码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【PyTorch】深度学习实践之 梯度下降Gradient Descent


    本文目录

    • 梯度下降算法
      • 代码:
      • 结果:
    • 随机梯度下降SGD
      • 代码:
      • 结果:
    • 二者区别
    • 鞍点
    • 学习资料:
    • 系列文章索引


    梯度下降算法

    在这里插入图片描述
    通过计算梯度就可以知道 w 的移动方向,应该让 w 向右走而不是向左走,也可以知道什么时候会到达最低点(梯度为0的地方)。此处引入一个学习率α,可以控制走的快慢,一般训练学习率α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!

    代码:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import cm
    from mpl_toolkits.mplot3d import Axes3D
    
    x_data = [1.0, 2.0, 3.0]
    y_data = [2.0, 4.0, 6.0]
    
    w = 1.0
    
    # 定义线性模型
    def forward(x):
        return x * w
    
    # 定义所有样本的平均平方误差
    def cost(xs, ys):
        cost = 0
        for x, y in zip(xs, ys):
            y_pred = forward(x)
            cost += (y_pred - y) ** 2
        return cost / len(xs)
    
    # 定义梯度函数
    def gradient(xs, ys):
        grad = 0
        for x, y in zip(xs, ys):
            grad += 2 * x * (x * w - y)
        return grad / len(xs)
    
    
    epoch_list = []
    loss_list = []
    print('Predict (before training)', 4, forward(4))
    for epoch in range(100):
        cost_val = cost(x_data, y_data)
        grad_val = gradient(x_data, y_data)
        w -= 0.01 * grad_val # 0.01是学习率
        print('Epoch:', epoch, 'w=', w, 'loss=', cost_val)
        epoch_list.append(epoch)
        loss_list.append(cost_val)
    print('Predict (after training)', 4, forward(4))
    
    plt.plot(epoch_list, loss_list)
    plt.ylabel('loss')
    plt.xlabel('epoch')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    结果:

    在这里插入图片描述

    随机梯度下降SGD

    随机梯度下降就是随机选择一个样本计算loss

    代码:

    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import cm
    from mpl_toolkits.mplot3d import Axes3D
    
    x_data = [1.0, 2.0, 3.0]
    y_data = [2.0, 4.0, 6.0]
    
    w = 1.0
    
    # 定义线性模型
    def forward(x):
        return x * w
    
    # 定义单个样本的损失
    def loss(x, y):
        y_pred = forward(x)
        return (y_pred - y) ** 2
     
    # 定义梯度函数
    def gradient(x, y):
        return 2 * x * (x * w - y)
    
    epoch_list = []
    loss_list = []
    print('Predict (before training)', 4, forward(4))
    for epoch in range(100):
        for x, y in zip(x_data, y_data):
            grad = gradient(x, y) #单个样本梯度
            w -= 0.01 * grad #权重更新
            print("\tgrad:", x, y, grad)
            l = loss(x, y)
        print("progress", epoch, "w=", w, "loss=", l)
        print("\n")
        epoch_list.append(epoch)
        loss_list.append(l)
    
    print('Predict (after training)', 4, forward(4))
    
    plt.plot(epoch_list, loss_list)
    plt.ylabel('loss')
    plt.xlabel('epoch')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    结果:

    在这里插入图片描述

    二者区别

    • cost是所有样本算出来的损失,loss是随机的一个样本损失,引入了一个随机噪声,随机噪声可能会把我们向前推动,那么将来我们在更新的过程中,就有可能跨越鞍点,从而向最优值前进,而普通梯度下降可能只会停留在局部最优点停滞不前
    • 随机梯度下降只需要求出一个样本均值 ,而普通梯度下降是计算所有数据
    • 普通的是需要把计算所得的均值进行相加,随机梯度下降是对每一个样本来求梯度,然后进行更新
    • 随机梯度算法更新的次数大于普通梯度算法

    鞍点

    一个不是局部极值点的驻点称为鞍点。

    鞍点这词来自于不定二次型x2-y2的二维图形,像马鞍:x-轴方向往上曲,在y-轴方向往下曲。
    在这里插入图片描述


    学习资料:

    https://blog.csdn.net/qq_44833724/article/details/123262072


    系列文章索引

    教程指路:【《PyTorch深度学习实践》完结合集】 https://www.bilibili.com/video/BV1Y7411d7Ys?share_source=copy_web&vd_source=3d4224b4fa4af57813fe954f52f8fbe7

    1. 线性模型 Linear Model
    2. 梯度下降 Gradient Descent
    3. 反向传播 Back Propagation
    4. 用PyTorch实现线性回归 Linear Regression with Pytorch
    5. 逻辑斯蒂回归 Logistic Regression
    6. 多维度输入 Multiple Dimension Input
    7. 加载数据集Dataset and Dataloader
    8. 用Softmax和CrossEntroyLoss解决多分类问题(Minst数据集)
    9. CNN基础篇——卷积神经网络跑Minst数据集
    10. CNN高级篇——实现复杂网络
    11. RNN基础篇——实现RNN
    12. RNN高级篇—实现分类
  • 相关阅读:
    【区块链实战】什么是DAPP,区块链开发如何进行技术选型
    Linux系统运维脚本:shell脚本查看一定网段范围在线网络设备的ip地址和不在线的网络设备的数量(查看在线和不在线网络设备)
    [晕事]今天做了件晕事21;设置代理访问网站的时候需注意的问题
    【刷题】怎么样才能正确的迎接面试?
    centos安装部署OpenStack train版
    新手入门:Web安全测试大盘点
    有望引领下轮牛市的5大加密主题
    基于.NET6的简单三层管理系统
    pyhton内置的数据类型(二)
    【Java面试】说一下你对CompletableFuture的理解
  • 原文地址:https://blog.csdn.net/qq_43800119/article/details/126409605
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号