Softmax
除了使用交叉熵来解决学习缓慢的问题外,还可以使用基于柔性最大值(softmax)神经元层。
柔性最大值的想法其实就是为神经网络定义一种新式的输出层。开始时和和S型层一样,首先计算带权输入
zjL=k∑(wjkLakL−1)+bjL
然后应用 softmax 函数在zjL上,根据这个函数,第j个神经元的激活值就是
ajL=k∑ezkLezjL
其中分母的求和是在所有的输出神经元上进行的。而且所有输出的激活值加起来正好为1,同样保证输出激活值都是正数。而且柔性最大值层的输出可以被看做是一个概率分布。
下面计算ajL对ziL的导数
如果j=i:
∂ziL∂ajL=∂ziL∂(k∑ezkLezjL)
=(k∑ezkL)2(ezjL)′⋅k∑ezkL−ezjL⋅ezjL
=k∑ezkLezjL−k∑ezkLezjL⋅k∑ezkLezjL
=aj(1−aj)
如果j≠i:
∂ziL∂ajL=∂ziL∂(k∑ezkLezjL)
=(k∑ezkL)20⋅k∑ezkL−ezjL⋅eziL
=−k∑ezkLezjL⋅k∑ezkLeziL
=−ajai
对数似然损失函数
其对数似然损失函数为:
C=−k∑yklogak
其中ak为第k个神经元的输出值,yk表示第k个神经元的真实值,取值为0或1。
这个代价的简单含义是:只有一个神经元对应了该样本的正确分类,若这个神经元的输出概率越高,则其产出的代价越小,反之则代价越高。
则计算损失函数对权重和偏置的偏导数:
∂bjL∂C=∂zjL∂C⋅∂bjL∂zjL
=∂zjL∂C⋅∂bjL∂k∑(wjkLakL−1)+bjL=∂zjL∂C
=∂zjL∂(−k∑yklogakL)
=−k∑yk⋅akL1⋅∂zjL∂akL
=−yj⋅ajL1⋅∂zjL∂ajL−k≠j∑yk⋅akL1⋅∂zjL∂akL
=−yj⋅ajL1⋅ajL(1−ajL)−k≠j∑yk⋅akL1⋅−ajLakL
=−yj+yjajL+k≠j∑yk⋅ajL
=ajL−yj
同样可得:
∂wjk∂C=aL−1(ajL−yj)
因此可以确保不会遇到学习缓慢的问题。事实上把一个具有对数似然代价的柔性最大值输出层,看作与一个具有交叉熵代价函数的S型输出层非常相似。在很多应用场景中,这两种方式的效果都不错。
参考:https://blog.csdn.net/niuniuyuh/article/details/61926561