设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 2664|回复: 4
打印 上一主题 下一主题

[信息技术] 继续请教问题:关于 Pytorch 的 Autograd

[复制链接]
  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    " l6 ~( w2 _1 @# i8 b; T8 f
    ) }! B% w2 T% [3 i为预防老年痴呆,时不时学点新东东玩一玩。: k2 U+ l- h! ?7 u
    Pytorch 下面的代码做最简单的一元线性回归:
    ) e2 o0 ]" `7 Q$ o/ ]1 j5 u----------------------------------------------! i" j) h  R  N9 }
    import torch
    ) A/ ~" m' O. u& S5 j  @1 ximport numpy as np
    0 W# n! A+ h3 dimport matplotlib.pyplot as plt, U6 p+ o6 }4 O0 R8 D
    import random
    3 S8 l0 t* h$ I) Z: C2 X8 @% Q9 X3 Q8 W) P
    x = torch.tensor(np.arange(1,100,1))
    # s, N2 I4 g  _" o7 {y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    ' n) D& |* l$ ~4 Z* W9 Q" d1 h- }* f, W4 {; Z
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b. q( A4 N' V$ J0 f' `
    b = torch.tensor(0.,requires_grad=True). \2 E. S* l" x' U
    " M1 O: h: B) E4 c
    epochs = 100
    " m5 o3 ], o( W% B/ p
    : U5 s. y" e4 h: ?- d2 blosses = []
    6 \* p9 @8 T  Sfor i in range(epochs):# L2 p  p6 J% @* f  g
      y_pred = (x*w+b)    # 预测0 r  W0 g# _% L+ w* L0 E
      y_pred.reshape(-1): T0 u; Q; H% I0 k- q: W

    7 h' I, M1 w: u4 {' k; Q  loss = torch.square(y_pred - y).mean()   #计算 loss
    & Q* I4 U+ u' t/ f1 l0 }  q  losses.append(loss): R3 B* G8 H) _5 C
      
    ' C+ [2 q" \7 ^! w$ z  loss.backward() # autograd6 G: ~- n2 }$ m% V( c* C/ j- l
      with torch.no_grad():
    + a5 r& r7 S' {0 ?4 h/ g% [) I    w  -= w.grad*0.0001   # 回归 w* N5 p3 y' O, k! d( o  X) G
        b  -= b.grad*0.0001    # 回归 b $ x4 t' z; e3 y; e. _" M
      w.grad.zero_()  . R$ Z6 Y" v" q# U0 d, G
      b.grad.zero_()
    3 d  s8 v- _( z/ I1 h+ C0 g$ I: ]0 J/ s9 K6 I+ e. H1 F
    print(w.item(),b.item()) #结果
    " x1 f0 h. D4 O1 {( W- P4 |4 X# J" @9 q, _4 Y9 D( ?
    Output: 27.26387596130371  0.4974517822265625
    # d' t/ s+ ?1 o# c7 O# F----------------------------------------------
    # [) q+ m% W7 _( R! R最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    : H6 y) T, _# _高手们帮看看是神马原因?/ c1 z0 G: N4 @6 d8 R- X- Q

    评分

    参与人数 1爱元 +10 收起 理由
    老票 + 10 不明觉厉

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    % K( t- B& a0 _+ `' k* v0 P1 }
    $ |; L# ^! C& @7 R" [没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " k2 H. n% D5 Y-------* u/ q. A" K) ~! N% r
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。  j- X$ D: n& B" E4 Z7 j- y* @
    -------
    0 }; `5 h$ c; A7 ~4 p" ]6 M算法诊断部分,建议把循环次数改为1000, 再看看loss是不是收敛。有点怀疑你循环次数不够,因为你起点是0, 步长很小。只是直观建议。

    评分

    参与人数 1爱元 +10 收起 理由
    雷达 + 10 谢谢建议

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    板凳
     楼主| 发表于 2023-2-14 21:52:57 | 只看该作者
    老福 发表于 2023-2-14 19:238 }# m5 i5 n1 C* |6 o. B
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " n$ A! Y9 w" h' ]  J1 j  O-------
    ' r5 t  |9 J% Q' D$ w不好意思, ...
    3 w: D+ m0 o$ ~
    谢谢,算法应该没问题,就是最简单的线性回归。3 t4 r# s2 C6 H  ~5 i3 y" t
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    ' E' D. F1 |  b% b6 C9 B+ [
    雷达 发表于 2023-2-14 21:52
    5 u6 W% s5 K6 r" ^+ E0 `谢谢,算法应该没问题,就是最简单的线性回归。
    7 I; _" J; u/ ~3 E0 H/ z' G( T" X我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    1 u4 A, w! v+ E: w! Z% U; m3 G- q1 R$ W3 G
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    4 @) J: I9 p) Y0 q% A2 q% A; A
    , F3 P' o+ m8 y或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 1 ?1 n' r( B2 ^- M  `: v
    老福 发表于 2023-2-14 22:00
    ; f. |' d/ Q/ p$ ~4 ?- w刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    4 ^" Z- l6 @1 I3 Y3 {
    7 t: n: f1 L( j& r8 h或者把b但的起点改为1试试。 ...

    " O3 N9 l3 m) H8 f( V0 Q. W0 D3 a) `  b5 o4 r2 _
    你是对的。
    5 ^# y  c, U! d' y  z" X) A/ h' w去掉了随机部分
    6 D5 g7 ?5 |/ m5 h#y = (x*27+15+random.randint(-2,3)).reshape(-1)5 }- ~1 g  \7 Y7 t
    y = (x*27+15).reshape(-1)
    / i6 v8 b4 i, m8 ^8 A" ]- p; u% _, l
    循环次数加成10倍,就看到 b 收敛了
    . A0 Y5 B8 |6 ?' f5 c  ^  Iw , b
    5 u4 l2 x0 p/ ]7 k+ N# @: `  ?; q9 y27.002620697021484 14.826167106628418
    ) k8 \% t  \; j% Q+ ~/ c  e2 Y6 H5 `  X- z
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2026-3-26 01:22 , Processed in 0.059730 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表