设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 & Y- G5 {/ i( O
    6 j' [: _' W8 a3 H( i3 P& U/ p% D
    为预防老年痴呆,时不时学点新东东玩一玩。
    ) U4 ]7 `6 m6 xPytorch 下面的代码做最简单的一元线性回归:
    & u' e1 R2 \  s. c/ J3 m----------------------------------------------4 `2 T4 }) Z& n8 h
    import torch1 x8 K; J" o. a5 Q$ z0 j. s
    import numpy as np1 f" M. y0 U1 t6 n% C
    import matplotlib.pyplot as plt! B% k/ v9 N9 j6 K9 o8 H% j7 W5 o
    import random  h. a# c* R! f

    ! k/ G8 P% ~  G+ ^, V8 k  rx = torch.tensor(np.arange(1,100,1))" i  {3 Z1 \* S7 A) W1 p1 o
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=159 E% @: I0 R. |$ Q$ U4 E

    2 v. _. I$ y9 c6 yw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b1 }1 q* E2 h# P% @
    b = torch.tensor(0.,requires_grad=True)
    2 ^% u, g4 T, D4 i4 |
    : r9 d5 n6 c9 M  a  Uepochs = 100# u  y: c5 y/ p! A% d$ P
    ) h% |1 G- q& N  C
    losses = []" S9 B* |% g. ?2 F% G
    for i in range(epochs):
    * [% \, ~7 t# [- ]: s. {  e  y_pred = (x*w+b)    # 预测
    8 N) A+ o% U4 W! `) z1 V( }  y_pred.reshape(-1)
    / y  B0 E6 y& q" l* O- R$ ~7 E0 i
    3 d1 Q- ]( q! R& V  loss = torch.square(y_pred - y).mean()   #计算 loss  q# q8 q4 p4 F7 h+ A; h$ D' y
      losses.append(loss)! e; h. C1 b% _) z2 N
      
    % \+ F$ z; p" s6 A: h% `& v  loss.backward() # autograd
    $ k! N' @' p/ G! U6 ?  with torch.no_grad():  x/ ^0 F% n: n+ {3 k5 d
        w  -= w.grad*0.0001   # 回归 w( \' C& B9 q& c: ?
        b  -= b.grad*0.0001    # 回归 b
    2 o+ B5 j  \0 ~- m  w.grad.zero_()  # h0 q5 `4 J/ v8 J2 n% o
      b.grad.zero_()" d! d& o* Q& V, \! i# \
    0 G1 d5 \7 A# e4 y) i7 T
    print(w.item(),b.item()) #结果% k. {: {- C" w; k# l# Z
    2 s' N+ `, j7 ~; H& a- a+ R5 g
    Output: 27.26387596130371  0.4974517822265625
    6 e, A; i( x& d( s----------------------------------------------
    " l! L% e# F: r) Z2 @最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。! `* p' Z* h) ?' S, l. |3 m
    高手们帮看看是神马原因?  Y, j% n8 Z% f6 }- [- v

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 + w7 J' \8 q2 @

    + s  F" A0 V6 O' _% |没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    4 g2 J" T% J2 f2 J9 @1 `-------
    ; b3 I3 j: s; z) e- Z' M不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。  R* S5 c; J$ ~, C9 Y# g2 W
    -------+ @6 i0 J8 T6 s& S' j9 ]
    算法诊断部分,建议把循环次数改为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:235 i7 f5 F( k; z4 z; ^
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " M+ ~6 H$ O5 {5 a7 `-------
    " H( V, c- n5 t. w' z$ `不好意思, ...

    ' R$ c+ h: {) c- a谢谢,算法应该没问题,就是最简单的线性回归。8 _6 y" A6 U. b  X# ~" j$ a, Q
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
      J" U; }- u( G
    雷达 发表于 2023-2-14 21:52( @9 J$ a4 |* _2 Y' r  w/ z" q
    谢谢,算法应该没问题,就是最简单的线性回归。
    . R" k0 {9 b/ t' N) `: z& F& P7 A: W我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    9 V. @+ Z+ E1 m% m3 Y
    / \7 T& M( [/ I2 }
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ! Q* {% u- x, r  T; q. ]1 E+ M6 q; |
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    3 u' |, J. ^/ k0 s( s, L( P
    老福 发表于 2023-2-14 22:00! y5 j9 c. S6 r# t; Z6 k
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    $ h( i0 A  d, }9 M, s/ \' Z
    2 ^" X3 E& @6 W) }: m  K或者把b但的起点改为1试试。 ...

    ! w' V# z; ~/ c% s: P. i5 A+ l& ?' t* I; |- H/ i
    你是对的。
      c$ e' x" V# x去掉了随机部分
    8 U3 Z4 q0 b3 [8 ~/ x# ^1 M#y = (x*27+15+random.randint(-2,3)).reshape(-1)1 p: l3 B2 S  J5 \
    y = (x*27+15).reshape(-1)
    & F. B# J9 p: D( j! @7 [' n8 _$ P
    ' @9 D0 C& b; i6 ]. Y循环次数加成10倍,就看到 b 收敛了
    & S- Y6 E7 p+ I0 s) ~; Z, U1 iw , b+ {. u; s) v1 d
    27.002620697021484 14.826167106628418
    ' o9 z* [: K3 i  W8 n) K- K7 V% ^& R6 `* ]# {
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-27 14:13 , Processed in 0.084919 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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