设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    $ m% @' w3 `. K; K7 N( s  q* X% Q& w/ r5 x/ }9 j3 I
    为预防老年痴呆,时不时学点新东东玩一玩。
    % N' d  N. U2 n( N+ I& y# VPytorch 下面的代码做最简单的一元线性回归:
    . F! A2 b% f  g. m----------------------------------------------/ p8 @9 m) W% t
    import torch
    9 x' f" y' E0 x* X( s, J- j6 \7 bimport numpy as np8 d( u$ N8 i( @9 Z& ~4 |; Z: P  B0 J
    import matplotlib.pyplot as plt; X3 T" _% M: h9 `1 n$ y  J
    import random
    8 w6 W- v0 f/ E/ H3 @* s* E
    3 t5 J2 [" q' ~& S1 ^7 ]: Fx = torch.tensor(np.arange(1,100,1))6 w, r% g1 X( G  _
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15/ |8 ]8 A; B# J0 u% Y4 Z

    9 ~, M& C% R# q1 F+ Uw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    / W$ r5 R2 c- M' @" Xb = torch.tensor(0.,requires_grad=True)1 z; Y3 J1 O9 Z: Y8 v

    4 C& q" L) H$ s0 x' Z- O" Kepochs = 100
    . @- J+ n/ c% v. t/ J. ^, b; \* k0 E( k  p: n& d) ?
    losses = []. U. T! {9 ?& Q$ H2 Z7 O7 G- _3 G) W
    for i in range(epochs):
    6 l  u0 t7 @5 {  r% j  y_pred = (x*w+b)    # 预测7 E+ k9 C& W/ o5 r" ^8 Y
      y_pred.reshape(-1)
    ' K* q# H0 R# A* m0 u
    ! O# d0 Z9 Y/ J9 |" v8 [0 k. y; x; n) z  loss = torch.square(y_pred - y).mean()   #计算 loss
    1 E: h( E- R% [0 [, u, J  losses.append(loss)
    , M8 X1 U/ t: O0 K  9 }; N8 b  `  _0 e  R9 ^
      loss.backward() # autograd& Y' H; F- ~2 X/ t3 L
      with torch.no_grad():% V! T6 t( w3 [& D
        w  -= w.grad*0.0001   # 回归 w
    / P8 a8 h7 y& R0 ?, _+ G    b  -= b.grad*0.0001    # 回归 b
    4 {6 |# ~, y2 T' \/ p  w.grad.zero_()  $ u0 [7 C5 {/ h0 ^. ]- R
      b.grad.zero_()
    * S: o  D: v+ g& K+ m
    7 ~+ ~% z8 k) rprint(w.item(),b.item()) #结果  i1 V! _" U* ~+ }2 T

    0 Z, P  R& _$ r! ?- p4 mOutput: 27.26387596130371  0.4974517822265625
      G  v4 Z4 E/ B" S----------------------------------------------
    ) c- h0 o& w$ x4 G" D最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    , Q/ ?) _( V' _, `% g, {7 g* ~( D, u高手们帮看看是神马原因?
    . Q' T. Q  ^4 O4 Z7 A" Z1 a

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ! N, }8 r; c5 g( S8 _
    ' `/ k' x! C& _& B1 @/ k
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    % F5 X+ L/ f6 W; ~4 w& k-------
    ( B4 ]) i" d2 }! P! L5 }不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    2 W- a* ~/ B  V4 b: t9 Q2 d- @1 ]-------6 D+ h) e5 S. p4 p' h! i
    算法诊断部分,建议把循环次数改为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
    / G% v# _& U1 j6 |; x没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    2 o) Y% u" ?8 K1 o3 W& B6 }-------
    $ h7 _( H- w+ t! V  Q5 V3 ~2 b不好意思, ...

    : ?8 l6 e3 j% B4 z- G谢谢,算法应该没问题,就是最简单的线性回归。
    * W6 i4 Z# x( o3 F0 D2 H& f我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    $ J1 @% G0 m1 k- i
    雷达 发表于 2023-2-14 21:528 f8 e" }2 }! x4 A/ C4 n
    谢谢,算法应该没问题,就是最简单的线性回归。. \! U! ~6 ^% Z" }  |
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    4 b. d* |1 Y) |% {& u
      e; W/ W8 B" q  g3 R" ?0 r+ ~刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    5 J8 K9 z0 P3 W; ~! z/ f) x7 F
    1 c4 K! s( L; \  C6 P- M- O: s或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 9 J3 v. o3 P7 r$ R/ _
    老福 发表于 2023-2-14 22:00
    3 f, ^5 T5 h6 I刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    0 j" K: s6 h  o" U8 I* p
    - P* L$ K+ f5 L. W' c6 ~7 v  b; {7 }或者把b但的起点改为1试试。 ...

    / ]& W; B( b; a
    1 b) Y8 v% l3 Z. w) G5 n你是对的。- Y4 `, n) L5 i% ^
    去掉了随机部分1 A% k# C' w  Z8 e% u
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    4 k/ @2 R" i" w' h9 I4 Hy = (x*27+15).reshape(-1)
    3 [# e  Q+ X0 a" f) N4 g, a8 M( H) t' o
    循环次数加成10倍,就看到 b 收敛了7 T- m- {8 M" q# s8 ^% ^) H
    w , b
    8 ]" S. _- ^5 U1 ?) h27.002620697021484 14.826167106628418
    3 g( d% Z( s: v6 S; s4 L$ `
    / l/ t5 {& R0 k' ^3 N, M3 k; W4 h. W和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

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

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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