- (人工)神经网络:由人工神经元和神经元之间的连接组成
- 早期,是一种连接主义模型,更进一步,是一种分布式并行处理模型,分布式并行处理模型有 3 个特性
- 信息表示是分布式的(非局部的)
- 记忆和知识是存储在单元之间的连接上
- 通过逐渐改变单元之间的连接强度来学习新的知识
- 从机器学习角度,神经网络可以看作一个非线性模型
- 其基本组成单元为具有非线性激活函数的神经元,通过大量神经元之间的连接,使得神经网络成为一种高度非线性的模型
- 神经元之间的连接权重就是需要学习的参数
- 采用误差反向传播和梯度下降进行学习
- 早期,是一种连接主义模型,更进一步,是一种分布式并行处理模型,分布式并行处理模型有 3 个特性
4.1 神经元
- (人工)神经元:是构成神经网络的基本单元,接收一组信息输入并产生输出
概念 | 定义 |
---|---|
净输入 z | ,表示一个神经元所获得的输入信号 x 的加权和 |
活性值 a | , 是非线性的激活函数 |
激活函数 | 现代神经网络的激活函数通常要求是连续可导的非线性函数 |
为了增强网络的表示能力和学习能力,激活函数需要具备的特点:
- 连续并可导(允许少数点少不可导)的非线性函数,可导的激活函数可以直接利用数值优化的方法来学习网络参数
- 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率
- 激活函数地导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定新
-
4.1.1 Sigmoid 型函数
Sigmoid 型函数是一类 S 型曲线函数,为两端饱和函数,常用的 Sigmoid 函数有 Logistic 函数和 Tanh 函数。
- 左饱和:函数 f(x),当
时,其导数
- 右饱和:函数 f(x),当
时,其导数
- 两端饱和:同时满足左、右饱和
- 左饱和:函数 f(x),当
Logistic 函数:
,值域为 (0, 1)
- (优点)装备了 Logistic 激活函数的神经元具有两点性质:
- 其输出直接可以看作概率分布(将实数域的输入“挤压”到 (0, 1)),使得神经网络可以更好地和统计学习模型进行结合
- 其可以看作一个软性门,用来控制其他神经元输出信息的数量
- 缺点:输出恒大于 0,非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移,并进一步使得梯度下降的收敛速度变慢
- (优点)装备了 Logistic 激活函数的神经元具有两点性质:
Tanh 函数:
,值域为 (-1, 1)
- 优点:输出是零中心化的
Logistic 函数和 Tanh 函数具有饱和性,但计算开销较大。这两个函数在 0 附近近似线性,两端饱和,因此可以用分段函数来近似:
Hard-Logistic 函数:
Hard-Tanh 函数:
4.1.2 ReLU 函数
ReLU 函数/Rectifier 函数,修正线性单元,是一个斜坡函数,定义:
- 优点:
- 采用 ReLU 的神经元只需进行加、乘、比较的操作,计算上更加高效
- 具有生物和理性:ReLU 具有很好的稀疏性,大约 50% 的神经元处于激活状态,而 Sigmoid 型函数会导致 一个非稀疏的神经网络
- 在优化方面,Sigmoid 型函数是两端饱和的,可能导致梯度消失的问题;而 ReLU 函数为左饱和函数,且在 x>0 时导数为 1,在一定程度上缓解了神经网络的梯度消失问题,加速梯度下降的收敛速度
- 缺点:
- ReLU 函数的输出是非零中心化的,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率
- 死亡 ReLU 问题:由于当
时,函数恒等于 0,所以当一个 ReLU 神经元在一次不恰当更新后梯度变为 0,则永远不能再被激活
不过,有以下几种变种 ReLU 函数可以解决死亡 ReLU 问题 or 非零中心化的问题:
- 带泄露的 ReLU:
- 当
时,也能保持一个很小的梯度 γ,使得神经元非激活时也能有一个非零的梯度可以更新参数,避免死亡 ReLU 问题
- 当
- 带参数的 ReLU:
- i 代表第 i 个神经元,每个神经元可以有不同的可学习的参数
- ELU 函数(指数线性单元):
- 使一个近似的零中心化的非线性函数,γ≥0 是一个超参数,决定 x≤0 时的包和曲线,并调整输出均值在 0 附近
- Softplus 函数:
,其导数刚好是 Logistic 函数
- 可以看作 ReLU 函数的平滑版本
4.1.3 Swish 函数
Swish 函数,是一种自控门激活函数,定义:
- 前面提到 Logistic 函数 σ(·) 可以看作一种软性的门控机制,当
接近于 1 时,门的状态为“开”,swish 函数的输出接近于 x 本身;当
接近于 0 时,门的状态为“关”,swish 函数的输出接近于 0
4.1.4 GELU 函数
GELU,高斯误差线性单元,也是一种通过门控机制来调整输出值的激活函数
定义:,
是高斯分布
的累积分布函数
- 一般设
- 高斯分布的累积分布函数为 S 型函数,因此 GELU 函数可以用 Tanh 函数或 Logistic 函数近似
4.1.5 Maxout 单元
Maxout 单元也是一种分段线性函数
- Sigmoid 型函数、ReLU 函数等激活函数的输入是神经元的净输入
,是一个标量;而 Maxout 单元的输入是上一层神经元的全部原始输入,是一个向量
- 每个 Maxout 单元有 K 个权重向量
和偏置
,可以得到 K 个净输入
- Maxout 单元的定义:
4.2 网络结构
4.2.1 前馈网络
- 神经层:前馈网络中各个神经元按接收信息的先后分为不同的组,每一组可以看作一个神经层
- 前馈网络每一层的神经元接收前一层神经元的输出,并输出到下一层神经元,整个网络没有反向的信息传播,可以用有向无环路图表示
- 前馈网络包括:
- 前馈网络可以看作一个函数,通过简单非线性函数的多次符合,实现输入空间到输出空间的复杂映射
- 优点:这种网络结构简单,易于实现
4.2.2 记忆网络/反馈网络
- 记忆网络/前馈网络中的神经元不但可以接收其他神经元的信息,也可以接收自己的历史信息(神经元具有记忆功能)
- 记忆网络的信息传播可以是单向或双向传递,可以用有向循环图或无环图表示
- 记忆网络包括:
- 循环神经网络
- Hopfield网络(8.6.1节)
- 玻尔兹曼机(12.1节)
- 受限玻尔兹曼机(12.2节)
- 记忆网络可以看作一个程序,具有更强的计算和记忆能力
4.2.3 图网络
- 图网络(6.8节)是定义在图结构数据上的神经网络,用于处理图结构的输入数据,比如知识图谱、社交网络、分子网络等
- 图网络的每个节点都由一个或一组神经元构成
- 图网络的节点之间可以是有向的,也可以是无向的,每个节点可以收到来自相邻节点或自身的信息
4.3 前馈神经网络 FNN
- 前馈神经网络也称多层感知机,但其实前馈神经网络是由多层的 Logistic 回归模型(连续的非线性函数)组成,而不是由多层的感知机(不连续的非线性函数)组成
- 前馈神经网络可以用有向无环图表示,整个网络中无反馈,信号从输入层向输出层单向传播
前馈神经网络的记号 | 记号 | 含义 | | —- | —- | | | 神经网络的层数 | | | 第 层神经元的个数 | |
| 第 层神经元的激活函数 | | | 第 层到第 层的权重矩阵 | |
| 第 层到第 层的偏置 | |
| 第 层神经元的净输入 | | | 第 层神经元的输出(活性值) |前馈神经网络逐层信息传递的公式:
- 初始(输入层的活性值):
- 第
层神经元的净输入:
- 第
层神经元的输出(活性值):
- 合并以上两个公式:
- 最后得到网络的输出
- 初始(输入层的活性值):
4.3.1 通用近似定理
通用近似定理说明了:神经网络的计算能力可以去近似一个给定的连续函数
4.3.2 应用到机器学习
- 多层前馈神经网络可以看作一种特征转换方法,将 D 维的输入空间映射到 D’ 的输出空间。其输出
作为分类器
的输入再进行分类,输出
- 如果分类器
为 Logisitic 回归分类器或 Softmax 回归分类器,则
也可以看成是多层前馈神经网络的最后一层,即神经网络直接输出不同类别的条件概率
- 对于二分类问题,采用 Logisitic 回归,神经网络最后一层只用一个神经元,且激活函数为 Logisitic 函数,网络的输出可直接作为类别 y=1 的条件概率
- 对于多分类问题,采用 Softmax 回归,神经网络最后一层设置 C 个神经元(C 个类别),且激活函数为 Softmax 函数,输出可作为每个类的条件概率
4.3.3 参数学习
- 交叉熵损失函数:
- 结构化风险函数:
为正则化项,用来防止过拟合,一般使用 Frobenius 范数:
为超参数,λ 越大,W 越接近于 0
- 网络参数通过梯度下降法进行学习,每次迭代中,第
层的参数更新方式:
- 使用反向传播算法来高效地计算梯度
4.4 反向传播算法
用随机梯度下降法进行参数学习,需要计算损失函数关于每个参数的梯度
关于参数矩阵中每个元素的偏导数:
因此需要计算三个偏导数:
:
,是第 i 个元素为
,其余为 0 的行向量
:
:第
层神经元的误差项,表示第
层神经元对最终损失的影响,也反映了最终损失对第
层神经元的敏感程度;也间接反映了不同神经元对网络能力的贡献程度,从而比较好地解决了贡献度分配问题
,
是点积运算符,表示每个元素相乘
- 也就是第
层的误差项可以通过第
层的误差项计算得到,这就是误差的反向传播
- 反向传播算法的含义:第
层的一个神经元的误差项(或敏感性)是所有与该神经元相连的第
层的神经元的误差项的权重和,然后,再乘上该神经元激活函数的梯度
所以
关于参数矩阵的梯度:
使用误差反向传播算法的前馈神经网络的训练过程分为三步:
- 前馈计算每一层的净输入
和激活值
,直到最后一层
- 反向传播计算每一层的误差项
- 计算每一层参数的偏导数
和
,并更新参数
4.5 自动梯度计算
4.5.1 数值微分
函数 在点 x 的导数
,数值微分要找这个
缺点:
- 如果
过小,会引起数值计算问题,比如舍入误差
- 如果
过大,会增加截断误差,使得导数计算不准确
- 计算复杂度高
4.5.2 符号微分
符号微分是一种基于符号计算的自动求导方法
- 处理的对象是数学表达式
- 在编译阶段先构造一个复合函数的计算图,通过符合计算得到导数的表达式,还可以对导数表达式进行优化,在程序运行阶段才代入变量的具体数值来计算导数
优点:
- 符号计算与平台无关,可以在 CPU 或 GPU 上运行
不足:
- 编译时间较长,特别是对于循环,需要很长时间进行编译
- 为了进行符号微分,一般要设计一种专门的语言来表示数学表达式,并且要对变量(符号)进行预先声明
- 很难对程序进行调试
4.5.3 自动微分
自动微分是一种可以对一个(程序)函数进行计算导数的方法
- 处理的对象是一个函数或一段程序
- 是目前大多数深度学习框架的首选
- 基本原理:所有的数值计算可以分解为一些基本操作,包括
和一些初等函数
等,并构成一个计算图,然后用链式法则来自动计算一个复合函数的梯度
- 无需事先编译,在程序运行阶段边计算边记录计算图,计算图上的局部梯度都直接代入数值进行计算,然后用前向模式或反向模式计算最终的梯度
自动微分分为:
- 前向模式:按计算图中计算方向的相同方向来递归地计算梯度
- 反向模式:按计算图中计算方向的相反方向来递归地计算梯度
- 反向模式和反向传播的计算梯度的方式相同
计算图按构建方式可分为:
- 静态计算图:在编译时构建计算图,构建好后在程序运行时不能改变
- 特性:构建时可以进行优化,并行能力强,但灵活性比较差
- 实例:Tensorflow
- 动态计算图:在程序运行时动态构建
- 特性:不容易优化,难以并行计算,但灵活性比较高
- 实例:Pytorch、Tensorflow 2.0
4.6 优化问题
神经网络的参数学习比线性模型要更加困难,主要原因有两点:
- 非凸优化问题
- 梯度消失问题
4.6.1 非凸优化问题
神经网络的优化问题是一个非凸优化问题
4.6.2 梯度消失问题/梯度弥散问题
神经网络中误差反向传播的迭代公式:,每一层都要乘以该层的激活函数的导数
Sigmoid 型函数的导数的值域都 ≤1,且由于 Sigmoid 型函数的饱和性,饱和区的导数趋近于 0,因此误差经过每一层传递都会不断衰减,甚至直到梯度消失,使得整个网络很难训练
减轻梯度消失问题的方法:使用导数比较大的激活函数,eg. ReLU
4.7 总结和深入阅读
常见的激活函数及其导数:
习题
习题讨论,解答参考:邱锡鹏《神经网络与深度学习》—— 部分习题答案整理
习题 4-1 对于一个神经元
,并使用梯度下降优化参数 𝒘 时, 如果输入 𝒙 恒大于 0,其收敛速度会比零均值化的输入更慢
如果输入 𝒙 恒大于 0,即非零中心化的输入,会导致反向传播计算得到的 w 的梯度值全为正或全为负,这样的梯度值用于权重更新时,不是平缓的迭代变化,而是总朝着同一方向抖动(锯齿状变化),影响梯度下降速度。
习题 4-2 试设计一个前馈神经网络来解决 XOR 问题(异或), 要求该前馈神经网络具有两个隐藏神经元和一个输出神经元, 并使用 ReLU 作为激活函数.
习题 4-3 试举例说明“死亡ReLU问题”, 并提出解决方法
解决方法:
- 带泄露的 ReLU
- 带参数的 ReLU
- ELU 函数
- Softplus 函数
习题 4-4 计算 Swish 函数和 GELU 函数的导数(参见 4.1.3 节)
习题 4-5 如果限制一个神经网络的总神经元数量(不考虑输入层)为 𝑁 + 1,输入层大小为
,输出层大小为 1,隐藏层的层数为 𝐿,每个隐藏层的神经元数量为
,试分析参数数量和隐藏层层数 𝐿 的关系.
- N + 1 个神经元每个神经元都有偏置参数,即共有 N + 1 个偏置参数
- 输入层连接隐藏层的权重参数数量为
- 隐藏层内部之间连接的权重参数数量为
- 隐藏层连接输出层的权重参数数量为
所以,参数数量的和为
习题 4-6 证明通用近似定理对于具有线性输出层和至少一个使用 ReLU 激活函数的隐藏层组成的前馈神经网络,也都是适用的
习题 4-7 为什么在神经网络模型的结构化风险函数中不对偏置 𝒃 进行正则化?
加入正则化项的目的是为了防止过拟合, 防止它对于输入的微小变化过于敏感, 但偏置对任意的输入都产生同样的效应, 加入他们对于防止过拟合没有什么帮助
习题 4-8 为什么在用反向传播算法进行参数学习时要采用随机参数初始化的方式而不是直接令 𝑾 = 0, 𝒃 = 0?
若将𝑾和𝒃都初始化为0,则在输入层之后的所有隐藏层神经元接收到的输入都是一样的,那么在使用反向传播算法进行梯度的传递时,每一隐藏层的权重梯度值都是相同的,这就导致了权重只能向同一方向下降,这和问题4-1有一定的相似性,只不过是从权重和偏置方面导致了输入X值的非零均值化(更极端的是所有值相同)
习题 4-9 梯度消失问题是否可以通过增加学习率来缓解?
可以缓解, 但不一定能得到理想的效果, 增大学习率可能使最优值被跨越, 也可能造成梯度爆炸