详解softmax
为什么需要Softmax
初级的神经网络中,预测结果由输出层的单个神经元给出,通常表示输入数据与目标分类的近似度(概率),也可以由激活函数处理后,用大于或小于0来表示输入数据是否属于该分类。但这样的神经网络非常局限,只能进行二元分类,判断是与否的问题。因此我们需要引入一个特殊的激活函数 - softmax,它可以让神经网络判断多种分类,并给每个分类计算出符合的概率。
Softmax的正向传播
为实现多分类的功能,神经网络的输出层需要有足够的神经元数量,例如:对于一个四分类的目标,输出层则需要有四个神经元,每个神经元给出属于各自分类的结果。应用在输出层上的softmax函数会综合各个神经元的结果,为每个分类提供他们的概率,并且,总概率和为1。
用计算出一个临时变量,, 这里的是与输出层有关的,若输出层有4个神经元,则 应该是一个(4,1)维的向量,同样的,运算得到的临时变量也是(4,1)维的向量
用算出, , 这里会有一些巧妙,分母的表示矩阵中所有元素的和,可以用np.sum(t)求得, 分子为矩阵,由于上下维度不相等,计算会触发python numpy的广播化操作,最后得到的也是一个矩阵,中的每一个元素都代表中对应元素在整个向量的占比,因此的元素的总和会是1,即概率和为1
Softmax的反向传播
在实际应用中,我们希望正确的结果概率最大,而错误的结果概率最小,因此我们把一个样本的标签定义成只有一个元素是1的向量。比如对于四分类模型,某一个样本属于分类二,那么这个样本的标签就是
由于结果是一个表示概率的多维向量,那么模型的损失函数也要相应地变化,变成了如下形式,n表示的是分类的数量
代入具体的示例中看一下,若我们希望预测分类为第二个,则应当为1,其余的都为0,此时的损失函数就变成了,仅与相关,
因此,又因为,,,
最终可以得到,
则对于第二个神经元的,
而对于输出层的其余神经元,其参数的偏导值都为0
Softmax的适用场景
正如其名字中的“max”,softmax就是在诸多分类中将最可能符合输入样本的分类的概率设为最大值,而其他无关分类的概率值则相对较小,也就是说,softmax输出的多分类结果是互斥的。在实际应用中,如果你的分类之间相互排斥,那么这个分类模型就适用softmax,反之,如果分类之间存在有交集,那么更好的解决办法是针对每个分类都设置一个二分类器,那么输入样本的分类结果就可以包含一个或多个分类。