Softmax

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

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

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

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

ajL=ezjL∑kezkL a^L_j = \frac{e^{z^L_j}}{\displaystyle\sum_{k}e^{z^L_k}}

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

下面计算ajLa^L_j对ziLz_i^L的导数

如果j=ij=i:

∂ajL∂ziL=∂∂ziL(ezjL∑kezkL) \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)′⋅∑kezkL−ezjL⋅ezjL(∑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}

=ezjL∑kezkL−ezjL∑kezkL⋅ezjL∑kezkL =\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(1−aj) =a_j (1-a_j)

如果j≠ij \neq i:

∂ajL∂ziL=∂∂ziL(ezjL∑kezkL) \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}})

=0⋅∑kezkL−ezjL⋅eziL(∑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}

=−ezjL∑kezkL⋅eziL∑kezkL =-\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个神经元的真实值,取值为00或11。

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

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

∂C∂bjL=∂C∂zjL⋅∂zjL∂bjL \frac{\partial C}{\partial b_j^L} = \frac{\partial C }{\partial z_j^L}\cdot \frac{\partial z_j^L }{\partial b_j^L}

=∂C∂zjL⋅∂∑k(wjkLakL−1)+bjL∂bjL=∂C∂zjL = \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 )

=−∑kyk⋅1akL⋅∂akL∂zjL =-\displaystyle\sum_{k}y_k \cdot \frac{1 }{a_k^L} \cdot \frac{\partial a_k^L}{\partial z_j^L}

=−yj⋅1ajL⋅∂ajL∂zjL−∑k≠jyk⋅1akL⋅∂akL∂zjL =-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}

=−yj⋅1ajL⋅ajL(1−ajL)−∑k≠jyk⋅1akL⋅−ajLakL =-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+∑k≠jyk⋅ajL =-y_j + y_j a_j^L +\displaystyle\sum_{k \neq j}y_k \cdot a_j^L

=ajL−yj =a_j^L-y_j

同样可得:

∂C∂wjk=aL−1(ajL−yj) \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 ""