设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 ! J* g' o' S% t) Z
    7 f2 J% m% q  f, U- Y/ {7 @3 e
    为预防老年痴呆,时不时学点新东东玩一玩。
    # ?( e  h0 t  w( e( \* M5 E+ |Pytorch 下面的代码做最简单的一元线性回归:% i5 Y# |4 z# M" A; g
    ----------------------------------------------8 e6 d; r: j; s
    import torch1 r1 T' z% U+ V6 ^  M* F3 |0 g+ k( \. p
    import numpy as np% c# O9 f+ s/ y& u
    import matplotlib.pyplot as plt
    " F/ Q1 x% S4 _) n5 oimport random3 w1 U* q* j0 D$ V
    $ b8 J0 ?+ t8 _7 g7 j8 ?
    x = torch.tensor(np.arange(1,100,1))
    $ `& h; ^1 k, d- g. V& m( Gy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15, p$ v2 w, P8 R' m6 B' K
    " G  l5 @" {2 c, P9 Y  I, x
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b$ b: W: B% X. h- L/ B/ e2 j3 z
    b = torch.tensor(0.,requires_grad=True)1 S6 r/ S% K, R( P
    ; o( A5 k# B. @
    epochs = 100
    5 [. j/ ]7 r  b0 a
    8 W; }4 V( \- Blosses = []
    3 o1 W8 c2 \; E0 t' V+ ^5 cfor i in range(epochs):
    * Y, q( I; |% a5 G5 [- n9 U, o, o  y_pred = (x*w+b)    # 预测
    ' v; ]- x. z8 z3 x1 `$ G  y_pred.reshape(-1)5 n' A4 i7 @9 Y! ^

    4 a9 y; e; l) P& c  loss = torch.square(y_pred - y).mean()   #计算 loss
    7 F# @1 _  Q' d# D; I, w  losses.append(loss)8 f( @) J) s' A, O* T; _
      
    4 u; Z2 ]$ v0 u+ P  loss.backward() # autograd! @7 }1 |* }4 O) \' x7 X9 [
      with torch.no_grad():
    ! g. e& ]) [( d    w  -= w.grad*0.0001   # 回归 w$ u' }) S% V0 ]  I2 P1 {  d8 ~
        b  -= b.grad*0.0001    # 回归 b
    ; s& ~" _6 J/ z1 p  w.grad.zero_()  ) ?; S4 J. @$ k7 o7 w! G
      b.grad.zero_()
    $ u7 N( K8 n4 t* y  u: w: j7 c
    $ K3 R1 z6 M; tprint(w.item(),b.item()) #结果3 l9 Y6 u2 |. a* c
    & X, K* u, S( i- V6 H! |) x
    Output: 27.26387596130371  0.4974517822265625
    ; g0 e  G2 e/ b3 [9 P4 ~5 U----------------------------------------------
    ) Y4 G& w! i3 n0 \最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    1 @: C) f: R: C; d高手们帮看看是神马原因?! X3 ^% N: R% I( O/ b8 j+ J0 z/ P* _' L

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 0 |, Q9 K; n6 a1 e8 b$ a
    ( B0 J: k2 K" o5 i
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?5 A$ [, s# l$ R2 s: j
    -------
    6 h4 S$ R0 `0 f$ E' y! {9 V8 U6 S  ^不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。' P. u" y' e+ H$ b9 R% R4 k; m
    -------
    0 S5 `) t0 Z6 |! i0 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. M+ G5 {- `' m( k( [: M
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    9 K0 f8 H( |7 z( E; _# y-------# ]" O1 b: |" h& W8 G# `
    不好意思, ...

    - K. n' K6 d: ~. W+ @谢谢,算法应该没问题,就是最简单的线性回归。
    # f; i, g( V4 [1 i7 n我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    ! M( w! c4 o$ Z! i
    雷达 发表于 2023-2-14 21:52
    , |! j$ X% E' O5 I谢谢,算法应该没问题,就是最简单的线性回归。8 N1 E* N8 l1 ~4 U8 ^" [) u* a
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    # @3 A5 [" v0 h; H. H
    $ R- k; x: j- ^; W& A% ^刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。; n% N5 h  E1 M: E7 w

    ' S- j  @! i9 z, w0 _或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑   k) L1 F: j+ i4 g9 f; u
    老福 发表于 2023-2-14 22:00: f$ V6 J- ~, n: F* |
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    7 s  Z8 \6 w9 i, [1 G! I; i0 ~* L1 m& q3 N( u% ]
    或者把b但的起点改为1试试。 ...

    3 m3 K# m( m5 k
    6 o& F( O, z& o2 D9 Z3 e- q你是对的。# Q3 J, P" A% j5 \" N9 P5 z
    去掉了随机部分' x1 r. s! _2 K( x! }6 ^0 |
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)' L4 D4 a2 _% j- F
    y = (x*27+15).reshape(-1)) N3 H5 C+ N, D

    + ?$ }6 e! Y! O1 D- S0 ~循环次数加成10倍,就看到 b 收敛了
      A6 Q/ X3 u* b! Uw , b4 k# Q* U8 ^9 f% T5 ~/ `0 ~
    27.002620697021484 14.826167106628418; b  }- X- I( ]

    8 Z' @5 p+ m& a) W" k和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-21 01:53 , Processed in 0.058269 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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