设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 . a5 h: e3 p/ u8 t; R; q1 F- @2 f

    / h7 O4 q- ]# L# K为预防老年痴呆,时不时学点新东东玩一玩。
    " [' J" k9 T6 U2 ]8 wPytorch 下面的代码做最简单的一元线性回归:6 M, M9 ?& |' P" K
    ----------------------------------------------
    + W: \+ k; N" B9 nimport torch
    , c8 {4 J: s) gimport numpy as np
    - k+ G) G* ^4 S3 f; L& N; pimport matplotlib.pyplot as plt: y, w/ L" L% p& L5 B
    import random
    % H5 ?. n  h: x3 h, J( x9 ?% R# M* j# ]5 B1 \" Z0 B% X, f6 j$ @
    x = torch.tensor(np.arange(1,100,1))+ g  P' ?3 F/ D$ b( J: e1 i+ I% Y
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    + H3 Y5 [( G  P! ?" S6 O, p  v9 A( L! \0 H5 b8 o/ C$ c$ ~
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    ) M/ N2 a" r, Rb = torch.tensor(0.,requires_grad=True): p6 i8 a" t. P9 b

    . _7 {6 }) h& K% y1 {4 Y; X. X- }epochs = 100
    . j4 x. x7 B8 b6 r: k$ M1 E' w) {5 H9 c! ~* L" ^" q: U
    losses = []  `: c$ W5 l9 F' t! i7 @
    for i in range(epochs):
    6 z3 x9 j; P' r% h  y_pred = (x*w+b)    # 预测
    , e5 Y$ U/ r# x) k8 d1 ~- r2 p  y_pred.reshape(-1)
    # w+ U$ \0 m5 ^- v
    ! z& Q" k! G3 c' W  loss = torch.square(y_pred - y).mean()   #计算 loss% _1 z! L. t( q! s
      losses.append(loss)
    7 E7 j% T( k/ p8 T7 ~2 ]! Y7 j  
    9 `% T7 S9 Y* S/ O  I, W" o- `  loss.backward() # autograd
    & n: |4 j' p; E  L, U' S  Q  with torch.no_grad():
    / m: T; n/ C' o$ x2 h- o    w  -= w.grad*0.0001   # 回归 w
    2 J1 i; J0 G5 C    b  -= b.grad*0.0001    # 回归 b
    . l: j5 z# B+ l. h) w6 q  w.grad.zero_()  . U' G" u  r( d" ?. i$ X' k
      b.grad.zero_()  L" E& e2 p7 P- ]
    3 F& G7 o; B0 q+ p2 A
    print(w.item(),b.item()) #结果
    / k+ z0 V  d- f, t7 o" r; G" g' j7 Q4 f$ a! A
    Output: 27.26387596130371  0.4974517822265625( e7 G" T: A( n8 Z1 l$ {' q6 E) P1 ?
    ----------------------------------------------" J# g2 w; \- Y8 H" E
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    4 [% R1 `+ y4 T1 G, @8 ]/ n高手们帮看看是神马原因?
    ! Q3 @7 E/ a. I

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 6 B* \8 l/ M! a* j) z$ E# Z  ~

    . l* c2 Y& H% ~没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ; Z: {2 D; o  ?-------+ q2 `4 h, P6 u% X' @
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    6 ?; U& B$ f9 ~5 p; K% \-------" K: V+ I% Q* ?/ @) s, |
    算法诊断部分,建议把循环次数改为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
    * a& U' Z* |: D" h) ^5 q, [没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    5 J  J9 X0 }2 v$ e0 }5 I-------
    ) n4 }; I$ p7 a/ }$ x不好意思, ...

    0 ^5 W  G9 W; l$ G- {3 D( b谢谢,算法应该没问题,就是最简单的线性回归。5 I0 w$ l% h7 ?, M; _: |
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 5 `% d- `! N( q! s# B
    雷达 发表于 2023-2-14 21:52
    0 I$ X! W$ ~$ a! b9 a谢谢,算法应该没问题,就是最简单的线性回归。, z" I5 e0 f8 L7 [
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    ! `1 I+ U; s  q* H# G5 W" A; `6 B. U/ U+ E% G6 y, C
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    $ j1 [0 J6 a) M4 r- y7 ~5 _: x; |) b+ r. m- p2 x" I2 L
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 " P/ m' U0 O, S, V+ @
    老福 发表于 2023-2-14 22:00# C1 Q9 J- P; b( o
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    / f" W7 o, j* u
    9 d6 b" K6 B2 a或者把b但的起点改为1试试。 ...
    . |% R7 Y- ~4 R5 c, p. Z$ x4 Z. l

    % O3 n; T- g: v. i" f* i8 _7 `你是对的。  b# ~* s# e- ~4 n6 }5 v* q! C
    去掉了随机部分
    2 L6 l; V7 ?# _. i: N, R# x( g#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    / Y2 w6 B" |& g) @$ Ay = (x*27+15).reshape(-1)( l1 d% l( O$ c+ A

    2 Z' s" D5 F% G$ s4 }循环次数加成10倍,就看到 b 收敛了
    + \1 ?* l$ [7 d) R3 [w , b0 ^' O, c: s" g! j% i
    27.002620697021484 14.826167106628418
    ) k% m7 l& q& \5 C4 Q8 L4 d# N: u7 _8 V! a% J* q: S5 u
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-13 14:12 , Processed in 0.056299 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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