设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    , J+ v9 m/ R0 h0 z$ h: Y# `# e% g& P+ U" K' U% F6 R3 q
    为预防老年痴呆,时不时学点新东东玩一玩。
    - Q& m) `. h+ H+ u+ i1 Z$ S  EPytorch 下面的代码做最简单的一元线性回归:
    8 d3 I. Z% o; s3 ^& f8 Z7 e----------------------------------------------3 ^5 E, }! d9 `4 d0 G2 C
    import torch# k6 Y1 g( b3 k) b+ `% T( i
    import numpy as np* m! `3 j- Y0 T( h, ?4 D5 _( P
    import matplotlib.pyplot as plt
    9 Q( J" P2 ^5 Wimport random3 A8 ^# {; C6 B; p. k

    % e! s* B2 ]3 ?; cx = torch.tensor(np.arange(1,100,1))- N$ e+ Z% G: O+ i2 ^: Q
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15: x$ p. o* d- k" y: \) z5 H
    $ x0 O# r0 X" T! I1 B( {7 K5 U
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    . w2 m' @0 o2 Y, bb = torch.tensor(0.,requires_grad=True)
    * C* |' m7 r/ H. N7 C/ O$ W/ x' ~) d2 R8 p
    epochs = 100! a$ ~5 g" f1 k: c; r
    / h+ w& f3 ?) s- t* T/ i8 K, u! H1 g, N
    losses = []
    1 J. y4 Q; W4 ffor i in range(epochs):4 C8 W% J7 K6 z' e5 K" M- Q
      y_pred = (x*w+b)    # 预测
    8 U6 r! F* i6 K9 e7 T' {$ t" G1 y  y_pred.reshape(-1)6 ]& z* v1 \, x
    # L9 K: K) o1 c" v6 I8 D5 e
      loss = torch.square(y_pred - y).mean()   #计算 loss
    2 A: `: Y; y: ~1 h% ]% b  losses.append(loss)
    - g8 ~  z" |0 a5 ~% v+ d# W1 _  
    ) q! C' j0 }, }9 q6 e% A% k: V" Q  loss.backward() # autograd- {' e3 j  |+ E+ P8 |
      with torch.no_grad():; @5 h7 v9 m, b6 y' W4 W6 B$ g
        w  -= w.grad*0.0001   # 回归 w
    $ p2 i: v; I# j    b  -= b.grad*0.0001    # 回归 b
    . Q* \0 L" Y2 V8 i0 x9 q/ W  w.grad.zero_()  
    6 C, S, `+ s' p' b3 |  b.grad.zero_()
    2 R- T$ u0 e8 K% `8 Q3 b. x: o  ^9 d* E1 E: i; M
    print(w.item(),b.item()) #结果
    ; I5 b1 }2 }+ L' b. S, H6 q& r2 j, O+ f' r0 X
    Output: 27.26387596130371  0.4974517822265625
    ) P/ s6 x! @/ t0 m6 f; q& @----------------------------------------------/ E3 L/ }% ^7 i# P2 {" J
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    ' U) Z; \1 x" h+ o  o; k4 ^高手们帮看看是神马原因?
    % ^6 i! e9 X$ y6 s+ a

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    ' Q9 _6 B* _$ \- @! ~6 G; z3 z, E; t$ I
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " P3 L; ~- R" e& q4 J; I6 E-------# }4 E& B# P9 E2 L
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    7 l2 h3 B$ N  q6 F* ?" W- I-------
    0 e3 M. c; C3 G5 v  Y0 Z算法诊断部分,建议把循环次数改为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
    & \+ R3 E! V) f" }9 m' n没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?& `) H" m+ \. S! U) l$ @' \1 d4 x
    -------
    ! i6 z" u6 X% k, {( Z1 O不好意思, ...
    # F" T$ U* z4 c' K2 F
    谢谢,算法应该没问题,就是最简单的线性回归。  {: H& ^( a4 d$ L& \% |3 E; G, s
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    " A0 r- F$ b' _4 n
    雷达 发表于 2023-2-14 21:52. l1 \7 q( |8 o# u+ s. X
    谢谢,算法应该没问题,就是最简单的线性回归。' f( e' E9 L0 Y  `8 r4 {
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    ; a1 |7 ~  u5 C
    - @$ c8 s2 g9 W7 Y0 H" d! a
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    9 P' f6 c, t& |0 w3 U& N% M7 p) d/ e" q% 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 V$ u2 _2 P) c% |2 o) j& K
    老福 发表于 2023-2-14 22:00" {3 C1 L% v- |: N
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。3 `6 Z1 m; `5 e; D! N& V. ~
    % Z, q9 [# J+ {6 J1 j: F0 _. F3 O9 e
    或者把b但的起点改为1试试。 ...
    4 D+ l3 T) s8 r& g  z2 S. {6 g
    8 }- p% K/ E! }/ v5 A0 O7 R* V3 m) U
    你是对的。' i+ c4 F: R$ n8 Z$ o$ z9 W9 l
    去掉了随机部分' s2 ]. A, n% p; j& d) T+ i( Y% n+ V
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)3 l% A: I  A( o  @. l
    y = (x*27+15).reshape(-1)0 ~1 s: ?7 f: {; A4 U
    9 D3 F1 T- R' t) X$ W! k6 P# B; w; O
    循环次数加成10倍,就看到 b 收敛了
    " K* c' T0 \1 Mw , b/ d% {# @8 s# d2 C$ g
    27.002620697021484 14.826167106628418
    4 N# O0 o1 Y, B: v6 j0 O
    9 I* n6 M  a, E% F: @0 `. L和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-12-25 20:00 , Processed in 0.029052 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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