深度学习Loss function之Softmax中的矩阵求导

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Gitoo1993/article/details/78221238

最近在重温CS231n的Assignment,采用SGD进行参数更新,在back propagation计算gradient时经常涉及到矩阵运算的的“求导”,在许多代码中该步骤仅需进行一次矩阵乘法,对其实现背后的推导没有进行说明,自己只有照抄死记硬背,但是毕竟只有明白背后的原理才能举一反三,在遇到其他需要对矩阵进行求导的情况时能够自己解决,因此今天我试着推导了一下,并且希望记录下来方便以后查阅:

首先简单介绍下Softmax:

假设在神经网络的最后一层输出为f(N,C),N表示train data的数目,C表示种类的数量,f[i,j]可以理解为第i个train data在j类的分数,而Softmax将以f为输入,然后计算各个train data属于j类的概率,再计算Loss(一种对Softmax的解释)。Softmax的Loss function为:

                                

引入临时变量p,则某个样例引入的损失为:



可以将P视为样例属于某类的概率。经过简单的求导,可以得到:




此时我们已经可以得到df,但是参数更新需要获得dW,因此将通过back propagation计算dW,由于f=np.dot(X,W),涉及到了矩阵的乘法,求导并不直观,在这里进行推导下,加深自己的理解:

矩阵乘法的实质是

其中i表示第i个样例,j表示第j类,因此f[i,j]可以理解为第i个样例在第j类的分数。对其进行back propagation:

这是第i个样例引入的,考虑所有样例,则有:


可以看出该式也是矩阵乘法,因此得出dW=np.dot(X.T,df)

恩,从df到dW的back propagation就完成了:)

python代码实现可以参考cs231n的slides

http://cs231n.github.io/neural-networks-case-study/




猜你喜欢

转载自blog.csdn.net/Gitoo1993/article/details/78221238