设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    1 w: }' [5 Q( d$ c3 Q; J; T; T/ R8 k6 P6 n+ T, h$ n) o- Z
    为预防老年痴呆,时不时学点新东东玩一玩。
    # ^5 y2 @7 G5 {% ~% @9 Q+ V  vPytorch 下面的代码做最简单的一元线性回归:
    # {1 N  |. k* x6 i2 f( ~----------------------------------------------( U' A: w9 B& L/ e2 \
    import torch
    . U5 j! b5 @7 @9 ?6 ^import numpy as np6 y" f" b) h- T! s
    import matplotlib.pyplot as plt
    % @6 F2 N2 c/ V! O" Oimport random/ C  Z" C( N8 S, R- G8 l8 ^

    6 k# Z$ f) Z2 A( x7 _; z& x9 v1 `x = torch.tensor(np.arange(1,100,1))
    1 U# w8 n8 Q0 j5 g/ ~5 @y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15& @% x6 S1 U0 y; [- K; ]

    - q/ d; c/ l/ r: X! |# i: o( h$ Sw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b. Z, J5 l3 r0 w- S$ `3 u+ g7 C& e
    b = torch.tensor(0.,requires_grad=True)8 J* \1 _6 y- H9 g) c, o/ M
    3 r. Z9 B; U7 m' b/ i
    epochs = 100
    ' B0 T( u; x( U4 q8 h. d: p8 E1 t% s! }3 ]! l' W
    losses = []
      g" d$ L" S' q% {$ Wfor i in range(epochs):  J/ h4 V9 f6 T5 X: d8 h9 Y
      y_pred = (x*w+b)    # 预测( g8 S# J* q9 h1 a/ ?5 ^- _
      y_pred.reshape(-1)
    2 D$ N) m) @  a; J
    7 _) E  }7 m; r* q  loss = torch.square(y_pred - y).mean()   #计算 loss
    ; d- y0 ]/ a4 M% ]1 i& P! k  losses.append(loss)& p+ ^1 P) ~& b. F" s, s
      ; m! P; [: A& Y; P
      loss.backward() # autograd
    * [; N4 }9 y* U. N& v  }  with torch.no_grad():! L8 h" O" v: i0 }
        w  -= w.grad*0.0001   # 回归 w
    % s: a& m: Q' Y: Z1 z    b  -= b.grad*0.0001    # 回归 b
    * W! c7 Z" m6 o! P6 t9 H  w.grad.zero_()  9 G. ]7 S" }5 M$ Y6 Z; Z7 `
      b.grad.zero_()1 r" a* R& C, Z5 Y- A4 ~

    " B& D& O# P' @7 h( Vprint(w.item(),b.item()) #结果
    * ?$ U7 j1 Q) V8 w. D
    $ K: J6 `) J2 p  ROutput: 27.26387596130371  0.4974517822265625( p1 @/ x! z" `2 E3 t" W, @1 _
    ----------------------------------------------
    " ?; R- c/ ]0 q! Q# a最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。( \5 o/ ]& w. Q( L: F
    高手们帮看看是神马原因?  c/ }3 n0 X1 x: P) p7 r7 l7 T

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 , H+ {5 G5 D1 `" p  n. _  B- _# t6 c

    3 [2 Q$ h. J$ l, J8 ^$ f没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?& O( p% \/ A( s( T& j$ t
    -------5 |5 V8 U, ~% R2 `' g
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    & c9 u( m; o6 u, k4 @2 b( C1 j-------4 ]5 o5 j0 d* S( E3 q$ h: ]& m: ?9 O
    算法诊断部分,建议把循环次数改为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
    " v" w* j  F# V* ]没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    0 a' H3 A; l8 i: i-------
    + J4 m/ ?' W2 N" B不好意思, ...

    , j; l; ?  }" V% n3 k谢谢,算法应该没问题,就是最简单的线性回归。2 W7 G- u  g8 x; z' y+ ]
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    7 m7 o# @) w  {; n& ?- p$ Z
    雷达 发表于 2023-2-14 21:52/ d% k( r0 M/ d, g
    谢谢,算法应该没问题,就是最简单的线性回归。8 ^. g3 r: E8 m+ X5 f5 ]
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    7 Q2 E6 k$ Q1 R% m
    . i) ?  s5 H" [& D& U
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。, R. g! _3 `( h/ p
    " j3 L# \, P; r3 K; G& v
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 , c5 ^8 B9 x: c+ [; ?
    老福 发表于 2023-2-14 22:00
    ' x" v7 j1 M' q) u$ a  t4 U& X刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。7 `! |  s( s" h
    9 P. M6 R9 @. C. Y  x
    或者把b但的起点改为1试试。 ...

    5 }" B8 {) d2 q* ~3 C& v* E- Q- Y8 s* k
    你是对的。2 A. j7 y' Z* k3 ~+ {
    去掉了随机部分
    $ F5 F8 q+ D6 N  ]#y = (x*27+15+random.randint(-2,3)).reshape(-1)3 F' E7 w& X2 d9 z( @3 D6 F
    y = (x*27+15).reshape(-1)2 _+ E* f" t6 U" O% _- B, R
      h, e9 d4 P: O: m9 P0 g
    循环次数加成10倍,就看到 b 收敛了& I: {' I9 l3 k" u* U! x. H$ {
    w , b
    , L/ d" g& Y+ @. F' E: V* n27.002620697021484 14.826167106628418
    , ^3 P6 `" m5 g9 |
    * o: }; e$ h  P0 V/ E4 B3 T! ?0 d和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-13 02:22 , Processed in 0.058283 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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