【深度学习基础】第二十四课:softmax函数的导数

【深度学习基础】系列博客为学习Coursera上吴恩达深度学习课程所做的课程笔记。

1.softmax函数

softmax函数详解。

2.softmax函数的导数

假设神经网络输出层的激活函数为softmax函数,用以解决多分类问题。在反向传播时,就需要计算softmax函数的导数,这也就是本文着重介绍的内容。

我们只需关注输出层即可,其余层和之前介绍的二分类模型一样,不再赘述。

我们先考虑只有一个样本的情况,输出层的 z [ L ] , a [ L ] z^{[L]},a^{[L]} z[L],a[L]以及标签y为(假设预测类别共有K类):

z [ L ] = [ z 1 z 2 ⋮ z K ] ; a [ L ] = [ a 1 a 2 ⋮ a K ] ; y = [ y 1 y 2 ⋮ y K ] z^{[L]}= \begin{bmatrix} z_1 \\ z_2 \\ \vdots \\ z_K \\ \end{bmatrix} ; a^{[L]} = \begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_K \\ \end{bmatrix};y=\begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_K \\ \end{bmatrix} z[L]= z1z2zK ;a[L]= a1a2aK ;y= y1y2yK

其中:

a j = e z j ∑ k = 1 K e z k , j ∈ [ 1 , 2 , . . . , K ] (1) a_j=\frac{e^{z_j}}{\sum^K_{k=1}e^{z_k}},j\in [1,2,...,K] \tag{1} aj=k=1Kezkezj,j[1,2,...,K](1)

使用交叉熵损失函数构建cost function:

C = − ∑ k = 1 K y k ln ⁡ a k (2) C=-\sum^K_{k=1} y_k \ln a_k \tag{2} C=k=1Kyklnak(2)

其中, y k y_k yk等于0或1。

很容易算出:

∂ C ∂ a j = − y j a j (3) \frac{\partial C}{\partial a_j}=-\frac{y_j}{a_j} \tag{3} ajC=ajyj(3)

接下来我们只要算出 ∂ a j ∂ z i \frac{\partial a_j}{ \partial z_i} ziaj即可。这里之所以是 z i z_i zi而不是 z j z_j zj是因为使用softmax计算得到的 a j a_j aj包含了 z [ L ] z^{[L]} z[L]中的所有元素,也就是说 a j a_j aj可对 z [ L ] z^{[L]} z[L]中的任意元素求导,而不仅仅只是 z j z_j zj。因此,我们分两种情况讨论。

情况一: i = j i=j i=j

∂ a j ∂ z i = ∂ a i ∂ z i = e z i ∑ k = 1 K e z k − e 2 z i ( ∑ k = 1 K e z k ) 2 = e z i ∑ k = 1 K e z k − ( e z i ∑ k = 1 K e z k ) 2 = a i − a i 2 = a i ( 1 − a i ) \begin{align*} \frac{\partial a_j}{\partial z_i} &= \frac{\partial a_i}{\partial z_i} \\&= \frac{e^{z_i} \sum^K_{k=1}e^{z_k} - e^{2z _i} }{ (\sum^K_{k=1}e^{z_k})^2 } \\&= \frac{e^{z_i}}{\sum^K_{k=1}e^{z_k}} - (\frac{e^{z_i}}{\sum^K_{k=1}e^{z_k}})^2 \\&= a_i-a_i^2 \\&= a_i(1-a_i) \tag{4} \end{align*} ziaj=ziai=(k=1Kezk)2ezik=1Kezke2zi=k=1Kezkezi(k=1Kezkezi)2=aiai2=ai(1ai)(4)

情况二: i ≠ j i\neq j i=j

∂ a j ∂ z i = − e z j e z i ( ∑ k = 1 K e z k ) 2 = − a j a i (5) \frac{\partial a_j}{\partial z_i} = -\frac{e^{z_j} e^{z_i}}{(\sum^K_{k=1}e^{z_k})^2} = -a_j a_i \tag{5} ziaj=(k=1Kezk)2ezjezi=ajai(5)

结合式(3)、式(4)、式(5)可得:

∂ C ∂ z i = ∑ k = 1 K ∂ C ∂ a k ⋅ ∂ a k ∂ z i = − y i a i ⋅ a i ( 1 − a i ) + ∑ k = 1 , k ≠ i K ( − y k a k ) ⋅ ( − a k a i ) = − y i + y i a i + ∑ k = 1 , k ≠ i K y k a i = − y i + a i ( y i + ∑ k = 1 , k ≠ i K y k ) = a i − y i \begin{align*} \frac{\partial C}{\partial z_i} &= \sum^K_{k=1} \frac{\partial C}{\partial a_k} \cdot \frac{\partial a_k}{\partial z_i} \tag{6} \\&= -\frac{y_i}{a_i} \cdot a_i(1-a_i) + \sum^K_{k=1,k\neq i} (-\frac{y_k}{a_k}) \cdot (-a_k a_i) \tag{7} \\&= -y_i + y_i a_i + \sum^K_{k=1,k\neq i} y_k a_i \tag{8} \\&= -y_i + a_i (y_i + \sum^K_{k=1,k\neq i} y_k) \tag{9} \\&= a_i - y_i \end{align*} ziC=k=1KakCziak=aiyiai(1ai)+k=1,k=iK(akyk)(akai)=yi+yiai+k=1,k=iKykai=yi+ai(yi+k=1,k=iKyk)=aiyi(6)(7)(8)(9)

  • 式(6)是因为 a [ L ] a^{[L]} a[L]中每个元素的计算都包含了 z i z_i zi
  • 式(7)中将k分为 k = i k=i k=i k ≠ i k\neq i k=i两种情况。 k = i k=i k=i的情况可以用到式(4), k ≠ i k\neq i k=i的情况用到式(5)。
  • 式(9)中, y i + ∑ k = 1 , k ≠ i K y k = 1 y_i + \sum^K_{k=1,k\neq i} y_k=1 yi+k=1,k=iKyk=1。这是因为K个类别中只有一个为正确类别,其标签为1,其余错误类别标签均为0。

使用向量化方法:

∂ C ∂ z [ L ] = a [ L ] − y \frac{\partial C}{\partial z^{[L]} }=a^{[L]}-y z[L]C=a[L]y

可直接扩展到多个样本的情况:

∂ L ∂ Z [ L ] = A [ L ] − Y \frac{\partial L}{\partial Z^{[L]} }=A^{[L]}-Y Z[L]L=A[L]Y


想要获取最新文章推送或者私聊谈人生,请关注我的个人微信公众号:⬇️x-jeff的AI工坊⬇️
【深度学习基础】第二十四课:softmax函数的导数_第1张图片

个人博客网站:https://shichaoxin.com

GitHub:https://github.com/x-jeff


你可能感兴趣的:(深度学习基础,深度学习,人工智能)