前言
如果你能找到这里,真是我的幸运~这里是蓝白绛的学习笔记,本集合主要针对《百面机器学习——算法工程师带你去面试》这本书。主要记录我认为重要的知识点,希望对大家有帮助。
第九章 前向神经网络
引导语
从输入到输出的过程中不存在于模型自身的反馈连接的模型,此类模型被称为“前馈”。
深度前馈网络是一类网络模型的统称,有多层感知机、自编码器、限制玻尔兹曼机,以及卷积神经网络等。
1、多层感知机与布尔函数
- 多层感知机表示异或逻辑时最少需要几个隐藏层(仅考虑二元输入)?
一个隐藏层即可计算异或函数。
0个隐藏层的情况(等同于逻辑回归)无法精确学习出一个输出为异或的模型表示。事实上,通用近似定理告诉我们,一个前馈神经网络如果具有线性输出层和至少一层具有任何一种“挤压”性质的激活函数的隐藏层,当给予网络足够数量的隐藏单元时,可以以任意精度近似任何从一个有限维空间到另一个有限维空间的波莱尔可测函数。我们常用的激活函数和目标函数是通用近似定理使用的一个子集,因此多层感知机的表达能力是非常强的,关键是我们能否学习到对应此表达式的模型参数。 - 如果只使用一个隐藏层,需要多少隐节点能够实现包含元输入的任意布尔函数?
个隐节点。 - 考虑多隐层的情况,实现包含元输入的任意布尔函数最少需要多少个网络节点和网络层?
元异或函数需要包括个节点(包括最终输出节点)。可以发现,多隐层结构可以将隐节点的数目从指数级直接减少至线性级。
需要的最少网络层数为(向上取整)。
2、深度神经网络中的激活函数
- 线性模型是机器学习领域中最基本也是最重要的工具,以逻辑回归和线性回归为例,无论通过闭解形式还是使用凸优化,它们都能高效且可靠地拟合数据。但我们往往会遇到线性不可分问题(如XOR异或函数),需要非线性变换对数据分布进行重新映射,对于深度神经网络,我们在每一层线性变换后叠加一个非线性激活函数,以避免多层网络等效于单层线性函数,从而获得更强大的学习与拟合能力。
- 常用激活函数及其导数:
Sigmoid激活函数的形式为: Tanh激活函数的形式为: ReLU激活函数的形式为: - Sigmoid和Tanh激活函数为什么会导致梯度消失的现象?
Sigmoid和Tanh激活函数曲线如下图所示:
Sigmoid函数的导数在很大或很小时都会趋近于0,造成梯度消失,同样Tanh函数的导数在很大或很小时都会趋近于0,同样造成梯度消失。
实际上Tanh激活函数相当于Sigmoid的平移: - ReLU系列激活函数相对于Sigmoid和Tanh激活函数的优点是什么?它们有什么局限性以及如何改进?
- 优点:
(1) 从计算的角度上,Sigmoid和Tanh激活函数都需要计算指数函数,复杂度高,而ReLU只需要一个阈值即可得到激活值。
(2) ReLU的非饱和性可以有效解决梯度消失的问题,提供相对宽的激活边界。
(3) ReLU的单侧抑制提供了网络的稀疏表达能力。 - 局限性:
其训练过程中会导致神经元死亡。函数导致负梯度在经过ReLU单元时被置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。在实际训练中,如果学习率设置较大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。
为了解决这个问题,人们设计了Leaky ReLU(LReLU),其形式表达式为
一般为一个很小的正常数,LReLU既实现了单侧抑制,又保留了部分负梯度信息以致信息不完全丢失。但是另一方面,值的选择增加了问题难度,需要较强的人工先验或多次重复训练以确定合适的参数值。
基于此,参数化的PReLU(Parametric ReLU)将负轴部分斜率作为网络中一个可学习的参数,进行反向传播训练,与其他含参数网络层联合优化。
RReLU(Random ReLU)增加了“随机化”机制,在训练过程中,斜率作为一个满足某种分布的随机采样;测试时再固定下来,一定程度上能起到正则化的作用。
3、多层感知机的反向传播算法
- 在网络训练中,前向传播最终产生一个标量损失函数,反向传播算法则将损失函数的信息沿网络层向后传播用以计算梯度,达到优化网络参数的目的。
- 多层感知机的平方误差和交叉熵损失函数的计算公式就不写了,还有各层参数更新的梯度计算公式推导也不写了,网上有非常多资料。
-
平方误差损失函数和交叉熵损失函数分别适用的场景:
平方损失函数:更适合输出为连续,并且最后一层不含Sigmoid或Softmax激活函数的神经网络;
交叉熵损失函数:更适合二分类或多分类的场景。 - 为什么平方损失不适合最后一层含有Sigmoid或Softmax激活函数的神经网络?
平方误差损失函数相对于输出层的导数其中最后一项为激活函数的导数,当激活函数为Sigmoid函数时,如果的绝对值较大,函数的梯度会趋于饱和,即的绝对值非常小,导致取值也非常小,使得基于梯度的学习速度非常缓慢。
当使用交叉熵损失函数时,相对于输出层的导数(也可以被认为是残差)为此导数是线性的,因此不会存在学习速度过慢的问题。
4、神经网络训练技巧
- 解决过拟合的方法有:数据集增强、参数范数惩罚/正则化、模型集成等;其中Dropout是模型集成方法中最高效与常用的技巧。
同时,深度神经网络的训练中涉及诸多手调参数,如学习率、权重衰减系数、Dropout比例等,这些参数的选择会显著影响模型最终的训练效果。批量归一化(Batch Normalization,BN)方法有效规避了这些复杂参数对网络训练产生的影响,在加速训练收敛的同时也提升了网络的泛化能力。 - 神经网络训练时是否可以将全部参数初始化为0?
不能。
考虑全连接的深度神经网络,同一层的神经元都是同构的,拥有相同的输入和输出,如果再将参数全部初始化为相同的值,那么无论前向传播还是反向传播的取值都是相同的。学习过程将永远无法打破这种对称性,最终同一个网络层中的各个参数仍然是相同的。
因此需要随机地初始化神经网络参数的值,以打破对称性,简单来说,我们可以初始化参数为的均匀分布,其中为神经元接受的输入维度,偏置可以被简单地设为0,并不会导致参数对称的问题。 - Dropout抑制过拟合的工作原理:Dropout随机丢弃部分神经元的机制,相当于每次迭代都在训练不同结构的神经网络。类比于Bagging方法,Dropout可以被认为是一种实用的大规模深度神经网络的模型集成算法。这是由于传统意义上的Bagging涉及多个模型的同时训练与测试评估,当网络与参数规模庞大时,这种集成方式需要消耗大量的运算时间与空间。Dropout在小批量级别上的操作,提供了一种轻量级的Bagging集成近似,能够实现指数级数量神经网络的训练与评测。
对于包含个神经元节点的网络,在Dropout的作用下可以看作个模型的集成。这个模型可认为是原始网络的子网络,它们共享部分权重,并且具有相同的网络层数,而模型整体的参数数目不变,大大简化了运算。对于任意神经元,每次训练中都与一组随机挑选的不同的神经元集合共同进行优化,这个过程为减弱全体神经元之间的联合适应性,减少过拟合的风险,增强泛化能力。 - 批量归一化的基本动机与原理:神经网络训练过程的本质是学习数据分布,如果训练数据与测试数据的分布不同将会大大降低网络的泛化能力,因此我们需要在训练开始前对所有输入数据进行归一化处理。然而随着网络训练的进行,每个隐层的参数变化使得后一层的输入发生变化,从而每一批训练数据的分布也随之变化,致使网络在每次迭代中都需要拟合不同的数据分布,增大训练的复杂度以及过拟合的风险。
批量归一化方法是针对每一批数据,在网络每一层输入之间增加归一化处理(均值为0,标准差为1),将所有批数据强制性在同一的数据分布下。可以看作在每一层输入和上一层输出之间加入了一个新的计算层,对数据的分布进行了额外的约束,从而增强模型的泛化能力。
但是批量归一化同时也降低了模型的拟合能力,归一化之后的输入分被强制为0均值和1标准差,以Sigmoid激活函数为例,批量归一化之后数据整体处于函数的非饱和区域,只包含线性变换,破坏了之前学习到的特征分布,为了恢复原始数据分布,具体实现中加入了变换重构以及可学习参数和:其中和分别为输入数据分布的方差和偏差。
对于一般的网络,不采用批量归一化操作时,这两个参数高度依赖前面网络学习到的连接权重(对应复杂的非线性)。而在批量归一化操作中,和变成了该层的学习参数,仅用两个参数就可以恢复最优的输入数据分布,与之前网络层的参数解耦,从而更加有利于优化的过程,提高模型的泛化能力。
小结
这是本章的第一部分,整理了多层感知机实现异或函数、布尔函数,深度神经网络中的激活函数,梯度消失,损失函数,Dropout,批量归一化等等。后一部分整理深度卷积神经网络和ResNet。
结尾
如果您发现我的文章有任何错误,或对我的文章有什么好的建议,请联系我!如果您喜欢我的文章,请点喜欢~*我是蓝白绛,感谢你的阅读!