Softmax及其求导
正向传播
为了方便理解,若输入,输出只有3个变量(下面的普通性情况不太理解的可以带入此特殊情况帮助理解)。
- 输入:输出层神经元 Z = [z1, z2, z3],分类标签 Y = [y1,y2,y3](Y是one-hot标签,只有一个yi值为1,其他全为0)
- 输出:A = softmax(Z) = [a1,a2,a3]
更一般的,假设有n个神经元(或者说n类),softmax公式为:
ai=∑j=1nezjezi
损失函数采用交叉熵,公式为:
L=−i=1∑nyilnai
求导
先说结论,按向量形式表示∂Z∂L=A−Y
证明:在这里我们假设第k个神经元为正确标签,即在Y = [y1,y2,y3]中yk = 1,其他yi都为0。
首先求L对A的导数
∂ai∂L=∂ai∂−∑i=1nyilnai=−aiyi
再求L对Z的导数,这里需要注意,在正向传播时,每一个ai的计算都有所有的zj参加(请看softmax的公式的分母,是求和)
∂zi∂L=j=1∑naj∂L⋅∂zi∂aj
再次强调,因为每一个ai的计算都由所有的zj参加,换句话说,每一个zj都包含在每一个ai中,因此对zj求偏导要先对所有的ai求偏导。
而我们事先假设好了yk=1,其他yi都为0,因此只有∂ak∂L不为0,其他都为0,可以进一步将上式化简为:
∂zi∂L=j=1∑naj∂L⋅∂zi∂aj=∂ak∂L⋅∂zi∂ak
由此可见,我们的重点就是要求∂zi∂ak了。对于∂zi∂ak的求解,要分两种情况。
-
若i = k
∂zi∂ak=∂zk∂ak=∂zk∂(∑j=1nezjezk)=(∑j=1nezj)2ezk(∑j=1nezj)−(ezk)2=∑j=1nezjezk−(∑j=1nezjezk)2=ak−ak2=ak(1−ak)
-
若i = k
∂zi∂ak=∂zi∂(∑j=1nezjezk)=(∑j=1nezj)2−ezk⋅ezi=−∑j=1nezjezk⋅∑j=1nezjezi=−ak⋅ai
结合我们求出的∂ai∂L和∂zj∂ai,这里直接写出L对整个Z的导数,我们可得
∂Z∂L=j=1∑ni=1∑n∂aj∂L⋅∂zi∂aj=−ak1i=1∑n∂zi∂ak=−ak1⋅i=1,i=k∑n(−akai)−ak1⋅i=k∑(ai(1−ai))=i=1,i=k∑nai+i=k∑ai−1=i=1∑nai−1
我们又知道yk = 1,除了yk其他yi都等于0,因此上式的1可以写成yk,在进一步写成∑i=1nyi,带入上式
∂Z∂L=i=1∑nai−1=i=1∑nai−i=1∑nyi=A−Y
证明完毕~