深度学习是机器学习的重要分支,也是机器学习的核心,但深度学习是在机器学习基础上发展起来的,因此理解机器学习的基本概念、基本原理对理解深度学习大有裨益。
机器学习的基本任务一般分为4大类:监督学习、无监督学习、半监督学习和强化学习。监督学习和无监督学习比较普遍,常见的分类和回归等属于监督学习,聚类和降维等属于无监督学习。
根据下图,生成式对抗属于半监督学习。
监督学习是最常见的一种机器学习类型,其任务的特点就是给定学习目标,这个学习目标又称标签、标注或实际值等,整个学习过程就是围绕如何使预测与目标更接近而来的。近些年,随着深度学习的发展,分类除传统的二分类、多分类、多标签分类之外,也出现了一些新内容,如目标检测、目标识别、图像分割等监督学习的重要内容。
监督学习的输入数据中有标签或目标值,但在实际生活中,有很多数据是没有标签的,或者标签代价很高。这些没有标签的数据也可能包含很重要的规则或信息,从这类数据中学习到一个规则或规律的过程被称为无监督学习。在无监督学习中,我们通过推断输入数据中的结构来建模,模型包括关联学习、降维、聚类等。
半监督学习是监督学习与无监督学习相结合的一种学习方法。半监督学习使用大量的未标记数据,同时由部分使用标记数据进行模式识别。
对抗生成式网络也是一种半监督学习,给定一些真图片或语音,然后通过对抗生成网络生成一些与真图片或是语音逼真的图形或语音。
强化学习主要包含4个元素:智能体(Agent)、环境状态、行动和奖励。强化学习的目标就是获得最多的累计奖励。
强化学习把学习看作一个试探评价的过程,Agent选择一个动作用于环境,环境接受该动作后状态发生变化,同时产生一个强化信号(奖或惩)反馈给Agent,Agent根据强化信号和环境当前状态再选择下一个动作,选择的原则是使受到正强化(奖)的概率增大。选择的动作不仅影响立即强化值, 也影响下一时刻的状态和最终的强化值。
强化学习不同于监督学习,主要表现在教师信号上。强化学习中由环境提供的强化信号是Agent对所产生动作的好坏做的一种评价,而不是告诉 Agent如何去产生正确的动作。由于外部环境只提供了很少的信息,所以 Agent必须靠自身的经历进行学习。通过这种方式,Agent在行动一一被评价的环境中获得知识,改进行动方案以适应环境。
机器学习一般需要先定义问题、收集数据、探索数据、预处理数据,对数据处理后,接下来开始训练模型、评估模型,然后优化模型等步骤。
模型确定后,还需要确定一种评估模型性能的方法,即评估方法。评估方法大致有以下3种。
在训练模型过程中,经常会出现刚开始训练时,训练和测试精度不高(或损失值较大),然 后通过增加迭代次数或通过优化,训练精度和测试精度继续提升,如果出现这种情况,当然最好。但随着我们训练迭代次数的增加或不断优化,也有可能会出现训练精度或损失值继续改善,但测试精度或损失值不降反升的情况。(过拟合)
解决过拟合问题:正则化。正则化不仅可以有效地降低高方差,还有利于降低偏差。
神经网络的L2正则化称为权重衰减(Weight Decay),即权重正则化。
Dropout的做法是在训练过程中按一定比例(比例参数可设置)随机忽略或屏蔽一些神经元。这些神经元会被随机“抛弃”,也就是说它们在正向传播过程中对于下游神经元的贡献效果暂时消失了,反向传播时该神经元也不会有任何权重的更新。所以,通过传播过程,Dropout将产生和L2范数相同的收缩权重的效果。
加入了Dropout以后,输入的特征都是有可能会被随机清除的,所以该神经元不会再特别依赖于任何一个输入特征,也就是说不会给任何一个输入设置太大的权重。由于网络模型对神经元特定的权重不那么敏感。这反过来又提升了模型的泛化能力,不容易对训练数据过拟合。
BN是对隐藏层的标准化处理,它与输入的标准化处理Normalizing Inputs是有区别的。Normalizing Inputs是使所有输入的均值为0,方差为1。 而Batch Normalization可使各隐藏层输入的均值和方差为任意值。实际上, 从激活函数的角度来看,如果各隐藏层的输入均值在靠近0的区域,即处 激活函数的线性区域,这样不利于训练好的非线性神经网络,而且得到的模型效果也不会太好。
一般在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时,可以尝试用BN来解决。另外,在一般情况下,也 可以加入BN来加快训练速度,提高模型精度,还可以大大地提高训练模型的效率。
常见的参数初始化有零值初始化、随机初始化、均匀分布初始、正态分布初始和正交分布初始等。一般采用正态分布或均匀分布的初始值,实践表明正 态分布、正交分布、均匀分布的初始值能带来更好的效果。
搭建比较深的神经网络时,一般使用relu激活函数。
损失函数(Loss Function)在机器学习中非常重要,因为训练模型的过程实际就是优化损失函数的过程。损失函数对每个参数的偏导数就是梯度下降中提到的梯度,防止过拟合时添加的正则化项也是加在损失函数后面。损失函数用来衡量模型的好坏,损失函数越小说明模型和参数越符合训练样本。任何能够衡量模型预测值与真实值之间的差异的函数都可以叫作损失函数。在机器学习中常用的损失函数有两种,即交叉熵(Cross Entropy)和均方 误差(Mean squared error,MSE),分别对应机器学习中的分类问题和回归问题。
对分类问题的损失函数一般采用交叉熵,交叉熵反应的两个概率分布的距离(不是欧氏距离)。 回归问题预测的不是类别,而是一个任意实数。在神经网络中一般只有 个输出节点,该输出值就是预测值。反应的预测值与实际值之间的距离可以用欧氏距离来表示,所以对这类问题通常使用均方差作为损失函数。
1.torch.nn.MSELoss
2.torch.nn.CrossEntropyLoss
传统梯度更新算法为最常见、最简单的一种参数更新策略。其基本思想是:先设定一个学习率λ,参数沿梯度的反方向移动。假设需更新的参数为 θ,梯度为g,则其更新策略可表示为:
θ←θ-λg (5-12)
这种梯度更新算法简洁,当学习率取值恰当时,可以收敛到全面最优点 (凸函数)或局部最优点(非凸函数)。但其不足也很明显,对超参数学习率比较敏感(过小导致收敛速度过慢,过大又越过极值点),如图5-11的右图所示。在比较平坦的区域,因梯度接近于0,易导致提前终止训练,如图5-11的左图所示,要选中一个恰当的学习速率往往要花费不少时间。
学习率除了敏感,有时还会因其在迭代过程中保持不变,很容易造成算法被卡在鞍点的位置,如图5-12所示。 另外,在较平坦的区域,由于梯度接近于0,优化算法会因误判,在还 未到达极值点时,就提前结束迭代,如图5-13所示。
动量(Momentum)是模拟物理里动量的概念,具有物理上惯性的含 义,一个物体在运动时具有惯性,把这个思想运用到梯度下降计算中,可以增加算法的收敛速度和稳定性。动量算法每下降一步都是由前面下降方向的一个累积和当前点的梯度方向组合而成。
含动量的随机梯度下降法,其算法伪代码如下:
先往前走一步,在靠前一点的位置(如图5-16中的C点)看到梯度,然后按照那个位置再来修正这一步的梯 度方向,如图5-16所示。这就得到动量算法的一种改进算法,称为Nesterov Accelerated Gradient,简称NAG算法。这种预更新方法能防止大幅振荡,不会错过最小值,并会对参数更新更加敏感。
为了更好地驾驭这个超参数,人们想出来多种自适应优化算法,使用自适应优化算法, 学习率不再是一个固定不变值,它会根据不同情况自动调整来适应相应的情况。
AdaGrad算法是通过参数来调整合适的学习率λ,是能独立地自动调整模型参数的学习率,对稀疏参数进行大幅更新和对频繁参数进行小幅更新。
1)随着迭代时间越长,累积梯度r越大,导致学习速率随着时间减小,在接近目标值时,不会因为学习速率过大而越过极值点。
2)不同参数之间的学习速率不同,因此,与前面固定学习速率相比, 不容易在鞍点卡住。
3)如果梯度累积参数r比较小,则学习速率会比较大,所以参数迭代的步长就会比较大。相反,如果梯度累积参数比较大,则学习速率会比较小, 所以迭代的步长会比较小。
针对梯度平方和累计越来越大的问题,RMSProp指数加权的移动平均代替梯度平方和。RMSProp为了使用移动平均,还引入了一个新的超参数ρ, 用来控制移动平均的长度范围。
Adam(Adaptive Moment Estimation)本质上是带有动量项的 RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。