机器学习-神经网络与深度学习

机器学习—神经网络与深度学习

神经网络与深度学习:
(一)感知机和多层网络
(二)误差逆传播算法
(三)神经网络的优化技巧
(四)深度学习的基本概念
(五)常见的深度网络结构

(零)前置知识

0 基本概念

0.1 点到直线的距离

若空间中直线方程为\(Ax+By+C=0\),点P的坐标为\((x_0,y_0)\)

\[d = \frac{Ax_0+By_0+C}{\sqrt{A^2+B^2}}点到直线的距离 \]

0.2 超平面(Hyperplanes)

超平面是在空间\(R^d\)中的一个子空间\(R^{d-1}\)
在二维空间中的超平面是一条线,在三维空间的超平面是一个平面。

0.3 欧式距离(Euclidean Metric)

二维空间公式

\[\rho = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2} \\ |X| = \sqrt{x_2^2+y_2^2} \]

三维空间公式

\[\rho = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2 + (z_2-z_1)^2} \\ |X| = \sqrt{x_2^2 + y_2^2 + z_2^2} \]

n维空间公式

\[d(x,y) := \sqrt{(x_2-x_1)^2 + (x_2-y_2)^2 + \cdots + (x_n-y_n)^2} = \sqrt{\sum \limits_{i=1}^{n}(x_i-y_i)^2} \]

0.4 样本到超平面距离

我们假设超平面是\(h = w \cdot x+b\),其中\(w= (w_0,w_1,\cdots,w_m)\),\(x=(x_0,x_1,\cdots,x_m)\)
样本点\(x^{'}\)到超平面的距离如下:

\[d = \frac{w \cdot x^{'}+b}{||w||} \]

0.5 几种函数的区分与认识
  • 损失函数:用来衡量单个样本预测值与真实值的误差,是一个非负实值函数,损失函数越小,则预测正确程度越高。表示为

    \[L(y_i,f(x_i)) \]

  • 代价函数:定义在训练集上,是模型关于训练集的平均损失(也称为经验风险函数),表示为

    \[\frac{1}{N}\sum \limits_{i=1}^{N}L(y_i,f(x_i)) \]

  • 风险函数:是指损失函数的期望,(又称期望损失),由于输入\(X\)和输出\(Y\)是随机变量,那么可求得联合分布\(P(X,Y)\),所以可以表示为:

\[R_{exp}(f) = E_p[L(Y,f(X))] = \int_{X,Y}L(y,f(x))p(x,y)dxdy \]

  • 目标函数:是一个更为广的概念,比如最小化结构风险求最优模型时,结构化风险函数就是目标函数,而最小化经验风险求最优模型时,经验风险函数就是目标函数,简单地说,目标函数就是需要优化的函数。
0.6 梯度的理解及其应用

我们先来回顾以下几个熟悉的概念,导数、偏导数、方向导数,从而根据他们的实际意义来引出并理解梯度。

  • 导数
    导数的定义
      

    \[f'(x) = \underset{\Delta x \to 0}{lim} \frac{\Delta y}{\Delta x} \frac{f(x_0+\Delta x) - f(x_0)}{\Delta x} \]

    这里补充相关符号的意义及关系,如下

    \(\Delta x\): \(x\)的变化量 ;

    \(dx\): \(x\)的变化量\(\Delta x\)趋于0时,则记作微元\(dx\)
    \(\Delta y\)\(\Delta y =f(x_0 + \Delta x)-f(x_0)\),是函数的增量;

    \(dy\): \(dy = f'(x_0)dx\),是切线的增量;
    \(\Delta x \to 0\)时,\(dy\)\(\Delta y\)都是无穷小,\(dy\)\(\Delta y\)的主部,即\(\Delta y=dy + o(\Delta x)\)

    导数的意义,反映的是函数\(y=f(x)\)在某一点处沿\(x\)轴正方向的变化率/变化趋势。

  • 偏导数
    偏导数的定义

    \[\frac{\partial}{\partial x_j}f(x_0,x_1,...,x_n) = \underset{\Delta x \to 0}{lim} \frac{\Delta y}{\Delta x} = \underset{\Delta x \to 0}{lim} \frac{f(x_0,x_1,...,x_n) - f(x_0,...,x_j,...,x_n)}{\Delta x} \]

    与导数的区分
      可以看到,导数与偏导数本质上是一致的,都是当自变量的变化量趋于0时候,函数值的变化量与自变量变化量比值的极限。直观地说,偏导数也就是函数在某一点上沿某一坐标轴正方向的变化率。
    与导数的区别在于:
    导数,指的是一元函数中,函数\(y=f(x)\)在某一点处沿\(x\)轴正方向的变化率。
    偏导数,指的是多元函数中,函数\(y=f(x_1,x_2,...,x_n)\)在某一点处沿某一坐标轴\((x_1,x_2,...,x_n)\)正方向的变化率。

  • 方向导数
    方向导数的定义

    \[\frac{\partial}{\partial l}f(x_0,x_1,...,x_n) = \underset{\rho \to 0}{lim} \frac{\Delta y}{\Delta x} = \underset{\rho \to 0}{lim} \frac{f(x_0+\Delta x_0,x_1+\Delta x_1,...,x_n+\Delta x_n) - f(x_0,x_1,...,x_n)}{\rho} \\ \rho = \sqrt{(\Delta x_0)^2 + (\Delta x_1)^2 + ...+ (\Delta x_j)^2 + ... +(\Delta x_n)^2} \]

    方向导数的意义为,某一点在某一趋近方向上的导数值。通俗地说,方向导数就是函数在某一特定方向上的变化率。

  • 梯度: 对于可微的数量场\(f(x,y,z)\),以\(\left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y},\frac{\partial f}{\partial z}\right)\)为分离的向量场,称为\(f\)的梯度(或斜量)
    梯度定义

    \[grad f(x_0,x_1,...,x_n) = \left(\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial x_1},...,\frac{\partial f}{\partial x_j},...,\frac{\partial f}{\partial x_n} \right) \]

     梯度的提出是为回答一个问题:
     函数在变量空间的某一点处,沿着哪一个方向有最大的变化率?
     梯度定义如下:
     函数在某一点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。

     这里注意三点:
      1)梯度是一个向量,即有方向有大小;
      2)梯度的方向是最大方向导数的方向;
      3)梯度的值是最大方向导数的值。

我们若将偏导数和方向导数看作是一个向量,向量的方向即为变化率的方向,向量的模即为变化率的大小。那么梯度的意义,就可以理解为,函数在某一点最大的方向导数,函数沿梯度方向,函数有最大的变化率。也即可沿着梯度的方向去求极值。

  梯度下降法(gradient descent)是一个最优化算法,常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型。顾名思义,梯度下降法的计算过程就是沿梯度下降的方向求解极小值(也可以沿梯度上升方向求解极大值)。其迭代公式为

\[a_{k+1} = a_{k} + \rho_k s^{-(k)} \]

  其中\(s^{-(k)}\)代表梯度的负方向,\(\rho_k\)表示梯度方向上的搜索步长。梯度方向我们可以通过对函数求导得到,步长的确定比较麻烦,步长太大可能会发散,太小则收敛速度又慢。一般确定步长的方法是由线性搜索算法来确定,即把下一个点的坐标看作是\(a_{k+1}\)的函数,然后求满足\(f(a_{k+1})\)的最小值\(a_{k+1}\)即可。

  一般情况下,梯度向量为0则说明到了一个极值点,此时梯度的幅值也为0。而采用梯度下降算法进行最优化求解时,算法迭代的终止条件是梯度向量的幅值接近0即可,可以设置非常小的常数阈值。
  
  在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

0.7 全局最小与局部极小

  模型学习的过程,实质上就是一个寻找最优参数的过程,例如BP算法试图通过最速下降来寻找使得累积经验误差最小的权值与阈值,在谈到最优时,一般会提到局部极小和全局最小。

局部极小解:参数空间中的某个点,其领域点的误差函数值均不小于该点的误差函数值。
全局最小解:参数空间中的某个点,所有其他点的误差函数值均不小于该点的误差函数值。

  要成为局部极小点,只要满足该点在参数空间上的梯度为零。
  局部极小点可以有多个,而全局最小只有一个。
  全局最小一定是局部极小,但局部最小却不一定是全局最小。 
(如下图中有两个局部极小,但只有其中之一是全局最小)

 

在很多机器学习算法中,在参数寻优过程时,都试图找到目标函数的全局最小。

 

(一)感知机和多层网络

0.神经元模型

神经元(neuron)模型是神经网络中最基本的成分,也即上述定义总的“简单单元”。在生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一定的“阈值”(threshold),那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。
  

  上述情形抽象为简单的模型,称为“M-P神经元模型”。

\(y = f\left(\sum \limits_{i=1}^n w_ix_i - \theta\right)\)
其中,\(x_i\)可理解为第i个相邻神经元发送的化学物质量,
\(w_i\)可理解为单位化学物质对于当前神经电位的影响,
\(w_ix_i\)表示第i个神经元对当前神经元电位的影响(增加or减少),
假设当前神经元的电位原本为0,则\(\sum_1^nw_ix_i\)表示当前神经元的电位,
将其与阈值\(\theta\)相减,若大于0,则神经元处于兴奋状态,
用激活函数\(f\)表示本神经元向下一个神经元发送的化学物质数量,也即为传递信号。

  在这个模型中,神经元接收到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接(connection)进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”(activation function)处理以产生神经元的输出。

  理想中的激活函数是下图所示的阶跃函数,它将输入值映射为输出值“0”或“1”,显然,“1”对应于神经元兴奋,“0”对应于神经元抑制。然而,阶跃函数具有不连续、不光滑等不太好的性质,因此实际常用Sigmoid函数作为激活函数。典型的Sigmoid函数,如下图所示,它把可能在较大范围内变化的输入值挤压到(0,1)输出值范围内,因此有时也称为“挤压函数”(squashing function)。

我们把许多个这样的神经元按一定层次结构连接起来,就得到了神经网络。

1.感知机

  感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。

感知机(Perceptron)由两层神经元组成,如下图所示,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元(亦称“阈值逻辑单元”)(threshold logic unit)

感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。
感知机学习算法具有简单而易于实现的优点,分为原始形式对偶形式
感知机预测是用学习得到的感知机模型对新的输入实例进行分类。

1.1 感知机模型

感知机定义:假设输入空间(特征空间)是\(X⊆R^n\),输出空间是\(y={+1,-1}\).输入\(x∈X\)表示实例的特征向量,对应于输入空间(特征空间)的点;输出\(y∈y\)表示实例的类别。由输入空间到输出空间的如下函数:

\[f(x) = sign(w \cdot x+b) \]

称为感知机。其中,\(w\)\(b\)为感知机模型参数,\(w∈R^n\)叫作权值(weight)或者权值向量(weight vector),\(b∈R\)叫作偏置(bias),\(w \cdot x\)表示\(w\)\(x\)的内积。\(sign\)是符号函数,即

\[sign(x) = \left\{\begin{matrix} +1, \quad x≥0 \\ -1, \quad x<0 \end{matrix}\right. \]

  感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中所有线性分类模型(linear classification model)或线性分类器(linear classifier),即函数集合{\(f|f(x)=w \cdot x+b\)}.
 
  感知机有如下几何解释:线性方程

\[y = w \cdot x+b = 0 \]

对应于特征空间\(R^n\)中的一个超平面\(S\),其中\(w\)是超平面的法向量,\(b\)是超平面的截距。这个超平面将特征空间划分为两个部分。位于两部分的点(特征向量)分别被分为正、负两类。因此,超平面S称为分离超平面(separating hyperplane),如下图所示

1.2 感知机学习策略
1.2.1 数据集的线性可分性

数据集的线性可分性的定义:给定一个数据集

\[T = \left\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N) \right\} \]

其中,\(x_i∈X = R^n,y_i∈y=\left\{+1,-1\right\},i=1,2,\cdots,N\),如果存在某个超平面\(S\)

\[w \cdot x+b = 0 \]

能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即

\[\left\{\begin{matrix} 对所有y_i=+1的实例, \quad 有w*x_i+b > 0 \\ 对所有y_i=-1的实例, \quad 有w*x_i+b < 0 \end{matrix}\right. \]

则称数据集T为线性可分数据集(linearly separable data set);否则,称数据集合T线性不可分。

1.2.2 感知机学习策略

  假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例和负实例点完全正确分开的分离超平面。为了找出这样的超平面,即确定感知机模型参数\(w,b\),需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化

  损失函数的一个自然选择是误分类点的总数。但是,这样的损失函数不是参数\(w,b\)的连续可导函数,不易优化。损失函数的另一个选择是误分类点到超平面S的总距离,这是感知机所采用的。
为此,首先写出输入空间\(R^n\)中任一点\(x_0\)到超平面S的距离:

\[\frac{1}{||w||}|w*x_0+b| \]

其中,\(||w||\)\(w\)\(L_2\)范数,(也即为欧式距离\(||w|| = \sqrt{w_1^2+w_2^2+...+w_n^2}\))。
  其次,对于误分类的数据(\(x_i,y_i\))来说,\(-y_i(w \cdot x_i+b)>0\)成立。因为当\(w \cdot x_i+b>0\)时,\(y_i=-1\);而当\(w\cdot _i+b<0\)时,\(y_i=+1\)。因此,误分类点\(x_i\)到超平面S的距离是

\[-\frac{1}{||w||}y_i(w \cdot x_0+b) \]

  这样,假设超平面S的误分类点集合为M,那么所有误分类点到超平面S的总距离为

\[\frac{1}{||w||}\sum \limits_{x_i∈M}y_i(w \cdot x_0+b) \]

  若不考虑\(\frac{1}{||w||}\),就得到感知机学习的损失函数。\(\sum \limits_{x_i∈M}y_i(w \cdot x_0+b)\)也称为样本点的函数间隔。

(为何可不考虑\(\frac{1}{||w||}\)?)
  这是因为,编置\(b\)可以定义为\(b = w_0x_0\),其中\(x_0=1\),将\(b\)吸收进\(w\)里面。这样一来,总距离就转变成\(-\frac{1}{||w||}\sum_{x_i∈M}y_iw \cdot x_i\)
  由此,分子与分母都含有\(w\),当分子的\(w\)扩大N倍时,分母的L2范数也会扩大N倍数。也就是说,分子和分母有固定的倍数关系。那么我们可以固定分子或者分母为1,然后求分母的倒数或者分子自己的最小化作为损失函数,这样可以简化我们的损失函数。在感知机模型中,我们采用的是保留分子。

  给定一个数据集

\[T = \left\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N) \right\} \]

其中,\(x_i∈X = R^n,y_i∈y=\left\{+1,-1\right\},i=1,2,\cdots,N\).
感知机\(sign(w \cdot x+b)\)学习的损失函数定义为

\[L(w,b) = -\sum \limits_{x_i∈M}y_i(w \cdot x_i+b) \]

其中M为误分类点的集合。(这个损失函数就是感知机学习的经验风险函数。)
  显然,损失函数\(L(w,b)\)是非负的。如果没有误分类点,损失函数值是0。而且,误分类点越少,误分类点离超平面越近,损失函数就越小。
  对于一个特定的样本点的损失函数:在误分类时是参数\(w,b\)的线性函数,在正确分类时是0。因此,给定训练数据集T,损失函数\(L(w,b)\)\(w,b\)的连续可导函数。
  感知机学习的策略是在假设空间中选取使损失函数\(L(w,b) = -\sum \limits_{x_i∈M}y_i(w \cdot x_i+b)\)最小的模型参数\(w,b\),即为感知机模型。

1.2.3 感知机学习算法

感知机学习问题转化为求解损失函数式\(L(w,b) = -\sum \limits_{x_i∈M}y_i(w \cdot x_i+b)\)的最优化问题,最优化的方法是随机梯度下降法。

1.2.3.1 感知机学习算法的原始形式
感知机学习算法是对以下最优化问题的算法。给定一个数据集

\[T = \left\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N) \right\} \]

其中,\(x_i∈X = R^n,y_i∈y=\left\{+1,-1\right\},i=1,2,\cdots,N\),求参数\(w,b\),使其为以下损失函数极小化问题的解

\[\underset{w,b} min L(w,b) = -\sum \limits_{x_i∈M}y_i(w \cdot x_i+b) \]

其中M为误分类点的集合。

  感知机学习算法是误分类驱动的,具体采用随机梯度下降法(stochastic gradient descent)。
首先,任意选取一个超平面\(w_0,b_0\),然后用梯度下降法不断地极小化目标函数\(\underset{w,b} min L(w,b) = -\sum \limits_{x_i∈M}y_i(w \cdot x_i+b)\)。极小化过程不是一次使M中所有误分类点的梯度下降,而是依次随机选取一个误分类点使其梯度下降。
  
  假设误分类点集合M是固定的,那么损失函数\(L(w,b)\)的梯度由下面给出

\[▽_wL(w,b) = -\sum \limits_{x_i∈M}y_ix_i \\ ▽_bL(w,b) = -\sum \limits_{x_i∈M}y_i \]

随机选取一个误分类点(\(x_i,y_i\)),对\(w,b\)进行更新:

\[w ← w + \eta y_ix_i\\ b ← b + \eta y_i \]

其中,\(\eta(0<\eta≤1)\)是步长,在统计学习中又称为学习率(learning rate)。这样,通过迭代可以期待损失函数\(L(w,b)\)不断减小,直到为0。
综上所述,得到如下算法:

[算法](感知机学习算法的原始形式)
输入:训练数据集\(T = \left\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N) \right\}\),其中\(x_i∈X = R^n,y_i∈y=\left\{+1,-1\right\},i=1,2,\cdots,N\),学习率\(\eta(0<\eta≤1)\);
输出:\(w,b\);感知机模型\(f(x) = sign(w \cdot x+b)\).
(1)选取初值\(w_0,b_0\);
(2)在训练集中选取数据(\(x_i\),\(y_i\));
(3)如果\(y_i(w \cdot x+b)≤0\),

\[w ← w + \eta y_ix_i\\ b ← b + \eta y_i \]

(4)转至(2),直至训练集中没有误分类点。
[注]这种学习算法直观上有如下解决:当一个实例点被误分类,即位于分离超平面的错误一侧时,则调整\(w,b\)的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面间的距离,直至超平面越过该误分类点使其被正确分类。本算法是感知机学习的基本算法,对应于后面的对偶形式,称为原始形式。感知机学习算法简单且易于实现。

[例1]试用感知机学习算法的原始形式求感知机模型。
如下图所示的训练数据集,其正实例点是\(x_1=(3,3)^T,x_2=(4,3)^T\),负实例点是\(x_3=(1,1)^T\),试用感知机学习算法的原始形式求感知机模型\(f(x)=sign(w \cdot x+b)\). 这里,\(w=(w^{(1)},w^{(2)})^T,x=(x^{(1)},x^{(2)})^T\)

: 构建最优化问题:

\[\underset{w,b}min L(w,b) = -\sum \limits_{x_I∈M}y_i(w\cdot x_i+b) \]

按感知机学习算法的原始形式算法,求解\(w,b\)\(\eta=1\)
(1) 取初值\(w_0=0,b_0=0\)
(2) 对\(x_1=(3,3)^T,y_1(w_0+x_1+b_0)=0\),未能被正确分类,更新\(w,b\)

\[w_1 = w_0 + y_1x_1 = (3,3)^T,\quad b_1 = b_0 + y_1 = 1 \]

得到线性模型

\[w_1 \cdot x+b_1 = 3x^{(1)}+3x^{(2)}+1 \]

(3) 对\(x_1,x_2\),显然,\(y_i(w_1\cdot x_i+b_1)>0\),被正确分类,不修改\(w,b\)
\(x_3=(1,1)^T,y_3(w_1 \cdot x_3+b_1)<0\),被误分类,更新\(w,b\)

\[w_2 = w_1 + y_3x_3 = (2,2)^T,\quad b_2 = b_1 + y_3 = 0 \]

得到线性模型

\[w_2*x + b_2 = 2x^{(1)} + 2x^{(2)} \]

如此继续下去,直到

\[W_7 = (1,1)^T,\quad b_7 = -3\\ w_7 \cdot x + b_7 = x^{(1)}+x^{(2)} - 3 \]

详细迭代过程见下表:

对所有数据点\(y_i(w_7 \cdot x_i+b_7)>0\),没有误分类点,损失函数达到极小、
分类超平面为:\(x^{(1)}+x^{(2)} - 3\) =0
感知机模型为:\(f(x) = sign(x^{(1)}+x^{(2)}-3)\)

 这是在计算中误分类点先后取\(x_1,x_3,x_3,x_3,x_1,x_3,w_3\)得到的分离超平面和感知机模型。如果在计算中误分类点依次取\(x_1,x_3,x_3,x_3,x_2,x_3,x_3,x_3,x_1,x_3,x_3\),那么得到的分离超平面是\(2x^{(1)}+x^{(2)}-5=0\),得到的感知机模型为:\(f(x) = sign(2x^{(1)}+x^{(2)}-5)\)

  由此可见,感知机学习算法由于采用不同的初值或选取不同的误分类点,解可以不同。

1.2.3.2 感知机学习算法的对偶形式

感知机学习的对偶形式的基本想法是,将\(w\)\(b\)表示为实例\(x_i\)和标记\(y_i\)的线性组合的形式,通过求解其系数而求得\(w\)\(b\)。不失为一般性,在原始形式中,可以假设初始值\(w_0,b_0\)均为0。对误分类点\((x_i,y_i)\)通过

\[w ← w + \eta y_ix_i \\ b ← b + \eta y_i \]

逐步修改\(w,b\),设修改n次,则\(w,b\)关于\((x_i,y_i)\)的增量分别是\(\alpha_iy_ix_i\)\(\alpha_iy_i\),这里\(a_i=n_i\eta\)
这样,从学习过程不难看出,最后学习到的\(w,b\)可以分别表示为

\[w = \sum \limits_{i=1}^{N}\alpha_iy_ix_i \\ b = \sum \limits_{i=1}^{N}\alpha_iy_i \]

这里,\(\alpha_i≥0,i=1,2,\cdots,N\),当\(\eta=1\)时,表示第\(i\)个实例点由于误分而进行更新的次数。实例点更新次数越多,意味着它距离分离超平面越近,也就越难正确分类。换句话说,这样的实例对学习结果影响最大。

[算法2](感知机学习算法的对偶形式)
输入:线性可分的数据集\(T = \left\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N) \right\}\),其中\(x_i∈X = R^n,y_i∈y=\left\{+1,-1\right\},i=1,2,\cdots,N\); 学习率\(\eta(0<\eta≤1)\);
输出:\(\alpha,b\); 感知机模型\(f(x) = sign(\sum \limits_{j=1}^{N}\alpha_jy_jx_j \cdot x+b)\),其中\(\alpha=(\alpha_1,\alpha_2,\cdots,\alpha_N)^T\)
(1) \(\alpha←0,b←0\);
(2) 在训练集中选取数据(\(x_i,y_i\));
(3) 如果\(y_i \left(\sum \limits_{j=1}^{N}\alpha_jy_jx_j \cdot x_i+b \right)≤0\),

\[\alpha_i ← \alpha_i + \eta \\ b ← b + \eta y_i \]

(4) 转至(2)直到没有误分类数据。
对偶形式中训练实例仅以内积分(“\(\cdot\)”)的形式出现。为了方便,可以预先将训练集中实例间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵(Gram matrix)

\[G = [x_i \cdot x_j]_{N×N} \]

[例2]试用感知机学习算法对偶形式求感知机模型。
数据同例1,正样本点是\(x_1=(3,3)^T,x_2 = (4,3)^T\),负样本点是\(x_3 = (1,1)^T\),试用感知机学习算法对偶形式求感知机模型。

(1) 取\(\alpha_i=0,i=1,2,3,b = 0,\eta = 1\)
(2) 计算Gram矩阵

\[G = \begin{bmatrix} 18 & 21 & 6 \\ 21 & 25 & 7 \\ 6 & 7 & 2 \end{bmatrix} \]

(3) 误分条件

\[y_i \left(\sum \limits_{j=1}^{N}\alpha_jy_jx_j \cdot x_i + b \right)≤0 \]

参数更新

\[\alpha_i ← \alpha_i + 1, \quad b ← b + y_i \]

(4)迭代过程。详见下表。

(5) 

\[w = 2x_1 + 0x_2 - 5x_3 = (1,1)^T \\ b = -3 \]

分离超平面 

\[x^{(1)} + x^{(2)} -3 = 0 \]

感知机模型

\[f(x) = sign(x^{(1)} + x^{(2)} -3) \]

与原始形式一样,感知机学习算法的对偶形式迭代也是收敛的,存在多个解。

1.2.4 感知机学习算法的收敛性

Novikoff定理:设训练数据集T= \(T = \left\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N) \right\}\)是线性可分的,其中\(x_i∈X = R^n,y_i∈y=\left\{+1,-1\right\},i=1,2,\cdots,N\),则有
(1) 存在满足条件\(||\hat w_{opt}||=1\)的超平面\(\hat w_{opt} \cdot \hat x= w_{opt}\cdot x+b_{opt}=0\)将训练数据集完全正确分开;且存在\(\gamma >0\),对所有\(i=1,2,\cdots,N\)

\[y_i(\hat w_{opt} \cdot\hat x_i) = y_i(w_{opt}\cdot x_i+b_{opt})≥\gamma \]

(2) 令\(R= \underset{1≤i≤N}{max} ||\hat x_i||\),则感知机算法在训练数据集上的误分类此时k满足不等式

\[k ≤ (\frac{R}{\gamma})^{2} \]

定理表明,误分类的次数k是有上界的,经过有限次搜索可以找到将训练数据完全正确分开的分离超平面。也就是说,当训练数据集线性可分时,感知机学习算法原始形式迭代是收敛的。并且,感知机学习算法存在许多解,这些解既依赖于初值的选择,也依赖于超平面增加约束条件。当训练集线性不可分时,感知机学习算法不收敛,迭代结果会发生震荡。

1.2.5感知机实现逻辑运算

感知机能容易地实现逻辑与&,或|,非!
若根据\(y = f(\sum_i{w_ix_i}-\theta)\),假定\(f\)为阶跃函数,有

  • “与”(\(x_1\)\(x_2\)):令\(w_1=w_2=1,\theta =2\),则\(y = f(1 \cdot x_1+1\cdot x_2-2)\),仅在\(x_1=x_2=1\)时,\(y=1\);

  • “或”(\(x_1∨x_2\)): 令\(w_1=w_2=1,\theta=0.5\),则\(y = f(1\cdot x_1+1 \cdot x_2-0.5)\),当\(x_1 = 1或x_2=1\)时,\(y=1\);

  • “非”(\(﹁x\)):令\(w_1 = -0.6,w_2 = 0,\theta =-0.5\),则\(y = f(-0.6 \cdot x_1+0\cdot x_2+0.5)\),当\(x_1=1\)时,\(y=0,y=1\)

更一般地,给定训练数据集,权重\(w_i(i=1,2,\cdots,n)\)以及阈值\(\theta\)可通过学习得到。阈值\(\theta\)可看作一个固定输入为-1.0的“哑节点”(dummy node)所对应的连接权重\(w_{n+1}\)。这样,权重和阈值的学习就可统一为权重的学习。
感知机学习规则非常简单,对训练样例(x,y),若当前感知机的输出为\(\hat y\),则感知机权重将这样调整:

\[w_i←w_i + \Delta w_i, \\ \Delta w_i = \eta(y - \hat y)x_i \]

其中\(\eta∈(0,1)\)称为学习率(learning rate)。
若感知机对训练样例\((x,y)\)预测正确,即\(\hat y = y\),则感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元(functional neuron),其学习能力非常有限。事实上,上述与、或、非问题都是线性可分(linearly separable)的问题。
若两类模式是线性可分的,即存在一个线性超平面能将它们分开,如下图所示,则感知机的学习过程一定会收敛(converge),而求得适当的权向量\(w=(w_1;w_2;\cdots,w_{n+1})\);否则若不收敛则感知机学习过程将会发生振荡(fluctuation),权向量\(w\)难以稳定并确定下来,不能求得合适解。

(单层)感知机甚至不能解决异或这样简单的非线性可分问题。如下图所示:

要解决非线性可分问题,需考虑使用多层功能神经元。
例如下图这个简单的两层感知机就能解决异或问题。

  如上图的网络结构称为“两层网络”,其中输出层和输入层之间的一层神经元,被称为隐层或隐含层(hidden layer)(故该网络结构也可称“单隐层网络”),隐含层和输出层都是拥有激活函数的功能神经元。

  更一般的,常见的神经网络是形如下图所示的层级结构((a)通常称为“两层网络”或“单隐层网络”)

每层神经元与下一层神经元全互连,神经元之间的不存在同层连接,也不存在跨层连接。这样的神经网络结构通常称为“多层前馈神经网络”(multi-layer feedforward neural network),其中输入层神经元接收外界输入,隐层与输出层神经元对信号进行加工,最终结果由输出层神经元输出;换言之,输入层神经元仅是接受输入,不进行函数处理,隐层与输出层包含功能神经元。

  神经网络的学习过程,就是根据训练数据来调整神经元之间的“连接权”(connection weight)以及每个功能神经元的阈值;换言之,神经网络“学”到的东西,蕴涵在连接权与阈值中。

2.多层网络

2.1 单层前馈神经网络

这里先回顾一下,单层前馈神经网络。将多个M-P神经元模型按层连接,就能得到单层前馈神经网络。

  单隐层前馈神经网络由输入层、隐含层、输出层组成,可简单模拟生物神经网络,每层神经元与下一层神经元连接,神经元之间不存在跨层连接、同层连接,输入层用于数据的输入,隐含层与输出层神经元对数据进行加工。

取出其中一个神经元进行讨论,其输入到输出的变换关系为

\[s_j = \sum \limits_{i=1}^{n}w_{ji}x_i - \theta_j \\ y_j = f(s_j) = \left\{\begin{matrix} 1, \quad s_j ≥ 0 \\ 0, \quad s_j < 0 \end{matrix}\right. \]

上式中,\(x=[x_1,x_2,\cdots,x_n]^T\)是输入特征向量,\(w_{ji}\)\(x_i\)\(y_j\)的连接权,输出值\(y_j(j=1,2,...,m)\)是按照不同特征的分类结果。

2.2 多层前馈神经网络

多层前馈神经网络有一个输入层,中间包含一个或多个隐含层,有一个输出层。多层感知机网络中输入与输出变换关系为

\[s_i^{(q)} = \sum \limits_{j=0}^{n_q-1}w_{ij}^{(q)}x_j^{(q-1)} \\ (x_0^{(q-1)} = \theta_i^{(q)}, \quad w_{i0}^{(q-1) = -1}) \\ x_i^{(q)} = f(s_i^{(q)}) = \left\{\begin{matrix} 1, \quad s_j^{(q)} ≥ 0 \\ -1, \quad s_j^{(q)} < 0 \end{matrix}\right. \\ 其中,i = 1,2,...,n_q; \quad j = 1,2,...,n_{q-1}; \quad q = 1,2,...,Q \\ \]

这时每一层相当于一个单层前馈神经网络,如对于第q层,它形成一个\(n_{q-1}\)维的超平面。它对于该层的输入模式进行线性分类,但由于多层的组合,最终可以实现对输入模式的较复杂的分类。

2.1 网络结构

  多层网络,顾名思义就是由多个层结构组成的网络系统,它的每一层都是由若干个神经元结点构成,该层的任意一个结点都与上一层的每一个结点相联,由它们来提供输入,经过计算产生该结点的输出并作为下一层结点的输入。
  值得注意的是任何多层的网络结构必须有一个输入层、一个输出层。下面的图结构是更形象的表示:

  我们从图像中来说明多层网络的结构:上图为一个三层的网络结构,它由一个输入层、一个输出层和一个隐藏层构成。(当然隐藏层的层数可以更多。)图像隐藏层的节点与输入层的每一个节点相连,也就是说它接收了一组向量\([x_1,x_2,x_3,\cdots,x_n]\)作为输入,同时与它相连的n条线代表了n个输入的权重。特别要注意的是图像隐藏层节点与输出层节点还有一条红色的连线,它们代表偏置,即\(w_0\)

  我们知道,图像的第\(i\)个节点,它将输入与对应的权重进行线性加权求和,然后经过\(sigmold\)函数计算,把得到的结果作为该个结点的输出。

\[I_i = net_{i} = w_0 + x_1w_1 + x_2w_2 + x_3w_3 + \cdots + x_nw_n = \sum \limits_{i=0}^{N=n}x_iw_i.\quad (其中x_0=1) \\ O_i = \frac{1}{1+e^{-net_i}} \]

  整个多层网络就是一组输入开始,然后按照每条连结线的权重,进行一致地向前计算。这里我们进一步对上面这个网络结构进行量化,以便后面实现:首先它是一个三层的网络结构,第一层是输入层,它本身没有接收输入,也没有连线进来;第二层有3个结点,并且有\(3×(4+1)\)根连结线,注意每个结点有一个偏置线;最后一层是输出层,它有4个结点,并且有\(4×(3+1)\)根连结线。所以说整个网络结构为\([layer1, layer2,layer3]\),而每一层都是这样的结构:\(layer = [nodes, weights]\)

通俗来讲,神经网络其实就是按照一定规则连接起来的多个神经元。

上图展示了一个全连接(full connected,FC)神经网络,它的规则包含:

  • 神经元按照层来布局。最左边的输入层,负责接收输入数据;最右边的输出层,负责输出数据。
  • 中间是隐藏层,对于外部不可预见。隐藏层可以包括多层,大于一层的就被称为深度神经网络,层次越多数据处理能力越强。
  • 同一层的神经元之间没有连接。
  • 前后两层的所有神经元相连(这就是全连接的含义),前层神经元的输出就是后层神经元的输入。
  • 每个连接都有一个权重。

多层神经网络的训练过程
多层神经网络的训练过程,按如下步骤进行:
1.从输入层开始,将数据经过神经网络传输到输出层,这一步是前向传播。
2.根据输出,计算误差(预测结果和已知结果之间的差异),得到代价函数。利用梯度下降法最小化误差。
3.梯度下降法需要计算每个权重的梯度,使用反向传播算法计算梯度,根据梯度调整权重值。
重复以上三个步骤训练权重。

与单层网络的区别
从大的方面来说,两者都是通过梯度下降法,求取代价函数的最小值,来训练权重。
区别在于,多层神经网络引入了反向传播来计算梯度。
单层网络中,权重的梯度计算是直接求代价函数对某个权重的偏导数,单层网络的代价函数相对简单,可以这样做。
但是多层神经网络中,越靠近输入层的权重,其代价函数越复杂,计算量非常大。而反向传播算法是一种高效简单的梯度算法。

(二)误差逆传播算法(BP)

  误差逆传播算法(error BackPropagation,简称BP),是迄今最成功的神经网络学习算法。现实任务中使用神经网络时,大多是在使用BP算法进行训练。值得指出的是,BP不仅可用于前馈神经网络,还可用于其他类型的神经网络,例如训练递归神经网络。但通常说“BP网络”时,一般是指用BP算法训练的多层前馈神经网络。

2.1算法推导过程

  给定训练集D= {\((x_1,y_1),(x_2,y_2),...,(x_m,y_m)\)},\(x_i∈\mathbb{R}^d\)\(y_i∈\mathbb{R}^l\),即输入示例由\(d\)个属性描述,输出\(l\)维实值向量。

我们在下图给出一个拥有\(d\)个输入神经元、\(l\)个输出神经元、\(q\)个隐含层神经元的多层前馈网络结构。

其中,输出层第\(j\)个神经元的阈值用\(\theta_j\)表示,隐含层第\(h\)个神经元的阈值用\(\gamma_h\)表示。
输入层第\(i\)个神经元与隐含层第\(h\)个神经元之间的连接权为\(v_{ih}\),
隐含层第\(h\)个神经元与输出层第\(j\)个神经元之间的连接权为\(w_{hj}\)

则记隐含层第\(h\)层神经元接收到的输入为\(\alpha_h = \sum_{i=1}^{d}v_{ij}x_i\)
输出层第\(j\)个神经元接收到的输入为\(\beta_j = \sum_{h=1}^{q}w_{hj}b_h\),
其中\(b_{h}\)为隐含层第\(h\)个神经元的输出,
\(E_k\)为均方误差,
\(g_j = -\frac{\partial E_k}{\partial \beta_j}\),即为均方误差\(E_k\)对输出层第\(j\)个神经元的输入\(\beta_j\)的负偏导数,
\(e_h=-\frac{\partial E_k}{\partial \alpha_h}\),即均方误差\(E_k\)对隐含层第\(h\)个神经元的输入\(\alpha_h\)的负偏导数。
误差\(E_k\)从后往前依次对各层功能神经元的输入求导,这也体现了"误差逆传播"的实际含义。

假设隐含层和输出层神经元都使用\(Sigmold\)函数
对训练样例\((x_k,y_k)\),假定神经网络的输出为\(\hat y_k = (\hat y_1^k,\hat y_2^k,...,\hat y_l^k)\),即

\[\hat y_j^k = f(\beta_j - \theta_j) \quad \quad (5.3) \]

式(5.3)的解释:
该式即网络输出层第\(j\)个神经元的输出表达式,其中\(\beta_j = \sum_{h=1}^q w_{hj}b_h\)是输出层第\(j\)个神经元输入,\(\theta_j\)是相应的阈值,\(f\)是神经元的激活函数。通过该式,可以根据当前连接权和阈值计算出训练样本\((x_k,y_k)\)的网络输出\(\hat y_k = (\hat y_1^k,\hat y_2^k,...,\hat y_l^k)\)

则网络在\((x_k,y_k)\)上的均方误差

\[E_k = \frac{1}{2}\sum \limits_{j=1}^{l}(\hat y_j^k - y_j^k)^2 \quad \quad (5.4) \]

式(5.4)的解释:
该式就是针对训练样本\((x_k,y_k)\),求出网络输出\(\hat y_k = (\hat y_1^k,\hat y_2^k,...,\hat y_l^k)\)与真实值\(y_k\)之间的均方误差(对应元素差的平方,再求和);这里的二分之一是为了求导后可以使系数为1,因为平方求导会多出来一个2,正好与\(\frac{1}{2}\)抵消掉。

上图的网络中有\((d+l+1)q+l\)个参数需要确定:
   输入层到隐含层的\(d×q\)个权值、
   隐含层到输出层的\(q×l\)个权值、
   \(q\)个隐含层神经元的阈值、
   \(l\)个输出层神经元的阈值。

BP是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则对参数进行更新估计,即与式\((w_i←w_i+\Delta w_i)\)类似,任意参数\(v\)的更新估计式为

\[v ← v + \Delta v \quad \quad (5.5) \]

下面以隐含层到输出层的连接权\(w_{hj}\)为例来进行推导。

BP算法基于梯度下降(gradient descent)策略,以目标的负梯度方向对参数进行调整。
\(E_k = \frac{1}{2}\sum \limits_{j=1}^{l}(\hat y_j^k - y_j^k)^2\)的均方误差\(E_k\),给定学习率\(\eta\),对均方误差\(E_k\)在连接权\(w_{hj}\)求偏导,有

\[\Delta w_{hj} = -\eta \frac{\partial E_k}{\partial w_{hj}} \quad \quad (5.6) \]

注意到,隐含层到输出层的连接权\(w_{hj}\)在网络结构中先影响到第\(j\)个输出层神经元的输入值\(\beta_j\),再影响到其输出值\(\hat y_j^k\),然后进而影响到\((x_k,y_k)\)上的均方误差\(E_k\),那么(根据偏导数的链式法则)有

\[\frac{\partial E_k}{\partial w_{hj}} = \frac{\partial E_k}{\partial \hat y_j^k} \cdot \frac{\partial \hat y_j^k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial w_{hj}} \quad \quad (5.7) \]

这里根据\(\beta_j\)的定义(\(\beta_j = \sum_{h=1}^{q}w_{hj}b_h\)),显然有

\[\frac{\partial \beta_j}{\partial w_{hj}} = b_h \quad \quad (5.8) \]

如下图,\(Sigmold\)函数有一个很好的性质:

\[f'(x) = f(x)(1-f(x)) \quad \quad (5.9) \]

\(f'(x) = f(x)(1-f(x))\)推导:

\[\begin{align} &令f(x)= \frac{1}{1+e^{-x}},求导,得 \\ &f'(x) = \frac{e^{-x}}{(1+e^{-x})^2} = \frac{1}{1+e^{-x}}\cdot \frac{e^{-x}}{1+e^{-x}} \quad \quad 由(\frac{u}{v})'=\frac{u'v-uv'}{v^2}得\\ &= \frac{1}{1+e^{-x}}(1-\frac{1}{1+e^{-x}}) = f(x)(1-f(x))\\ &证毕。\\ \end{align} \]

于是根据\(\hat y_j^k = f(\beta_j - \theta_j)\)\(E_k = \frac{1}{2}\sum \limits_{j=1}^{l}(\hat y_j^k - y_j^k)^2\)

\[\begin{align} &g_j = \frac{\partial E_k}{\partial \hat y_j^k} \cdot \frac{\partial \hat y_j^k}{\partial \beta_j} \\ &= -(\hat y_j^k-y_j^k)f'(\beta_j - \theta_j) \quad \quad (由f'(x) = f(x)(1-f(x))) \\ &= \hat y_j^k(1-\hat y_j^k)(y_j^k-\hat y_j^k) \quad \quad (5.10) \end{align} \]

\(g_j=\hat y_j^k(1-\hat y_j^k)(y_j^k-\hat y_j^k)\)推导:

\[\frac{\partial E_k}{\partial \hat y_j^k} = \frac{\partial(\frac{1}{2})\sum_{j=1}^l(\ hat y_j^k -y_j^k)}{\partial \hat y_j^k} = (\hat y_j^k-y_j^k) \\ \frac{\partial \hat y_j^k}{\partial \beta_j} = \hat y_j^k(1-\hat y_j^k) \frac{\partial \hat y_j^k}{\partial \beta_j} = \hat y_j^k(1-\hat y_j^k) \]

\(\hat y_j^k = f(\beta_j - \theta_j)\)的表达式代入,即得:

\[\frac{\partial \hat y_j^k}{\partial \beta_j} = \frac{\partial f(\beta_j -\theta_j)}{\partial \beta_j} = \frac{\partial f(\beta_j - \theta_j)}{\partial (\beta_j - \theta_j)}\cdot \frac{\partial(\beta_j - \theta_j)}{\partial \beta_j} \\ = f(\beta_j-\theta_j)(1-f(\beta_j-\theta_j))\\ = \hat y_j^k(1-\hat y_j^k) \\ \]

两部分整理,证毕。

\(\Delta w_{hj} = \eta g_j b_h\)推导

再将\(g_j= \hat y_j^k(1-\hat y_j^k)(y_j^k-\hat y_j^k)\)\(\frac{\partial \beta_j}{\partial w_{hj}} = b_h\)代入\(\frac{\partial E_k}{\partial w_{hj}} = \frac{\partial E_k}{\partial \hat y_j^k} \cdot \frac{\partial \hat y_j^k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial w_{hj}}\),再代入\(\Delta w_{hj} = -\eta \frac{\partial E_k}{\partial w_{hj}}\),就得到了BP算法中关于\(w_{hj}\)的更新公式

\[\Delta w_{hj} = \eta g_j b_h \quad \quad (5.11) \]

如上过程,类似可得以下:

\[\begin{align} &\Delta \theta_j = -\eta g_j  \quad \quad (5.12)\\ &\Delta v_{ih} = \eta e_h x_i \quad \quad (5.13)\\ &\Delta \gamma_{h} = -\eta e_h \quad \quad (5.14)\\ \end{align} \]

\(\Delta \theta_j = -\eta g_j\)推导

\[根据链式求导法则有,\frac{\partial E_k}{\partial \theta_j} = \frac{\partial E_k}{\partial \hat y_j^k} \cdot \frac{\partial \hat y_j^k}{\partial \theta_j} \\ 其中\frac{\partial \hat y_j^k}{\partial \theta_j} = \frac{\partial f(\beta_j-\theta_j)}{\partial \theta_j} = \frac{\partial f(\beta_j - \theta_j)}{\partial(\beta_j-\theta_j)}\cdot \frac{\partial (\beta_j -\theta_j)}{\partial \theta_j} \\ 又根据f'(x) = f(x)(1-f(x))有\frac{\partial f(\beta_j-\theta_j)}{\partial (\beta_j-\theta_j)} = f(\beta_j -\theta_j)(1-f(\beta_j-\theta_j)),并且易知\frac{\partial (\beta_j-\theta_j)}{\partial \theta_j}=-1 \\ 因此有 \quad \frac{\partial \hat y_j^k}{\partial \theta_j} = -f(\beta_j-\theta_j)(1-f(\beta_j-\theta_j)) = -\hat y_j^k(1-\hat y_j^k) \\ 而\frac{\partial E_k}{\partial \hat y_j^k} = \frac{\partial\frac{1}{2}\sum_{j=1}^l(\ hat y_j^k-y_j^k)^2}{\partial \hat y_j^k} = (\hat y_j^k - y_j^k) \\ 综合两部分求导结果,结合g_j=\hat y_j^k(1-\hat y_j^k)(y_j^k-\hat y_j^k)得,\\ \frac{\partial E_k}{\partial \theta_j} = -(\hat y_j^k-y_j^k)\hat y_j^k(1-\hat y_j^k) = \hat y_j^k(1-\hat y_j^k)(y_j^k-\hat y_j^k) = g_j \\ 因此,类似于\Delta w_{hj} = \eta g_j b_h,\Delta \theta_j = \eta \frac{\partial E_k}{\partial \theta_j} = -\eta g_j。\quad \quad 证毕。 \]

\(\Delta v_{ih} = \eta e_h x_i\)\(\Delta gamma_h = -\eta e_h\)

\[\begin{align} &e_h = \frac{\partial E_k}{\partial b_h} \cdot \frac{\partial b_n}{\partial \alpha_h} \\ &= -\sum \limits_{j=1}^l \frac{\partial E_k}{\partial \beta_j} \cdot \frac{\partial \beta_j}{\partial b_h} f'(\alpha_h-\gamma_h) \\ &= \sum \limits_{j=1}^{l} w_{hj}g_{j} f'(\alpha_j-\gamma_h) \\ &= b_h(1-b_h)\sum \limits_{j=1}^l w_{hj}g_{j} \quad \quad (5.15) \end{align} \]

\(e_h = b_h(1-b_h)\sum \limits_{j=1}^l w_{hj}g_{j}\)推导

\[\begin{align} &为了求e_h=-\frac{\partial E_k}{\partial \alpha_h},先列出E_h和\alpha之间的联系: \\ &①E_k = \frac{1}{2} \sum_{j=1}^l(\hat y_j^k-y_j^k)^2 \\ &②\hat y_j^k = f(\beta_j-\theta_j) \\ &③\beta_j = \sum_{h=1}^q w_{hj}b_{h}\\ &④b_h = f(\alpha_h-\gamma_h) \\ &为避免符号混淆,在接下来的推导中将\beta_j = \sum_{h=1}^qw_{hj}b_h中求和变量h换为p,而h特指\alpha_h中的h, \\ &即有\beta_j = \sum_{p=1}^q w_{pj}b_p. 由于\beta_j = \sum_{p=1}^q w_{pj}b_p,即隐含层第h个神经元的输出b_n与输出层任意神经元的输入\beta_j均有关,\\ &因此\frac{\partial E_k}{\partial b_h} = \frac{\partial E_k}{\partial \beta_1} \frac{\partial \beta_1}{\partial b_n} + \frac{\partial E_k}{\partial \beta_2} \frac{\partial \beta_2}{\partial b_n} + ... + \frac{\partial E_k}{\partial \beta_l} \frac{\partial \beta_l}{\partial b_n} = \sum_{j=1}^l \frac{\partial E_k}{\partial \beta_j} \frac{\partial \beta_j}{\partial \beta_n} \\ &进而可得 e_h = -\frac{\partial E_k}{\partial \alpha_h} = -\frac{\partial E_k}{\partial b_h}\frac{\partial b_h}{\partial \alpha_h} = -\sum_{j=1}^l \frac{\partial E_k}{\partial \beta_j}\frac{\partial \beta_j}{\partial b_h}\frac{\partial b_h}{\partial \alpha_h} \\ &由g_j定义可知g_j = -\frac{\partial E_k}{\partial \beta_j},再根据f'(x) = f(x)(1-f(x))的结论可知,\frac{\partial b_h}{\partial \alpha_h} = b_n(1-b_n),\\ &而\frac{\partial \beta_j}{\partial b_h} = \frac{\partial \sum_{p=1}^qw_{pj}b_p}{\partial b_n} = w_{hj} \\ &综上所述,e_h = - \sum_{j=1}^l \frac{\partial E_k}{\partial \beta_j}\frac{\partial \beta_j}{\partial b_h}\frac{\partial b_h}{\partial \alpha_h} = \sum_{j=1}^lg_{j}w_{hj}b_h(1-b_h) = b_h(1-b_h)\sum_{j=1}^l g_j w_{hj} 以上,证毕。 \end{align} \]

\(\Delta v_{ih} = \eta e_h x_i\)推导:

\[\begin{align} &类似于\Delta w_{hj} = \eta g_j b_h,并结合e_h的定义e_h = \frac{\partial E_k}{\partial \alpha_h},得 \\ &7\Delta v_{ih} = -\eta \frac{\partial E_k}{\partial v_{ih}} = -\eta \frac{\partial E_k}{\partial \alpha_h}\frac{\partial \alpha_h}{\partial v_{ih}} = \eta e_h x_i \\ &其中,由\alpha_h = \sum_{i=1}^d v_{ih}x_i,可得\frac{\partial \alpha_h}{\partial v_{ih}} = \frac{\partial \sum_{i=1}^{d}v_{ih}x_i}{\partial v_{ih}} = x_i, \quad 至此证毕. \end{align} \]

\(\Delta \gamma_{h} = -\eta e_h\)推导:

\[\begin{align} &类似于\Delta w_{hj} = \eta g_j b_h,得 \Delta \gamma_h = -\eta \frac{\partial E_k}{\partial \gamma_h} = -\eta \frac{\partial E_k}{\partial b_n}\frac{\partial b_h}{\partial \gamma_h} \\ &而b_h = f(\alpha_h - \gamma_h),故\frac{\partial f(\alpha_h - \gamma_h)}{\partial \gamma_{h}} = \frac{\partial f(\alpha_h - \gamma_h)}{\partial (\alpha_h - \gamma_h)}\frac{\partial (\alpha_h - \gamma_h)}{\partial \alpha_h} \\ &其中,\frac{\partial(\alpha_h - \gamma_h)}{\partial \gamma_h} = -1, \frac{\partial(\alpha_h - \gamma_h)}{\partial \alpha_h} = 1, \quad 即\frac{\partial b_n}{\partial \gamma_h} = -\frac{\partial b_h}{\partial \alpha_h} \\ &因此 \Delta \gamma_h = -\eta \frac{\partial E_k}{\partial \gamma_h} = -\eta \frac{\partial E_k}{\partial b_h} \frac{\partial b_n}{\partial \gamma_h} = \eta \frac{\partial E_k}{\partial b_h} \frac{\partial b_h}{\partial \alpha_h} \\ &结合,e_h的定义e_h = \frac{\partial E_k}{\partial \alpha_h},因此\Delta \gamma_h = \eta \frac{\partial E_k}{\partial b_n}\frac{\partial b_n}{\partial \alpha_h} = -\eta e_h。\quad 证毕。 \end{align} \]

  学习率\(\eta∈(0,1)\)控制着算法每一轮迭代中的更新步长,若太大则容易振荡,太小则收敛速度又过慢。
(有时为了做精细调节,可令\(\Delta w_{hj} = \eta g_j b_h\)\(\Delta \theta_j = \eta g_j\)使用\(\eta_1\),\(\Delta v_{ih} = \eta e_h x_i\)\(\Delta gamma_h = -\eta e_h\)使用\(\eta_2\),两者未必相等)

2.2 BP算法工作流程

对每个训练样例,BP算法执行以下操作:
先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;
然后计算输出层的误差(第4-5行),
再将误差逆向传播至隐含层神经元(第6行),
最后根据隐含层神经元的误差来对连接权和阈值进行调整(第7行)。
该迭代过程层循环进行,直到达到某些停止条件为止。

输入:训练集\(D=\left\{(x_k,y_k)\right\}_{k=1}^m\); 学习率\(\eta\).
过程
1:在(0,1)范围内随机初始化网络中所有连接权和阈值
2:repeat
3:  for all (\(x_k,y_k\))∈D do
4:    根据当前参数和式\(\hat y_j^k = f(\beta_j - \theta_j)\)计算当前样本的输出\(\hat y_k\);
5:    根据式\(g_j=\hat y_j^k(1-\hat y_j^k)(y_j^k-\hat y_j^k)\)计算输出层神经元的梯度项\(g_j\);
6:    根据\(e_h = b_h(1-b_h)\sum \limits_{j=1}^l w_{hj}g_{j}\)计算隐含层神经元的梯度项\(e_h\);
7:    根据\(\Delta w_{hj} = \eta g_j b_h\),\(\Delta \theta_j = \eta g_j\),\(\Delta v_{ih} = \eta e_h x_i\),\(\Delta gamma_h = -\eta e_h\)更新连接权\(w_{hj}\),\(v_{ih}\)与阈值\(\theta_j\),\(\gamma_h\)

8:  end for
9:until 达到停止条件(例如,训练误差已达到了一个很小的值)
输出:连接权与阈值确定的多层前馈神经网络

  这里需要注意的是,BP算法的目标是要最小化训练集D上的累积误差

\[E= \frac{1}{m}\sum \limits_{k=1}^m E_k \]

  上面介绍的“标准BP算法”每次仅针对一个训练样例更新连接权和阈值,也就是说,上面算法的更新规则是基于单个的\(E_k\)推导而成。如果类似地推导出基于累积误差最小化的更新规则,就得到了累积误差逆传播(accumulated error backpropagation)算法。对于神经网络,累积BP算法与标准BP算法都很常用。

  给出一个包含2个属性、5个样本的西瓜数据,随着训练轮数的增加,网络参数和分类边界的变化情况(如下图)。

  由于标准BP算法每次更新只针对单个样例,因此参数更新得非常频繁,而且对不同样例进行更新的效果可能出现“抵消”现象。因此,为了达到同样的累积误差极小点,标准BP算法往往需进行更多次数的迭代。累积BP算法直接针对累积误差最小化,它在读取整个训练集D一遍后才对参数进行更新,其参数更新的频率低得多。但在很多任务中,累积误差下降到一定程度之后,进一步下降会非常缓慢,这时标准BP往往会更快获得较好的解,尤其是在训练集D非常大时更加明显。

2.3多层神经网络的BP算法推导

  为了更进一步理解BP算法的推导,尤其是为将来推导深度神经网络的BP算法打下基础,接下来以包含两个隐层的神经网络(如上图所示)为例推导BP算法。
  约定输入层为第1层,输出层神经元仅接受输入,不进行函数处理;隐含层和输出层神经元为功能神经元,对信号进行加工处理。除第1层外,第\(k\)层第\(i\)个神经元的输入为\(z_i^{(k)}\),输出为\(a_i^{(k)}\),其中\(a_i^{(k)} = f(z_i^{(k)})\)\(f(\cdot)\)为激活函数。第\(k\)层神经元个数为\(s_k\)个;从第\(k\)层第\(i\)个神经元到第\(l= k+1\)层第\(j\)个神经元的连接权重记为\(\theta_{ij}^{(kl)}\),第\(k\)层到第\(l=k+1\)层所有连接权重构成大小为\(s_k×s_l\)矩阵\(\Theta^{(kl)}\):

\[\Theta^{(12)} = \begin{bmatrix} \theta_{11}^{(12)} & \theta_{12}^{(12)} & \theta_{13}^{(12)} & \theta_{14}^{(12)} \\ \theta_{21}^{(12)} & \theta_{22}^{(12)} & \theta_{23}^{(12)} & \theta_{24}^{(12)} \\ \theta_{31}^{(12)} & \theta_{32}^{(12)} & \theta_{33}^{(12)} & \theta_{34}^{(12)} \\ \end{bmatrix} ,\Theta^{(23)} = \begin{bmatrix} \theta_{11}^{(23)} & \theta_{12}^{(23)} & \theta_{13}^{(23)} & \theta_{14}^{(23)} \\ \theta_{21}^{(23)} & \theta_{22}^{(23)} & \theta_{23}^{(23)} & \theta_{24}^{(23)} \\ \theta_{31}^{(23)} & \theta_{32}^{(23)} & \theta_{33}^{(23)} & \theta_{34}^{(23)} \\ \theta_{41}^{(23)} & \theta_{42}^{(23)} & \theta_{43}^{(23)} & \theta_{44}^{(23)} \end{bmatrix} ,\Theta^{(34)} = \begin{bmatrix} \theta_{11}^{(34} & \theta_{12}^{(34)} & \theta_{13}^{(34)} & \theta_{14}^{(34)} \\ \theta_{21}^{(34)} & \theta_{22}^{(34)} & \theta_{23}^{(34)} & \theta_{24}^{(34)} \\ \theta_{31}^{(34)} & \theta_{32}^{(34)} & \theta_{33}^{(34)} & \theta_{34}^{(34)} \\ \theta_{41}^{(34)} & \theta_{42}^{(34)} & \theta_{43}^{(34)} & \theta_{44}^{(34)} \end{bmatrix} \]

  为了方便表示,除输出层外,每层增加取值为-1的第0个神经元,将第\(l\)\(s_l\)个神经元的\(s_l\)个阈值统一表示为连接权重;记第k层到第\(l=k+1\)层包含阈值的所有连接权重构成的矩阵\(\widetilde \Theta^{(kl)}\),大小为\((s_k+1)×s_l\)

\[\widetilde \Theta^{(12)} = \begin{bmatrix} \theta_{01}^{(12)} & \theta_{02}^{(12)} & \theta_{03}^{(12)} & \theta_{04}^{(12)} \\ \theta_{11}^{(12)} & \theta_{12}^{(12)} & \theta_{13}^{(12)} & \theta_{14}^{(12)} \\ \theta_{21}^{(12)} & \theta_{22}^{(12)} & \theta_{23}^{(12)} & \theta_{24}^{(12)} \\ \theta_{31}^{(12)} & \theta_{32}^{(12)} & \theta_{33}^{(12)} & \theta_{34}^{(12)} \\ \end{bmatrix} ,\widetilde \Theta^{(23)} = \begin{bmatrix} \theta_{01}^{(23)} & \theta_{02}^{(23)} & \theta_{03}^{(23)} & \theta_{04}^{(23)} \\ \theta_{11}^{(23)} & \theta_{12}^{(23)} & \theta_{13}^{(23)} & \theta_{14}^{(23)} \\ \theta_{21}^{(23)} & \theta_{22}^{(23)} & \theta_{23}^{(23)} & \theta_{24}^{(23)} \\ \theta_{31}^{(23)} & \theta_{32}^{(23)} & \theta_{33}^{(23)} & \theta_{34}^{(23)} \\ \theta_{41}^{(23)} & \theta_{42}^{(23)} & \theta_{43}^{(23)} & \theta_{44}^{(23)} \end{bmatrix} ,\widetilde \Theta^{(34)} = \begin{bmatrix} \theta_{01}^{(34)} & \theta_{02}^{(34)} & \theta_{03}^{(34)} & \theta_{04}^{(34)} \\ \theta_{11}^{(34} & \theta_{12}^{(34)} & \theta_{13}^{(34)} & \theta_{14}^{(34)} \\ \theta_{21}^{(34)} & \theta_{22}^{(34)} & \theta_{23}^{(34)} & \theta_{24}^{(34)} \\ \theta_{31}^{(34)} & \theta_{32}^{(34)} & \theta_{33}^{(34)} & \theta_{34}^{(34)} \\ \theta_{41}^{(34)} & \theta_{42}^{(34)} & \theta_{43}^{(34)} & \theta_{44}^{(34)} \end{bmatrix} \]

例如,第3层第1个神经元的输入为

\[z_1^{(3)} = \theta_{11}^{23}a_1^{(2)} + \theta_{21}^{23}a_2^{(2)} + \theta_{31}^{23}a_1^{(3)} + \theta_{41}^{23}a_1^{(4)} -\theta_{01}^{(23)} \]

各层神经元的输入和输出表示如下:

输入:\(x = (x_1;x_2;x_3) = x\),
第1层:

\[a^{(1)} = \left(a_1^{(1)}; a_2^{(1)}; a_3^{(1)}\right) = x \\ \widetilde a^{(1)} = \left(-1; a_1^{(1)}; a_2^{(1)}; a_3^{(1)}\right) = (-1;x) \]

第2层:

\[z^{(2)} = \left(z_1^{(2)}; z_2^{(2)}; z_3^{(2)};z_4^{(2)} \right) = [\widetilde \Theta^{(12)}]^{T}\widetilde a^{(1)} \\ a^{(2)} = \left(a_1^{(2)}; a_2^{(2)}; a_3^{(2)} ; a_4^{(2)}\right) = f(z^{(2)}) \\ \widetilde a^{(2)} = \left(-1; a_1^{(2)}; a_2^{(2)}; a_3^{(2)} ; a_4^{(2)}\right) = (-1;a^{(2)}) \]

第3层:

其中

\[f'(z^{(4)}) = \left(\frac{\partial a_1^{(4)}}{\partial z_1^{(4)}}; \frac{\partial a_2^{(4)}}{\partial z_2^{(4)}}; \frac{\partial a_3^{(4)}}{\partial z_3^{(4)}} \right) \\ f'(z^{(3)}) = \left(\frac{\partial a_1^{(3)}}{\partial z_1^{(3)}}; \frac{\partial a_2^{(3)}}{\partial z_2^{(3)}}; \frac{\partial a_3^{(3)}}{\partial z_3^{(3)}} ; \frac{\partial a_4^{(3)}}{\partial z_4^{(3)}}\right) \\ f'(z^{(2)}) = \left(\frac{\partial a_1^{(2)}}{\partial z_1^{(2)}}; \frac{\partial a_2^{(2)}}{\partial z_2^{(2)}}; \frac{\partial a_3^{(2)}}{\partial z_3^{(2)}};\frac{\partial a_4^{(2)}}{\partial z_4^{(2)}} \right) \]

符号“⊙”表示矩阵哈达玛积,即两个大小相同的矩阵对应位置元素相乘。

对于\(\delta^{(4)}\)来说,由于

\[\frac{\partial E}{\partial a^{(4)}} = \left(\frac{\partial E}{\partial a_1^{(4)}}; \frac{\partial E}{\partial a_1^{(4)}};\frac{\partial E}{\partial a_1^{(4)}} \right) \\ = \left(a_1^{(4)}-y_1; a_2^{(4)}-y_2; a_3^{(4)}-y_3\right) = a^{4} -y \\ 因此 \delta^{(4)} = (a^{(4)}-y)⊙f'(z^{(4)}) \]

对于\(\delta^{(3)}\)来说,由于

\[\frac{\partial E}{\partial a^{(3)}} = \left(\frac{\partial E}{\partial a_1^{(3)}}; \frac{\partial E}{\partial a_2^{(3)}};\frac{\partial E}{\partial a_3^{(3)}};\frac{\partial E}{\partial a_4^{(3)}} \right) \]

接下来以\(\frac{\partial E}{\partial a_1^{2}}\)为例,详细推导\(\frac{\partial E}{\partial a_1^{2}}\)中的每一项:已知

\[z_1^{(3)} = \theta_{01}^{(23)}a_0^{2} + \theta_{11}^{(23)}a_1^{2} + \theta_{21}^{(23)}a_2^{2} + \theta_{31}^{(23)}a_3^{2} + \theta_{41}^{(23)}a_4^{2} =[\widetilde \Theta_{:1}^{(23)}]^{T}\widetilde \Theta^{(2)} \\ z_2^{(3)} = \theta_{02}^{(23)}a_0^{2} + \theta_{12}^{(23)}a_1^{2} + \theta_{22}^{(23)}a_2^{2} + \theta_{32}^{(23)}a_3^{2} + \theta_{42}^{(23)}a_4^{2} =[\widetilde \Theta_{:2}^{(23)}]^{T}\widetilde \Theta^{(2)} \\ z_3^{(3)} = \theta_{03}^{(23)}a_0^{2} + \theta_{13}^{(23)}a_1^{2} + \theta_{23}^{(23)}a_2^{2} + \theta_{33}^{(23)}a_3^{2} + \theta_{43}^{(23)}a_4^{2} =[\widetilde \Theta_{:3}^{(23)}]^{T}\widetilde \Theta^{(2)} \\ z_4^{(3)} = \theta_{04}^{(23)}a_0^{2} + \theta_{14}^{(23)}a_1^{2} + \theta_{24}^{(23)}a_2^{2} + \theta_{34}^{(23)}a_3^{2} + \theta_{44}^{(23)}a_4^{2} =[\widetilde \Theta_{:4}^{(23)}]^{T}\widetilde \Theta^{(2)} \\ \]

\[\frac{\partial E}{\partial a_1^{(2)}} = \frac{\partial E}{\partial z_1^{(3)}}\frac{\partial z_1^{(3)}}{\partial a_1^{(2)}} + \frac{\partial E}{\partial z_2^{(3)}}\frac{\partial z_2^{(3)}}{\partial a_1^{(2)}} + \frac{\partial E}{\partial z_3^{(3)}}\frac{\partial z_3^{(3)}}{\partial a_1^{(2)}} + \frac{\partial E}{\partial z_4^{(3)}}\frac{\partial z_4^{(3)}}{\partial a_1^{(2)}} \\ = \frac{\partial E}{\partial z_1^{(3)}}\theta_{11}^{(23)} + \frac{\partial E}{\partial z_2^{(3)}}\theta_{12}^{(23)} + \frac{\partial E}{\partial z_3^{(3)}}\theta_{13}^{(23)}+ \frac{\partial E}{\partial z_4^{(3)}}\theta_{14}^{(23)} \\ = (\theta_{11}^{(23)}, \theta_{12}^{(23)}, \theta_{13}^{(23)},\theta_{14}^{(23)})\left(\frac{\partial E}{\partial z_1^{(3)}};\frac{\partial E}{\partial z_2^{(3)}};\frac{\partial E}{\partial z_3^{(3)}} ;\frac{\partial E}{\partial z_4^{(3)}} \right) \\ = \Theta_{1:}^{(23)} \frac{\partial E}{\partial z^{(3)}} = \Theta_{1:}^{(23)}\delta^{(3)} \]

进而有

\[\frac{\partial E}{\partial a^{(2)}} = \left(\Theta_{(1:)}^{(23)}\delta^{(3)}; \Theta_{(2:)}^{(23)}\delta^{(3)}; \Theta_{(3:)}^{(23)}\delta^{(3)}; \Theta_{(4:)}^{(23)}\delta^{(3)} \right) \]

因此\(\delta^{(2)} = (\Theta^{(23)}\delta^{(3)})⊙f'(z^{(2)})\):
总结一下:

\[\delta^{(4)} = \frac{\partial E}{\partial z^{(4)}} = \frac{\partial E}{\partial a^{(4)}}⊙f'(z^{(4)}) = (a^{(4)}-y)⊙f'(z^{4}) \\ \delta^{(3)} = \frac{\partial E}{\partial z^{(3)}} = \frac{\partial E}{\partial a^{(3)}}⊙f'(z^{(3)}) = (\Theta^{(34)}\delta^{(4)})⊙f'(z^{3}) \\ \delta^{(2)} = \frac{\partial E}{\partial z^{(2)}} = \frac{\partial E}{\partial a^{(2)}}⊙f'(z^{(2)}) = (\Theta^{(23)}\delta^{(3)})⊙f'(z^{2}) \]

有以上三个变量,就可以求出\(\Delta \widetilde \Theta^{(12)},\Delta \widetilde \Theta^{(23)},\Delta \widetilde \Theta^{(34)}\),具体如下:

对于\(\widetilde \Theta^{(34)}\)来说,第1列只与\(z_1^{(4)}\)有关,第2列只与\(z_2^{(4)}\)有关,第3列只与\(z_3^{(4)}\)有关,即

\[z_1^{(4)} = \theta_{01}^{(34)}a_0^{(3)} + \theta_{11}^{(34)}a_1^{(3)} + \theta_{21}^{(34)}a_2^{(3)} + \theta_{31}^{(34)}a_3^{(3)} + \theta_{41}^{(34)}a_4^{(3)} \\ z_2^{(4)} = \theta_{02}^{(34)}a_0^{(3)} + \theta_{12}^{(34)}a_2^{(3)} + \theta_{22}^{(34)}a_2^{(3)} + \theta_{32}^{(34)}a_3^{(3)} + \theta_{42}^{(34)}a_4^{(3)} \\ z_3^{(4)} = \theta_{03}^{(34)}a_0^{(3)} + \theta_{13}^{(34)}a_3^{(3)} + \theta_{23}^{(34)}a_3^{(3)} + \theta_{33}^{(34)}a_3^{(3)} + \theta_{43}^{(34)}a_4^{(3)} \\ \]

例如,\(\frac{\partial E}{\partial \theta_{01}^{(34)}} = \frac{\partial E}{\partial z_1^{(4)}} \frac{\partial z_1^{(4)}}{\partial \theta_{01}^{(4)}} = \delta_1^{(4)}a_0^{(3)}\).
通用的公式为:

\[\frac{\partial E}{\partial \theta_{ij}^{(kl)}} = \frac{\partial E}{\partial \theta_{z}^{(l)}} \frac{\partial z_{j}^{(l)}}{\partial \theta_{ij}^{(kl)}} = \delta_j^{(l)} a_i^{(k)} \quad (0≤i≤s_k, 1≤j≤s_l, l=k+1) \\ \frac{\partial E}{\partial \widetilde \Theta^{(kl)}} = \widetilde a^{(k)}[\delta^{(l)}]^T \quad (1≤k≤3, 2≤l≤4) \]

进而

\[\Delta \widetilde \Theta^{(12)} = -\eta \widetilde a^{(1)}[\delta^{(2)}]^T,\Delta \widetilde \Theta^{(23)} = -\eta \widetilde a^{(2)}[\delta^{(3)}]^T, \Delta \widetilde \Theta^{(34)} = -\eta \widetilde a^{(3)}[\delta^{(4)}]^T \]

至此,推导结束。

以上推导过程可以轻易推广至更一般的情况,对于n层神经网络而言(1个输入层,1个输出层,n-2个隐含层),网络在样本\((x,y)\)上的均方误差为:

\[E = \frac{1}{2}||\hat y -y||^2 = \frac{1}{2}||a^{(n)} - y||^2 = \frac{1}{2}\sum_{j=1}^{s_n}(a_j^{(n)} - y_j)^2 \\ \]

对于第2层至第n层,

\[\delta^{(2)} = \frac{\partial E}{\partial z^{(2)}} = \frac{\partial E}{\partial a^{(2)}}⊙f'(z^{(2)}) = (\Theta^{(23)}\delta^{(3)})⊙f'(z^{(2)}) \\ \delta^{(k)} = \frac{\partial E}{\partial z^{(k)}} = \frac{\partial E}{\partial a^{(k)}}⊙f'(z^{(k)}) = (\Theta^{(kl)}\delta^{(l)})⊙f'(z^{(k)}), k=l-1 \\ \delta^{(n)} = \frac{\partial E}{\partial z^{(n)}} = \frac{\partial E}{\partial a^{(n)}}⊙f'(z^{(n)}) = (a^{n}-y)⊙f'(z^{(n)}) \]

第k层到第\(l=k+1\)层的权重更新为

\[\Delta \widetilde \Theta^{(kl)} = -\eta \widetilde a^{(k)}[\delta^{(l)}]^T \quad (1≤k≤n-1, 2≤l≤n) \\ \widetilde \Theta^{(kl)} = \widetilde \Theta^{(kl)} + \Delta \widetilde \Theta^{kl} \]

2.4 BP神经网络的优化策略

  正由于其强大的表示能力,BP神经网络经常遭遇“过拟合”,其训练误差持续降低,但测试误差却可能上升。
有以下两种常用优化策略来缓解BP网络的过拟合。
  第一种策略是“早停”(early stopping):
将数据分为训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。
  第二种策略是“正则化”(regularization):
其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。仍令\(E_k\)表示第k个训练样例上的误差,\(w_i\)表示连接权和阈值,则误差目标函数\(E = \frac{1}{m}\sum \limits_{k=1}^mE_k\)改变为

\[E = \lambda \frac{1}{m}\sum \limits_{k=1}^m E_k +(1-\lambda)\sum \limits_{i} w_i^2 \]

其中\(\lambda∈(0,1)\)用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。

(三)神经网络的优化技巧

改善神经网络优化的目标是找到更好的局部最小值和提高优化效率。目前比较有效的经验性改善方法通常分为以下几个方面:

(1)使用更有效的优化算法来提高梯度下降优化方法的效率和稳定下,比如动态学习率调整、梯度估计修正等。
(2)使用更好的参数初始化方法、数据预处理方法来提高优化效率。
(3)修改网络结构来得到更好的优化地形(Optimization Landscape),比如使用ReLU激活函数、残差连接、逐层归一化等。[优化地形指的是,在高维空间中损失函数的曲面形状,好的优化地形通常比较平滑]
(4)使用更好的超参数优化方法。

优化技巧都是针对相应的问题来提出的,下面列出了一些训练神经网络存在的主要问题,及其优化技巧。

  • 过拟合
  • 局部最优
  • 梯度消失
  • 收敛速度慢
  • 学习速度慢

3.1 过拟合

判断是否过拟合的方式就是观察准确率曲线,如果训练集准确率不断上升,测试集准确率却开始下下降,就说明出现过拟合了。

优化方法:

  • 训练更多的数据

    人工扩大训练集数量

    通过旋转、变形、增加噪音等各种方法来扩大训练集数量,需要注意的是,这些方法需要因地制宜。在大规模的数据集上,不同的机器学习准确率差异不一定能说明某个算法更好,很可能在另一个数据集上另一种算法就更好。

  • 降低网络容量
    (not always the option,大网络有大智慧)

  • 早期停止(early stopping)

      将数据分为训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,也即当验证集的准确率已经饱和(saturated)时,则停止训练,同时返回具有最小验证集误差的连接权和阈值。

    • 为什么使用验证集:使用验证集可以避免对测试集过拟合,从而得到正确的测试效果。

    • 如何判断是否已经饱和: 通过诸如“最近N次无提升”( \(no-improvement-in-n\) )、“平均准确率是否提升”等判断条件,可以让算法自己决定是否已过拟合。比如连续三次没有提升到更高等。

     

  • 正则化(L1和L2)

      其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。仍令\(E_k\)表示第k个训练样例上的误差,\(w_i\)表示连接权和阈值,则误差目标函数\(E = \frac{1}{m}\sum \limits_{k=1}^mE_k\)改变为

    \[E = \lambda \frac{1}{m}\sum \limits_{k=1}^m E_k +(1-\lambda)\sum \limits_{i} w_i^2 \]

    其中\(\lambda∈(0,1)\)用于对经验误差与网络复杂度这两项进行折中,常通过交叉验证法来估计。

    \(L2\) 正则化

    \(L2\) 正则化的交叉熵损失函数,这里第二个部分就是正则化部分,n是训练集的大小:

\[ C = -\frac{1}{n}\sum_{xj}[y_jln{a_j^L} + (1-y_j)ln(1-a_j^L)]+\frac{\lambda}{2n}\sum_w{w^2} \]

正则化不需要bias(偏置),因为这个不和任何值相乘,只定义阈值,所以不会造成过拟合。

正则化让网络更倾向于小的权重,大的权重只有在显著减小损失函数的时候才会被采用。

求导:对于正则化之后的损失函数求导,求 \(w\) 的偏导只需要加上一个 \(\frac{\lambda}{n}w\),求 \(b\) 的偏导则完全不变。
从这里可以看到,在随机梯度下降的时候,\(w=(1-\frac{\eta\lambda}{n})w-\frac{\eta}{m}\sum_x{\frac{\partial{C_x}}{\partial{w}}}\) ,这里的w会因为 \(1-\frac{\eta\lambda}{n}\) 这个系数而越来越小

正则化的神经网络对于小的噪音会作出更小的反应,所以正则化神经网络可能更适合小规模的神经网络,而非正则化神经网络适合训练带有大量关于噪声的信息的数据,模型比较复杂。

正则化目前还没有系统的知识体系,来确定哪种正则化的效果更好。

事实上神经网络会有一个自我正则化的过程,但是这个机制并没有被很好地研究出来。

\(L1\)正则化

正则化的形式改成\(L1\)曼哈顿距离:

\[ C = C_0+\frac{\lambda}{n}\sum_w|w| \]

如果对\(L1\)正则化的cost函数求偏导:

\[ \frac{\partial{C}}{\partial{w}}=\frac{\partial{C_0}}{\partial{w}}+\frac{\lambda}{n}sign(w) \]

\(L2\)一样,\(L1\)正则化让\(w\)更小了。不同的是在\(L1\)中缩小的是一个常数,而\(L2\)是依靠一个乘积对\(w\)进行百分比的缩放。所以当\(w\)很大的时候,\(L1\)需要比\(L2\)更多的步数才会把\(w\)缩放到相同的效果;当\(w\)很大的时候,\(L1\)又比\(L2\)要快很多。结果就是\(L1\)倾向于把很重要的\(w\)相对缩小,而其他不是很重要的\(w\)减小到几乎为零。

  • Dropout,在每个epoch(回合)中随机关闭一些节点

    Dropout

    Dropout不依靠修改cost函数来避免过拟合,而是修改网络本身,它通过每次都随机删去一部分神经元,对于参数不断更新。由于每次都只有一半的神经元更新了,所以对于它们每次更新的梯度会减半。

    Dropout可以看成不同神经网络对于权值更新都进行了投票,同时也可以这么理解:避免了某个权值依赖其他权值的情况,让训练的权值更鲁棒,让每个权值都能发挥作用。从这个方面看,dropout是直接让权值发挥作用,范数正则化则是惩罚大权值来间接让小权值发挥作用。

3.2 局部最优(局部极小)

“跳出”局部极小的优化策略

初始点搜索法  
  使用多组不同参数值初始化多个神经网络,按标准化方法训练,取其中误差最小的解作为最终参数。这相当于从多个不同的初始点开始搜索,这样就可能陷入不同的局部极小,从中进行选择有可能获得更接近全局最小的结果。

使用“模拟退火”(simulated annealing)技术

  模拟退火在每一步都以一定的概率接收比当前解更差的结果,从而有助于“跳出”局部极小。在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法稳定。
使用随机梯度下降
与标准梯度下降法精确计算梯度不同,随机梯度下降法在计算梯度时加入了随机因素。于是,即使陷入局部极小点,它计算出的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索。

优化方法:

  • 随机重新开始
  • 动量,\(\beta\),\(0<\beta<1\).
    第n步步长,\(step(n) := step(n) + \beta step(n-1) + \beta^2 step(n-2)\) + ...

3.3 梯度消失

在实际训练中,与两种情况下经常出现梯度消失,一是神经网络层数过多太深,二是采用了与模型不合适的损失函数。
  从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。因此出现梯度消失、爆炸的现象。
  从损失函数角度来讲,在计算权值更新信息的时候需要计算前层偏导信息,因此如果激活函数选择不合适,比如使用sigmoid,梯度消失就会很明显了。

优化方法:

  • 采用其他激活函数,如ReLU(修正线性单元)、tanh(双曲正切)、softmax激活函数

    softmax激活函数

    \[a_j^L=\frac{e^{z_j^L}}{\sum_k{e^{z_k^L}}} \]

    这里的 \(z_j^L\) 还是指输入x的线性组合 \((w_j^L)^Tx^{L-1}+b_j^L\)

    softmax输出的结果是一个概率,这是相对于sigmoid的一个优势。同时softmax的一个值和同一层的其他值有关,而sigmoid只和自己的值有关。

    同时,对于softmax梯度消失的问题,使用 \(C \equiv-ln{a_y^L}\) 这样的损失函数(对于类别为y的样本,预测概率 \(a_y^L\) 越高越好):

    \[\frac{\partial{C}}{\partial{b_j^L}}=a_j^L-y_j \\\frac{\partial{C}}{\partial{w_{jk}^L}}=a_k^{L-1}(a_j^L-y_j) \]

    weights中x过小造成的梯度消失则不可能通过设计损失函数来避免。

  • 更改损失函数,如交叉熵损失函数

    更改损失函数为交叉熵损失函数

    交叉熵损失函数的形式为:

    \[C=-\frac{1}{n}\sum_x{[yln{a}+(1-y)ln{(1-a)}]} \]

    此时 \(\frac{\partial{C}}{\partial{w_j}}=\frac{1}{n}\sum_x{\frac{\sigma’(z)x_j}{\sigma(z)(1-\sigma(z))}(\sigma(z)-y)}\).

    \(\sigma\) 为sigmoid函数时,它有一个特殊的性质就是

    \[\sigma’(z)x_j=\sigma(z)(1-\sigma(z)) \]

    所以 \(\frac{\partial{C}}{\partial{w_j}}=\frac{1}{n}\sum_x{x_j(\sigma(z)-y))}\),可以发现这里的 \(\frac{\partial{C}}{\partial{w_j}}\) 已经和 \(\sigma’(z)\) 无关了,就算 \(\sigma(z)\) 已经很接近0或者1,也不会对学习速率产生什么影响,并且预期结果与输出结果差别越大,学习的速率就越快。

    同样可以得出 \(\frac{\partial{C}}{\partial{b}}=\frac{1}{n}\sum_x{(\sigma(z)-y))}\)\(\sigma’(z)\) 无关。

    所以使用sigmoid函数时,交叉熵损失函数可以有效地避免神经元饱和的情况。当使用平方和损失函数时,则对于sigmoid函数没有这样的约分作用。但当激活函数是线性函数时,平方和损失函数也是一个不错的选择,这时它也会得到和 \(\frac{\partial{C}}{\partial{w_j}}=\frac{1}{n}\sum_x{x_j(\sigma(z)-y))}\) 相同的结果,可以说交叉熵损失函数是为了sigmoid函数族量身定做的一个损失函数。

3.4 收敛速度慢

优化方法:

  • 批量梯度下降(BGD)

  • 随机梯度下降(SGD)

  • 小批量梯度下降法(MGD)

        梯度下降法作为机器学习中较常使用的优化算法,其有着三种不同的形式:批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)以及小批量梯度下降(Mini-Batch Gradient Descent)。其中小批量梯度下降法也常用在深度学习中进行模型的训练。接下来,我们将对这三种不同的梯度下降法进行理解。
      为了便于理解,这里我们将使用只含有一个特征的线性回归来展开。

    此时线性回归的假设函数为:

    \[h_{\theta}(x^{(i)}) = \theta_1 x^{(i)} + \theta_0 \\ \]

    其中\(i = 1,2,...,m\)表示样本数。

    对应的目标函数(代价函数)即为:

    \[J(\theta_0, \theta_1) = \frac{1}{2m} \sum \limits_{i=1}^m(h_{\theta}(x^{(i)}) - y^{(i)})^2 \]

    下图为\(J(\theta_0,\theta_1)\)与参数\(\theta_0,\theta_1\)的关系的图:

3.4.1 批量梯度下降(BGD)

  批量梯度下降法是最原始的形式,它是指每一次迭代时使用所有样本来进行梯度的更新。
由上面的目标函数,从数学上理解如下:
(1) 对目标函数求偏导数:

\[\frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} = \frac{1}{m} \sum \limits_{i=1}^{m} (h_{\theta}(x^{(i)}) - y^{(i)})x_j^{(i)} \]

  其中,\(i=1,2,...,m\)表示样本数,\(j=0,1\)表示特征数,这里我们使用偏置值\(x_0^{(i)}=1\)
(2) 每次迭代对参数进行更新:

\[\theta_j := \theta_j - \alpha \frac{1}{m} \sum \limits_{i=1}^m(h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} \]

这里需注意,更新时存在一个求和函数\(\sum\),即为对所有样本进行计算处理(可与SGD法进行比较)
伪代码形式为:
repeat{
       $ \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x{(i)})-y{(i)})x_j^{(i)} $
      (for j =0,1)
}

优点:
  (1)一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行。
  (2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
    当目标函数为凸函数时,BGD一定能够得到全局最优。
缺点:
  (1)当样本数目 \(m\) 很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。
    从迭代的次数上来看,BGD迭代的次数相对较少。

其迭代的收敛曲线示意图可以表示如下:

3.4.2 随机梯度下降(SGD)

  随机梯度下降法不同于批量梯度下降,随机梯度下降是每次迭代使用一个样本来对参数进行更新。使得训练速度加快。
  对一个样本的目标函数为:

\[J^{(i)}(\theta_0, \theta_1) = \frac{1}{2}(h_{\theta}(x^{(i)})-y^{(i)})^2 \]

(1) 对目标函数求偏导

\[\frac{\Delta J^{(i)}(\theta_0, \theta_1)}{\theta_j} = (h_{\theta}(x^{(i)}) - y^{(i)})x_j^{(i)} \]

(1) 参数更新

\[\theta_j := \theta_j - \alpha(h_{\theta}(x^{(i)}) - y^{(i)})x_j^{(i)} \]

注意,这里不再有求和符号\(\sum\).
伪代码形式为:
repeat{
  for i=1,...,m{
     $ \theta_j := \theta_j -\alpha (h_{\theta}(x{(i)})-y{(i)})x_j^{(i)} $
    (for j =0,1)
  }
}

优点:
  (1)由于不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
缺点:
  (1)准确度下降。由于即使在目标函数为强凸函数的情况下,SGD仍旧无法做到线性收敛。
  (2)可能会收敛到局部最优,由于单个样本并不能代表全体样本的趋势。
  (3)不易于并行实现。

解释一下为什么SGD收敛速度比BGD要快:
  答:这里我们假设有30W个样本,对于BGD而言,每次迭代需要计算30W个样本才能对参数进行一次更新,需要求得最小值可能需要多次迭代(假设这里是10);而对于SGD,每次更新参数只需要一个样本,因此若使用这30W个样本进行参数更新,则参数会被更新(迭代)30W次,而这期间,SGD就能保证能够收敛到一个合适的最小值上了。也就是说,在收敛时,BGD计算了\(10×30W\)次,而SGD只计算了 \(1×30W\)次。

从迭代的次数上来看,SGD迭代的次数较多,在解空间的搜索过程看起来很盲目。其迭代的收敛曲线示意图可以表示如下:

3.4.3 小批量梯度下降(MGD)

  在训练深度神经网络时,训练数据的规模通常比较大。如果在梯度下降时,每次迭代都要计算整个训练数据上的梯度,这就需要比较多的计算资源。另外,大规模训练集上的数据通常会非常冗余,也没有必要在整个训练集上计算梯度。因此,在训练深度神经网络时,经常使用“小批量梯度下降法”(Mini-Batch Gradient Descent).

小批量梯度下降,是对批量梯度下降以及随机梯度下降的一个折中办法。其思想是:每次迭代 使用batch_size个样本来对参数进行更新。

  令\(f(x;\theta)\)表示一个深度神经网络,\(\theta\)为网络参数,在使用小批量梯度下降进行优化时,每次选取\(K\)个训练样本\(\mathcal{S}_{t} = \left\{(x^{(k)},y^{(k)}) \right\}_{k=1}^K\)。第\(t\)次迭代(Iteration)时损失函数关于参数\(\theta\)的偏导数为

\[ g_t(\theta) = \frac{1}{K} \underset{x,y} \sum \frac{\partial \mathcal{L}(y,f(x;\theta))}{\partial \theta} \]

其中\(\mathcal{L}(\cdot)\)为可微分的损失函数,K称为批量大小(Batch Size)。
\(t\)次更新的梯度\(g_t\)定义为

\[ g_t \overset{\Delta} = g_t(\theta_{t-1}) \]

使用梯度下降来更新参数,

\[ \theta_t \gets \theta_{t-1} - \alpha g_t \quad 其中\alpha为学习率 \]

每次迭代时,参数更新的差值\(\Delta \theta_t\)定义为

\[ \Delta \theta_t \overset{\Delta}= \theta_t - \theta_{t-1} \]

这里的\(\Delta \theta_t\)并不需要完全一致。\(\Delta \theta_t\)为每次迭代时参数的实际更新方向,即\(\theta_t = \theta_{t-1}+\Delta \theta_t\)。在标准的小批量梯度下降中,\(\Delta \theta_t = \alpha g_t\)

从上面公式可以看出,影响小批量梯度下降法的主要因素有:
(1)批量大小K.
(2)学习率\(\alpha\).
(3)梯度估计.

为了更有效地训练深度神经网络,在标准的小批量梯度下降法的基础上,也经常使用一些改进方法以加快优化速度,比如如何选择批量大小、如何调整学习率以及如何修正梯度估计。

优点:
  (1)通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
  (2)每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。(比如上例中的30W,设置batch_size=100时,需要迭代3000次,远小于SGD的30W次)
  (3)可实现并行化。
  缺点:
  (1)batch_size的不当选择可能会带来一些问题。

  批量大小选择
  由上面可知,在小批量梯度下降法中,批量大小对网络优化的影响也非常大。一般而言,批量大小不影响随机梯度的期望,但是会影响随机梯度的方差。批量大小越大,随机梯度的方差越小,引入的噪声也就越小,训练也越稳定,因此可以设置较大的学习率。而批量大小较小时候,需要设置较小的学习率,否则模型会不收敛。

  学习率通常要随着批量大小的增大而相应地增大。一个简单有效的方法是线性缩放规则(Linear Scaling Rule):当批量大小增加m倍时,学习率也增加m倍。线性缩放规则往往在批量大小比较小时适用,但当批量大小非常大时候,线性缩放会使得训练不稳定。

下图以MNIST数据集为例,给出了从回合(Epoch)和迭代(Iteration)的角度,批量大小对损失下降的影响。

  其中,每一次小批量更新为一次迭代,所有训练集的样本更新一遍为一个回合,两者的关系为

\[1回合(Epoch) = \frac{训练样本的数量N}{批量大小K}×迭代(Iteration). \]

  根据上图(a)图像可以看出,批量大小越大,下降效果越明显,并且下降曲线越平滑。
但从上图(b)来看,如果按整个数据集上的回合(Epoch)数来看,则是批量样本数越小,适当小的批量大小会导致更快的收敛。
  此外,批量大小和模型的泛化能力也有一定的关系,通过实验发现:批量越大,越有可能收敛到尖锐最小值;批量越小,越有可能收敛到平坦最小值。

batch_size的选择带来的影响:
  (1)在合理地范围内,增大batch_size的好处:
    a. 内存利用率提高了,大矩阵乘法的并行化效率提高。
    b. 跑完一次 epoch(回合)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
    c. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
  (2)盲目增大batch_size的坏处:
    a. 内存利用率提高了,但是内存容量可能撑不住了。
    b. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
    c. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

下图显示了三种梯度下降算法的收敛过程:

3.5 学习速度慢

学习率是神经网络优化时的重要超参数。在梯度下降法中,学习率\(\alpha\)的取值非常关键。
若学习率过大就不会收敛,若学习率过小则又收敛速度太慢。

学习率调整方法:

  • 学习率衰减(学习率退火)
  • 学习率预热
  • 周期性学习率调整
  • 自适应学习率调整

详细介绍如下

3.5.1 学习率衰减(学习率退火)

从经验上看,学习率在一开始要保持大一些来保证收敛速度,在收敛到最优点附近时要小些以避免来回振荡。比较简单的学习调整可以通过学习率衰减(Learning Rate Decay)的方式来实现,(也称为学习退火)。
  不失一般性,这里的衰减方式设置为按迭代次数进行衰减。
  假设初始化学习率为\(\alpha_0\),在第t次迭代时的学习率\(\alpha_t\)。常见的衰减方法有以下几种:

分段常数衰减(Piecewise Constant Decay):
  即每经\(T_1,T_2,...,T_m\)次迭代将学习率衰减为原来的\(\beta_1,\beta_2,...,\beta_m\)倍,其中\(T_m\)\(\beta_m<1\)为根据经验设置的超参数。分段常数衰减,也称为阶梯衰减(Step Decay).

逆时衰减(Inverse Time Decay):
  

\[\alpha_t = \alpha_0 \frac{1}{1+\beta×t} \quad 其中\beta为衰减率。 \]

指数衰减(Exponential Decay):

\[\alpha_t = \alpha_0 \beta^{t} \quad 其中\beta < 1为衰减率。 \]

自然指数衰减(Natural Exponential Decay):

\[\alpha_t = \alpha_0 exp(-\beta×t) = \alpha_0 e^{(-\beta t)} \quad 其中\beta为衰减率。 \]

余弦衰减(Cosine Decay):

\[\alpha_t = \frac{1}{2} \alpha_0(1+cos(\frac{t \pi}{T})) \quad 其中T为总的迭代次数 \]

下图给出了不同衰减方法的示例(假设初始学习率为1)

3.5.2 学习率预热

  在小批量梯度下降法中,当批量大小的设置比较大时,通常需要比较大的学习率。但在刚开始训练时,由于参数是随机初始化的,梯度往往也比较大,再加上比较大的初始学习率,会使得训练不稳定。

  为了提高训练稳定性,我们可以在最初几轮迭代时,采用比较小的学习率,等梯度下降到一定程度后再恢复到初始的学习率,这种方法称为学习率预热(Learning Rate Warmup)。

  一个常用的学习率预热方法是逐渐预热(Gradual Warmup)。假设预热的迭代次数为\(T'\),初始学习率为\(\alpha_0\),在预热过程中,每次更新的学习率为

\[\alpha_t' = \frac{t}{T’}\alpha \quad 1 ≤ t ≤ T' \]

 当预热过程结束,再选择一种学习率衰减方法来逐渐降低学习率。
 

3.5.3 周期性学习率调整

  为了使得梯度下降法能够逃离鞍点或尖锐最小值,一种经验性的方式是在训练过程中周期性地增大学习率。当参加处于尖锐最小值附近时,增大学习率有助于逃离尖锐最小值;当参数处于平坦最小值附近时,增大学习率依然有可能在该平坦最小值的吸引域(Basin of Attraction)内。因此,周期性地增大学习率虽然可能短期内损害优化过程,使得网络收敛的稳定性变差,但从长期来看,有助于找到更好的局部最优解。

  这里介绍两种常用的周期性调整学习率的方法:循环学习率带热重启的随机梯度下降

3.5.3.1 循环学习率

  使用循环学习率,即让学习率在一个区间内周期性地增大和缩小。通常可以使用线性缩放来调整学习率,称为三角循环学习率(Triangular Cyclic Learning Rate)。假设每个循环周期的长度相等都为\(2\Delta T\),其中前\(\DeltaT\)步为学习率线性增大阶段,后\(\Delta T\)步为学习率线性缩小阶段。在第\(t\)次迭代时,其所在的循环周期数\(m\)

\[m = \lfloor 1+\frac{t}{2\Delta T}\rfloor \]

其中\(\lfloor \cdot \rfloor\)表示“向下取整”函数。第\(t\)次迭代的学习率

\[\alpha_t = \alpha_{min}^m + (\alpha_{max}^m - \alpha_{min}^m) \left(max(0,1-b) \right). \]

其中\(\alpha_{max}^m\)\(\alpha_{min}^m\)分别为第\(m\)个周期中学习率的上界和下界,可以随着\(m\)的增大而逐渐降低;\(b∈[0,1]\)的计算为

\[b = |\frac{t}{\Delta T} - 2m + 1| \]

3.5.3.2 带热重启的随机梯度下降

  带热重启的随机梯度下降是用热重启方式来替代学习率衰减的方法。学习率每隔一定周期后重新初始化为某个预先设定值,然后逐渐衰减。每次重启后模型参数不是从头开始优化,而是从重启前的参数基础上继续优化。
  假设在梯度下降过程中重启M次,第m次重启在上次重启开始第\(T_m\)个回合后进行,\(T_m\)称为重启周期。在第m次重启之前,采用余弦衰减来降低学习率。第\(t\)次迭代的学习率为

\[\alpha_t = \alpha_{min}^m + \frac{1}{2}(\alpha_{max}^m - \alpha_{min}^m)(1+cos(\frac{T_{cur}}{T_m}\pi)) \]

其中\(\alpha_{max}^m\)\(\alpha_{min}^m\)分别为第\(m\)个周期中学习率的上界和下界,可以随着\(m\)的增大而逐渐降低;
\(T_{cur}\)为从上次重启之后的回合(Epoch)数。\(T_{cur}\)可以取小数,比如0.1,0.2等,这样可以在一个回合内部进行学习率衰减。重启周期\(T_m\)可以随着重启次数逐渐增加,比如\(T_m = T_{m-1}×\mathcal{k}\),其中\(\mathcal{k}\)≥1为放大因子。

下图给出了两种周期性学习率调整的示例(假设初始学习率为1),每次周期中学习率的上界也逐步衰减。

3.5.4 自适应学习率调整

自适应学习率调整包含以下几种算法:\(AdaGrad\)算法、\(RMSprop\)算法、\(AdaDelta\)算法

3.5.4.1 \(AdaGrad\)算法

   \(AdaGrad\)算法是借鉴L2正则化的思想,每次迭代时自适应地调整每个参数的学习率。在第\(t\)次迭代时,先计算每个参数梯度平方的累计值

\[G_t = \sum \limits_{\tau=1}^t g_{\tau} \odot g_{\tau} \]

其中\(\odot\)为按元素乘积,\(g_{\tau}∈ \mathbb{R}^{|\theta|}\)是第\(\tau\)次迭代时的梯度。

\(AdaGrad\)算法的参数更新差值为

\[\Delta \theta_t = - \frac{\alpha}{\sqrt{G_t + \epsilon}}\odotg_t \]

其中\(\alpha\)是初始的学习率,\(\epsilon\)是为了保持数值稳定性而设置的非常小的常数,一般取值\(e^{-7}到e^{-10}\)。此外,这里开平方、除、加运算都是按元素进行的操作。

  在\(AdaGrad\)算法中,如果某个参数的偏导数累积比较大,其学习率相对较小;相反,如果其偏导数累积较小,其学习率相对较大。但整体是随着迭代次数的增加,学习率逐渐缩小。

  \(AdaGrad\)算法的缺点是在经过一定次数的迭代依然没有找到最优点时,由于这时的学习率已经非常小,很那再继续找到最优点。

3.5.4.2 \(RMSprop\)算法

  \(RMSprop\)算法是Geoff Hinton提出的一种自适应学习率的方法,可以在有些情况下避免\(AdaGrad\)算法中学习率不断单调下降以至于过早衰减的缺点。
  \(RMSprop\)算法首先计算每次迭代梯度\(g_t\)平方的指数衰减移动平均,

\[G_t = \beta G_{t-1} + (1-\beta)g_t \odotg_t \\ = (1-\beta) \sum \limits_{\tau=1}^t \beta^{t-\tau}g_{\tau} \odot g_{\tau} \]

其中\(\beta\)为衰减率,一般取值为0.9。
\(RMSprop\)算法的参数更新差值为

\[\Delta \theta_t = -\frac{\alpha}{\sqrt{G_t+\epsilon}}\odotg_t \]

其中\(\alpha\)是初始的学习率,比如0.001。
  从上式可以看出,\(RMSprop\)算法和\(AdaGrad\)算法的区别在于\(G_t\)的计算由累积方式变成指数衰减移动平均。在迭代过程中,每个参数的学习率并不总是呈衰减趋势,既可以变小也可以变大。

3.5.4.3 \(AdaDelta\)算法

  \(AdaDelta\)算法也是对\(AdaGrad\)算法的一个改进,与\(RMSprop\)算法类似,\(AdaDelta\)算法通过梯度平方的指数衰减移动平均来调整学习率。此外,\(AdaDelta\)算法通过梯度平方的指数衰减移动平均来调整学习率。此外,\(AdaDelta\)算法还引入了每次参数更新差值\(\Delta \theta\)的平方的指数衰减权移动平均。
  
  第\(t\)次迭代时,参数更新差值\(\Delta \theta\)的平方的指数衰减权移动平均为

\[\Delta X_{t-1}^2 = \beta_1 \Delta X_{t-2}^2 + (1-\beta_1)\Delta \theta_{t-1} \odot \Delta \theta_{t-1} \]

  其中\(\beta_1\)为衰减率。此时\(\Delta \theta_t\)还未知,因此只能计算到\(\Delta X_{t-1}\)

  \(AdaDelta\)算法的参数更新差值为

\[\Delta \theta_t = -\frac{\sqrt{\Delta X_{t-1}^2} + \epsilon}{\sqrt{G_t + \epsilon}}g_t \]

  其中\(G_t\)的计算方式和\(RMSprop\)算法一样,\(\Delta X_{t-1}^2\)为参数更新差值\(\Delta \theta\)的指数衰减权移动平均。
  从上式可以看出,\(AdaDelta\)算法将\(RMSprop\)算法中的初始学习率\(\alpha\)改为动态计算的\(\sqrt{\Delta X_{t-1}^2}\),在一定程度上平抑了学习率的波动。

(四)深度学习的基本概念

为了更好的理解深度学习,这里引用邱锡鹏《神经网络与深度学习》的相关内容:

4.1 机器学习总结

  机器学习(Machine Learning,ML)是指从有限的观测数据中学习(或“猜测”)出具有一般性的规律,并利用这些规律对未知数据进行预测的方法。机器学习是人工智能的一个重要分支,并逐渐成为推动人工智能发展的关键因素。

  传统的机器学习主要关注如何学习一个预测模型。一般需要首先将数据表示为一组特征(Feature),特征的表示形式可以是连续的数值、离散的符号或其他形式。然后将这些特征输入到预测模型,并输出预测结果。这类机器学习有看作浅层学习(Shallow Learning)。浅层学习的一个重要特点是不设计特征学习,其特征主要靠人工经验或特征转换方法来抽取。
  
  当我们用机器学习来解决实际任务时,会面对多种多样的数据形式,比如声音、图像、文本等。不同数据的特征构造方式差异很大。对于图像这类数据,我们可以很自然地将其表示为一个连续的向量。而对于文本数据,因为其一般由离散符号组成,并且每个符号在计算机内部都表示为无意义的编码,所以通常很难找到合适的表示方式。因此,在实际任务中使用机器学习模型一般会包含以下几个步骤:

(1) 数据预处理:经过数据的预处理,如去除噪声等。比如在文本分类中,去除停用词。
(2) 特征提取:从原始数据中提取一些有效的特征。比如在图像分类中,提取边缘、尺度不变特征变换(Scale Invariant Feature Transform,SIFT)特征等。
(3) 特征转换:对特征进行一定的加工,比如降维和升维。降维包括特征抽取(Feature Extraction)和特征选择(Feature Selection)两种途径。常用的特征转换方法有主成分分析(Principal Components Analysis,PCA)、线性判别分析(Linear Discriminant Analysis,LDA)等。
(4) 预测:机器学习的核心部分,学习一个函数并进行预测。

  上述流程中,每步特征处理以及预测一般都是分开进行的。传统的机器学习模型主要关注最后一步,即构建预测函数。但是在实际操作过程中,不同预测模型的性能相差不多,而前三步中的特征处理对最终系统的准确性有着十分关键的作用。特征处理一般都需要人工干预完成,利用人类的经验来选取好的特征,并提高机器学习系统的性能。因此,很多的机器学习问题变成了特征工程(Feature Engineering)问题。开发一个机器学习系统的主要工作量都消耗在了预处理、特征提取以及特征转换上。

4.2 表示学习

  为了提高机器学习系统的准确率,我们就需要将输入信息转换为有效的特征,或者更一般性地称为表示(Representation)。如果有一种算法可以自动地学习出有效的特征,并提高最终机器学习模型的性能,那么这种学习就可以叫做表示学习(Representation Learning)。

语义鸿沟 表示学习的关键是解决语义鸿沟(Semantic Gap)问题。
  语义鸿沟问题是指输入数据的底层特征和高层语义信息之间的不一致性和差异性。比如给定一些关于“车”的图片,由于图片中每辆车的颜色和形状等属性都不尽相同,因此不同图片在像素级别上的表示(即底层特征)差异性也会非常大。但是我们理解这些图片是建立在比较抽象的高层语义概念上的。如果一个预测模型直接建立在底层特征之上,会导致对预测模型的能力要求过高。如果可以有一个好的表示在某种程度上能够反映出数据的高层语义特征,那么我们就能相对容易地构建后续的机器学习模型。
  在表示学习中,有两个核心问题:一是“什么是一个好的表示”;二是“如何学习到好的表示”。

4.2.1 局部表示和分布式表示

“好的表示”是非常主观的概念,没有一个明确的标准。但一般而言,一个好的表示具有以下几个优点:
(1) 一个好的表示应该具有很强的表示能力,即同样大小的向量可以表示更多信息。
(2) 一个好的表示应该使后续的学习任务变得简单,即需要包含更高层的语义信息。
(3) 一个好的表示应该具有一般性,是任务或领域独立的。虽然目前的大部分表示学习方法还是基于某个任务来学习,但我们期望其学到的表示可以比较容易地迁移到其他任务上。
  在机器学习中,我们经常使用两种方式来表示特征:局部表示(Local Representation)和分布式表示(Distributed Representation)。
  以颜色表示为例,我们可以用很多词来形容不同的颜色,除了基本的“红”“蓝”“绿”“白”“黑”等之外,还有很多以地区或物品命名的,比如“中国红”“天蓝色”“咖啡色”“琥珀色”等。如果要在计算机中表示颜色,一般有两种表示方法。
  一种表示颜色的方法是以不同名字来命名不同的颜色,这种表示方式叫作局部表示,也称离散表示符号表示。局部表示通常可以表示为one-hot向量的形式。假设所有颜色的名字构成一个词表\(\mathcal{V}\),词表大小为\(|\mathcal{V}|\)。我们可以用一个\(|\mathcal{V}|\)的one-hot向量来表示每一种颜色。在第\(i\)种颜色对应的one-hot向量中,第\(i\)维的值为1,其他都为0。
  局部表示有两个优点:
(1)这种离散的表示方式具有很好的解释性,有利于人工归纳和总结特征,并通过特征组合进行高效的特征工程;
(2)通过多种特征组合得到的表示向量通常是稀疏的二值向量,当用于线性模型时计算效率非常高。但局部表示有两个不足之处:
a.one-hot向量的维数很高,且不能扩展。如果有一种新的颜色,我们就需要增加一维来表示;
b.不同颜色之间的相似度都为0,即我们无法知道“红色”和“中国红”的相似度要高于“红色”和“黑色”的相似度。
  另一种表示颜色的方式是用RGB值来表示颜色,不同颜色对应到R、G、B三维空间中一个点,这种表示方式叫做分布式表示。分布式表示通常可以表示为低维的稠度向量。
  和局部表示相比,分布式表示的表示能力要强很多,分布式表示的向量维度一般都比较低。我们只需要用一个三维的稠密向量就可以表示所有颜色。并且,分布式表示也很容易表示新的颜色名。此外,不要颜色之间的相似度也很容易计算。  

下表列出了4种颜色的局部表示和分布式表示示例。

  我们可以使用神经网络来将高维的局部表示空间\(\mathbb{R}^{|\mathcal{v}|}\)映射到一个非常低维的分布式表示空间\(\mathbb{R}^{D}\)\(D\ll |\mathcal{V}|\)。在这个低维空间中,每个特征不再是坐标轴上的点,而是分散在整个低维空间中。在机器学习中,这个过程也称为嵌入(Em-bedding)。嵌入通常指将一个度量空间中的一些对象映射到另外低维的度量空间中,并尽可能保持不同对象之间的拓补关系。比如自然语言中词的分布式表示,也经常叫做词嵌入

  下图展示了一个三维one-hot向量空间和一个二维嵌入空间的对比。

  

图中有三个样本\(w_1,w_2,w_3\)在one-hot向量空间中,每个样本都位于坐标轴上,每个坐标轴上一个样本。而在低维的嵌入空间中,每个样本都不在坐标轴上,样本之间可以计算相似度。

4.2.2 表示学习

  要学习到一种好的高层语义表示(一般为分布式表示),通常需要从底层特征开始,经过多步非线性转换才能得到。深层结构的优点是可以增加特征的重用性,从而指数级地增加表示能力。因此,表示学习的关键是构建具有一定深度的多层次特征表示。
  在传统的机器学习中,也有很多有关特征学习的方法,比如主成分分析、线性判别、独立成分分析等。但是,传统的特征学习一般是通过人为地设计一些准则,然后根据这些准则来选取有效的特征。特征的学习是和最终预测模型的学习分开进行的,因此学习到的特征不一定可以提升最终模型的性能。

4.3 深度学习

  为了学习一种好的表示,需要构建具有一定“深度”的模型,并通过学习算法来让模型自动学习出好的特征表示(从底层特征,到中层特征,再到高层特征),从而最终提升预测模型的准确率。所谓“深度”是指原始数据进行非线性特征转换的次数。如果把一个表示学习系统看作是一个有向图结构,深度也可以看作从输入节点到输出节点所经过的最长路径的长度。
  
  这样我们就需要一种学习方法可以从数据中学习一个“深度模型”,这就是深度学习(Deep Learning,DL)。深度学习是机器学习的一个子问题,其主要目的是从数据中自动学习到有效的特征表示。

  下图给出了深度学习的数据处理流程。通过多层的特征转换,把原始数据变成更高层次、更抽象的表示。这些学习的表示可以替代人工设计的特征,从而避免“特征工程”。

  深度学习是将原始的数据特征通过多步的特征转换得到一种特征表示,并进一步输入到预测函数得到最终结果。和“浅层学习”不同,深度学习需要解决的关键问题是贡献度分配(Credit Assignment Problem,CAP),即一个系统中不同的组件(component)或其参数对最终系统输出结果的贡献或影响。
  
  以下围棋为例,每当下完一盘棋,最后的结果要么赢要么输。我们会思考哪几步导致了最后的胜利,或者又是哪几步导致了最后的败局。如何判断每一步棋的贡献就是贡献度分配问题,这是一个非常困难的问题。从某种意义上来讲,深度学习可以看作是一种强化学习(Reinforcement Learning,RL),每个内部组件并不能直接得到监督信息,需要通过整个模型的最终监督信息(奖励)得到,并且有一定的延时性。
  
  目前,深度学习采用的模型主要是神经网络模型,其主要原因是神经网络模型可以使用误差反向传播算法,从而可以比较好地解决贡献度分配问题。只要是超过一层的神经网络都会存在贡献度分配问题,因此可以将超过一层的神经网络都看作是深度学习模型。随着深度学习的快速发展,模型深度也从早期的5~10层增加到目前的数百曾。随着模型深度的不断增加,其特征表示的能力也越来越强,从而使后续的预测更加容易。

  理论上,参数越多,模型复杂度就越高,容量(capability)就越大,从而能完成更复杂的学习任务。深度学习(deep learning)正是一种极其复杂而强大的模型。

  如何增大模型复杂度?
  这里有两个办法,一是增加隐层数目,二是增加隐层神经元的数目。前者更有效一些,因为它不仅增加了功能神经元的数量,还增加了激活函数嵌套的层数。但是对多隐层神经网络,经典算法如标准BP算法往往会在误差逆传播时发散(diverge),无法收敛达到稳定状态。
  
  那么要怎么才能有效地训练多隐层神经网络呢?
  一般来说,有以下两种方法:

  1.无监督逐层训练(unsupervised layer-wide training):每次训练一层隐节点,把上一层隐节点的输出当作输入来训练,本层隐节点训练好后,输出再作为下一层的输入来训练,这称为预训练(pre-trainning)。全部预训练完成后,再对整个网络进行微(fine-tuning)训练。
一个典型的例子就是深度信念网络(deep belief network,简称DBN)。这种做法其实可以视为把大量的参数进行分组,先找出每组较好的设置,再基于这些局部最优的结果来训练全局最优。
  
  2.权共享(weight sharing):令同一层神经元使用完全相同的连接权,典型的例子是卷积神经网络(Convolutional Neural Network,简称CNN)。这样做可以大大较少需要训练的参数数目。

以CNN进行手写数字识别任务为例,如下图所示。

  网络输入是一个\(32×32\)的手写数字图像,输出是其识别结果,CNN复合多个“卷积层”和“采样层”对输入信号进行加工,然后在连接层实现与输出目标之间的映射。每个卷积层都包含读个特征映射(feature map),每个特征映射是一个由多个神经元构成的“平面”,通过一种卷积滤波器提取输入的一种特征。
  
  例如,上图中第一个卷积层都由6个特征映射构成,每个特征映射是一个\(28×28\)的神经元阵列,其中每个神经元负责从\(5×5\)的区域通过卷积滤波器提取局部特征。采样层亦称为“汇合(pooling)层”,其作用是基于局部相关性原理进行亚采样,从而在减少数据量的同时保持有用信息。
  
  如上图,第一个采样层有6个\(14×14\)的特征映射,其中每个神经元与上一层中对应特征映射的\(2×2\)领域相连,并据此计算输出。通过复合卷积层和采样层,图中的CNN将原始图像映射成120维特征向量,最后通过一个由84个神经元构成的连接层和输出层连接完成识别任务。CNN可用BP算法进行训练,但在训练中,无论是在卷积层还是采样层,其每一组神经元(即图中的每个“平面”)都是用相同的连接权,从而大幅减少了需要训练的参数数目。  

  深度学习可以理解为一种特征学习(feature learning)或者表示学习(representation learning),无论是DBN还是CNN,都是通过多个隐层来把与输出目标联系不大的初始输入转化为与输出目标更加密切的表示,使原来只通过单层映射难以完成的任务变成可能。即通过多层处理,逐渐将初始的“低层”特征表示转化为“高层”特征表示,从而使得最后可以用简单的模型来完成复杂的学习任务。

  传统任务中,样本的特征需要人类专家来设计,这称为特征工程(feature engineering)。特征好坏对泛化性能有至关重要的影响。而深度学习为全自动数据分析带来了可能,可以自动产生更好的特征。

  

(五)常见的深度网络结构

神经网络模型、算法繁多,这里不能详尽描述,故只对特别常见的几种网络稍作简介。

  • RBF网络
  • ART网络
  • SOM网络
  • 级联相关网络
  • Elman网络
  • Boltzmann机

5.1 RBF网络

  RBF(Radial Basis Function,径向基函数)网络,是一种单隐层前馈神经网络,它使用径向基函数作为隐层神经元激活函数,而输出层则是对隐层神经元输出的线性组合。假定输入为\(d\)维向量\(x\),输出为实值,则RBF网络可表示为

\[\varphi(x) = \sum \limits_{i}^q w_i \rho(x,c_i) \]

其中\(q\)为隐层神经元个数,
\(c_i\)表示第\(i\)个隐层神经元所对应的中心,\(w_i\)表示第\(i\)个隐层神经元所对应的权重。
\(\rho(x,c_i)\)是径向基函数,这是某种沿径向对称的标量函数,通常定义为样本\(x\)到数据中心\(c_i\)之间欧式距离的单调函数。常用的径向基函数形如

\[\rho(x,c_i) = e^{(-\beta_i||x-c_i||^2)} \]

  [Park and Sandberg]证明,具有足够多隐层神经元的RBF网络能以任意精度逼近任意连续函数。
通常采用两步过程来训练RBF网络:
第一步,确定神经元中心\(c_i\),常用的方式包括随机采样、聚类等;
第二步,利用BP算法等来确定参数\(w_i\)\(\beta_i\)。  

5.2 ART网络

  竞争型学习(competitive learning)是神经网络中一种常用的无监督学习策略,在使用该策略时,网络的输出神经元相互竞争,每一时刻仅有一个竞争获胜的神经元被激活,其他神经元的状态被抑制。这种机制亦称“胜者通吃”(winner-take-all)原则。
  
  ART(Adaptive Resonance Theory,自适应谐振理论)网络是竞争型学习的重要代表。该网络由比较层、识别层、识别阈值和重置模块构成。其中,比较层负责接收输入样本,并将其传递给识别层神经元。识别层每个神经元对应与一个模式类,神经元数目可在训练过程中动态增长以增加新的模式类。

  在接收到比较层的输入信号后,识别层神经元之间相互竞争以产生获胜神经元。竞争的最简单方式是,计算输入向量与每个识别层神经元所对应的模式类的代表向量之间的距离,距离最小者胜。获胜神经元将向其他识别层神经元发送信号,抑制其激活。若输入向量与获胜神经元所对应的代表向量之间的相似度大于识别阈值,则当前输入样本将归为该代表向量所属类别,同时,网络连接权将会更新,使得以后在接收到相似输入样本时该模式类会计算出更大的相似度,从而使该获胜神经元有更大可能获胜;若相似度不大于识别阈值,则重置模块将在识别层增设一个新的神经元,其代表向量就设置为当前输入向量。

  显然,识别阈值对ART网络的性能有重要影响。当识别阈值较高时,输入样本将会分成比较多、比较精细的模式类,而如果识别阈值较低,则会产生比较少、比较粗略的模式类。
  
  ART比较好地缓解了竞争型学习中的“可塑性-稳定性窘境”(stability-plasticity),可塑性是指神经网络要有学习新知识的能力,而稳定性则是神经网络在学习新知识要保持对旧知识的记忆。这就使得ART网络具有一个很重要的优点:可进行增量学习(incremental learning)或在线学习(online learning)。
  
  早期的ART网络只能处理布尔型输入数据,此后ART发展成了一个算法族,包括能处理实值输入的ART2网络、结合模糊处理的FuzzyART网络,以及可进行监督学习的ARTMAP网络等。

5.3 SOM网络

  SOM(Self-Organizing Map,自组织映射)网络是一种竞争学习型的无监督神经网络,它能将高维输入数据映射到低维空间(通常为二维),同时保持输入数据在高维空间拓补结构,即将高维空间中相似的样本点映射到网络输出层中邻近神经元。
  
  如下图所示,SOM网络中的输出层神经元以矩阵方式排列在二维空间中,每个神经元都拥有一个权向量,网络在接收输入向量后,将会确定输出层获胜神经元,它决定了该输入向量在低维空间中的位置。SOM的训练目标就是为每个输出层神经元找到合适的权向量,以达到保持拓补结构的目的。

  SOM的训练过程很简单:在接收到一个训练样本后,每个输出层神经元会计算该样本与自身携带的权向量之间的距离,距离最近的神经元称为竞争获胜者,称为最佳匹配单元(best matching unit)。然后,最佳匹配单元及其邻近神经元的权向量将被调整,以使得这些权向量与当前输入样本的距离缩小。这个过程不断迭代,直至收敛。
  

5.4 级联相关网络

  一般的神经网络模型通常假定网络结构是事先固定的,训练的目的是,利用训练样本来确定合适的连接权、阈值等参数。与此不同,结构自适应网络则将网络结构也当作学习的目标之一,并希望能在训练过程中找到最符合数据特点的网络结构。级联相关(Cascade-Correlation)网络是结构自适应网络的重要代表。

  级联相关网络有两个主要成分:“级联”和“相关”。

   

[级联相关网络的训练过程。新的隐节点加入时,红色连接权通过最大化新节点的输出与网络误差之间的相关性来进行训练。]

  级联是指建立层次连接的层级结构。在开始训练时,网络只有输入层和输出层,处于最小拓补结构;随着训练的进行,如图所示,新的隐层神经元逐渐加入,从而创建起层级结构。当新的隐层神经元加入时,其输入端连接权值是冻结固定的。相关是指通过最大化新神经元的输出与网络误差之间的相关性(correlation)来训练相关的参数。

  与一般的前馈神经网络相比,级联相关网络无需设置网络层数、隐层神经元数目,且训练速度较快,但其在数据较小时易陷入过拟合。  

5.5 Elman网络

  与前馈神经网络不同,“递归神经网络”(recurrent neural network)允许网络中出现环形结构,从而可让一些神经元的输出反馈回来作为输入信号。这样的结构与信息反馈过程,使得网络在\(t\)时刻的输出状态不仅与\(t\)时刻的输入有关,还与\(t-1\)时刻的网络状态有关,从而能处理与时间有关的动态变化。
  
  Elman网络是最常用的递归神经网络之一,其结构如图所示,它的结构与多层前馈网络很相似,但隐层神经元的输出被反馈回来,与下一时刻输入层神经元提供的信号一起,作为隐层神经元在下一时刻的输入。隐层神经元通常采用\(Sigmoid\)激活函数,而网络的训练则常通过推广的BP算法进行。

5.6 Boltzmann机

神经网络中有一类模型为网络状态定义一个“能量”(energy),能量最小化时网络达到理想状态,而网络的训练就是在最小化这个能量函数。Boltzmann机就是一种“基于能量的模型”(energy-based model),常见结构如下图所示,其神经元分为两层:显层与隐层。
显层用于表示数据的输入与输出,隐层则被理解为数据的内在表达。
Boltzmann机中的神经元都是布尔型的,即只能取0、1两种状态,状态1表示激活,状态0表示抑制。
令向量\(s∈\left\{0,1\right\}^n\)表示\(n\)个神经元的状态,\(w_{ij}\)表示神经元\(i\)\(j\)之间连接权,\(\theta_i\)表示神经元\(i\)的阈值,则状态向量\(s\)所对应的Boltzmann机能量定义为

\[E(s) = -\sum \limits_{i=1}^{n-1} \sum \limits_{j=i+1}^n w_{ij}s_is_j - \sum \limits_{i=1}^n \theta_i s_i \]

若网络中的神经元以任意不依赖于输入值的输入值的顺序进行更新,则网络最终将达到Boltzmann分布,此时状态向量\(s\)出现的概率将仅由其能量与所有可能状态向量的能量确定:

\[P(s) = \frac{e^{-E(s)}}{\sum_t e^{-E(t)}} \]

  Boltzmann机的训练过程就是将每个训练样本视为一个状态向量,使其出现的概率尽可能大。标准的Boltzmann机是一个全连接图,训练网络的复杂度很高,这使其难以用于解决现实任务。现实总常采用受限Boltzmann机(Restricted Boltzmann Machine,简称RBM)。如下图所示,受限Boltzmann机结构由完全图简化为二部图。
  
  受限Boltzmann机常用“对比散度”(Contrastive Divergence,简称CD)算法来进行训练。假定网络中有\(d\)个显层神经元和\(q\)个隐层神经元,令\(v\)\(h\)分别显层与隐层的状态向量,则由于同一层内不存在连接,有

\[P(v|h) = \overset{d}{\underset{i=1}\Pi}P(v_i|h) \\ P(v|h) = \overset{q}{\underset{j=1}\Pi}P(h_j|v) \]

CD算法对每个训练样本\(v\),先根据\(P(v|h) = \overset{q}{\underset{j=1}\Pi}P(h_j|v)\)计算出隐层神经元状态的概率分布,然后根据这个概率分布采样得到\(h\);此后,类似地根据\(P(v|h) = \overset{d}{\underset{i=1}\Pi}P(v_i|h)\)\(h\)产生\(v'\),再从\(v'\)产生\(h'\);
连接权的更新公式为

\[\Delta \omega = \eta(vh^{T}-v'h'^{T}) \]

参考材料:
(1)周志华《机器学习》
(2)李航《统计学习方法》
(3)邱锡鹏《神经网络与深度学习》
(4)感知机原理(Perceptron)
(5)批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解
(6)[机器学习] ML重要概念:梯度(Gradient)与梯度下降法

posted @ 2021-04-16 23:43  Xu_Lin  阅读(401)  评论(0编辑  收藏  举报