设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 - i* W' Y* c3 Q1 m( o

    - g% P5 z8 b" d, x! v8 |为预防老年痴呆,时不时学点新东东玩一玩。" A0 Q% n/ [3 u+ F7 P
    Pytorch 下面的代码做最简单的一元线性回归:6 u  {0 x' y. Z0 I( W
    ----------------------------------------------
    * ^3 R1 l0 \; y: m( timport torch
    % ]! P- N6 X- H- k8 Uimport numpy as np: F$ a+ l6 W' p2 L2 B/ k
    import matplotlib.pyplot as plt7 l. W6 Y7 ]) p# B3 ]
    import random
    ; L0 J$ V% e0 w7 l6 R  H- \) u: D- B+ S& a; M/ A' c: L" Y5 a' A- D
    x = torch.tensor(np.arange(1,100,1))3 B% L9 w0 l+ K( k8 g8 x' P5 }
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    2 g. f+ a9 ~3 H) b7 P) o0 u# j' {+ X6 ~1 S7 O9 `% }2 P" N. }  i
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b7 e0 }, u4 N0 W% a, ~; ?8 O1 f
    b = torch.tensor(0.,requires_grad=True)
      P$ }0 p) V) i8 S0 E0 P% L' l% v1 Q
    epochs = 100
    ( H  I' j2 X; V. _. d4 S! Q: X4 _$ n2 N4 l
    losses = []
    9 f2 N! I' d0 m- mfor i in range(epochs):- o4 J% `* P" X3 \
      y_pred = (x*w+b)    # 预测4 @+ Y& C' ~2 X% N! i5 ]
      y_pred.reshape(-1)$ c  P1 H+ a6 Y9 U
    $ c& B: z1 [! R% ^
      loss = torch.square(y_pred - y).mean()   #计算 loss
    5 s. o8 U3 K4 o: L$ Z$ h% }' V  losses.append(loss)
    3 r1 p; B8 j) }4 m% {! s  . y5 e0 u. z2 F# O
      loss.backward() # autograd6 e$ n) L. S, S8 K
      with torch.no_grad():% {' f- L" m1 D; r% P
        w  -= w.grad*0.0001   # 回归 w
    ( D0 K0 |$ W4 y5 E! x    b  -= b.grad*0.0001    # 回归 b % T1 M; s. v6 U1 d" L
      w.grad.zero_()  8 q; W$ m8 `# H' M+ \0 b  _2 R- G
      b.grad.zero_()
    $ E4 `" r$ q/ s: \0 s2 Z
    ) _! U; o1 o, ^8 M& k% s% h: Aprint(w.item(),b.item()) #结果
    4 U9 V2 e1 n& I- K! H
    , S- R5 t; E% d0 J' mOutput: 27.26387596130371  0.4974517822265625
    1 Q# S( j; g/ }9 |  a----------------------------------------------/ y. u, X* e2 s/ H) |" q7 `8 k7 v" {2 d
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    + v4 G( Z6 J# @, E6 O, y高手们帮看看是神马原因?
    - t+ X# C: U7 O; @; a6 {

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ! m( m" M# \4 d, `
    ' O. y6 J" B" W# w# V
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?$ u) `' b: I$ c+ m5 E, z
    -------
    7 [# ~4 u, |4 m# ^( c不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。( [8 u, j( v& q/ L
    -------
    : W5 H" T3 S( S# g4 j" E; w算法诊断部分,建议把循环次数改为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
    7 b9 w7 _5 Q  j1 V! O没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ; E2 J7 ~" L0 z# o# n* S+ h-------, }" B0 n0 }( n7 C
    不好意思, ...

    ' ?3 Z6 P: @7 ^6 M谢谢,算法应该没问题,就是最简单的线性回归。( u5 ^9 J/ j3 }. U$ S
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    6 `: H. l" i! g4 j
    雷达 发表于 2023-2-14 21:524 h( ~3 P# \+ i, d  e$ d
    谢谢,算法应该没问题,就是最简单的线性回归。7 s& T- C  i/ {* U, c0 x0 |
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    7 R# A+ W2 G4 H! x' b/ l$ e: z+ x
    " P& j; l, N4 @# R! b
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    # v$ c) l# Q& ]  e! d' e' ~  y* g
    7 V6 L7 [7 }4 c$ R& [8 ~. Q1 X; d或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    ' s* {( X! o2 T( q) ?
    老福 发表于 2023-2-14 22:00
    ! g6 E/ [. q+ c  e) G& r" l刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    0 ^: |2 y8 b' ?7 v8 S
    $ q- N$ B& z3 Q0 s2 X或者把b但的起点改为1试试。 ...

    " U  k% y* R" o/ e, ^+ o% D- A7 X5 J3 f+ C# z: i7 t0 o* a9 {
    你是对的。
    7 T4 g5 T  |9 \' c/ Y去掉了随机部分" F! r, G% n. @2 ?& c$ ]( N$ x
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    . }1 }& V2 a  }$ z4 D' c) m# ]0 Ty = (x*27+15).reshape(-1)
    ) E! k( I$ I- i+ E) i1 n6 t4 f- u& F/ s) c
    循环次数加成10倍,就看到 b 收敛了
    * f3 x7 y: D" t! f- R0 C, hw , b
    3 m3 e/ r8 y9 [& E; F0 x1 U" I" i27.002620697021484 14.8261671066284186 U( W  B/ U/ {4 R( s9 D
    - c, N, n# J$ p  R" y8 T3 k
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-22 13:55 , Processed in 0.029862 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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