西瓜书《机器学习》全网最详细解读 第五章:神经网络

前言

《机器学习》,又称西瓜书,是南京大学教授周志华教授编著的一本机器学习领域的经典教材。《机器学习》系统地介绍了机器学习的基本理论、常用算法及其应用。全书内容丰富,涵盖了机器学习的多个重要方面,包括监督学习、无监督学习、强化学习等主要学习范式。《机器学习》适合计算机科学、人工智能、数据科学等相关专业的本科生、研究生以及对机器学习感兴趣的自学者。无论是初学者希望系统地学习机器学习的基础知识,还是有一定基础的研究人员和从业者希望深入了解前沿技术,这本书都能提供有价值的参考。

在接下来的日子里,我将每周精心打磨一章内容,全方位、多角度地为大家剖析书中精髓。无论是复杂难懂的算法,还是晦涩难解的公式,我都会以通俗易懂的方式逐一解读,力求让每一位读者都能轻松掌握其中的奥秘。让我们一起在知识的海洋中遨游,探索机器学习的无限魅力!

第一章:西瓜书《机器学习》全网最详细解读 第一章:绪论_机器学习 西瓜书-优快云博客

第二章:西瓜书《机器学习》全网最详细解释 第二章:模型评估-优快云博客

第三章:西瓜书《机器学习》全网最详细解读 第三章:线性模型-优快云博客

第四章:西瓜书《机器学习》全网最详细解读 第四章:决策树-优快云博客

在本系列中:

  • 重点内容将使用加粗或者红字显示
  • 普通内容使用普通颜色显示
  • 示例使用蓝色显示

-

-

5.1 神经元模型

神经网络是一种模仿生物神经元结构和功能的人工智能模型。它由大量的节点(神经元)和连接这些节点的边(突触)组成,这些节点和边共同构成了一个复杂的网络结构。

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

后来有学者将上述情形抽象“M-P 神经元模型”。在这个模型中,神经元接收到来自 n 个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接(connection)进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过“激活函数”(activation function)处理以产生神经元的输出。输出信号又可以作为其他神经元的输入,从而实现信息在网络中的传递和处理。

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

单层神经元的计算过程:

  1. 计算所有的w_i\cdot x_i,其中x_i代表一个属性,w_i代表相应属性的重要程度。如判断好瓜的过程中, 如果颜色重要,那么颜色的权重w就大,其他权重就小。
  2. 将他们加起来,得到\sum_{i=1}^{n}w_i\cdot x_i 
  3. 减去阈值\theta,得到\sum_{i=1}^{n}w_i\cdot x_i-\theta
  4. 经过激活函数f,得到输出 y=f(\sum_{i=1}^{n}w_i\cdot x_i-\theta)

激活函数是一个重要的概念,我们这里先介绍激活函数的作用,读者可能一时无法理解,我们后续再做更详细的讲解:

神经网络的基本单元是神经元,每个神经元的输出通常是输入的加权和。如果没有激活函数,无论神经网络有多少层,其最终输出仍然是输入的线性组合。换句话说,多层神经网络将退化为一个简单的线性模型,无法学习复杂的模式和关系。激活函数通过非线性变换,使得神经网络能够捕捉和表示复杂的非线性关系,从而大大增强了模型的表达能力和灵活性。 

理想中的激活函数是图(a) 所示的阶跃函数,它将输入值映射为输出值“0”或“1”,显然“1”对应于神经元兴奋,“0”对应于神经元抑制。然而,阶跃函数具有不连续、不光滑等不太好的性质,因此实际常用 Sigmoid 函数作为激活函数。

这点内容在第3章讲解过,读者可以回顾一下:单位阶跃函数不连续,不连续函数在不连续点处的导数通常不存在。而现代深度学习模型最基本的数学原理就是求导,无法求导也就意味着我们无法使用阶跃函数。

典型的 Sigmoid 函数如图(b) 所示,它把可能在较大范围内变化的输入值挤压到 (0,1) 输出值范围内,因此有时也称为“挤压函数”(squashing function)。

其他的常见激活函数如Relu、tanh、Leaky ReLU、Softmax等

经过激活函数后,当x越接近+\infty,y就越接近1;而当x越接近-\infty,y就越接近0。

神经网络的工作原理类似于人脑的学习过程。在训练阶段,网络会接收大量的输入数据和对应的期望输出数据,通过调整神经元之间的连接权重,使得网络的输出逐渐逼近期望的输出。这个过程通常通过一种称为反向传播的算法来实现。反向传播算法会计算网络输出与期望输出之间的误差,然后将误差从输出层向输入层逐层反向传播,同时根据误差对连接权重进行调整,以优化网络的性能。(见5.3节)经过多次的训练迭代,神经网络能够学习到输入数据与输出数据之间的映复杂射关系,从而在面对新的输入数据时能够做出准确的预测或分类。

-

从计算机科学的角度看,我们只需将一个神经网络视为包含了许多参数的数学模型,这个模型是若干个函数,例如 y_j = f\left(\sum_i w_i x_i - \theta_j\right)相互(嵌套)代入而得。

-

-

5.2 感知机与多层网络

感知机(Perceptron)由一层神经元组成,输入层(一般不计入层数)接收外界输入信号后传递给输出层,输出层是 M-P 神经元,亦称“阈值逻辑单元”(threshold logic unit)。

注意:书上说两层神经元,实际上是算上了输入层,但大部分的教材中都不会计算输入层。我们一般认为单个神经元就是一个单层的感知机网络。

感知机能容易地实现逻辑与、或、非运算。我们以书上的案例为例:

对于感知机y = f\left(\sum_i w_i x_i - \theta\right),假设激活函数f\geq0时,y=1;否则y=0,有

  • “与”(x_1 \land 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 时,1 \cdot x_1 + 1 \cdot x_2 - 2\geq 0,因此 y = 1;
  • “或”(x_1 \lor x_2): 令 w_1 = w_2 = 1, \theta = 0.5,则y = f(1 \cdot x_1 + 1 \cdot x_2 - 0.5)
    x_1 = 1x_2 = 1时,1 \cdot x_1 + 1 \cdot x_2 - 0.5\geq 0,因此y = 1;
  • “非”(\neg x_1): 令 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; 当 x_1 = 0 时,y = 1。

给定训练数据集,权重 w_i (i = 1, 2, \ldots, n) 以及阈值 \theta 可通过学习得到。感知机学习规则非常简单,对训练样例 (x, y),若当前感知机的输出为 \hat{y},则感知机权重将这样调整:
        w_i \leftarrow w_i + \Delta w_i
        \Delta w_i = \eta (y - \hat{y}) x_i
其中 \eta \in (0,1) 称为学习率 (learning rate)。可看出,若感知机对训练样例 (x, y) 预测正确,即 \hat{y} = y,则感知机不发生变化,否则将根据错误的程度进行权重调整。

对该公式的解读如下,需要读者具备一定的高数基础。 

上述调整过程可以看做这样的过程:

然而,感知机只拥有一层功能神经元(functional neuron),其学习能力非常有限。

若两类模式是线性可分的,即存在一个线性超平面能将它们分开,则感知机的学习过程一定会收敛(converge)而求得适当的权向量 \boldsymbol{w} = (w_1; w_2; \ldots; w_{n+1})。如图 5.4(a)-(c) 所示,与、或、非问题都是线性可分(linearly separable)的问题。

否则感知机学习过程将会发生振荡(fluctuation),\boldsymbol{w}难以稳定下来,不能求得合适解,例如感知机甚至不能解决如图 5.4(d) 所示的异或这样简单的非线性可分问题。

-

那么我们该如何解决如异或这样的非线性问题呢?

要解决非线性可分问题,需考虑使用多层神经元。例如图 5.5 中这个简单的两层感知机就能解决异或问题。在图 5.5(a) 中,输出层与输入层之间的神经元,被称为隐层或隐含层(hidden layer),隐含层和输出层神经元都是拥有激活函数的功能神经元。

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

在这个神经网络中,一共有4层(隐藏层*3+输出层,输入层没有任何参数,不计入),每层有若干神经元,每个神经元都是本节所提到的所谓感知机,包括激活函数和参数w和b,经过计算后输出,输出结果传递给下一层

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

在5.3节,我们将介绍如何调整多层神经网络神经元的权重。
-

-

5.3 误差逆传播算法

本节需要读者具备一定的高数基础。

显然,多层网络的学习能力比单层感知机强得多。然而若欲训练多层网络,简单感知机学习规则显然不够了,需要更强大的学习算法。

误差逆传播(error BackPropagation,简称 BP)算法就是其中最杰出的代表,它是迄今最成功的神经网络学习算法。通常说“BP 网络”时,一般是指用 BP 算法训练的多层前馈神经网络。

误差逆传播算法(Backpropagation,简称BP)是神经网络训练中的一种核心算法,用于计算损失函数对网络参数的梯度,从而通过优化方法(如梯度下降)更新参数,以最小化误差。

算法流程

  1. 前向传播:输入数据通过神经网络的各层,逐层计算得到输出结果。
  2. 误差计算:在输出层,计算网络预测值与真实值之间的差异,通常使用均方误差(MSE)或交叉熵损失函数来量化误差。
  3. 反向传播:误差从输出层开始,逐层向输入层传播。利用链式法则,计算损失函数对每一层权重的梯度。(本节内容,注意:反向传播并不是真的反向,而是从链式法则的角度看起来像反向更新参数,故名反向传播
  4. 权重更新:根据计算得到的梯度,使用梯度下降法或其他优化算法更新网络的权重和偏置。更新规则通常为:w_{\text{new}} = w_{\text{old}} - \eta \cdot \frac{\partial E}{\partial w}(本节内容)

-

图 5.7 给出了一个拥有 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_{ih} x_i,输出层第 j 个神经元接收到的输入为 \beta_j = \sum_{h=1}^{q} w_{hj} b_h,其中 b_h 为隐层第 h 个神经元的输出。

接下来我们看书上的公式推导过程:

  1. 首先,给定训练集 D = \{(x_1, y_1), (x_2, y_2), \ldots, (x_m, y_m)\}x_i \in \mathbb{R}^dy_i \in \mathbb{R}^l,其中x_i为输入数据,而y_i为真实标签(我们期望的输出值),而每个输入数据由 d 个属性描述,输出 l 维实值向量。
  2. 前向传播:数据经过神经网络后,其输出为 \hat{y}_k = (\hat{y}_j^k, \hat{y}_2^k, \ldots, \hat{y}_l^k),即\hat{y}_j^k = f(\beta_j - \theta_j)
  3. 误差计算:我们需比较模型输出值\hat{y}_j^k和真实标签值y_j^k的差距,这里我们使用均方误差:E_k = \frac{1}{2} \sum_{j=1}^{l} (\hat{y}_j^k - y_j^k)^2(详见第2.3节,这里不多赘述)

现在,我们先看一下模型,图 5.7 的网络中有 (d+l+1)q+l 个参数需确定:输入层到隐层的 d \times q 个权值、隐层到输出层的q \times l 个权值、q 个隐层神经元的阈值、l 个输出层神经元的阈值。与5.2的算法一样,我们也需要BP 迭代更新模型,也就是说对于上述模型,任意一个参数 v 的更新估计式为v \leftarrow v + \Delta v.(这里的参数v实际上就是图中的连接权w_{hj}v_{ih}、阈值\theta_j\gamma_h)。

那么我们如何仿照单层感知机,对模型的每一个权重都进行梯度下降法更新?

我们首先先看如何对最后一层的权重w_{hj}进行更新,实际上由于w_{hj}是输出层的输入权重,我们可看成一层感知机。给定学习率\eta,其更新步长为\Delta w_{hj} = -\eta \frac{\partial E_k}{\partial w_{hj}}

我们可以看到隐藏层的输出b_h首先与权重w_{hj}相乘,所有权重乘积求和,然后进入神经元计算激活函数,最后计算损失函数。 这实际上是一个链式过程,我们依据上面的过程可以列出表达式:\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}},其中:

  • 其中\beta_j = \sum_{h=1}^{q} w_{hj} b_h,这是输入到激活函数的数据,因此有  \frac{\partial \beta_j}{\partial w_{hj}} = b_h
  • 其中 \hat{y}_j^k = f(\beta_j - \theta_j),这是神经元的输出,而 f 就是激活函数Sigmoid, Sigmoid 函数有一个很好的性质:
    f'(x) = f(x)(1 - f(x)) ,因此  \frac{\partial \hat{y}_j^k}{\partial \beta_j}= \hat{y}_j^k (1 - \hat{y}_j^k)
  • 其中 E_k = \frac{1}{2} \sum_{j=1}^{l} (\hat{y}_j^k - y_j^k)^2 这是和真实值的比较得到的误差,因此 \frac{\partial E_k}{\partial \hat{y}_j^k}=(\hat{y}_j^k - y_j^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}}=(\hat{y}_j^k - y_j^k)\cdot\hat{y}_j^k (1 - \hat{y}_j^k)\cdot b_h

为了方便起见,书上令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)= \hat{y}_j^k (1 - \hat{y}_j^k)(y_j^k - \hat{y}_j^k)
之后将上式代入式\frac{\partial E_k}{\partial w_{hj}},就得到了 BP 算法中关于 w_{hj} 的更新公式:\Delta w_{hj} = \eta g_j b_h

-

上面的推导全部是基于一层神经元的情况,如果遇到多层,如我们想计算 v_{ih} 的更新步长,该怎么办?

其实,我们也可以根据链式法则,推导更长的式子,以此计算隐藏层的权重。

如下,我们想要对第一层的权重v_{ih}进行更新,可以得到其链式法则推导式:

\frac{\partial E_k}{\partial v_{ih}} = \frac{\partial E_k}{\partial b_{h}}\cdot \frac{\partial b_h}{\partial \alpha_h}\cdot \frac{\partial \alpha_h}{\partial v_{ih}}= \sum_{j=1}^{l}\frac{\partial E_k}{\partial \beta _{j}}\cdot \frac{\partial \beta _{j}}{\partial b_h}\cdot \frac{\partial b_h}{\partial \alpha_h}\cdot \frac{\partial \alpha_h}{\partial v_{ih}}\\= \sum_{j=1}^{l}\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 b_{h}}\cdot \frac{\partial b_{h}}{\partial b_h}\cdot \frac{\partial b_h}{\partial \alpha_h}\cdot \frac{\partial \alpha_h}{\partial v_{ih}}

  • 其中\alpha _h = \sum_{i=1}^{d} v_{ih} x_i,这是输入到第一个激活函数的数据,因此有  \frac{\partial \alpha_h}{\partial v_{ih}} = x_i
  • 其中 b_h = f(\alpha _h - \gamma _h),这是第一个神经元的输出,得到  \frac{\partial b_h}{\partial \alpha _h}= b_h (1 - b_h)
  • 剩余部分都是输出层的参数。因为我们要计算所有输出层神经元的梯度,因此计算\sum_{j=1}^{l} \frac{\partial E_k}{\partial b_{h}}\cdot \frac{\partial b_h}{\partial \alpha_h}

其结果为:= \sum_{j=1}^{l} w_{hj} g_j f'(\alpha_h - \gamma_h)\cdot x_i= b_h (1 - b_h) \sum_{j=1}^{l} w_{hj} g_j \cdot x_i

为了方便起见,书上令e_h = -\frac{\partial E_k}{\partial b_h} \cdot \frac{\partial b_h}{\partial \alpha_h}= b_h (1 - b_h) \sum_{j=1}^{l} w_{hj} g_j \cdot,则v_{ih} 的更新公式为:\Delta v_{ih} = \eta e_h x_i

类似可得
        \Delta \theta_j = -\eta g_j
        \Delta \gamma_h = -\eta e_h

至此,我们可以通过反向传播计算整个神经网络的所有参数。 

-

其中,学习率 \eta \in (0,1) 控制着算法每一轮迭代中的更新步长,若太大则容易振荡,太小则收敛速度又会过慢。

-

图 5.8 给出了 BP 算法的工作流程。对每个训练样例,BP 算法执行以下操作:

  1. 先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果\hat{y}_k
  2. 然后计算输出层的误差 (第 5 行),然后计算梯度g_j
  3. 再将误差逆向传播至隐层神经元 (第 6 行),计算梯度e_h
  4. 最后根据隐层神经元的误差来对连接权w_{hj}v_{ih}和阈值\theta _j\gamma _h进行调整 (第 7 行)。
  5. 该迭代过程循环进行,直到达到某些停止条件为止,例如训练误差已达到一个很小的值。

图 5.9 给出了在 2 个属性、5 个样本的西瓜数据上,随着训练轮数的增加,网络参数和分类边界的变化情况。 

-

其中BP 算法的目标是要最小化训练集 D 上的累积误差:E = \frac{1}{m} \sum_{k=1}^{m} E_k,但我们上面介绍的“标准 BP 算法”每次仅针对一个训练样例更新连接权和阈值,也就是说,图 5.8 中算法的更新规则是基于单个的 E_k 推导而得。

如果类似地推导出基于累积误差 E 最小化的更新规则,就得到了累积误差逆传播(accumulated error backpropagation)算法。

接下来,我们要区分几个重要概念:

  • 标准BP算法标准BP算法每次针对单个训练样例都要更新权值与阈值,即每训练1个样本更新一次参数。这种方法的参数更新频繁,不同样例可能抵消,需要多次迭代。
  • 累积BP算法累积BP算法的优化目标是最小化整个训练集上的累计误差,读取整个训练集一遍才对参数进行更新,参数更新频率较低。
  • 批处理BP算法:即Batch BP算法。批处理BP算法在每次更新权重和偏置时,不是基于单个样本,而是基于训练集的一个子集(称为一个“batch”)来计算误差和梯度。这种方法介于标准BP算法(每次更新基于单个样本,类似于随机梯度下降)和累积BP算法(每次更新基于整个训练集,类似于批量梯度下降)之间。

在很多任务中,累计误差下降到一定程度后,进一步下降会非常缓慢,这时标准BP算法往往会获得较好的解,尤其当训练集非常大时效果更明显。

批处理BP算法通过计算整个batch的误差平均值来更新权重,这样可以在一定程度上减少更新的方差,提高训练的稳定性和收敛速度。同时,由于不是对每个样本都进行一次更新,批处理BP算法在计算和内存使用上通常比标准BP算法更高效。 

-

有论文证明:只需一个包含足够多神经元的隐层,多层前馈网络就能以任意精度逼近任意复杂度的连续函数。然而,如何设置隐层神经元的个数仍是个未决问题,实际应用中通常靠“试错法”(trial-by-error)调整。

正是由于其强大的表示能力,BP 神经网络经常遭遇过拟合,其训练误差持续降低,但测试误差却可能上升。

有两种策略常用来缓解 BP 网络的过拟合

  1. 第一种策略是“早停” (early stopping):将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。
  2. 第二种策略是“正则化” (regularization),其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。仍令 E_k 表示第 k 个训练样例上的误差,w_i 表示连接权和阈值,则误差目标函数改变为 E = \lambda \frac{1}{m} \sum_{k=1}^{m} E_k + (1 - \lambda) \sum_i w_i^2,其中 \lambda \in (0,1) 。(详见第11.4节,这里不多介绍)

-

-

5.4 全局最小和局部极小

此时,神经网络的训练过程可看作一个参数寻优过程,即在参数空间中,寻找一组最优参数使得 损失 E 最小。

两种“最优”:“局部极小”(local minimum)和“全局最小”(global minimum)。

  • 局部极小解是参数空间中的某个点,其邻域点的误差函数值均不小于该点的函数值。
    数学定义:
    \boldsymbol{w}^* 和 \theta^*,若存在 \varepsilon > 0 使得\forall \ (\boldsymbol{w}; \theta) \in \{ (\boldsymbol{w}; \theta) \mid \|(\boldsymbol{w}; \theta) - (\boldsymbol{w}^*; \theta^*)\| \leqslant \varepsilon \} \ ,都有 E(\boldsymbol{w}; \theta) \geqslant E(\boldsymbol{w}^*; \theta^*) 成立,则 (\boldsymbol{w}^*; \theta^*) 为局部极小解;
  • 全局最小解则是指参数空间中所有点的误差函数值均不小于该点的误差函数值。
    数学定义:
    若对参数空间中的任意 (\boldsymbol{w}; \theta) 都有E(\boldsymbol{w}; \theta) \geqslant E(\boldsymbol{w}^*; \theta^*),则 (\boldsymbol{w}^*; \theta^*) 为全局最小解。

根据高数知识,我们知道对于梯度为零的点,只要其误差函数值小于邻点的误差函数值,就是局部极小点;整个函数空间可能存在多个局部极小值,但却只会有一个全局最小值。也就是说,“全局最小”一定是“局部极小”,反之则不成立。例如,图 5.10 中有两个局部极小,但只有其中之一是全局最小。

显然,我们在参数寻优过程中是希望找到全局最小。

 -

基于梯度的搜索是使用最为广泛的参数寻优方法。在此类方法中,我们从某些初始解出发,迭代寻找最优参数值。每次迭代中,我们先计算误差函数在当前点的梯度,然后根据梯度确定搜索方向。由于负梯度方向是函数值下降最快的方向,因此梯度下降法就是沿着负梯度方向搜索最优解。若误差函数在当前点的梯度为零,则已达到局部极小,更新量将为零,这意味着参数的迭代更新将在此停止。

显然,如果误差函数仅有一个局部极小,那么此时找到的局部极小就是全局最小;然而,如果误差函数具有多个局部极小,则不能保证找到的解是全局最小。对后一种情形,我们称参数寻优陷入了局部极小,这显然不是我们所希望的。

在现实任务中,人们常采用以下策略来试图“跳出”局部极小,从而进一步接近全局最小:

  1. 网格搜索:以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数。这相当于从多个不同的初始点开始搜索,这样就可能陷入不同的局部极小,从中进行选择有可能获得更接近全局最小的结果。
  2. 使用“模拟退火”(simulated annealing)技术。模拟退火在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小。在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法稳定。
  3. 使用随机梯度下降。与标准梯度下降法精确计算梯度不同,随机梯度下降法在计算梯度时加入了随机因素。于是,即便陷入局部极小点,它计算出的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索。

此外,遗传算法(genetic algorithms)也常用来训练神经网络以更好地逼近全局最小。

需注意的是,上述用于跳出局部极小的技术大多是启发式,理论上尚缺乏保障。也就是说,它们是碰运气的算法,不一定成功!

-

-

5.5 其他常见神经网络

以下6种网络目前已经不常见了,了解即可。

5.5.1 RBF网络

RBF(Radial Basis Function,径向基函数)网络是一种单隐层前馈神经网络,它使用径向基函数作为隐层神经元激活函数,而输出层则是对隐层神经元输出的线性组合。

假定输入为 d 维向量 \boldsymbol{x},输出为实值,则 RBF 网络可表示为\varphi(\boldsymbol{x}) = \sum_{i=1}^{q} w_i \rho(\boldsymbol{x}, \boldsymbol{c}_i)注意:与常规神经网络的先乘权重再激活不同,RBF网络是先进行激活,然后与权重w_i相乘。

其中

  • q 为隐层神经元个数,
  • \boldsymbol{c}_iw_i 分别是第 i 个隐层神经元所对应的中心和权重,
  • \rho(\boldsymbol{x}, \boldsymbol{c}_i) 是径向基函数,这是某种沿径向对称的标量函数,通常定义为样本 \boldsymbol{x} 到数据中心 \boldsymbol{c}_i 之间欧氏距离的单调函数。常用的高斯径向基函数形如\rho(\boldsymbol{x}, \boldsymbol{c}_i) = e^{-\beta_i \|\boldsymbol{x} - \boldsymbol{c}_i\|^2}

可证明具有足够多隐层神经元的 RBF 网络能以任意精度逼近任意连续函数。

我们通常采用两步过程来训练 RBF 网络:

  1. 第一步,确定神经元中心 \boldsymbol{c}_i,常用的方式包括随机采样、聚类等;
  2. 第二步,利用 BP 算法等来确定参数 w_i\beta_i

-

5.5.2 ART网络

竞争型学习(competitive learning)是神经网络中一种常用的无监督学习策略,在使用该策略时,网络的输出神经元相互竞争,每一时刻仅有一个竞争获胜的神经元被激活,其他神经元的状态被抑制。这种机制亦称“胜者通吃”(winner-take-all)原则。

ART(Adaptive Resonance Theory,自适应谐振理论)由比较层、识别层、识别阈值和重置模块构成。在接收到比较层的输入信号后,识别层神经元之间相互竞争以产生获胜神经元。竞争的最简单方式是,计算输入向量与每个识别层神经元所对应的模式类的代表向量之间的距离,距离最小者胜。获胜神经元将向其他识别层神经元发送信号,抑制其激活。

若输入向量与获胜神经元所对应的代表向量之间的相似度大于识别阈值,则当前输入样本将被归为该代表向量所属类别,同时,网络连接权将会更新,使得以后在接收到相似输入样本时该模式类会计算出更大的相似度,从而使该获胜神经元有更大可能获胜;若相似度不大于识别阈值,则重置模块将在识别层增设一个新的神经元,其代表向量就设置为当前输入向量。

当识别阈值较高时,输入样本将会被分成比较多、比较精细的模式类,而如果识别阈值较低,则会产生比较少、比较粗略的模式类。

-

5.5.3 SOM网络

SOM(Self-Organizing Map,自组织映射)网络是一种竞争学习型的无监督神经网络,它能将高维输入数据映射到低维空间(通常为二维),同时保持输入数据在高维空间的拓扑结构,即将高维空间中相似的样本点映射到网络输出层中的邻近神经元。(SOM就是将高维数据映射到低维空间,同时尽可能保留其高维关系,即所谓降维

如图 5.11 所示,SOM网络通常由一个二维的神经元网格组成,每个神经元与整个输入向量相连接。神经元在网格中的位置表示其在输出空间中的位置,而神经元的权重向量表示其在输入空间中的位置。

这里的输入是3维,经过映射后变成2维平面,实现了降维

SOM 的训练过程很简单:

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

-

5.5.4 级联相关网络

级联相关网络(Cascade-Correlation)是一种构造性神经网络,它在训练过程中将网络的结构也视为学习的目标之一,希望找到适合数据的网络结构。这种网络从一个具有输入层和输出层的小规模基本网络开始,并通过自动训练和添加隐藏单元,逐渐扩展成一个更深层次的结构。

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

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

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

-

5.5.5 Elman网络

与前馈神经网络不同,“循环神经网络”(recurrent neural networks)允许网络中出现环形结构,从而可让一些神经元的输出反馈回来作为输入信号。这样的结构与信息反馈过程,使得网络在 t 时刻的输出状态不仅与 t 时刻的输入有关,还与 t-1 时刻的网络状态有关,从而能处理与时间有关的动态变化。

Elman 网络是最常用的递归神经网络之一,其结构如图 5.13 所示,它的结构与多层前馈网络很相似,但隐层神经元的输出被反馈回来,与下一时刻输入层神经元提供的信号一起,作为隐层神经元在下一时刻的输入。

-

5.5.6 Boltzmann机

神经网络中有一类模型是为网络状态定义一个“能量”(energy),能量最小化时网络达到理想状态,而网络的训练就是在最小化这个能量函数。

Boltzmann 机就是一种“基于能量的模型”(energy-based model),常见结构如图 5.14(a) 所示,其神经元分为两层:显层与隐层。显层用于表示数据的输入与输出,隐层则被理解为数据的内在表达。(注意,Boltzmann机类似于全连接图,输入输出是可见的点,内部还有隐藏层,Boltzmann机在学习每一个边的连接权,然后建模点与点的关系)

Boltzmann 机中的神经元都是布尔型的,即只能取 0、1 两种状态,状态 1 表示激活,状态 0 表示抑制。令向量 \boldsymbol{s} \in \{0,1\}^n 表示 n 个神经元的状态,w_{ij}表示神经元 i 与 j 之间的连接权,\theta_i表示神经元 i 的阈值,则状态向量 \boldsymbol{s} 所对应的 Boltzmann 机能量定义为E(\boldsymbol{s}) = -\sum_{i=1}^{n-1} \sum_{j=i+1}^{n} w_{ij} s_i s_j - \sum_{i=1}^{n} \theta_i s_i

Boltzmann 机的训练过程就是将每个训练样本视为一个状态向量,使其出现的概率尽可能大。标准的 Boltzmann 机是一个全连接图,训练网络的复杂度很高,这使其难以用于解决现实任务。

 -

现实中常采用受限 Boltzmann 机(Restricted Boltzmann Machine,简称 RBM)。如图 5.14(b) 所示,受限 Boltzmann 机仅保留显层与隐层之间的连接,从而将 Boltzmann 机结构由完全图简化为二部图。(受限Boltzmann 机相当于将输入和输出都变成显层数据(只不过这个时候输出可能是空),通过映射到隐层,再反映射回显层,得到输出结果。其实它还是图结构,只不过输入的点之间没有直接连接)

受限 Boltzmann 机常用“对比散度”(Contrastive Divergence,简称 CD)算法来进行训练。假定网络中有 d 个显层神经元和 q 个隐层神经元,令 \boldsymbol{v}\boldsymbol{h} 分别表示显层与隐层的状态向量,则由于同一层内不存在连接,有

P(\boldsymbol{v}|\boldsymbol{h}) = \prod_{i=1}^{d} P(v_i|\boldsymbol{h})         (5.22        显层映射到隐层)

P(\boldsymbol{h}|\boldsymbol{v}) = \prod_{j=1}^{q} P(h_j|\boldsymbol{v})        (5.23        再由隐层映射到显层)

CD 算法对每个训练样本 \boldsymbol{v},先根据式 (5.23) 计算出隐层神经元状态的概率分布,然后根据这个概率分布采样得到 \boldsymbol{h};此后,类似地根据式 (5.22) \boldsymbol{h} 产生 \boldsymbol{v}',再从 \boldsymbol{v}' 产生 \boldsymbol{h}';连接权的更新公式为 \Delta w = \eta (\boldsymbol{v} \boldsymbol{h}^\top - \boldsymbol{v}' \boldsymbol{h}'^\top)

-

-

5.6 深度学习

随着云计算、大数据时代的到来,计算能力的大幅提高可缓解训练低效性,训练数据的大幅增加则可降低过拟合风险,因此,以“深度学习”(deep learning)为代表的复杂模型开始受到人们的关注。

无监督逐层训练(unsupervised layer-wise training)是多隐层网络训练的有效手段,其基本思想是每次训练一层隐结点,训练时将上一层隐结点的输出作为输入,而本层隐层的输出作为下一层隐层的输入,这称为“预训练”(pre-training)。

在预训练全部完成后,再对整个网络进行“微调”(fine-tuning)训练。

“预训练+微调”的做法可视为将大量参数分组,对每组先找到局部看来比较好的设置,然后再基于这些局部较优的结果联合起来进行全局寻优。这样就在利用了模型大量参数所提供的自由度的同时,有效地节省了训练开销。

这里的预训练+微调是早期的神经网络概念,与当今流行的大模型的预训练+微调不同。

当今:

预训练是指在一个大型数据集上训练模型,让模型见到尽可能多的数据,使得模型学习到通用的特征表示。

微调是指在预训练模型的基础上,针对特定任务进行进一步训练的过程。

简单来说:预训练是在大规模数据集上学到通用表示,微调是在预训练基础上对一个特定的任务进行增强。

另一种节省训练开销的策略是“权共享”(weight sharing),即让一组神经元使用相同的连接权。这个策略在卷积神经网络(Convolutional Neural Network,简称 CNN)中发挥了重要作用。在CNN中,卷积层通过权共享来实现。卷积核在图像上滑动,对图像不同位置的输入应用相同的权重,从而提取局部特征。

深度学习模型机制可看作是对输入信号进行逐层加工,从而把初始的、与输出目标之间联系不太密切的输入表示,转化成与输出目标联系更密切的表示。换言之,通过多层处理,逐渐将初始的“低层”特征表示转化为“高层”特征表示后,用“简单模型”即可完成复杂的分类等学习任务。由此可将深度学习理解为进行“特征学习”(feature learning)或“表示学习”(representation learning)。

以往在机器学习用于现实任务时,描述样本的特征通常需由人类专家来设计,这称为“特征工程”(feature engineering)。众所周知,特征的好坏对泛化性能有至关重要的影响,人类专家设计出好特征也并非易事;特征学习则通过机器学习技术自身来产生好特征,这使机器学习向“全自动数据分析”又前进了一步。

-

-

另一个重要问题:激活函数的作用

我们本文先介绍激活函数的作用,并没有讲解为什么,最后,我们对其原理进行解释:

简单来说:激活函数为神经网络引入了非线性因素,使得网络能够学习和模拟复杂的函数映射关系。如果没有激活函数,无论神经网络有多少层,其实都相当于一个线性模型,无法解决非线性问题。

我们从数学形式上解释一下这个问题:

  1. 对于单层线性模型,其数学形式为:y = wx+b
  2. 假如我们只使用线性模型进行多层堆叠,其数学形式为:y=w_2(w_1x+b_1)+b_2=w_2w_1x+w_2b_1+b_2=Wx+B

你会发现无论堆叠多少层,其数学形式均可以表达成 Wx+B的形式,这就意味着多层堆叠其实都相当于一个线性模型,你的堆叠没有任何意义。

没有非线性激活函数,无论神经网络有多少层,其整体行为都将是线性的,这将大大限制网络处理复杂问题的能力。

而有了激活函数后:

先对线性层进行激活 y=f(w_1x+b_1),然后再堆叠一层线性层,可得到y=w_2\cdot f(w_1x+b_1)+b_2\neq Wx+B,这使得多层堆叠完全不等于单层,神经网络才能进行更复杂的建模,多层神经网络才真正有了意义。

非线性激活函数使得网络变换为更丰富的形式,从而能够学习输入数据的复杂映射关系,从而提高模型的表达能力和泛化能力。

-

-

 亲爱的朋友们,非常感谢您抽出宝贵的时间阅读我的博客。在这里,我分享了一些自己学习的点滴。如果您在阅读过程中有所收获,或者觉得这些内容引起了您的共鸣,希望能得到您的一次点赞,这对我来说是莫大的鼓励。同时,如果您对我的分享感兴趣,不妨关注一下我的博客,这样就能及时收到我的更新通知,不错过更多有趣的内容。另外,如果这些文章对您有帮助,也可以收藏起来,方便日后查阅。您的支持是我不断前行的动力,再次感谢您的陪伴!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值