神经网络的分类模型

NLP的入门算法应该是文本分类了,笔者最早接触文本分类的模型是采用keras框架搭建的分类,用了TextCNN和LSTM,很轻松的在短文本分类上取得很好的效果,很有成就感。后续完成了很多算法模型,较少关注理论层面去深入理解算法的原理。本文从原理层面介绍文本分类算法,重点在于介绍softmax+交叉熵为什么可以取得很好的效果,希望能够帮助读者理解算法的原理。

介绍

本文作为文本分类的入门篇,首先介绍神经网络如何建模条件概率,后续的文章再来介绍经典算法如朴素贝叶斯以及KNN如何完成文本分类,作为对比,帮助读者更加深入的理解神经网络建模的方法。

假设有一批标记数据{x_i, y_i}_{i=1}^N,其中x_i表示输入文本,y_i \in {C_1, C_2, \cdots, C_k},文本的单标签多分类问题。文本分类问题就是建模条件概率P(Y=C|X),得到概率分布,选择标签最大的概率作为分类结果。
-w846

不同的分类算法建模条件概率方法不同,神经网络建模条件概率使用softmax函数,模型有K个分类,神经网络的输出有K个,假设输出层第i个神经元的输出为s_i表示分类为C_i的打分,那么p(y=C_i|x)表示分类为C_i的概率

p(y=C_i|x) = \frac{e^{s_i}}{\sum_ j ^k e^{s_j}}

得到概率分布以后,选择概率最大的标签作为分类标签即可。按照上面搭建好神经网络,最后输出层激活函数用softmax,解决了网络的前向传播,参数都是初始化的。必须要确定优化目标,更新参数,也就是训练模型。直观来说我们希望目标分类的打分s_i是最大的,这样计算出来的目标分类概率也是最大的。

交叉熵

标记数据{x_i, y_i}_{i=1}^N,认为这组样本是从真实的概率分布P(X,Y)采样得到的,也就意味着这组样本出现的概率应该是最大的

\prod _{i=1} ^m p(y_i=C_t|x_i)

上面的概率就是似然概率,通过最大化似然概率来优化参数,通常会对似然概率取负号对数,优化的目标函数为最小化负对数似然函数
L(w)= -\sum_i ^ m\log p(y_i=C_t|x_i)

上面一共有m个样本,只考虑一个样本目标函数简化为
-\log p(y=C_t|x) = -\log \frac{e^{s_t}}{\sum_ j ^k e^{s_j}} \\ =\log \sum_ j ^k e^{s_j} – s_t \approx \max(s_1, s_2, \cdots, s_k) – s_t

最小化上面的目标函数,其中\max(s_1, s_2, \cdots, s_k) 如果最大值不是目标类s_t,意味着某个s_j, j\ne t是最大值,则损失函数结果为s_j – s_t > 0,最小化目标函数很明显可以取得最小值为0,当且仅当\max(s_1, s_2, \cdots, s_k)就是s_t

实际上优化上面的目标函数,意味着目标类大于非目标的得分,不断优化目标函数会接近0,此时分类目标s_t远远大于其余得分,神经网络就能给出正确的分类。

我们在搭建神经网络时,对于多分类问题采用交叉熵作为目标函数,其实最小化上述的负对数似然函数等价于最小化交叉熵,下面简单推导一下。交叉熵的写法是
L=-\sum_i ^m y_t ^{(i)} \log y_p^{(i)}

依然只考虑一个样本的交叉熵
L=- y_t \log y_p
其中y_t, y_p分别为样本的概率分布和网络输出的概率分布,目标类为t,那么y_t为one-hot向量,t位置为1其余为0,而y_p=(p_1, p_2, \cdots, p_t, \cdots, p_k)

于是单个样本的交叉熵
L=- y_t \log y_p = -\log p_t = -\log p(y=C_t|x)

可以看到最小化交叉熵和最大化似然函数是等价的

标签:

发表评论

邮箱地址不会被公开。