Softmax

除了使用交叉熵来解决学习缓慢的问题外,还可以使用基于柔性最大值(softmax)神经元层。

柔性最大值的想法其实就是为神经网络定义一种新式的输出层。开始时和和S型层一样,首先计算带权输入

zjL=k(wjkLakL1)+bjL z^L_j=\displaystyle\sum_{k}(w_{jk}^L a_k^{L-1}) + b_j^L

然后应用 softmax 函数在zjLz^L_j上,根据这个函数,第jj个神经元的激活值就是

ajL=ezjLkezkL a^L_j = \frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}}

其中分母的求和是在所有的输出神经元上进行的。而且所有输出的激活值加起来正好为1,同样保证输出激活值都是正数。而且柔性最大值层的输出可以被看做是一个概率分布。

下面计算ajLa^L_jziLz_i^L的导数

如果j=ij=i

ajLziL=ziL(ezjLkezkL) \frac{\partial a_j^L}{\partial z_i^L} = \frac{\partial }{\partial z_i^L}(\frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}})

=(ezjL)kezkLezjLezjL(kezkL)2 =\frac{(e^{z^L_j})'\cdot\displaystyle\sum_{k}e^{z^L_k} - e^{z^L_j}\cdot e^{z^L_j} }{(\displaystyle\sum_{k}e^{z^L_k})^2}

=ezjLkezkLezjLkezkLezjLkezkL =\frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}}-\frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}} \cdot \frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}}

=aj(1aj) =a_j (1-a_j)

如果jij \neq i

ajLziL=ziL(ezjLkezkL) \frac{\partial a_j^L}{\partial z_i^L}=\frac{\partial }{\partial z_i^L}(\frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}})

=0kezkLezjLeziL(kezkL)2 =\frac{0\cdot\displaystyle\sum_{k}e^{z^L_k} - e^{z^L_j}\cdot e^{z^L_i} }{(\displaystyle\sum_{k}e^{z^L_k})^2}

=ezjLkezkLeziLkezkL =-\frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}} \cdot \frac{e^{z^L_i}}{\displaystyle\sum_{k}e^{z^L_k}}

=ajai = - a_j a_i

对数似然损失函数

其对数似然损失函数为:

C=kyklogak C=-\displaystyle\sum_{k}y_k \mathrm{log}a_k

其中aka_k为第kk个神经元的输出值,yky_k表示第kk个神经元的真实值,取值为0011

这个代价的简单含义是:只有一个神经元对应了该样本的正确分类,若这个神经元的输出概率越高,则其产出的代价越小,反之则代价越高。

则计算损失函数对权重和偏置的偏导数:

CbjL=CzjLzjLbjL \frac{\partial C}{\partial b_j^L} = \frac{\partial C }{\partial z_j^L}\cdot \frac{\partial z_j^L }{\partial b_j^L}

=CzjLk(wjkLakL1)+bjLbjL=CzjL = \frac{\partial C }{\partial z_j^L}\cdot \frac{\partial \displaystyle\sum_{k}(w_{jk}^L a_k^{L-1}) + b_j^L }{\partial b_j^L} = \frac{\partial C }{\partial z_j^L}

=zjL(kyklogakL) = \frac{\partial}{\partial z_j^L}( -\displaystyle\sum_{k}y_k \mathrm{log}a_k^L )

=kyk1akLakLzjL =-\displaystyle\sum_{k}y_k \cdot \frac{1 }{a_k^L} \cdot \frac{\partial a_k^L}{\partial z_j^L}

=yj1ajLajLzjLkjyk1akLakLzjL =-y_j \cdot \frac{1 }{a_j^L} \cdot \frac{\partial a_j^L}{\partial z_j^L}-\displaystyle\sum_{k \neq j}y_k \cdot \frac{1 }{a_k^L} \cdot \frac{\partial a_k^L}{\partial z_j^L}

=yj1ajLajL(1ajL)kjyk1akLajLakL =-y_j \cdot \frac{1 }{a_j^L} \cdot a_j^L (1-a_j^L)-\displaystyle\sum_{k \neq j}y_k \cdot \frac{1 }{a_k^L} \cdot -a_j^L a_k^L

=yj+yjajL+kjykajL =-y_j + y_j a_j^L +\displaystyle\sum_{k \neq j}y_k \cdot a_j^L

=ajLyj =a_j^L-y_j

同样可得:

Cwjk=aL1(ajLyj) \frac{\partial C}{\partial w_{jk}}=a^{L-1}(a_j^L-y_j)

因此可以确保不会遇到学习缓慢的问题。事实上把一个具有对数似然代价的柔性最大值输出层,看作与一个具有交叉熵代价函数的S型输出层非常相似。在很多应用场景中,这两种方式的效果都不错。

参考:https://blog.csdn.net/niuniuyuh/article/details/61926561

results matching ""

    No results matching ""