西瓜书学习笔记 | 神经网络
Daisy Author

本文是我学习周志华老师编写的机器学习书籍『西瓜书』的第五章:神经网络的过程中做的笔记.

神经元模型

def: 由具有适应性的简单单元组成的广泛并行互联网络, 模拟生物神经系统对真实世界产生的交互反应.

基本单位:神经元模型(neuraon)

模型接收来自 n 个神经元传递的输入信号, 通过带权重的连接进行传递(加权求和), 总输入值将与神经元的阈值进行比较, 通过激活函数产生输出.

4.1

输入信号 总输入 产生输出

激活函数: 理想情况下为阶跃函数 不连续、不光滑

实际使用 Sigmoid 函数(对数几率函数)作为激活函数:

感知机与多层网络

def: 感知机(perceptron)由两层神经元组成, 输入层接收外界输入信号后传递给输出层(亦称阈值逻辑单元)

感知机的数学表达:

img

感知机的阈值 (亦称偏置)可以看作一个固定输入为 -1.0 的哑结点(dummy node)所对应的连接权重 , 这样, 权重和阈值的学习可以统一为权重的学习.

通过对权重和阈值的统一表示, 我们可以将感知机的数学写为向量内积形式:

感知机的权重通过梯度下降法进行调整, 当感知机输出为 , 使用均方误差 作为评价函数时:

  • 权重梯度:
  • 权重改变量:
  • 梯度下降更新:

其中 称为学习率.

事实上, 感知机只拥有一层功能神经元, 其学习negligence非常有限, 它只能有效地处理线性可分(linear separable)的问题.感知机收敛的条件是两类模式线性可分, 否则其学习过程会发生震荡.

感知机不能解决异或问题.

要解决异或问题, 需要使用多层网络, 考虑一个简单的数学直观:

对于 问题, 根据真值表, 我们可以将其等价为与仅包含与或非逻辑运算符的表达式

根据我们之前的讨论, 感知机可以解决与、或、非问题, 因此, 我们可以分别对 进行感知机表达, 然后进一步对两个表达式的输出进行 表达, 这样一来, 我们相当于将两个逻辑或运算并联输入一个逻辑与运算.

这启示我们, 我们在解决非线性问题可以采用感知机的级联, 一个两层感知机即可求解异或问题.

使用更深(更多层)的感知机级联, 可以表达更复杂的非线性问题.

nn

这样的网络被称为“多层前馈神经网络”.

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

反向传播算法

笔者认为西瓜书在这一部分的思维跳跃性较大, 像笔者一样的初学者一般难以适应, 因此在这一部分加入了大部分读者的理解, 希望能够渐进而直观地解释反向传播算法.

深层网络的训练需要依靠误差反向传播算法(error backpropagation).

给定训练集 , ,

使用如图多层前馈神经网络进行求解, 使用 表示输出层第 j 个 神经元的阈值, 使用 表示隐藏层第 h 个神经元的阈值, 输出层和隐藏层均使用 sigmoid 激活函数:

nn-3

对训练集样本 , 神经网络的输出为 , 则 .

网络在 上的均方误差损失为:

网络中待确定参数的个数为 , BP 是一个迭代学习算法, 基于梯度下降策略, 在迭代的每一轮采用广义感知器学习规则对参数进行更新.

首先考虑靠近输出层的连接权重 , 我们希望求出该权重的更新公式.

直观上看, 我们只需要获得损失相对于权重的梯度, 便可以对更新公式进行表达:

注意到 首先影响到第 j 个输出层神经元 , 再影响到其输出值 , 最后影响到损失 , 我们可以根据链式法则对其梯度进行展开:

显然, 是对隐层神经元输出的线性汇聚, 它相对于 的梯度显然为上一层:

sigmoid 函数性质:

我们定义输出层误差(输出层损失对输出层神经元输入的偏导):

我们可以根据输出层误差和输出层输入对权重的偏导写出权重 的更新公式:

我们在感知机部分对神经元的阈值和权重进行了统一表达,我们可以将其拓展到多层网络,得到输出层神经元的阈值更新公式:

我们接下来考虑隐藏层的连接权重 , 由于与输出层之间被一层稠密连接的权重层所分割, 我们无法直观地利用链式法则展开.

我们在分析输出层权重更新规则时定义了输出层误差的概念, 我们将其拓展到隐藏层, 对隐藏层定义误差, 有:

有了隐藏层误差, 我们便可以很容易地将损失相对于隐藏层权重的梯度利用链式法则进行展开:

问题便转化为了对隐藏层误差的表达, 我们基于对神经网络拓扑结构的几何直观, 不难发现, 隐藏层第 h 个神经元的输出将会作为输出层所有神经元的输入分量.

也就是说, 对于该隐藏层神经元, 其对所有输出层神经元的输出误差都做出了贡献, 因此, 我们将所有输出层神经元的输出误差反向传播, 通过权重加权汇聚在该隐藏层神经元, 通过进一步的链导法则展开, 可以对该隐藏层神经元的误差进行表达.

表达了隐藏层权重的误差, 我们可以进一步写出隐藏层权重和阈值的更新表达式:

到这里, 我们便推出了利用误差反向传播算法更新权重与阈值的表达式, 我们对反向传播算法的主要步骤进行总结:

  1. 前向传播计算输出
  2. 输出层误差计算
  3. 输出层误差反向传播, 获取隐藏误差
  4. 根据误差计算权重梯度并进行更新

我们以上的讨论是基于单样本误差进行更新, 这被称为标准 BP 算法, 我们同样可以推导出基于累积误差最小化的更新规则, 但是标准 BP 算法具有在线更新的优点, 且其梯度具有随机性, 这一性质对我们优化后期跳出局部极小值有一定帮助.

由于神经网络具有很强大的表示能力,其常常遭遇过拟合, 体现为训练误差持续降低, 但测试误差却可能上升, 有两种策略来防止过拟合.

  • 早停 (early stopping)
    将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值.
  • 正则化 (regularization)
    其基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和.仍令 表示第 k 个训练样例上的误差, 表示连接权和阙值,则误差目标函数改变为:

    被称为正则化系数, 用于对经验误差和网络复杂度进行折中, 事实上, 早停也可以被看作是一个正则化手段.

全局极大与全局极小

神经网络的训练过程可看作一个参数寻优过程, 也就是在一个参数空间中寻找一组最优参数使得 E 最小.

我们谈到的最优有两种: 局部极小和全局最小, 神经网络通常会优化并收敛于一个局部极小值, 但这不是我们所希望的, 为了跳出局部极小接近全局最小, 有以下手段, 仅作了解:

  • 多组不同参数初始化 (调参)
  • 智能优化算法 (ex. 模拟退火, 遗传算法)
  • 随机梯度下降