【ML笔记】多层感知机总结 (D2L)
概念
多层感知机是一种最简单的深度网络,分为输入层,隐藏层和输出层,其中隐藏层的每一层都有很多节点,每个节点代表一个变换(计算方法),包括常用的两个参数,即weight(权重)和bias(偏置量)
隐藏层
¶基本原理
由于输入层输入的数据(如图片的像素,声音的频率等)和输出层(如分类概率,判断等)之间难以找出直接的联系,因此引入隐藏层来讲输入特征进行特征提取,形成一个隐藏层,然后再将隐藏层的结果输入下一个隐藏层再次提取特征,以此类推,最后到达输出层。
¶开销
如果相邻隐藏层的节点互相连接,即全连接层,那么模型的参数开销可能会非常大,造成DRAM爆炸。这也是为什么在定义这种超大模型的时候会爆DRAM,因为在定义模型的时候会初始化所有参数,DRAM不足导致出错。因此在节点的连接性(模型的大小和参数量)与模型的准确性之间需要达到一个平衡。
¶非线性化
由于每一层节点的运算方式依然是基于线性代数,有时候求解非线性问题的性能并不好,因此需要将线性转为非线性。非线性化的本质是非线性仿射,将线性化计算出来的中间结果结果通过一个单独的激活函数得到非线性的结果,类似于g(f(x))
,f(x)
为节点本身的线性计算方式,g(x)
为非线性函数,这样得到的最终结果与输入x依然是非线性关系。常用的激活函数有
ReLU
Sigmoid
tanh
注意,非线性并不一定是连续曲线,也可以是分段直线等(这种问题一般只有我这种半个高中牲半个大学牲才会犯罢)
¶通用近似定理
通用近似定理证明了足够多的隐藏层节点可以无限逼近于任意一个函数,是MLP实际性的理论基础
模型选择
¶训练误差 & 泛化误差
训练误差就是Train Loss
,泛化误差指的是对于所有数据的误差。由于数据的规模是无限大的,因此永远不可能得到模型的准确泛化误差,只能通过在训练数据中单独分出测试数据来估计泛化误差,因此数据会被分为Train Dataset
和Test Dataset
。
¶复杂性
- 当模型简单而数据量很大的时候,泛化误差和训练误差应该相近,且
- 当模型复杂而数据量很小的时候,训练误差会下降,但是泛化误差会增大
- 数据量小对于模型来说容易过拟合,而数据量大就相对不容易过拟合
对于复杂性本身,一般来说参数越多的模型和参数范围越大的模型会被认为是更加复杂的模型。
¶验证集
就是相对测试数据集更加纯净的数据集,因为当测试次数足够时模型可能会对测试数据集产生过拟合,此时就需要验证集来评估模型的性能
¶K折交叉验证
这是针对数据不够用的情况,可以将训练数据分为K个不重叠的子集,然后选出一个子集充当验证集,然后重复训练,每次选用不同的子集充当验证集即可。
欠拟合 & 过拟合
¶概念
- 欠拟合就是训练损失和泛化损失都很拉,这是因为模型性能或复杂度相对大规模的数据量而言很拉胯导致学不了一点。
- 过拟合就是训练损失好看但是泛化损失很拉,这是因为模型复杂但数据少了,导致模型只记住了训练集的答案而并没有去找到特征之间的联系
¶数据集大小
前面有说,数据集越小越容易导致过拟合,而数据集过大如果模型规模不提升的话又会欠拟合,因此合适的数据量对应适宜规模的模型才是最优解。一般来说,深度学习模型要在几千数据的情况下才会比传统的线性模型效果更好。
正则化模型
¶原理 & 作用
通过调整模型参数设定来减小模型的复杂度以预防和解决模型过拟合问题,如减少节点数量,缩小参数范围等,下面是几个常见手段。
¶权重衰减
这是正则化最常见的方法之一,又称L2正则化
。相比起L1正则化
,L2正则化
在整个统计领域都更加受欢迎,二者有一些显著的差异。
- L1正则化的线性回归是统计学的基本模型,通常称为套索回归,它会将模型的权重集中在一小部分的特征上,然后将其他权重清零,以达到减少参数量的效果。它适用于高维数据集,尤其是样本中含有大量特征时,抛弃一些特征反而有助于缓解过拟合。
- L2正则化反其道而行之,它的线性模型构成经典的岭回归,重点打击权重向量的大分量,减小其参数大小以减小模型复杂度,使得模型倾向于对特征进行均匀的权重分布。适合处理特征之间相关性特别强的问题,因为它只是减小参数的大小但并没有抛弃,因此特征之间的关系得以保留,但会减弱,这也会缓解过拟合。
两种正则化方法都各有特色,但是在机器学习中L2正则化的权重平均策略可以使观测的误差更加稳定。不过,两种正则化结合起来也许能发挥最大效能。然后看看处理之后的效果:
未正则化:
已正则化:
¶暂退法 (Dropout)
暂退法就是在模型训练过程中暂时切除一些节点之间的联系,具体做法上看就是随机将部分节点的权重设置为0️⃣,相当于抛弃了这个节点。这个丢弃部分神经元的做法就是向每一层注入噪声。这样做的好处是在训练过程中可以切断一些特征之间的联系,使得模型去寻找另外的联系,增强性能。在实际测试的过程中,一般不会抛弃,因为测试的就是模型的满血性能。当然,一部分科学家通过在测试时同样抛弃节点,以此测试模型的稳定性。
前向传播 & 反向传播
- 前向传播就是顺着每一个节点的运算方式运算下去,从输入层经过隐藏层最后到达输出层。
- 反向传播就是计算输出结果和期望结果的误差,然后反向进行一层一层求导,以调整各个节点的参数
注意,前向传播和反向传播在训练过程中是同时存在且相互依赖的,而且训练模型比使用模型预测需要更加多的DRAM
稳定性
¶梯度消失 & 梯度爆炸
- 梯度消失指的是模型在反向传播的过程中导数(梯度)变得太小,以至于根本没办法更新参数。这个问题常常存在于层数太多的MLP中。此外,激活函数的选择也会导致梯度消失,比如
Sigmoid
函数,在0️⃣的时候梯度(导数)最大,但是绝对值无穷大的地方,梯度就接近于0️⃣了 - 梯度爆炸和梯度消失刚好相反,由于权重的初始化不恰当会导致反向求导时梯度过大而模型无法收敛。在反向传播的过程中,如果每一层的梯度都大于一,那么当梯度逐层相乘的时候,梯度就会成指数级增长。
¶对称性
对称性指的是每一个节点的参数基本上相同,带来的问题是不同的节点学习到的特征其实是差不多的,这会浪费大量节点带来的学习能力,而模型的性能也提不上去。
¶启发式初始化
解决方法就是对模型的参数进行合理的初始化,又称为启发式初始化,比如Xavier初始化
。这种启发式初始化可以提高模型的训练效率和收敛速度,并且适用于常见的激活函数如Sigmoid
和Tanh
。它会根据输入和输出节点的权重来计算中间隐藏层的权重初始值。
环境和分布偏移
¶协变量偏移
协变量就是bias,协变量偏移不会使数据发生本质性变化,比如照片版和卡通版的🐶,但是对于模型来说就是泛化能力的考察。因此,在训练过程中因尽可能的多加入不同特征的数据,这样可以有效降低模型的泛化损失
¶标签偏移
标签偏移就是标签标错了,比如🐶的图片标了🐱,这样数据的本质性变化对模型的性能造成的影响不言而喻。标签偏移的纠正从本质上就是在源材料上使用更加真实的数据,然后再训练过程中计算混淆矩阵来合理评价模型的性能。
¶概念偏移
这个就是社会学问题了,比如开封菜和金拱门在以前被冠以“垃圾食品的祖宗”,但是现在麦麦和KFC对健康的上心程度增加,也更加健康了。这就是随着时间的流逝和社会发展产生的概念偏移。概念偏移的纠正就只能靠社会学咯。