franciscochonge 发表于 2022-7-10 12:59

深度学习-优化算法

前言

深度学习的目标是最小化损失函数,本质上是一个优化问题;因此优化算法便是深度学习算法的学习机制。
用于深度学习的各种优化算法都是从梯度下降算法发展而来的。
梯度下降算法思想是利用链式求导法则计算损失函数值相对于神经网络中的每一个权重参数的梯度,通过沿负梯度方向更新权重参数达到降低损失函数值的效果。
梯度下降算法的伪代码如下:
def train(x,y,w,b,alpha,max_iters):

    """
    x:训练集
    y:训练集所对应的目标值
    w:权重向量
    b:偏置
    alpha:学习率
    max_iters:最大迭代次数
    """

    dw = 0
    db = 0
    m = x.shape
   
    #梯度下降迭代
    for i in range(max_iters):
      dw = 0
      db = 0
      #遍历训练集
      for j in range(m):
            #计算每个数据集的权重向量梯度w_grad和偏置梯度b_grad
            #将w_grad和b_grad分别累加到dw和db累加器中
      w = w - alpha * (dw / m) #更新权重向量
      b = b - alpha * (db / m) #更新偏置
    return w,b<hr/>深度学习面对的实际问题是有大量局部最优解和鞍点;梯度下降算法很容易被困在局部最优解,或是停留在鞍点不能动弹;因此基于梯度下降算法的许多改进版发展起来。
局部最优解:如果目标函数f(x)在x上的值比在x邻域的值更小,且在x上的值并非目标函数在整个定义域内的最小值,则f(x)为局部最优解。
鞍点:鞍点是函数上导数为0,但不是轴上局部极值的点。通常我们可以利用海森矩阵来判断某一点是否为局部极值点、鞍点。
当海森矩阵在梯度为0的位置上:

[*]特征值全为负:局部最大值
[*]特征值全为正:局部最小值
[*]特征值有正有负:鞍点
torch.optim.SGD

伪代码:
输入:全局的学习率
输出:收敛的参数
(1):初始化参数
(2):当不满足停止条件时执行:
(3):       从数据集 中均匀随机选取个样本
(4):       计算梯度:
(5):       计算更新: https://www.zhihu.com/equation?tex=w_%7Bt%7D%3Dw_%7Bt-1%7D-%5Cvarepsilon%5Codot+g_%7Bt%7D 参数参数含义params待优化参数的iterablelr学习率momentum动量因子weight_decay权重衰减系数dampening动量抑制因子nesterov是否使用Nesterov动量优点:
能避免冗余数据的影响,收敛速度加快,能够在线学习缺点:
权值更新方差大,收敛波动大
难以解决局部最优解问题torch.optim.ASGD

参数参数含义params待优化参数的iterablelr学习率lambd衰减项alphaeta更新的指数t0指定平均化起始点weight_decay权重衰减系数torch.optim.Adam

伪代码:
输入:全局的学习率(一般设置为0.001),极小值(一般设置为),一阶系数 https://www.zhihu.com/equation?tex=%5Cgamma_%7B1%7D (一般设置为0.9),二阶系数 https://www.zhihu.com/equation?tex=%5Cgamma_%7B2%7D
输出:收敛的参数
(1):初始化参数
(2):当不满足停止条件时执行:
(3):       从数据集 中均匀随机选取个样本
(4):       计算梯度:
(5):       计算一阶梯度偏差: https://www.zhihu.com/equation?tex=s_%7Bt%7D%3D%5Cgamma_%7B1%7D+s_%7Bt-1%7D%2B%281-%5Cgamma_%7B1%7D+%29g_%7Bt%7D
(6):       计算二阶梯度偏差: https://www.zhihu.com/equation?tex=r_%7Bt%7D%3D%5Cgamma_%7B2%7D+r_%7Bt-1%7D%2B%281-%5Cgamma_%7B2%7D+%29g_%7Bt%7D%5Codot+g_%7Bt%7D
(7):       计算一阶修正梯度: https://www.zhihu.com/equation?tex=%5Ctilde%7Bs_%7Bt%7D%7D%3D%5Cfrac%7Bs_%7Bt%7D%7D%7B1-%5Cgamma_%7B1%7D%7D
(8):       计算二阶修正梯度: https://www.zhihu.com/equation?tex=%5Ctilde%7Br_%7Bt%7D%7D%3D%5Cfrac%7Br_%7Bt%7D%7D%7B1-%5Cgamma_%7B2%7D%7D
(9):       计算更新: https://www.zhihu.com/equation?tex=w_%7Bt%7D%3Dw_%7Bt-1%7D-%5Cfrac%7B%5Cvarepsilon++%5Ctilde%7Bs_%7Bt%7D%7D%7D%7B%5Cdelta%2B%5Csqrt%7B%5Ctilde%7Br_%7Bt%7D%7D%7D%7D 参数参数含义params待优化参数的iterablelr学习率betas用于计算梯度以及梯度平方的运行平均值的系数eps为了增加数值计算的稳定性而加到分母里的项weight_decay权重衰减优点:
对内存需求小,收敛速度快,为不同的参数计算不同的自适应学习率torch.optim.Adamax

参数参数含义params待优化参数的iterablelr学习率betas用于计算梯度及梯度平方的运行平均值的系数eps为了增加数值计算的稳定性而加到分母里的项weight_decay权重衰减优点:
在Adam优化算法的基础上为学习率设定了简单的范围torch.optim.Adagrad

伪代码:
输入:全局的学习率,极小值(一般设置为),累积梯度变量
输出:收敛的参数
(1):初始化参数
(2):当不满足停止条件时执行:
(3):       从数据集 中均匀随机选取个样本
(4):       计算梯度:
(5):       计算累积梯度: https://www.zhihu.com/equation?tex=r%3Dr%2Bg_%7Bt%7D%5Codot+g_%7Bt%7D
(6):       计算更新:参数参数含义params待优化参数的iterablelr学习率lr_decay学习率衰减weight_decay权重衰减系数优点:
不需要对每个学习率手动调节缺点:
容易因为梯度消失而提取结束训练torch.optim.Adadelta

参数参数含义params待优化参数的iterablerho用于计算平方梯度的运行平均值的系数eps为增加数值计算稳定性而加到分母中的项lr在delta被应用到参数更新之前对它缩放的系数weight_decay权重衰减系数优点:
训练速度快缺点:
容易困于局部最优解torch.optim.Rprop

参数参数含义params待优化参数的iterablelr学习率etas乘法的增加和减小因子step_sizes允许的一对最大和最小步长缺点:
只适用于full-batch,应用场景小torch.optim.RMSprop

伪代码:
输入:全局的学习率,极小值(一般设置为),累积梯度变量
输出:收敛的参数
(1):初始化参数
(2):当不满足停止条件时执行:
(3):       从数据集 中均匀随机选取个样本
(4):       计算梯度:
(5):       计算累积梯度: https://www.zhihu.com/equation?tex=r%3D%5Cgamma+r_%7Bt-1%7D%2B%281-%5Cgamma+%29g_%7Bt%7D%5Codot+g_%7Bt%7D
(6):       计算更新:参数参数含义params待优化参数的iterablelr学习率momentum动量因子alpha平滑系数eps为增加数值计算稳定性而加到分母中的项centered为True时,计算中心化RMSProp,并用其方差预测值对梯度归一化weight_decay权重衰减系数优点:
解决了Adagrad激进的学习率缩减问题torch.optim.LBFGS

参数参数含义lr学习率max_iter每一步优化的最大迭代次数max_eval每一步优化的最大函数评价次数tolerance_grad一阶最优的终止容忍度tolerance_change在函数值/参数变化量上的终止容忍度history_size更新历史的大小优点:
收敛速度快,节省内存更多精彩


深度学习课程推荐
页: [1]
查看完整版本: 深度学习-优化算法