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