[TOC]
a) 了解神经网络的基础知识
b) 熟悉导数的链式法则及常见函数的导数
c) 熟悉常见的优化方法,梯度下降,随机梯度下降等
d) 熟悉矩阵和向量的乘加运算
a) 对于一个$n$层神经网络,第$i$层表示为$l_i, \ 1 \le i \le n$ ,第$i$神经元个数为$|l_i|$ ; 注意$l_1$是输入层,
b) 对于神经网络的一个输入样本$x$ ,其维度为$(1,|l_1|)$ ,也就是一个行向量;对应的输出$y$ 也是一个行向量,维度为$(1,|l_n|)$ 。(注:也可以将$x$ 和
c) 设神经网络中第i层的输出为$z^i$,(
d) 定义损失函数为$L(y,y^)$ ;其中$y^$ 为样本的真实$y$值
a) 记损失函数L关于第$i$ 层神经元的输出$z^i$ 的偏导为$\delta^i = \frac {\partial L} {\partial z^i} \ \ \ (1)$
b) 首先我们来看看损失函数L在最后一层参数上的偏导;也就是$\frac {\partial L} {\partial W^{n-1}}$ 和
对等式(4)一般化的向量表示为: $$ \frac {\partial L} {\partial W^{n-1}} = (z^{n-1})^T \delta^n_j \tag 5 $$
同理可得: $$ \frac {\partial L} {\partial b^{n-1}} =\delta^n \tag 6 $$
c) 更一般的损失函数L关于第$l$层(这里没有用索引$i$,避免跟等式1~4中的索引名相同,引起理解障碍)的参数上的偏导,也就是$\frac {\partial L} {\partial W^l}$ 和
\end{align*} $$ 一般化的表示如下: $$ \delta^l = \frac {\partial L} {\partial z^l} \ =\delta^{l+1}(W^l)^T \ \ \ (15) $$
以上的证明就是为了说明下面的结论,所以请牢记以下的结论,后续自己写神经网络的反向传播都会用到以下结论
a) 根据公式15,损失函数L关于第$l$层神经元的偏导,就是第$l+1$ 层的偏导乘上第l层权重矩阵的转置。我们将公式(15)递归一下,$\delta^l=\delta^{l+1}(W^l)^T=\delta^{l+2}(W^{l+1})^T(W^l)^T=\delta^n(W^{n-1})^T(W^{n-2})^T...(W^l)^T \ \ (16)$
也就是说,只要求得损失函数L关于最后一层(n)的偏导$\delta^n$,其它任意层的偏导,直接用最后一层的偏导逐层乘上权重的转置即可。很简单,很对称,有木有?
b) 根据公式(8) ,损失函数L关于第$l$层权重$W^l$ 的偏导为,第$l$ 层输出的转置乘第$l+1$ 层的偏导$\frac {\partial L} {\partial W^l} = (z^l)^T\delta^{l+1} \ \ \ \ (8)$
c) 根据公式(9) ,损失函数L关于第$l$层偏置$b^l$ 的偏导,就是第$l+1$ 层的偏导:
由以上可知对任意的全连接层,我们只需要只到它后一层的偏导,就可以求得当前层参数(权重、偏置)的偏导; 就可以使用梯度下降算法更新参数了 $$ w = w - \eta * \frac {\partial L} {\partial w} \ \ //\eta为学习率 \tag {17} $$
根据公式(16), 损失函数L关于任何一层的偏导,只需要求导损失函数关于最后一层的偏导$\delta^n$ 即可。$\delta^n$ 与损失函数的定义有关,下一节介绍常用损失函数的偏导计算。
以下说明损失函数的偏导的计算
对于单个样本$(x,y*)$ ,定义如下:
其中$y$是神经网络最后一层的输出$y=z^n$ ,就是预测值 $$ \begin{align} &\frac {\partial L} {\partial y_i} = \frac {\partial (\frac 1 2(y_i - y^_i)^2)} {\partial y_i} \ &=(y_i - y^_i) * \frac {\partial (y_i - y^_i)} {\partial y_i} \ &=(y_i - y^_i) \ \ \ \ \ \ \ (20) \end{align} $$ 更一般的表示为 $\frac {\partial L} {\partial y} = y - y^$ ; 也就是$\delta^n=\frac {\partial L} {\partial y}=y-y^ = z^n-y^* \tag {21}$
即使用均方误差情况下,损失函数L关于网络最后一层的导数就是预测值减实际值
交叉熵用于度量两个概率分布的差异;一般使用交叉熵损失前,会对网络输出做softmax变换进行概率归一化;所以我们这里介绍的交叉熵损失是带softmax变换的交叉熵。
softmax变换定义如下: $$ a_i=e^{y_i}/\sum_k e^{y_k} \tag {22} $$ 交叉熵损失定义如下: $$ L(y,y^) = - \sum_i y^_i \log a_i \tag {23} $$ a) 我们先来求$a_i$ 关于$y_j$ 的偏导 $$ \begin{align*} &\frac {\partial a_i} {\partial y_j} = \frac {\partial(e^{y_i}/\sum_k e^{y_k})} {\partial y_j} \ &= \frac {\partial e^{y_i}} {\partial y_j} * \frac {1} {\sum_k e^{y_k}} + e^{y_i} * \frac {-1} {(\sum_k e^{y_k})^2} * \frac {\partial (\sum_k e^{y_k})} {\partial y_j} \ &= \frac {\partial e^{y_i}} {\partial y_j} * \frac {1} {\sum_k e^{y_k}} - \frac {e^{y_i}} {(\sum_k e^{y_k})^2} * e^{y_j} \ &=\begin{cases} \frac {e^{y_j}} {\sum_k e^{y_k}} - \frac {(e^{y_j})^2} {(\sum_k e^{y_k})^2} & i=j \ -\frac {e^{y_i}e^{y_j}} {(\sum_k e^{y_k})^2} & i\neq\ j \end{cases} \ &=\begin{cases} a_i(1-a_i) & i=j \ -a_ia_j & i\neq\ j \tag {24} \end{cases} \end{align*} $$
b) 然后我们来求L关于$y_j$ 的偏导 $$ \begin{align} &\frac {\partial L} {\partial y_j} = - \sum_i\frac {\partial( y^_i \log a_i )} {\partial a_i} * \frac {\partial a_i} {\partial y_j} \ &=- \sum_i \frac {y^_i} {a_i} * \frac {\partial a_i} {\partial y_j} \ &= - \frac {y^j} {a_j} * a_j(1-a_j) + \sum{i \neq\ j} \frac {y^_i} {a_i} * a_ia_j & //注意这里i是变量,j是固定的 \ &=-y^j(1-a_j) + \sum{i \neq\ j} y^_ia_j \ &= - y^_j + \sum_iy^_i a_j & //所有真实标签的概率之和为1\ &=a_j - y^*_j \end{align} $$ 更一般的表示为 :
所以使用带softmax变换的交叉熵损失函数,损失函数L关于网络最后一层的导数就是预测值经softmax变换后的值减去真实值。(是不是跟均方差损失函数很相似,注意还是有差异的噢)