Ouput layer & 代价函数
网络结构
Output later 有K个神经元,有K个输入和输出。为了分别标记输入和输出,用ai∈[1,K]来表示Output layer的输入数据,yj∈[1,K]来表示Output layer输出点数据。每个输入数据ai∈[1,K]和隐藏层的H个块之间是全连接的。
输入和输出数据
- 每个Output layer层的输入数据是ai=∑Hh=1whibh。
- 当使用softmax输出函数的时候,每个Output layer层的输出数据就为yj=eaj∑Kj′=1eaj′。
- 当使用交差熵代价函数的时候L(x,z)=−∑Kj=1zjlnyj ,这里zj是各个输出点的目标分类结果,在训练数据中已经给出来了。
求导数
这里要求的是代价函数对每个输入数据的导数δi=∂L(x,z)∂ai。在反向传播中δi会传播给后续网络。
首先复习一下会用到的基本的微积分知识:
(uv)′=u′v+uv′ln(x)′=1x
交叉熵的导数:
对于任意一个输出yj的导数
∂L(x,z)∂yj=∂−∑Kj′=1zj′lnyj′∂yj=−zjyj当j′≠j时,该项对于yj的微分为0。因此只需要求j′=j项时的导数此时有:∂zjlnyj∂yj=zjyj
Softmax函数的导数:
首先准备一下在计算时会反复用到的部分:
∂1∑Kj′=1eaj′∂aj=∂1∑Kj′=1eaj′∂∑Kj=1eaj′∂∑Kj′=1eaj′∂aj=−1(∑Kj′=1eaj′)2∂∑Kj=1eaj′∂aj=−1(∑Kj′=1eaj′)2eaj根据链式法则,把复杂的函数分解成复合函数,然后可以对其分别求导数∑j′=1Keaj′可以分解为∑j′≠jeaj′+eaj其对eaj的导数就是eaj
在求导数时,根据i和j是否相等分开进行讨论:
当i=j时,求导数公式如下:
∂eai∑Kj=1eaj∂ai=∂eai∂eai1∑Kj′=1eaj′+eai∂1∑Kj′=1eaj′∂ai=eai1∑Kj′=1eaj′+eai(−1(∑Kj′=1eaj′)2eai)=eai∑Kj′=1eaj′(1−eai∑Kj′=1)=yi(1−yi)根据(uv)′=u′v+uv′,把函数拆成两个部分分别求导数由softmax定义,yi=eai∑Kj′=1eaj′
i≠j的求导数公式如下:
∂eaj∑Kj′=1eaj′∂ai=eaj∂1∑Kj′=1eaj′∂eai=eaj(−1(∑Kj′=1eaj′)2eai)=eaj∑Kj=1eaj′eai∑Kj′=1eaj′=−yjyieaj不受eai影响,是个常数
输出层的梯度δi的推导
L受所有的输出数据yj影响,而任意一个输入数据ai会影响到所有的输出数据yj,因此在L 对任意一个ai求导数时,要把所有的yj的导数都传递给ai,并把它们累加起来。
δi=∂L∂ai=∂L∂y1∂y1∂ai+∂L∂y2∂y2∂ai+⋯+∂L∂yj∂yj∂ai+⋯+∂L∂yK∂yK∂ai=∑j=1K∂L∂yj∂yj∂ai=∑j≠iK∂L∂yj∂yj∂ai+∂L∂yi∂yi∂ai根据i和j是否相等分开进行讨论
当i≠j时:
∑j≠iK∂L∂yj∂yj∂ai=∑j≠iK[−zjyj(−yiyj)]
当i=j时:
∂L∂yi∂yi∂ai=−ziyi[yi(1−yi)]
把这两个部分加起来:
δi=∂L∂ai=∑j≠iK∂L∂yj∂yj∂ai+∂L∂yi∂yi∂ai=∑j≠iK[−zjyj(−yiyj)]+{−ziyi[yi(1−yi)]}=yi{∑j≠iK[−zjyj(−yj)]−ziyi(1−yi)}=yi{∑j≠iKzj−ziyi+zi}=yi(1−ziyi)=yi−zi根据i和j是否相等分开进行讨论把上面两个部分代入提取公因数yi由于zj是个概率函数,因此所有的zj的和是1。∑j≠iKzj+zi=1
本文详细解析了输出层的工作原理及其与代价函数的关系。介绍了使用softmax作为输出函数时,如何计算输出层的梯度,并结合交叉熵代价函数推导出了输入数据的导数表达式。
535





