设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 - P  p0 C0 K4 m5 ]8 H; h/ V8 n

    ! @$ w* k4 |( R9 y为预防老年痴呆,时不时学点新东东玩一玩。4 \' q# t+ h) J1 @
    Pytorch 下面的代码做最简单的一元线性回归:# h0 ^7 |# N) ~% {/ R0 K1 l
    ----------------------------------------------/ B0 F9 Q$ d+ o2 t7 K% k
    import torch* j! I0 y$ E- J+ _
    import numpy as np; R' |0 Y% J4 a" T2 `+ d
    import matplotlib.pyplot as plt* N. Z4 {0 E! ~, Y9 k
    import random
    8 U7 S! |  u; i! u  M  c. |% M8 b  y) F7 w2 {& Q
    x = torch.tensor(np.arange(1,100,1))0 r$ I/ S+ V$ B& N
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15- ~4 `( n6 h, y0 K
    0 Q& x3 T3 ?; |0 E0 X
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b8 @. K1 q8 Z! ~; l( a+ i
    b = torch.tensor(0.,requires_grad=True)
    3 I3 E, ]* r2 ]3 e1 e& b" G: X' u5 I# g, _/ Q1 `
    epochs = 100
    3 y8 }6 B9 U3 T. e; u) U0 x7 J% t) P9 L
    losses = []5 y/ Z* u. i; p  x2 T9 O" K
    for i in range(epochs):
    0 ?: }6 n8 d7 T" P/ B& z  y_pred = (x*w+b)    # 预测
    0 g  U- ~4 I* P7 [) _  L  y_pred.reshape(-1); R5 x6 }; U1 l" s- q: M! w
    - P* C2 b( e: e1 K! f$ k- C
      loss = torch.square(y_pred - y).mean()   #计算 loss4 V/ U3 g5 x% I4 A; G% W
      losses.append(loss)0 V- [! C4 Q5 Y0 R9 S: O; j& s
      
    6 j8 r1 @) d+ t3 |5 N" ^  loss.backward() # autograd3 K7 n0 @) }8 `5 ]9 |
      with torch.no_grad():
    4 V& \& X/ F& T; e    w  -= w.grad*0.0001   # 回归 w
    ; e3 Z$ h1 B; x* {" |  `    b  -= b.grad*0.0001    # 回归 b ) a) m/ j: e- t- Z7 V* e' d
      w.grad.zero_()  
    1 L1 Q; S% u; ~; Z& t  b.grad.zero_()
      m2 M5 p7 D# p& r" O! G
    9 g) ]4 i* s% i5 L+ P6 E, v. Y2 s( pprint(w.item(),b.item()) #结果0 `1 j4 d# u" Y) C1 E# s

    ! p& f5 u9 B4 iOutput: 27.26387596130371  0.4974517822265625! N0 J' p+ H* E- @- P
    ----------------------------------------------
    " A, D% r$ U; y! Q最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    / T7 u  i9 U) U' H8 v高手们帮看看是神马原因?
    " I2 g5 W* A+ x

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    * _, _& {  x4 P0 V, o8 H. n% W8 Y6 c' q+ C2 p7 X4 G0 q
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    % l5 V% f3 h: _0 o7 f# x6 v" R' p-------
    4 Y( J& r' u% L  `不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。' T! y5 u& N) L+ N( O
    -------
    9 ~6 c! I0 n' x* b/ X2 P算法诊断部分,建议把循环次数改为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; r) k5 f& }7 L1 R% i0 s
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ! I: p% E5 Y+ n$ ~-------
    ! v3 Q9 k2 Y2 B$ Y2 u不好意思, ...
    5 A% P& a5 t1 x, V3 t& L( S
    谢谢,算法应该没问题,就是最简单的线性回归。9 O+ O7 X/ T* K5 |" ?; W7 r) n
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 * R7 ]$ m; K3 }7 `
    雷达 发表于 2023-2-14 21:52! o. R% x& Q; v& V0 P( Z
    谢谢,算法应该没问题,就是最简单的线性回归。
    ! s( ?4 N: p  C; D+ J我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    / R( @8 G. Q3 a& u3 N- m9 g( E2 i' ^; O+ r3 A- d
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    7 Q+ q1 @. i! B- d( N) ?% }7 e
    : {' u' L# V* I或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    ' t& t$ W0 k# [' K( t
    老福 发表于 2023-2-14 22:00# ^% e( b, Q* G+ x
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。' _& V- I3 C6 W& L% M' u

    8 C) s) ?5 s& K或者把b但的起点改为1试试。 ...

    * C: v5 v6 F, d# _6 \" ?# \- T# |% f; S! L
    你是对的。
    ; P) K  O+ {; ~, V9 c  _去掉了随机部分: v7 ]9 O7 o* h& W8 x8 u- |  d
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)# _/ j7 k3 n, ~8 W
    y = (x*27+15).reshape(-1)
    $ o) y. T; e1 F; {; `7 ]' P: ^9 N* v8 n/ {+ m2 _
    循环次数加成10倍,就看到 b 收敛了$ Y% g- i/ z& n% [9 p
    w , b
    6 a" E; [4 i; y$ Q27.002620697021484 14.826167106628418
    0 x: o- q0 f9 E7 O% F* T! V2 m; _! P, B. g! m0 g
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-2-26 23:46 , Processed in 0.064855 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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