第7章 反向传播算法

反向传播算法的三个阶段:

  • 1.前向传播求原函数值
  • 2.反向传播根据输出层误差求梯度
  • 3.根据梯度信息进行优化

反向传播算法本质上解决的问题:帮助机器快速的从参数空间里找到较好的参数组合。

7.3 激活函数导数

7.3.1 Sigmoid 函数导数

Sigmoid 函数也叫Logistic函数,定义为

\[Sigmoid := \frac {1}{1+e^{-x}} \]

Sigmoid函数的导数表达式:

\[\frac{d}{dx}σ(x)=σ(1-σ) \]

在神经网络的梯度计算中,通过缓存每层的 Sigmoid 函数输出值,即可在需要的时候计算出其导数。

7.3.2 ReLU函数导数

ReLU 函数定义 :

\[ReLU(x) :=max(0, x) \]

它的导数推导非常简单,直接可得 :

\[\frac{d}{dx}ReLU = \begin{cases} 1& \text x≥0\\ 0& \text x<0 \end{cases} \]

在反向传播的时候,它既不会放大梯度,造成梯度爆炸(Gradient exploding); 也不会缩小梯度,造成梯度弥散(Gradient vanishing)。

7.3.3 LeakyReLU 函数导数

LeakyReLU 函数的表达式:

\[LeakyReLU = \begin{cases} x, & \text{x≥0 }\\ p*x,& \text{x<0} \end{cases} \]

它的导数推导为

\[\frac{d}{dx}LeakyReLU = \begin{cases} 1, & \text{x≥0 }\\ p,& \text{x<0} \end{cases} \]

p 一般设置为一个较小的数值,如 0.01 或 0.02

7.3.4 Tanh函数梯度

tanh 函数的表达式:

\[tanh(x) = \frac{e^x-e^{-x}}{e^x+e^{-x}} = 2 * sigmoid(2x) - 1 \]

它的导数推导为 :

\[\frac{d}{dx}tanh(x)=1-\frac{(e^x-e^{-x})^2}{(e^x+e^{-x})^2}=1-tanh^2(x) \]

7.4 损失函数梯度

7.4.1 均方差函数梯度

均方差损失函数表达式为:

\[L = \frac{1}{2}\sum_{k=1}^{k}(y_k-o_k)^2 \]

均方差的导数推导为:

\[\frac{\partial L}{\partial o_i} = (o_i-y_i) \]

7.4.2 交叉熵函数梯度

在计算交叉熵损失函数时,一般将 Softmax 函数与交叉熵函数统一实现。我们先推导Softmax 函数的梯度,再推导交叉熵函数的梯度。

Softmax 梯度

Softmax函数表达式:

\[p_i = \frac{e^{z_i}}{\sum_{k=1}^k e^{z_k}} \]

  • i=j

    Softmax 函数的偏导数可以推导为 :\(p_i(1-p_j)\)

  • i≠j

Softmax 函数的偏导数可以推导为:

\[\frac{\partial p_i}{\partial z_j} = \begin{cases} p_i(1-p_j), & \text{当i=j}\\ -p_i.p_j,& \text{当i≠j} \end{cases} \]

交叉熵梯度

交叉熵损失函数的表达式:

\[L=-\sum_k y_klog(p_k) \]

交叉熵的偏导数可以进一步简化为

\[\frac{\partial L}{\partial z_i} = p_i-y_i \]

7.5 全连接层梯度

7.5.1 单个神经元梯度

采用均方差函数,单个神经元只有一个输出\(o_1^1\),损失函数可以表达为

\[L=\frac{1}{2}(o_0^1-t)^2 \]

其中𝑡为真实标签值 ,一权值链接的第j号节点的权值\(w_{j1}\)为例,考虑损失函数L对其的偏导数$\frac{\partial L}{\partial w_{j1}} $:

\[\frac{\partial L}{\partial w_{j1}} = (o_1 -t)o_1(1-o_1)x_j \]

从上式可以看到, 误差对权值\(w_{j1}\)的偏导数只与输出值\(o_1\)真实值𝑡以及当前权值连接的输入\(x_j\)有关。

7.5.2 全连接层梯度

多输出的全连接网络层模型与单个神经元模型不同之处在于, 它多了很多的输出节点\(o_1^1,o_2^1,o_3^1,...o_k^1\) ,每个输出节点分别对应到真实标签\(t_1,t_2,...,t_k\)

\[L = \frac{1}{2}\sum_{k=1}^{k}(o_i^1-t_i)^2 \]

最终可得

\[\frac{\partial L}{\partial w_{jk}} = (o_k-t_k)o_k(1-o_k)x_j \]

由此可以看到, 某条连接\(w_{jk}\)上面的连接,只与当前连接的输出节点\(o_k^1\), 对应的真实值节点的标签\(t_k^1\) ,以及对应的输入节点\(x_j\)有关。

7.7反向传播算法

每层的偏导数的计算公式

**输出层: **

\[\frac{\partial L}{\partial w_{jk}} = \delta_k^Ko_j \]

\[\delta_k^K=o_k(1-o_k)(o_k-t_k) \]

倒数第二层:

\[\frac{\partial L}{\partial w_{ij}} = \delta_j^Jo_i \]

\[\delta_j^J = o_j(1-o_j)\sum_k\delta_k^Kw_{jk} \]

倒数第三层:

\[\frac{\partial L}{\partial w_{ni}} = \delta_i^Io_n \]

\[\delta_i^I = o_i(1-o_i)\sum_j\delta_j^Jw_{ij} \]

其中\(o_n\)为倒数第三层的输入,即倒数第四层的输出。

依照此规律,只需要循环迭代计算每一层每个节点的𝛿𝑘𝐾, 𝛿 , 𝛿𝑖𝐼, …等值即可求得当前层的偏导数,从而得到每层权值矩阵 W 的梯度,再通过梯度下降算法迭代优化网络参数即可。

posted @ 2021-11-08 20:31  Reversal-destiny  阅读(420)  评论(0编辑  收藏  举报