深度学习 | 【03】梯度下降法

梯度下降和方向传播

1、 什么是梯度

是一个向量,导数+变化最快的方向(学习的前进方向)即多元函数参数的变化趋势。
在这里插入图片描述


机器学习

  • 收集数据x,构建机器学习模型f,得到 f(x, w) = 预测值
  • 判断模型好坏的方法:
    • loss = (预测值 - 真实值)^2 - 回归损失
    • loss = 真实值 * log(预测值) - 分类损失
  • 为了减低loss,通过调整参数w来实现
    在这里插入图片描述
  • 随机选择一个起始点v0, 通过调整w0,让loss函数取到最小值
    在这里插入图片描述
  • w的更新方法:
    • 计算w的梯度 -> 导数:
      在这里插入图片描述
    • 更新w:
      在这里插入图片描述
  • 其中:
    • 梯度的导数<0,则w将增加;
    • 梯度的倒数>0,则w将减小。

2、 偏导的计算

2.1 常见的导数计算

在这里插入图片描述

导数微分:

在这里插入图片描述

2.2 多元函数求偏导

多元函数有着多个自变量。在求偏导过程中,对某一个自变量求导,其他自 变量当作常量即可。

在这里插入图片描述

3、方向传播算法

3.1 计算图和反向传播

计算图:通过图的方式来描述函数的图形。

在这里插入图片描述

将其绘制成计算图可表示为以下图片。进而,可清楚的看清计算的方向以及过程。

在这里插入图片描述

求偏导

在这里插入图片描述

方向传播的过程是一个上图的从右往左的过程,自变量a,b,c各自的偏导就是连线上的梯度的乘积。

4、神经网络中的方向传播

4.1 神经网络的示意图
  • w1, w2……wn表示网络第n层权重;
    wn[i,j]表示第n层第i个神经元,连接到第n+1层第j个神经元的权重。

在这里插入图片描述

4.2 神经网络的计算图

在这里插入图片描述

  • ▽out是根据损失函数对预测值进行求导得到的结果;
  • f函数可以理解为激活函数。

缺点

当模型打的时候,计算量会非常大。
因此,反向传播的思想就是对其中一个参数单独求梯度,之后更新,在计算下一层。

通用描述
在这里插入图片描述

5、pytorch中实现

5.1 向前计算

对于pytorch中的一个tensor,如果设置它的属性 .requires_grad 为True,那么它将会追踪对于该张量的所有操作。或者可以理解为,这个tensor是一个参数,后续会被计算梯度,更新该参数。

5.1.1 计算过程

若要对x进行梯度计算,则在运算过程中,设置它的requires_gradtrue即可记录下前面的操作。
grad_fn能够组成一个计算图。

在这里插入图片描述
5.1.2 requires_grad和grad_fn

  • 可通过该tensor的属性.传入True直接修改。可使用grad_fn查看
  • 若不想记录的步骤,可放在with torch.no_grad()中就不会对其进行梯度计算。

在这里插入图片描述

5.2 梯度计算

注意:

  • 在输出为一个标量的情况下,我们可以调用输出tensor的backword()方法,但是在数据是一个向量的时候,调用backward()的时候还需要传入其他参数。
  • 很多时候我们的损失函数都是一个标量,所以这里就不再介绍损失为向量的情况。
  • loss.backward()就是根据损失函数,对参数(requires_grad=True)的去计算他的梯度,并且把它累加保存到x.gard ,此时还并未更新其梯度
  • requires_grad=True不能直接转换,需要使用tensor.datach.numpy()

6、线性回归简单实现

# -*- coding: utf-8 -*-
""" @Time : 2021/5/15 17:50
 @Author : XXX
 @Site : 
 @File : Demolos.py
 @Software: PyCharm 
"""
import torch
import matplotlib.pyplot as plt

# 学习率
learning_rate = 0.01

# 通过随机数获取数据
x = torch.rand([400, 1])
y_true = x*2 + 0.2

# 构建俩个参数,模拟x,y
w = torch.rand([1,1], requires_grad=True)
b = torch.tensor(0, requires_grad=True, dtype=torch.float32)



for i in range(2500):
    y_pre = torch.matmul(x, w) + b  # 预测值
    loss = (y_true-y_pre).pow(2).mean() # 均方误差

    # 若w,b的grid置0, backward将在其中累积(添加)梯度。
    if w.grad is not None:
        w.grad.data.zero_()
    if b.grad is not None:
        b.grad.data.zero_()

    loss.backward()     # 反向传播
    w.data = w.data - learning_rate*w.grad
    b.data = b.data - learning_rate*b.grad
    if i==1999:
        print(w.data, b.data, loss)

plt.figure(figsize=(20, 8), dpi=80)
plt.scatter(x.view(-1), y_true.view(-1))    # 绘制散点图
y_pre = torch.matmul(x, w) + b
plt.plot(x.view(-1), y_pre.detach().numpy().reshape(-1))

plt.show()


运行结果
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 2
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:像素格子 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值