设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 + D, ]5 M) _, v8 M9 R

    % p. ^1 y( q5 e' i' S: \为预防老年痴呆,时不时学点新东东玩一玩。0 f/ R0 f4 }5 X: q& i
    Pytorch 下面的代码做最简单的一元线性回归:
    % `+ E5 S( C' o----------------------------------------------7 @& |" z1 J* e/ n0 ]- @
    import torch$ Z! |" K% y9 m4 q
    import numpy as np
    8 G$ p+ y2 @$ p  d) L' qimport matplotlib.pyplot as plt
    3 l  X5 G* }; E/ {$ ?+ Q; v2 `import random& i" a- j3 y; o! H1 `5 X

    5 E4 W' C7 g/ W+ W0 ~1 V8 |x = torch.tensor(np.arange(1,100,1))
    2 U- F# _& l  j( B: q9 |$ A5 E; C& s) Iy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    ! i. d" z/ D% I5 b5 i/ u) ]% H1 G3 U7 d9 }9 Q0 i2 i
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    . t: u7 V, T+ `& _* Ob = torch.tensor(0.,requires_grad=True)
    ! E4 r) f2 \6 ]3 ]4 u4 S/ I8 S. `# k7 F  c3 j3 Z
    epochs = 100
    . g/ {& m: ?1 f" w" {1 a7 i5 Q) c& e* F! ]- _
    losses = []
    1 |: C) i! s" }for i in range(epochs):
    $ k/ p/ n7 |. q( Y$ k  y_pred = (x*w+b)    # 预测
    + G  X( g3 o- Y  y_pred.reshape(-1)7 o4 @3 j5 M) V. u( Q

    ' _" i: P! u: t, C  x. D  loss = torch.square(y_pred - y).mean()   #计算 loss: w9 [2 m- Z8 w* `2 C3 i6 a6 p
      losses.append(loss)
    2 u0 d5 t! N( M' X4 ^# S    O/ h5 t$ q. v- [9 w  e' |2 ^) M+ P" q
      loss.backward() # autograd# x# o$ o  d. L7 {% W# L
      with torch.no_grad():
    6 r: e4 [- R% b7 y    w  -= w.grad*0.0001   # 回归 w. Y+ @' u$ i( {* ?/ {9 M
        b  -= b.grad*0.0001    # 回归 b
    4 e; _; v4 I1 U9 B- i% i  w.grad.zero_()  : [2 L0 A. e+ @: p1 s
      b.grad.zero_()7 l# h8 g  Y# s# T$ S6 V9 k

    # j% R" w; l4 A' R6 ?, \# W" }print(w.item(),b.item()) #结果: M; v" f5 @8 B( d( `6 c4 z

    ' z) s' K6 B$ g( ]Output: 27.26387596130371  0.4974517822265625
    3 l/ R  X% Y7 [2 e7 O) y----------------------------------------------
    / l1 A' {1 s' R# k最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。" W4 g  m# V0 E
    高手们帮看看是神马原因?
    : I0 V  J) I% w# ]6 P# Q

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    ( s4 t/ J4 M# T8 z+ f" p: ~: _( y* o- c8 Y
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?2 E% h% H& S9 @" \4 C$ r( c- u$ k
    -------2 k9 t, Z# V3 z4 {4 [. s
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    ) X' I) g# K9 j( k& W  S-------( J  V6 S9 R! b/ e6 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
    2 }; ]& m1 b. ?' H7 L没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    5 c. f' P; ~6 d7 K* f-------! j; w- t( F8 \. {. a* Y( s, Y6 W
    不好意思, ...
    6 j# ~3 R3 T( j4 r% A" B$ {
    谢谢,算法应该没问题,就是最简单的线性回归。
    8 L+ N5 w! p8 x5 e2 M8 @: F; r我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    ; M" N) M4 F. Z/ t% p
    雷达 发表于 2023-2-14 21:52
    7 l8 k/ ?' U1 U% R谢谢,算法应该没问题,就是最简单的线性回归。
    " F" \0 k8 E9 E0 q3 ]5 V6 e, N我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    1 L' J5 j1 K( x4 \
    + @1 s/ u9 p, m; u. {
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。$ }+ k; H8 G+ d
    & a" S, A" d( Z, Q( _5 e
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 ' l6 z# M# g$ t- [' M7 j1 n
    老福 发表于 2023-2-14 22:00! F( ^- A- y3 R5 W, M5 \+ I' L1 f  \
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    1 ^6 @" Y: b" A& |3 H/ ^7 r" ]4 r1 ]6 k& x8 `
    或者把b但的起点改为1试试。 ...
    - @. ?, B1 h; g7 N0 f& y
    ! Y* d  C( ?( j( V
    你是对的。9 v3 R6 y0 ^" |$ i6 l% \5 @! m0 }
    去掉了随机部分
    / Z8 x' A2 o9 I) B' M#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ! M  A) Q$ r+ `+ J. H, iy = (x*27+15).reshape(-1)
    : b6 `' u9 q$ ?7 k. f" ^2 j6 Z+ l; d1 O8 |+ G
    循环次数加成10倍,就看到 b 收敛了5 w1 Z0 w3 V# _5 [1 S" }3 f+ s: I; Z9 y6 q
    w , b. B1 e3 O, v/ K" t+ v6 m( p" F
    27.002620697021484 14.826167106628418- X% M% w3 q6 H1 c3 N6 e5 k- u

      v/ F- E% ~' [# Z+ g和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-14 00:56 , Processed in 0.064157 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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