设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 " y' r- g  {4 D/ d

    1 ]5 `( L: \- q5 [; O2 i: @为预防老年痴呆,时不时学点新东东玩一玩。* U( m) ]% n7 W; H
    Pytorch 下面的代码做最简单的一元线性回归:6 t, m( q* t  W3 F
    ----------------------------------------------
    % O% l. h; H4 t$ k2 nimport torch! ^5 X9 \) K0 t2 V' ]
    import numpy as np7 _5 O' ], l7 O0 _/ p  @
    import matplotlib.pyplot as plt
    1 s  j  g( `, B* \6 |import random4 S1 t, \6 [8 d; w* c! r. r

    % V" P& ~. n; T  e. yx = torch.tensor(np.arange(1,100,1))3 s6 M4 W$ Z+ C  C
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=151 D( n/ W( H) Y* K' R" \, F. z

    + S$ P- g. u; e% s- ^1 Xw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    ; n% F" f8 y8 S" ?  ^0 M$ qb = torch.tensor(0.,requires_grad=True)
    & |' B7 D0 S4 C) Q  Y2 v- s% }& U4 {* b8 }; @. Q* h0 ]4 A' T
    epochs = 100: V" n2 c7 C4 L, \/ k" @, l
    $ H0 F! S6 o. O+ O3 G* e& q+ [
    losses = []
    , K( `4 A+ h: r* d. L3 L' Hfor i in range(epochs):
    4 I/ }# i$ ?4 p2 t  y_pred = (x*w+b)    # 预测2 A6 G. z% g! N1 P6 B1 {
      y_pred.reshape(-1)
    0 @7 t: E, j  a% |
    , {$ [- j/ ?/ m. O& [. g4 E  loss = torch.square(y_pred - y).mean()   #计算 loss
    9 F% ~  G% {% G8 h" v- r. O0 N1 q# o% I! i  losses.append(loss)9 z. h$ l$ Y1 u" H
      
    % S/ g/ j7 R# b! u% c( e  loss.backward() # autograd
    - F1 Q. B- u5 x- |  with torch.no_grad():
    3 F. z) O4 w$ c: k5 ?# [0 {4 ~    w  -= w.grad*0.0001   # 回归 w$ Q1 @! G$ ]. X! |  I1 d
        b  -= b.grad*0.0001    # 回归 b ) y* X# m, X8 j6 ~3 O% F( |
      w.grad.zero_()  
    ' `, ~1 z2 Y8 L* q. m  b.grad.zero_()
    : ^/ m, Y4 ^% Z5 K
    . w& P  |# ~  ]2 _5 K6 Y! ~print(w.item(),b.item()) #结果8 e( k6 E; N: d' X4 Q5 R
    9 }% a! w0 B9 h4 F- S: J
    Output: 27.26387596130371  0.49745178222656259 K' J: {2 l- v* \* J4 \
    ----------------------------------------------2 f, d* {' |, g6 G. z
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。- m2 |3 b; ?1 {/ `0 ~4 O2 L5 }9 d( G
    高手们帮看看是神马原因?, N% t& c) W6 N* y9 w" O

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    7 [+ u+ J: L5 u! ~  B/ u3 d6 a/ H* s+ @$ @7 N4 W! M
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " `/ ^7 a- s% J; H' p- M; d5 B-------5 P7 k2 c9 i; I7 ~
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    0 ^) r( @4 E  Y" C1 u9 `-------$ o4 a; ~* b; {
    算法诊断部分,建议把循环次数改为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. X7 H5 g& ]& @5 `4 n
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ) @8 _$ W+ f) _: h8 U-------# n. F/ v) @2 a9 P0 g% y! W
    不好意思, ...
    # ]6 ]( w2 K3 s& ~' `  ]$ `- [
    谢谢,算法应该没问题,就是最简单的线性回归。
    5 J8 B0 ^; H: d( W& D& k我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    ' i0 |; W% h  ?) x
    雷达 发表于 2023-2-14 21:52# E; ]- e+ f( x2 K" d
    谢谢,算法应该没问题,就是最简单的线性回归。
    ' s: g0 Z* d8 ~' K我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    ( F" I1 e% r% x8 g2 ^( l6 t0 y8 m$ {  R- q- Y5 j1 T8 b
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。$ P+ c4 B* K- F, w% p2 C, A6 y
    ; B) U" ]9 i0 T( K3 K! x
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 6 y5 J( x) Z, Q- C
    老福 发表于 2023-2-14 22:00+ W/ c: Z- R" q' W. [3 ?" l
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    1 V) B& _/ {1 g+ m4 R% Y( W7 q7 g! b* r
    或者把b但的起点改为1试试。 ...
    5 Y- M& y8 A% g1 d% ~
    ) z" p. ^, ]) `6 z0 X/ J
    你是对的。9 Y- m7 ?" ~+ @" Y
    去掉了随机部分) O# Z5 \! ]7 R- A
    #y = (x*27+15+random.randint(-2,3)).reshape(-1); ?4 Q* W; T* Y
    y = (x*27+15).reshape(-1)& z% c; y9 d& ~# E
    % s4 v% S7 `& r" p$ `1 d
    循环次数加成10倍,就看到 b 收敛了5 w# A3 _( n! r% D: t
    w , b
    ( @# P* F8 }4 x! X" a( {9 g27.002620697021484 14.826167106628418
    9 u# L1 `5 c* F* |0 E' H# [5 ]3 V
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-19 01:31 , Processed in 0.056413 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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