pytorch 入门【task06】PyTorch理解更多神经网络优化方法

本系列博客为跟随开源组织Datawhale学习小组的学习过程记录,任务内容及相关数据集为Datawhale开源组织搜集并无偿提供,饮水思源,特此宣传,欢迎关注Datawhale。
pytorch 入门【task06】PyTorch理解更多神经网络优化方法
1、了解不同优化器
2、书写优化器代码

常见优化器:

  • 梯度下降:常用三种变形:BGD(批量梯度下降),SGD(随机梯度下降),MBGD(小批量梯度下降),三种形式对应不同数据量的情况。他们的代价函数为:
    J(θ0,θ1)=12mi=1m(hθ(x(i))y(i))2 J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=1}^{m}(h_{\theta}(x^{(i)}) - y^{(i)})^2
    这里涉及一个trade-off的概念,即参数更新的准确率和运行时间,通过这两个维度来度量三种形式的优劣。
    1、BGD(Batch gradient descent,批量梯度下降)
    梯度更新规则:
    BGD是我们入门学到的第一个优化方法,采用整个训练集的数据来计算cost function对参数的梯度。

    缺点:BGD是在一次更新中,对整个数据集计算梯度,在数据量规模不大时,计算速度慢的问题还不明显,但是随着数据量的增大,其速度慢的弊端会非常棘手,并且,计算过程中并不能及时地放入新的数据,以实时更新模型。
    优点:由全部数据集确定的方向能够更好的代表样本总体,更准确地向极值方向下降,若目标函数为凸函数,BGD一定能够得到全局最优解。非凸函数也可以得到局部最小值。可以实现为并行计算
    数学理解大致为:
    对目标函数(代价函数)求偏导:
    ΔJ(θ0,θ1)Δθj=1mi=1m(hθ(x(i))y(i)) \frac{\Delta J(\theta_0,\theta_1)}{\Delta \theta_j} = \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})
    每次迭代对参数进行更新:
    θj:=θjα1mi=1m(hθ(x(i))y(i))xj(i) \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)}
    编码过程,需要先定义一个迭代次数epoch,首先计算梯度向量param_grad,接着沿着梯度下降方向更新参数params,学习率learning决定了每次迭代跨步的大小。其运行示意图大致为:
    pytorch 入门【task06】PyTorch理解更多神经网络优化方法
    2、SGD(Stochastic Gradient Descent,随机梯度下降)
    梯度更新规则:每次迭代仅使用一个样本对参数进行更新,迭代速度快,如果数据量非常大,那么SGD有可能只需要遍历其中部分数据,就能得到最优解。相较于于BGD,每次计算都是喂进去全部数据,一次迭代计算量大,也不能快速得到最优解;SGD虽然存在一定的随机性,造成准确度有所下降,但是从期望的角度来看,其价值对于代价是可接受的。
    优点:避免了每次迭代对全部数据的遍历,计算速度和参数迭代速度明显加快
    缺点:SGD因为更新非常频繁,会造成cost function剧烈震荡;可能最终收敛到局部最优;难以实现并行计算
    对于一个样本的目标函数为:
    J(i)(θ0,θ1)=12(hθ(x(i))y(i))2 J^{(i)}(\theta_0,\theta_1) = \frac{1}{2}(h_{\theta}(x^{(i)})-y^{(i)})^2
    对目标函数求偏导
    ΔJ(i)(θ0,θ1)θj=(hθ(x(i))y(i))xj(i) \frac{\Delta J^{(i)}(\theta_0,\theta_1)}{\theta_j} = (h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}_j
    参数更新:
    θj:=θjα(hθ(x(i))y(i))xj(i) \theta_j := \theta_j - \alpha (h_{\theta}(x^{(i)})-y^{(i)})x^{(i)}_j
    迭代过程中示意图:pytorch 入门【task06】PyTorch理解更多神经网络优化方法
    3、MBGD(Mini-Batch Gradient Descent,小批量梯度下降)
    本方法是对BGD和SGD两种方法的折中,即,每次迭代,使用batch_size个数据进行计算和更新参数
    优点:对于“小批量”的batch_size,使用矩阵形式计算(可以并行化),不会比SGD每次迭代一个样本慢很多,但是使用batch_size个数据进行迭代,又可以大大提高计算的速度,同时准确度相比SGD也提高了许多。
    缺点:batch_size的选择比较考究,在合理范围内,batch_size增大可以有效的提高效率,但是盲目增大batch_size会对内存造成过大的压力,花费时间会变大。所以batch_size的选择比较重要。batch_size一般取值50~256