2.2.4 损失函数和优化器
有了神经网络组件构建的模型还需要定义损失函数计算训练过程中输出和真实值的误差。均方误差(Mean Squared Error,MSE)是线性回归中常用的,是计算估算值与真实值差值的平方和的平均数。平均绝对误差(Mean Absolute Error,MAE)是计算估算值与真实值差值的绝对值求和再求平均。交叉熵(Cross Entropy,CE)是分类问题中常用的,衡量已知数据分布情况下,计算输出分布和已知分布的差值。
有了损失函数,就可以通过损失值利用优化器对参数进行训练更新。对于优化的目标函数f(x);先求解其梯度∇f(x),然后将训练参数W沿着梯度的负方向更新,更新公式为Wt=Wt−1−α∇(Wt−1),其中α是学习率,W是训练参数,∇(Wt−1)是方向。神经网络的优化器有两类:一类是学习率不受梯度影响的随机梯度下降(Stochastic Gradient Descent,SGD)及SGD的一些改进方法,如带有Momentum的SGD;另一类是自适应学习率,如AdaGrad、RMSProp、Adam等。
SGD的更新是对每个样本进行梯度下降,因此计算速度很快,但是单样本更新频繁,会造成震荡;为了解决震荡问题,提出了带有Momentum的SGD,该方法的参数更新不仅仅由梯度决定,也和累计的梯度下降方向有关,使得增加更新梯度下降方向不变的维度,减少更新梯度下降方向改变的维度,从而速度更快,震荡也减少了。
自适应学习率AdaGrad是通过以往的梯度自适应更新学习率,不同的参数Wi具有不同的学习率。AdaGrad对频繁变化的参数以更小的学习率更新,而稀疏的参数以更大的学习率更新。因此对稀疏数据的表现比较好。Adadelta是对AdaGrad的改进,解决了AdaGrad优化过程中学习率α单调减少问题;Adadelta不对过去的梯度平方进行累加,用指数平均的方法计算二阶动量,避免了二阶动量持续累积,导致训练提前结束。Adam可以理解为Adadelta和Momentum的结合,对一阶二阶动量均采用指数平均的方法计算。
MindSpore提供了丰富的API让用户导入损失函数和优化器。代码2.5计算了输入和真实值之间的softmax交叉熵损失,导入Momentum优化器。
代码2.5 定义损失函数和优化器