为什么softmax 里面要用交叉熵?这个问题之前困扰我挺久的,但这两篇博文完美解答了我的疑惑。
交叉熵、相对熵和负对数似然的理解 - 最大的梦想家的文章 - 知乎 https://zhuanlan.zhihu.com/p/268171298
Kullback-Leibler(KL)散度介绍 - 灰灰的文章 - 知乎 https://zhuanlan.zhihu.com/p/100676922
KL散度
KL散度,是衡量原始分布和近似分布(也就是学习出来的分布)之间的差异性,如果差异越大,说明学习出来的近似分布越不拟合。
\[D_{KL}(P\parallel Q) = \sum_{i=1}^N p_i(log(p_i)-log(q_i))\\ S(P) = \sum_{i=1}^K p_i\log p_i\\ CrossEntropy = -\sum_{i=1}^K p_i \log q_i \\ CrossEntropy(y_{true}, y_{pred}) = -\sum_{i=1}^K y_{true}(i) \log y_{pred}(i) \\ \]可以看到KL散度,实际上就是实际分布的熵S,加上预测分布和实际分布的交叉熵,机器学习的目的就是最小化KL散度,因为KL散度越小,说明两个分布越接近,这意味着我们通过学习得到的分布和实际的分布越接近。
对数似然
假设我们观测到了一连串样本,其中A情况有a个,B情况有b个,C情况有c个。我们的目标是什么?找到一组分布( p(a) p(b) p(c) )使得出现这种状态的概率最高。
因为机器学习学的就是一个分布。
那么我们的目标就是最大化 \(p(a)^a * p(b)^b *p(c)^c\)
用对数来表示就是\(a\log p(a) +b\log p(b) + c \log p(c)\)
实际上我们会这样来表示:\(\sum_{i=1}^N n_i\log p_i\)
我们的目标就是最大化这个似然函数,有的情况下,它是有解的,比如以前概率论中取导数求出极值点,然后得到分布的函数。但是在机器学习中,我们是通过学习得到分布的,并没有一个准确的函数。
还记得之前的交叉熵吗?
对数似然\(\sum_{i=1}^N n_i\log p_i\) 可以除以\(\sum_{i=1}^N n_i\) ,因为这个值是一个常数,那么就得到了:
\(\sum_{i=1}^N p_{true}(i)\log p_{pred}(i)\)
wow!!!!!!!!
这个不就是之前的交叉熵的负数吗?
所以换一种思路去思考对数似然,最大化对数似然实际上就是在最小化KL散度,因为我们的目标就是找到一组最接近真实分布的预测分布。
至此,我们得出结论,负对数似然就是交叉熵。
为什么我们可以用交叉熵来作为损失函数?
之前的KL散度中,是包含了两个组成部分的——自身熵S和交叉熵。
在深度学习分类时,我们用做标签的是一组onehot向量,(0,0,0,……,1,0,0),这代表$p_j = 1 \quad and \quad p_{i|i \neq j} =0 $ ,所以,\(S(P) = \sum_{i=1}^K p_i\log p_i=0\),而交叉熵也可以该写为\(CrossEntropy = -\sum_{i=1}^K p_i \log q_i = -p_j\log q_j = -\log q_j\)
而这个交叉熵和之前提到的负对数似然一致。
这就是为什么可以用交叉熵来做为损失函数。
SoftMax 梯度下降
等待填坑……