avatar

Softmax的理解与应用

Softmax的理解与应用

Softmax在机器学习中有非常广泛的应用,但是刚刚接触机器学习的人可能对Softmax的特点以及好处并不理解,其实你了解了以后就会发现,Softmax计算简单,效果显著,非常好用。

我们先来直观看一下,Softmax究竟是什么意思

我们知道max,假如说我有两个数,a和b,并且a>b,如果取max,那么就直接取a,没有第二种可能

但有的时候我不想这样,因为这样会造成分值小的那个饥饿。所以我希望分值大的那一项经常取到,分值小的那一项也偶尔可以取到,那么我用softmax就可以了
现在还是a和b,a>b,如果我们取按照softmax来计算取a和b的概率,那a的softmax值大于b的,所以a会经常取到,而b也会偶尔取到,概率跟它们本来的大小有关。所以说不是max,而是 Soft max

定义

假设有一个数组VVViV_{i}表示VV中的第i个元素,那么这个元素的softmax为:

Si=eijejS_{i} = \frac{e^{i}}{\sum_{j}e^j}

也就是说,是该元素的对数值,与所有元素对数值和的比值

计算与标注样本的差距

在神经网络的计算当中,我们经常需要计算按照神经网络的正向传播计算的分数S1,和按照正确标注计算的分数S2,之间的差距,计算Loss,才能应用反向传播。Loss定义为交叉熵

Li=log(efyijej)L_{i} = -log (\frac{e^{f_{y_{i}}}}{\sum_{j}e^{j}})

取log里面的值就是这组数据正确分类的Softmax值,它占的比重越大,这个样本的Loss也就越小,这种定义符合我们的要求

计算推导

当我们对分类的Loss进行改进的时候,我们要通过梯度下降,每次优化一个step大小的梯度,这个时候我们就要求Loss对每个权重矩阵的偏导,然后应用链式法则。那么这个过程的第一步,就是求Loss对score的偏导 (下面公式推导部分对于求偏导符号就用求导符号代替)

我们首先定义

Pyi=efyijejP_{y_{i}} = \frac {e^{f_{y_{i}}}}{\sum_{j}e^{j}}是选到yiy_{i}的概率

Li=log(efyijej)L_{i} = -log(\frac {e^{f_{y_{i}}}}{\sum_{j}e^{j}})是我们之前提到的交叉熵

那么我们求Loss的偏导数就是

Lifyi=ln(efyije<!0>)\frac{\partial{L_i}}{\partial{f_{y_i}}}=-\ln(\frac{e^{f_{y_{i}}}}{\sum_{j}e^})’

=1je<!1>efyi(efyije<!2>)=1je<!3>efyi(1jfyiejjej)=-1 * \frac{\sum_{j}e^}{e^{f_{y_{i}}}} * (\frac{e^{f_{y_{i}}}}{\sum_{j}e^})’=-1 * \frac{\sum_{j}e^}{e^{f_{y_{i}}}} * (1-\frac{\sum_{j \ne {f_{y_{i}}}}e^j}{\sum_je^j})’

=1je<!4>efyi(1)jfyiej(1)1(jej)2(jej)=-1* \frac{\sum_{j}e^}{e^{f_{y_{i}}}} * (-1) * \sum_{j \ne {f_{y_{i}}}}e^j * (-1) * \frac{1}{(\sum_je^j)^2} * (\sum_je^j)’

=1je<!5>efyi(1)jfyiej(1)1(jej)2efyi=-1 * \frac{\sum_{j}e^}{e^{f_{y_{i}}}} * (-1) * \sum_{j \ne {f_{y_i}}}e^j * (-1) * \frac{1}{(\sum_je^j)^2} * e^{f_{y_i}}

=jfyiejjej=-\frac{\sum_{j \ne {f_{y_i}}}e^j}{\sum_je^j}

=(1Pfyi)=Pfyi1= -(1-P_{f_{y_i}}) = P_{f_{y_i}} - 1

最后结果的形式非常的简单,只要将算出来的概率的向量对应的真正结果的那一维减1,就可以了

举个例子,通过若干层的计算,最后得到的某个训练样本的向量的分数是[ 1, 5, 3 ],
那么概率分别就是[e1e1+e3+e5,e5e1+e3+e5,e3e1+e3+e5]=[0.015,0.866,0.117][\frac{e^1}{e^1 + e^3 + e^5},\frac{e^5}{e^1 + e^3 + e^5},\frac{e^3}{e^1 + e^3 + e^5}]=[ 0.015, 0.866, 0.117 ],如果这个样本正确的分类是第二个的话,那么计算出来的偏导就是[0.015,0.8661,0.117]=[0.015,0.134,0.117][ 0.015, 0.866 - 1, 0.117 ] = [ 0.015, -0.134, 0.117 ]

参考资料:

【1】https://blog.csdn.net/supercally/article/details/54234115

Author: Hui Ning
Link: https://angelni.github.io/softmax/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付宝
    支付宝

Comment