深度学习实战-3 梯度下降算法

网上一个很精彩的PyTorch深度学习实践的课程,几个月前学完了,现在准备再学一遍,加深一下理解与印象,做一些笔记。文章如有错误,望批评指正。本课程只是笔记,如有侵权,请联系我删除。

3 梯度下降算法

3.1 传统方法遇到的问题

前面我们讲的是用搜索法进行线性模型的确定。但是这个方法有一定缺陷,就是当参数较多时,搜索量非常大,比如两个参数搜索区域是平面区域,那么搜索量是O(N^2)。

此外,还有一种方法是分治法。先用较大的网格进行初步搜索,确定一个初步的范围。然后再在这个范围内用小网格搜索。时间效率比起穷举搜索法高很多。但是这种方法有一定缺陷,因为loss曲线不一定是平滑的,可能是上下变化的。而且,当权重过多时,依然无法进行搜索。AlextNet有近500万个未知数,这种规模的权重无法搜索过来。

3.2 梯度下降法的引出

我们从一个简单的例子引入梯度下降法,如下图所示,有一个关于权重 w 和梯度 cost 的曲线,我们要想办法将loss将到最低:
在这里插入图片描述

我们可以利用梯度这一方法。将目标函数对权重进行求导 ∂ c o s t ∂ w \frac{\partial cost}{\partial w} wcost ,这样就求到了函数的最快上升方向。正值则x增大,函数增大;负值则x减少,函数增大。我们要让函数下降,就得用负的梯度方向,就是最快下降方向。

我们得到梯度下降法参数更新公式 w = w − α ∂ c o s t ∂ w w=w-\alpha \frac{\partial cost}{\partial w} w=wαwcost α \alpha α 是学习率,一般学习率要小一点,不然可能一步就跨过了最优点。

3.3 局部最优与鞍点

实际上,梯度下降是贪心法,即每一步走当前最优的方向,不考虑全局。当函数是非凸函数,梯度下降法不一定能得最优结果,但是能得一个局部最优结果,无法得到全局最优。

非凸函数:画一条线,无法保证函数值都在线上方或下方

既然梯度下降无法一定得到全局最优,但是为什么大量使用梯度下降法呢?

这是因为,深度学习,局部最优点不是非常多。不过,深度学习有很多鞍点,即此时梯度为0。在鞍点处,参数无法进行更新,这时深度学习需要解决的问题。

3.4 梯度下降法实例

对上节课的问题,有损失函数 c o s t = 1 N ∑ n = 1 n ( y i ^ − y i ) 2 = 1 N ∑ n = 1 n ( x n w − y i ) 2 cost=\frac{1}{N} \sum_{n=1}^{n}(\hat{y_i}-y_i)^2=\frac{1}{N} \sum_{n=1}^{n}(x_nw-y_i)^2 cost=N1n=1n(yi^yi)2=N1n=1n(xnwyi)2 。现在,我们求其梯度。
在这里插入图片描述

然后进行梯度更新,更新方法如下:
在这里插入图片描述

3.5 代码求解与可视化

import numpy as np
import matplotlib.pyplot as plt
#定义损失函数
def loss(x,y,w):
    loss_v=0
    for i,j in zip(x,y):
        loss_v+=(j-i*w)**2 #均方误差损失函数
    return loss_v/len(x)
#定义梯度下降函数,均方误差的梯度公式
def gradient_descent(x,y,w):
    g_d=0
    for i,j in zip(x,y):
        g_d+=2*i*(i*w-j)  #根据梯度下降算法的解析式计算梯度 
    return g_d/len(x)
#训练
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]
loss_value=[]
epoch=[]
alpha=0.01 #学习率
w=3
for i in range(0,100): #100个epoch
    loss_val=loss(x_data,y_data,w)
    loss_value.append(loss_val)
    w-=alpha*gradient_descent(x_data,y_data,w)
    epoch.append(i)
print(len(epoch))
plt.plot(epoch,loss_value) #可视化图形
print("经过100个epoch后,得到的w参数是:"+str(w))
经过100个epoch后,得到的w参数是:2.00

3.6 损失函数策略

上面的训练代码的损失函数曲线如下,可以看出训练曲线是比较平滑的。
在这里插入图片描述

但是如果损失函数曲线如果过于震荡,我们需要用指数加权均值的方法进行曲线平滑。我们设原来的参数为 C 1 , C 2 , C 3 , , , C n C_1,C_2,C_3,,,C_n C1,C2,C3,,,Cn ,进行指数加权为 C 1 ′ = C 1 , C i ′ = β C i + ( 1 − β C i − 1 ′ ) C_1^{'}=C_1 , C_i^{'}=\beta C_i+(1-\beta C_{i-1}^{'}) C1=C1Ci=βCi+(1βCi1)

若损失函数经过一定轮训练后,损失函数反而越来越大了,那就是训练失败了。失败的原因很多,其中一个就是学习率 α \alpha α 过大

3.7 其他梯度下降法

深度学习中,更常用的是随机梯度下降(SGD)。我们随机选一个样本进行权重更新。

随机梯度下降的好处,因为数据中有噪声,会帮助我们跨过鞍点。不过一个一个进行随机梯度,时间复杂度过高

所以我们会在性能与效率折中,即用mini-Batch梯度下降,即一次去小批量进行梯度更新。深度下降框架的SGD默认使用mini-Batch梯度下降,所以现在一般直接将Batch梯度下降指代mini-Batch梯度下降。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值