人工神经网络反向传播算法证明推导

为了搞明白这个没少在网上搜,但是结果不尽人意,最后找到了一篇很好很详细的证明过程,摘抄整理为 latex 如下。

(原文:https://blog.csdn.net/weixin_41718085/article/details/79381863

\documentclass{article}
\usepackage{xeCJK}
\usepackage{amsmath}
\setCJKmainfont{Noto Serif CJK SC}

\title{人工神经网络反向传播算法\\链式法则在人工智能中的应用}

\begin{document}
\maketitle

\section{背景}

\subsection{人工神经元}

人工神经元是一个运算,它将输入分别以不同的权重组合相加并做一次偏移操作后进行某个非线性运算得到输出,以数学语言描述即是

\[
x^{(j + 1)} = \sigma(b + \sum_i W_i x_i^{(j)})
\]

其中 \(j\) 指神经元所处的层数,本例中 \(x_i^{(j)}\) 是来自第 \(j\)
层的第 \(i\) 个神经元的输入,\(W_i\)
是当前神经元所有提供输入的神经元中的第 \(i\) 个的权重,\(b\)
是偏移值,\(f\)
被称作激活函数,通常是一个非线性函数,一些经典的激活函数有 Sigmoid,
ReLU, 和反正切函数。

\subsection{人工神经网络}

人工神经网络(Artificial Neural Network,后简称
ANN)由若干层人工神经元组成,在本文所考虑的模型中,每一层神经元接受上一层神经元的输入,运算,并将结果输出至下一层。事实上,若将整个网络中每个神经元的参数记为矩阵
\(A\),则整个神经网络可以认为是一个函数 \(f(A, x)\),其中 \(x\)
是整个网络的输出。

在应用的过程中,我们常常有一组输入 \(x\) 和对应着的期望输出
\(y\)。训练神经网络的过程就是寻找合适的 \(A_0\),使得
\(f(A_0, x) = y\)。为了解决这个问题,数学上我们引入损失函数\(J(y, y^*)\)
来指示 \(f(A, x)\) 训练的程度,其中 \(y^*\)
是神经网络的输出。一个典型的损失函数是欧几里得距离的平方,即
\(J_0(y, y^*) = (y - y^*)^T (y - y^*)\)。这样一来,问题便被转化为,寻找
\(A_0\) 使得 \(J(y, f(A_0, x))\) 可以取到最小值。

由于对于给定的训练数据 \(y\) 是定值,为了直观,不妨记
\(J(y, f(A, x)) = h(A, x)\),这样一来我们需要解决的问题便是:

求参数 \(A\) 使得函数 \(h(A, x)\) 可以取到最小值。

这是我们在微积分的学习中经常解决的一类问题,只需要求出
\({\partial h(A, x)} / {\partial A}\) 并令其为 0
即可。但是事实上,对 \(h\)
求导函数几乎是不可能的,我们常用的方法是在每次迭代中,求出 \(h\)
在某个点 \(A_0\)
处的导数值,并根据这个导数值的正负和绝对值大小适当地调整 \(A\)
并进入下一轮迭代。这种方法被称作梯度下降法,他有一个显著的缺点就是他只能求得局部最小值(这是显然的),但考虑到通常神经网络的局部最小值已经足够优秀,我们便勉强可以接受这个缺点的存在。然而即便有了梯度下降法的思路,我们也需要一种可以求出导数值的算法,本文将描述的反向传播算法(Back
Propagation Algorithm,常简称 BP 算法)即是一例。

\section{推导}

\subsection{符号定义}

为了方便推导过程的说明,在这里重新进行符号定义,接下来的推导过程将不会使用背景中使用的符号体系。

符号规约: 
\begin{itemize}
\item 第 \(l - 1\) 层的第 \(k\) 个神经元传播给第 \(l\) 层的第 \(j\) 个神经元的值的权重记为 \(W_{jk}^{(l)}\),每一层的所有权重记为矩阵 \(W^{(l)}\),所有的参数笼统地记作 \(W\); 
\item 第 \(l\) 层的第 \(j\) 个神经元的偏移值记为 \(b_j^{(l)}\),每层的所有偏移量记为向量 \(b^{(l)}\),所有的偏移笼统地记作 \(b\); 
\item 第 \(l\) 层的第 \(j\) 个神经元的输入值记为 \(z_j^{(l)}\),每层的所有输入值记为向量 \(z^{(l)}\); 
\item 第 \(l\) 层的第 \(j\) 个神经元的输出值记为 \(x_j^{(l)}\),每层的所有输出值记为向量 \(x^{(l)}\); 
\item 第 \(l\) 层的激活函数记为 \(\sigma_l\);(通常来讲每层神经元拥有一样的激活函数)
\item 第 \(l\) 层的神经元个数记为 \(s_l\); - 神经网络共有 \(n\) 层; 
\item 损失函数记为 \(J(W, b; y, y_0)\),其中 \(y_0\) 指真值,\(y\) 指网络的输出值;(在一次迭代中,\(y\) 和 \(y_0\) 是常数,因此后面将略去这两个参数) 
\item \({\partial J(W, b)}/{\partial z_j^{(l)}}\) 记为 \(\Delta_j^{(l)}\),一层的所有 \(\Delta\) 记作 \(\Delta^{(l)}\); 
\item 训练集为 \(T = \{(x_0, y_0), (x_1, y_1), ..., (x_m, y_m)\}\),且 \(|T| = m\); 
\item 被应用于矩阵或向量间的 \(*\) 运算指对位乘法。
\end{itemize} 
根据定义,显然有:

$$
z_j^{(l+1)} = \left(\sum_{k=0}^{s_{(l-1)}} W_{jk}^{(l)} x_k^{(l - 1)}\right) + b_j^{(l)} \eqno(a)
$$

$$
x_j^{(l)} = \sigma_l(z_j^{(l)}) \eqno(b)
$$

\subsection{证明目的}

给出一种算法以计算任意神经网络的 \(\partial J / \partial W_{jk}^{(l)}\) 和 \(\partial J / \partial b_{j}^{(l)}\)。出于篇幅的关系,本文仅说明对前者的计算,略去证明过程一致的后者证明部分。

\subsection{证明过程}

由链式法则知:

$$
{\partial J(W, b) \over \partial W_{jk}^{(l)}} = {\partial J(W, b) \over \partial x_j^{(l+1)}}{\partial x_j^{(l+1)} \over \partial z_j^{(l+1)}}{\partial z_j^{(l+1)} \over \partial W_{jk}^{(l)}} \eqno(0)
$$

将偏差拆分成了三部分,接下来分别对三个部分进行求解。

\paragraph{2.3.1. 第一部分}

对于第一部分有

$$
\begin{aligned}
{\partial J(W, b) \over \partial x_j^{(l+1)}} 
&= \sum_{i = 1}^{s_{l + 2}} {\partial J \over \partial z_i^{(l+2)}} {\partial z_i^{(l+2)} \over \partial x_j^{(l+1)}} \\
&\overset{(a)}= \sum_{i = 1}^{s_{l+2}} {\partial J \over \partial z_i^{(l+2)}} {\partial \over \partial x_j^{(l+1)}} \left(b_j^{(l+1)} + \sum_{k = 0}^{s_{l+1}}{W_{ji}^{(l+1)}x_i^{(l+1)}}\right) \\
&= \sum_{i = 1}^{s_{l+2}} \Delta_i^{(l+2)} W_{ji}^{(l)}
\end{aligned} \eqno(2)
$$

\paragraph{2.3.2. 第二部分}

对于第二部分有

\[
\begin{aligned}
  \partial x_j^{(l+1)} \over \partial z_j^{(l+1)}
  &\overset{(b)}= {\partial \over \partial z_j^{(l+1)}} \sigma_{l+1}(z_j^{(l+1)}) \\
  &= \sigma_{l+1}'(z_j^{(l+1)})
\end{aligned}
\]

对于激活函数 \(\sigma_l\) 来说,假设存在函数 \(f_l\) 使得 
\[
f_l(\sigma_l(x)) = \sigma_l'(x)
\]

则有

\[
\begin{aligned}
  {\partial x_j^{(l+1)} \over \partial z_j^{(l+1)}} = f^{(l+1)}(x_j^{(l+1)}
\end{aligned} \tag{2}
\]

\paragraph{2.3.3. 第三部分}

\[
\begin{aligned}
  {\partial z_j^{(l+1)} \over \partial W_{jk}^{(l)}}
  &\overset{(a)}= {\partial \over \partial W_{jk}^{(l)}} \left( b_j^{(l)} + \sum_{k=0}^{n_{l-1}} W_{jk}^{(l)} x_k^{(l - 1)}\right) \\
  &= x_j^{(l)}
\end{aligned} \tag{3}
\]

\paragraph{2.3.4. 综合}

综合 \((0)\),\((1)\),\((2)\),\((3)\) 式可得 
\[
\begin{aligned}
  \left(\sum_{i = 1}^{s_{l+2}} \Delta_i^{(l+2)} W_{ji}^{(l)}\right) f^{(l+1)}(x_j^{(l+1)})x_j^{(l)}
\end{aligned} \tag{4}
\]

又因为 
\[
\Delta_j^{(l+1)} = \frac{\partial J(W, b)}{\partial z_j^{(l + 1)}} = {\partial J(W, b) \over \partial x_j^{(l+1)}} {\partial x_j^{(l+1)} \over \partial z_j^{(l+1)}} \overset{(1), (2)}{=} \left(\sum_{i = 1}^{s_{l+2}} \Delta_i^{l+2} W_{ji}^{(l)}\right) f^{(l+1)}(x_j^{(l+1)}) \tag{5}
\]

其中 \( 0 < j < s_{l} + 1 \),\( 0 < l < n \).

\paragraph{2.3.5. 向量形式改写}

写作向量形式有

\[
\frac{\partial J(W, b)}{\partial W^{(l)}} = \Delta^{(l+1)} \left(x^{(l)}\right)^T \tag{4*}
\]

\[
\Delta^{(l)} = \left(W^{(l)}\right)^T \Delta^{(l+1)} * f_l(x^{(l+1)})  \tag{5*}
\]

\paragraph{2.3.6. 边界条件}

上文中我们求得了两个递推公式。显然,对于 \((5^*)\) 式来说,由于
\(l = n\) 时 \(l + 1\)
越界,所以不可以应用于该情况。对于该边界情况应当额外考虑。

\[
\begin{aligned}
  \Delta_j^{(n)} 
  &= \frac{\partial J(W, b; y, y_0)}{\partial z_j^{(n)}} \\
  &\overset{y = x^{(n)}}= \frac{\partial J(W, b; x^{(n)}, y_0)}{\partial x_i^{(n)}} \frac{\partial x_i^{(n)}}{\partial z_i^{(n)}} \\
  &\overset{(2)}= \frac{\partial J(W, b; x^{(n)}, y_0)}{\partial x_i^{(n)}} f^{(n)}(x_j^{(n)})
\end{aligned} \tag{6}
\]

之后的计算与损失函数的具体形式有关,无法一般地给出,但考虑到接下来的运算都是显而易见的,此处略去无伤大雅。

\section{结论}

通过一个边界条件和两个递推公式: 
\[
\begin{cases}
  \Delta_j^{(n)} = \frac{\partial J}{\partial x_i^{(n)}}(W, b; x^{(n)}, y_0) f^{(n)}(x_j^{(n)}) \\
  \frac{\partial J}{\partial W^{(l)}}(W, b) = \Delta^{(l+1)} \left(x^{(l)}\right)^T \\
  \Delta^{(l)} = \left(W^{(l)}\right)^T \Delta^{(l+1)} * f_l(x^{(l+1)})
\end{cases} \eqno(conclusion)
\] 
可以完成一次传播中对神经网络的求导过程。

\end{document}

猜你喜欢

转载自www.cnblogs.com/rabbull/p/10995697.html