设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    8 a% U7 ?6 H8 N. j% x+ V/ q5 r# i1 K2 x7 b4 u# D
    为预防老年痴呆,时不时学点新东东玩一玩。
    + d) ~% @7 J( X# GPytorch 下面的代码做最简单的一元线性回归:
    3 _& d. r# k) f# m6 r9 N& b----------------------------------------------) j  N. A5 [4 ^0 i9 h& _
    import torch  `1 W. C8 b" T
    import numpy as np6 y; v5 Z) q7 h7 D. V" j, O
    import matplotlib.pyplot as plt
    5 O, J3 l/ {8 Z1 vimport random
    : L! u8 r6 I/ F* u; }! R$ q( X1 I: M( i$ m' h
    x = torch.tensor(np.arange(1,100,1))
    . u& B. N4 U" ~# `! O9 sy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15. v3 f; J2 p2 p
    + D; d+ g( ]: N- u: b  m; P  c
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b& M8 E, ]6 o0 X) S2 S2 q
    b = torch.tensor(0.,requires_grad=True)8 E2 ?, ^' n& {. z& U9 k* e$ N

    $ L: W6 X8 E& B: C! v. bepochs = 100
    7 R$ {& H! ]. j& i2 {* Y; a$ W4 q! W1 [
    losses = []' G0 Z2 V. J8 _, w& s% c
    for i in range(epochs):* M9 J5 u$ B: X" ^8 f0 r
      y_pred = (x*w+b)    # 预测: x# p5 a7 X* q- \
      y_pred.reshape(-1)2 r2 z- s, v7 Y
    + J; N; o) p% }0 r& I% q* j
      loss = torch.square(y_pred - y).mean()   #计算 loss. m5 i6 q0 w& `& R' T" d0 s; v. A
      losses.append(loss)
    , E4 K& T  x9 M  9 }; y$ X& Q! G' B0 H* G
      loss.backward() # autograd* i5 n# w- B# H, j
      with torch.no_grad():, \& q# i7 v' N8 e
        w  -= w.grad*0.0001   # 回归 w* K5 A' e* ?/ r5 `- `8 W+ X
        b  -= b.grad*0.0001    # 回归 b
    - M+ s; Z# @- i4 J- n  w.grad.zero_()  
    : C5 e" \/ c) M" V  o/ a* |4 W( [  b.grad.zero_(): ^* |/ [9 t9 e; ~2 R9 e
      v1 h. d+ o+ J2 v' `+ t
    print(w.item(),b.item()) #结果8 ~, q( x" D+ s" n

    1 u5 ]' j5 `0 a7 {* f! W$ eOutput: 27.26387596130371  0.4974517822265625% b* S. v5 G9 y% Q. o5 k( o7 c
    ----------------------------------------------# x* Q" H8 |( O% U$ X' M1 O" u
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。- ?4 W4 ]5 q, z# h1 s& r
    高手们帮看看是神马原因?& e# f( B% n- \6 o9 y

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 " Z9 X8 O- m0 z9 G" R: k
    $ O1 |* t, c0 |, e  \/ B; i  s
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    / t- ^) J1 U' o9 ?* N' l-------
    7 s2 d3 L! F  H+ h' e不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    % d6 ]. N+ a* n& J" P( h-------
    ; P5 v, n" N+ x, R算法诊断部分,建议把循环次数改为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:23$ W2 C; G( W$ Q( V+ [
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?4 T; [3 `  T  g0 C( s7 V3 C
    -------
    4 x0 r$ }: s1 t% u1 j* x不好意思, ...

    ! T* @" @# }* x& d( J& t, P" e  [' d谢谢,算法应该没问题,就是最简单的线性回归。
    $ `. H, X7 d  X2 x8 b# |7 R' V我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
      Q+ y) N5 V+ w! m) Z1 A
    雷达 发表于 2023-2-14 21:52
    9 `- i. B7 H5 t1 |& z谢谢,算法应该没问题,就是最简单的线性回归。, E" U3 b8 d+ q$ f( P! V
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    5 D8 L9 _# N" x% o
    6 s. h& P& ^4 ?, m. k! f
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。- v" n) T6 G/ z- i- ]9 {
    . b+ V. m3 d% W, T
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 . p$ V. B2 a' q6 {( F( Z, f& Z
    老福 发表于 2023-2-14 22:00% O% {& C2 i+ F0 J9 T0 i
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。/ o& N% s( p# K

      k# v) J7 b1 {: ]9 g或者把b但的起点改为1试试。 ...

    ( C7 ]. K6 C7 Q( l6 s  }0 k! y0 o1 r+ W" W4 N- p
    你是对的。8 ?4 F" i# L. v/ q- w! ~& E) F3 Z
    去掉了随机部分" j& V4 `3 f6 U7 S6 I$ Y. Q
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ' _- [) b& L$ ^' }8 Q4 ny = (x*27+15).reshape(-1)+ A6 m( c: b. b; ^( K

    1 ?2 f) f6 u) u) k: ^. U" X7 f循环次数加成10倍,就看到 b 收敛了
    # l& Z! X& s' Vw , b
    ! m! }5 n. s# ^" }' H( u" S* D27.002620697021484 14.826167106628418: V4 D9 U1 B* @: W% x% J# \4 o
    ' M2 J8 F, l- F% c/ q! u* @
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-20 05:51 , Processed in 0.066812 second(s), 21 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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