深度学习——PyTorch实战计算机视觉4

损失和优化

在深度神经网络中,损失用来度量预测值与真实值之间的差距,也是衡量模型泛化能力的重要指标。预测值与真实值之间的差距越大,损失值就越高,此时就需要不断对模型中的参数进行优化来减少损失;同样的,预测值和真实值之间的差距越小,则模型预测越准,泛化能力越好。

对模型进行优化的最终目的是,尽可能在不过拟合的情况下降低损失值。

1. 损失函数

1)均方误差函数

均方误差(Mean Square Error,MSE)函数,计算的是预测值与真实值之差的平方的期望值,可用于评价数据的变化程度,值越小,预测精度越高。

MSE=\frac{1}{N}\sum_{i=1}^N(y^i_{true}-y^i_{pred})^2

其中,y_{pred}表示预测值,y_{true}表示真实值。

2)均方根误差函数

均方根误差(Root Mean Square Error,RMSE)在均方误差函数的基础上进行了改进,计算的是均方误差的算术平方根,值越小,精度越高。

RMSE=\sqrt{\frac{1}{N}\sum_{i=1}^N(y^i_{true}-y^i_{pred})^2}

3)平均绝对误差函数

平均绝对误差(Mean Absolute Error,MAE)计算的是绝对误差(即预测值与真实值之差的绝对值)的平均值,更能反映预测值误差的实际情况,值越小,精度越高。

MAE=\frac{1}{N}\sum_{i=1}^{N}\left | (y_{true}^i-y^i_{pred}) \right |

2. 优化函数

计算出模型的损失值之后,需要用损失值进行模型参数的优化。之前提到的后向传播只是模型参数优化的一部分,实际的优化过程中,我们还面临在优化过程中相关参数的初始化参数以何种形式进行微调如何选取合适的学习率等问题。我们可以把优化函数看作上述问题的解决方法的集合。

实践中,常用的是一阶优化函数,典型的有GD、SGD、Momentum、Adagrad、Adam等。一阶优化函数在优化过程中求解的是参数的一阶导数,这些一阶导数的值就是模型中参数的微调值。

此处引入概念:梯度。

梯度其实就是将多元函数的各个参数求得的偏导数以向量的形式展现出来,也叫做多元函数的梯度。举例:有二元函数f(x,y),分别对函数中的x,y求偏导数,然后把参数x,y求得的偏导数写成向量的形式,即(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y}),这就是二元函数f(x,y)的梯度,将其记作gradf(x,y)。同理,三元函数f(x,y,z)的梯度为(\frac{\partial f}{\partial x},\frac{\partial f}{\partial y},\frac{\partial f}{\partial z}),以此类推。

不难发现,梯度中的内容其实就是在后向传播中对每个参数求得的偏导数,所以我们在模型优化过程中使用的参数微调值其实就是函数计算得到的梯度,这个过程又叫做参数的梯度更新。对于只有单个参数的函数,可以用计算得到的导数来更新参数。

常见的优化函数:

1)梯度下降

梯度下降(Gradient Descent,GD)是参数优化的基础方法。虽然已经被广泛应用,但也有许多不足之处,所以基于梯度下降改进的优化函数也很多。全局梯度下降的参数更新公式如下:

\theta _j=\theta _j-\eta \times \frac{\partial J(\theta _j)}{\partial \theta _j}

其中,训练样本总数为n,j=0...n。J(\theta)是损失函数\frac{\partial J(\theta)}{\partial \theta}是根据损失函数计算\theta的梯度。\eta是学习率,控制梯度更新的快慢,过快的话参数更新跨度太大,容易出现局部最优和抖动,过慢的话梯度更新迭代次数增加,优化时间就会变长。所以选择一个合理的学习率很关键。

全局梯度下降每次计算损失值时都是针对参与训练的数据集而言的,所以会出现一个问题:因为模型的训练依赖于整个数据集,所以增加了计算损失值的时间成本和模型训练过程中的复杂度,而参与训练的数据量越大,这两个问题就越明显。

2)批量梯度下降

批量梯度下降(Batch Gradient Descent,BGD)将整个参与训练的数据集划分为若干个大小差不多的子训练集,每个子训练集叫做一个批量,每次只用一个批量的数据进行训练,并以这个批量计算得到的损失值为基准来对模型中的全部参数进行梯度更新,默认这个批量只用一次,然后用下一个批量完成相同的工作,指导所有批量的数据全部使用完毕。

设划分出来的批量个数为m,其中一个批量包含batch个数据样本,那么BGD的参数更新公式如下:

\theta _j=\theta _j-\eta \times \frac{\partial J_{batch}(\theta _j)}{\partial \theta _j}

BGD仍然存在问题:选择BGD容易导致优化函数的最终结果是局部最优解。

3)随机梯度下降

随机梯度下降(Stochastic Gradient Descent,SGD)通过随机的方式从整个训练集中抽取一部分参与训练,故只要抽取的数量合适,就不必担心计算损失函数的时间成本和模型训练的复杂度,而且与整个参与训练的数据集的大小没有关系。

设随机选取的数量为stochastic,那么SGD的参数更新公式如下:

\theta _j=\theta _j-\eta \times \frac{\partial J_{stochastic}(\theta _j)}{\partial \theta _j}

SGD虽然很好的提升了训练速度,但是在参数优化的过程中会出现抖动情况,原因就在于选取的参与训练的数据是随机的,所以模型会受到随随机训练数据集中噪声数据的影响,又因为有随机的因素,所以容易导致模型最终得到局部最优解。

4)Adam

自适应时刻估计法(Adaptive Moment Estimation,Adam)在模型训练优化过程中通过让参数获得自适应的学习率来达到优化质量和速度的双重提升。

Adam收敛速度快,学习效果好。

发布了115 篇原创文章 · 获赞 33 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Dorothy_Xue/article/details/102627175