深度学习基本概念
深度学习
深度学习的本质是一个前馈神经网络。
早期的人工神经网络通过模拟动物的神经元的运行模式来实现对数据的拟合和预测,即通过函数模拟信息在神经元中的变换和传输。
感知机通过对输入进行单层的线性变换来完成分类,然而这个模型无法解决线性不可分的问题。直到出现了多层感知机,由于增加了人工神经网络的深度,其对于相对复杂的函数拟合效果比较好,所以只要参数和隐含层的数量足够,多层感知机就能拟合任意的连续函数。同时,可以使用反向传播算法来优化多层感知机的模型,但因为梯度爆炸和梯度消失这一算法不适用于层数比较多的情况。
而后的一些神经网络模型和激活函数的出现不仅能够训练层数比较多的神经网络,同时也可以使用比较多的参数,有效提高模型的准确率。现阶段的这些神经网络模型就是深度学习。
机器学习
机器学习的主要任务就是:给定在现实中获取的一系列数据来构建一个模型,用于描述数据的具体分布。
那么,从概率的角度来说,可以认为机器学习模型是一个概率分布Pθ(X)。其中X是训练数据,这个概率分布拥有参数θ=(θ1,θ2,···,θn),机器学习的任务就是求解最佳参数θt,使得Pθ(X)最大。
求解最佳参数θt的过程称之为模型的训练过程,表示为:θt=argmaxθPθ(X)。
由于数据集含有很多条数据,即X=(X1,X2,···,Xn),故上述求解最佳参数的式子可以展开为θt=argmaxθ∏iPθ(Xi)=argmaxθ∑ilogPθ(Xi),也就是极大似然估计。
机器学习的任务大致分为监督学习和无监督学习。
对于监督学习来说,就是数据集包含输入的数据X及其对应的标签Y。对应的概率分布有联合概率分布和条件概率分布两种。对于联合概率分布,其表示的是数据和标签共同出现的概率,基于这一分布的生成式模型不仅能够根据输入数据X来预测对应的标签Y,还能根据得到的模型产生服从训练数据集分布的新数据。对于条件概率分布,表示的是在给定数据的条件下对应标签的概率,基于这一分布的判别式模型仅能够根据具体的数据X来预测对应的标签Y。
机器学习需要输出的是概率,相应的任务是拟合一个函数fθk(x),给定输入的Xi,给出对应的目标值Yik的概率,其极大似然估计式为θt=-argminθ∑i∑kYiklogfθk(Xi)。这里之所以要求最小值,是因为一般的优化过程都是做极小化的优化,而相应的损失函数称之为交叉熵。
一般来说,随着训练模型的进行,模型的损失函数在训练集上将会越来越低,而在验证集上将会呈现出先减小后增加的情况。 如图所示:
之所以会这样,是因为在训练模型的过程中,模型的分布会逐渐趋向训练集的分布,但在实际应用过程中要求我们保持模型具有一定的泛化能力,即用和训练集不同但数据源一致的数据来验证训练得到的模型时,损失函数不能太大。
如上图所示,在彩色线右边区域,模型已经完全偏向于训练集,失去一定的泛化能力,即为过拟合;而左边模型还没有训练到验证集损失函数最低点,即欠拟合。一般来说,随着数据量的增大越不容易过拟合,随着参数数目增大,模型越容易过拟合。 在机器学习实践中,可以考虑类似70%,20%,10%的训练集、验证集、测试集的划分,在深度学习中由于训练集越大越好,可以考虑类似90%,5%,5%的划分。
在深度学习中,为了消除过拟合的状态可以考虑使用L1正则化,L2正则化,标签平滑正则化等调节正则化系数,使得最后模型在验证集上尽量得到高的准确率。
除了加入正则项,还可以考虑使用Early Stopping,Dropout以及在优化器中使用权重衰减等避免过拟合。这些方法本质上都是减小参数的变化空间,从而缩小模型的表示范围,最后达到让模型在表示训练集数据的同时,也能很好地泛化到验证集数据的目的。
激活函数
由于线性变换的组合还是线性变换,因此在深度学习网络中需要引入激活函数,在线性变换之间插入非线性层。
所谓激活函数,就是一类非线性函数的统称,通过对线性变换中输出结果的每个分量都应用激活函数可以输出非线性的结果。 常见的激活函数有Sigmoid函数和ReLU函数。Sigmoid函数取值在0到1之间,当x很小的时候接近于0,x很大的时候接近于1。ReLU函数的形式非常简单,即当输入值大于0的时候,输出值等于输入值,当输入值小于0的时候,输出值等于0。可见其在x大于0的时候没有边界,随着x趋向于无穷大,输出值也趋向于无穷大,其相应的导数的值在这个过程中恒为1,这有助于在深度学习模型的训练和收敛。
在最终的隐藏层和输出层之间,根据神经网络预测的目标不同会选择不同的激活函数。例如回归问题的目标是预测一系列连续的值,就可以直接使用全连接的线性输出作为最终的预测,则输出层是没有激活函数的。如果是二分类问题可以直接使用Sigmoid函数作为输出,因为其输出在0到1之间可以表示二分类中某一分类的概率。若是多分类问题,最后一层的输出要等于最终分类的数目,而最终输出的每一个分类的概率通过Softmax激活函数来得到。
基于梯度的优化器
神经网络的优化算法是使用梯度下降来优化的。根据微分的知识可以知道,在函数的极小值附近,如果沿着函数梯度方向行走,函数值是下降的。如式w’=w-α∂L/∂W中的α,这个参数控制着权重沿梯度下降的大小,称为学习率。当学习率比较小的时候,权重梯度优化的速度比较慢,但又由于每次变化的步长比较小,因此函数的变化相对连续,优化过程也是连续的,能够逐渐收敛到函数的极小值点。当学习率比较大的时候,每次变化步长大,梯度优化速度相对比较快,但是优化的行为可能不连续,这就导致了函数可能在某些值附近振荡收敛,甚至可能会导致整个优化行为的数值不稳定,即函数在优化过程中不断振荡无法收敛,甚至会不收敛。
在深度学习中一般使用基于Mini-batch的数据来估算神经网络中的权重梯度,并且使用估算后的权重梯度来对模型进行梯度下降优化。
其一般流程为:对所有的数据进行进行随机Shuffle,然后从这些随机排列的数据中抽取一定数目的数据(这个数目称为Batch Size),计算出每个数据的损失函数,并对损失函数求平均,再用平均后的损失函数进行反向传播,计算对应的权重梯度。 在这一过程中,称包含了所有数据的Mini-batch的集合为Epoch。在实际的优化行为的表现上,随机梯度下降算法有一定的不稳定性,需要调节学习率使得损失函数处于下降速率比较快的状态。
之所以随机梯度下降算法的梯度不正确是因为其没有所有批次的梯度的信息。为了引入其他Mini-batch的信息,需要在当前梯度中引入历史的信息。
令初始时刻动量为0,t时刻的动量等于t-1时刻的动量加上权重梯度乘以学习率。即mt=γ·mt-1+α∂L/∂Wt。γ的值代表了优化器中包含过去历史信息的多少,一般取值为0.9左右。应用动量来进行优化能够更接近真实的梯度,从而增加算法的稳定性。