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