第五周 神经网络训练

https://www.coursera.org/learn/machine-learning/home/week/5

变量约定:

  • $s_l$ = 第 $l$ 层的神经元数,不包含偏置单元
  • $K$ = 输出层神经元数目,对应分类类别数目($K \geq 3$)
  • $\Theta$ 表示矩阵,$\Theta^{(l)}$ 表示第 $l$ 层的参数矩阵

Cost Function

回顾正则化逻辑回归的 cost function:

而 neural network 的则复杂一些:

最终的输出是 K 维向量

表示的是 K 维向量 第 $k$ 个分量

其中正则化项的求和部分

表示每层的参数矩阵元素的平方和。注意,起始值都是从1 开始,即不包括偏置单元参数。

其中误差部分

表示 所有样本在输出层每个神经元的联合概率(求对数)。

Forward propagation Algorithm

前向传播算法。

以一个样本,4层网络为例,前向传播算法如下

Back propagation Algorithm

以此图为例,省去了 Bias unit。

$x_1, x_2, x_3$ 是 $\mathbf{x}$ 的三个特征。

$\mathbf{z}_j^{(l)}$ 为第 $l$ 层的第 $j$个单元的输入值。

$\mathbf{a}_j^{(l)}$ 为第 $l$ 层的第 $j$个单元的输出值。其中 $\mathbf{a}=g(\mathbf{z})$,$g$ 为 sigmoid 函数。

$\pmb{\Theta}_{ij}^{(l)}$ 为第$l$层到$l+1$层的参数矩阵

BP 算法的具体过程

$
\text{for i = m} \\
\hspace{2em} a^{(1)}=x \\
\hspace{2em} 使用前馈传播算法计算 a^{(2)},a^{(3)} \\
\hspace{2em} \delta^{(3)}=a^{(3)}-y \\
\hspace{2em} \delta^{(2)}=(\Theta^{(2)})^T \delta^{(3)} \cdot g’(z^{(2)}) \\
\hspace{2em} \Theta^{(2)}=\Theta^{(2)}+a^{(2)}\delta^{(3)} \\
\hspace{2em} \Theta^{(1)}=\Theta^{(1)}+a^{(1)}\delta^{(2)} \\
\text{end}
$

BP 算法的直观图解

自顶向下(对应神经网络模型为自输出层向输入层)层层求偏导。因为神经网络的复杂性,人们总是深陷于求多元函数偏导的泥潭中无法自拔:到底该对哪个变量求导?理顺了神经网络中各数据点之间的关系,谁是谁的输入值,谁是谁的函数一清二楚,然后就可以畅快地使用链式法则了。

所以 BP 算法即反向传播算法,就是自顶向下求代价函数 $J(\Theta)$ 对各个参数 $\Theta_{ij}^{(l)}$ 偏导的过程,对应到神经网络模型中即自输出层向输入层层层求偏导。在上图,当反向传播到 $a^{(2)}_1$ 结点时,遇到分叉路口:选择对 $\Theta_{ij}^{(l)}$ 求偏导,即可得到第二层的参数梯度。而若选择对 $a^{(2)}_1$ 这条路径继续向下求偏导,就可以继续向下传播,继续向下求偏导,最终可得到第一层的参数梯度,于是就实现了 BP 算法的目的。在选择分叉路口之前,使用 $\delta^{(l)}$ 来保存到达分岔路口时的部分结果。那么如果选择继续向下求偏导,则还可以使用这个部分结果继续向下逐层求偏导。从而避免了大量的重复计算,有效地提升了神经网络算法的学习速度。

因此可以观察到 BP 算法两个突出特点:

  1. 自输出层向输入层(即反向传播),逐层求偏导,在这个过程中逐渐得到各个层的参数梯度。
  2. 在反向传播过程中,使用 $\delta^{(l)}$ 保存了部分结果,从而避免了大量的重复运算。

BP 算法步骤的详解与推导过程

BP 算法的目的在于为优化函数(比如梯度下降、其它的高级优化方法)提供梯度值,即使用 BP 算法计算代价函数(cost function)对每个参数的偏导值,其数学形式为:$\frac{\partial}{\partial \Theta_{ij}^{(l)}}J(\Theta)$。

若神经网络有 K 个输出(K classes),那么其 $J(\Theta)$ (不考虑正则化项)为:

为了便于推导,先只考虑一个样本(Loss 函数)则,

先计算 $\Theta_{11}^{(2)}$ 的梯度

已知以下关系(向量形式)

sigmoid 函数求导

先求 式1 的前两部分,令

再求 式1 的最后一项,已知 $z_1^{3}=\Theta^{(2)}_{11}a^{(2)}_1+\Theta^{(2)}_{12}a^{(2)}_2+\Theta^{(2)}_{13}a^{(2)}_3$

所以由 式2,式3 得

再计算 $\Theta_{11}^{(1)}$ 的梯度

已知 $z_1^{3}=\Theta^{(2)}_{11}a^{(2)}_1+\Theta^{(2)}_{12}a^{(2)}_2+\Theta^{(2)}_{13}a^{(2)}_3$ 和 $a^{(2)}_1=g(z^{(2)}_1)$

同理先求 式4 的前4项,令

于是 $\delta^{(l)}$ 的意义就体现出来了:它是用来保存上一次计算的部分结果。在计算 $\delta^{(l-1)}$ 时,可以使用这个部分结果继续向下逐层求偏导。这样在神经网络特别复杂、有大量计算时就可以节省大量重复的运算,从而有效地提高神经网络的学习速度。这里给出定义

并且由 式5 和 式2 可以推出其计算规则

继续求 式4 的最后一项,已知 $z_1^{2}=\Theta^{(1)}_{11}a^{(1)}_1+\Theta^{(1)}_{12}a^{(1)}_2+\Theta^{(1)}_{13}a^{(1)}_3$,则

由 式a、式b 得出

综上计算过程如下:

  • 初始化 $\Theta \neq 0$
  • 初始化 $a^{(1)} = x^{(1)}$
  • 计算所有的 $a,z$
    $
    \begin{cases}
    z^{(l+1)}= \Theta^{(l)}a^{(l)} \\
    a^{(l)}=g(z^{(l)})
    \end{cases}
    $
  • 计算所有的 $delta$
    $
    \delta^{(l)} = \begin{cases}
    a^{L} -y & (l=L) \\
    (\Theta^{(l)})^T \delta^{(l+1)} \cdot a^{(l)}(1-a^{(l)}) &(1<l<L)
    \end{cases}
    $
  • 计算所有的偏导数
    $
    \frac{\partial J(\Theta)}{\partial \Theta_{ij}^{(l)}} = \delta^{(l+1)}_ia^{(l)}_i
    $
  • 计算m个样本梯度之和(每个样本都能算出一个 $\delta,a$)
    $
    \Delta^{(l)}_{ij}= \sum_{t=1}^{m}\left(\delta^{(l+1)}_ia^{(l)}_i \right)
    $
  • 添加 L2 惩罚项导数后,计算梯度
    $
    D^{(l)}_{ij}= \begin{cases}
    \frac{1}{m}(\Delta^{(l)}_{ij}+\lambda\Theta^{(l)}_{ij}) & (j \neq 0)\\
    \frac{1}{m}\Delta^{(l)}_{ij} & (j=0)
    \end{cases}
    $
  • 更新 $\Theta$
    $
    \Theta^{(l)} := \Theta^{(l)} + \alpha D^{(l)}
    $

- - - - - - - - End Thank For Your Reading - - - - - - - -
0%