设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 . l8 ~# ^3 e: l  R$ C/ v
    - b8 ]5 o/ W' W
    为预防老年痴呆,时不时学点新东东玩一玩。- I2 d' w; D4 k. m/ q
    Pytorch 下面的代码做最简单的一元线性回归:
    + d, w/ v- F2 Q# U2 s, K# m----------------------------------------------! y" w) r- L. d! ^1 s
    import torch
    6 M# B. M; y3 t: F% J* e7 Yimport numpy as np
    ) v5 |) n" I$ z" Q9 Qimport matplotlib.pyplot as plt0 e5 |, U* b! n' O5 C5 ~& T6 I; V3 [' \
    import random# y' W1 b  B" L5 C+ S' ]1 @1 h+ R0 P' F

    " j) e* Y. M# A! q' U! e0 ~x = torch.tensor(np.arange(1,100,1))) {; u6 Z2 f7 R  w# G
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    7 f' Q$ x: N$ @' i5 E+ X, w5 W3 K& n" S0 V7 f* L; x
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b( E9 x7 e& D! ^
    b = torch.tensor(0.,requires_grad=True)
    " X+ |( d7 B. T! P8 S6 R0 A/ d& G( P# p* M
    epochs = 100
    ; ?: x: B; J' ~
    - i% u7 m/ U6 x8 v2 h% B, ?losses = []
    / g$ O7 E) [7 }" D* ~for i in range(epochs):) |6 |; ~. E* p$ H" |4 i
      y_pred = (x*w+b)    # 预测+ a7 l+ _8 ^7 {% \! M% y
      y_pred.reshape(-1)' }0 u+ g9 B5 y( k  r" R0 N+ b* a2 w! B
    6 N! e1 Z6 ]# q( n3 H* n( `$ l
      loss = torch.square(y_pred - y).mean()   #计算 loss8 }4 k8 ~% u! J' M$ `6 b
      losses.append(loss)
    6 v9 |$ V+ K$ N# X9 L  
    ; q0 F- K" g% Y7 _8 b$ k! S  loss.backward() # autograd" s! _) T# q( {- L
      with torch.no_grad():
    ' G8 e% _9 h# G* u1 s    w  -= w.grad*0.0001   # 回归 w$ Z/ T2 K% L, C' ^. X8 L
        b  -= b.grad*0.0001    # 回归 b $ ]! j. |+ b% h& ?( Q
      w.grad.zero_()  
    , z% K$ z7 K; h1 \) p( l+ T/ R  b.grad.zero_()1 T& ^) @9 Q) o! z' L: k$ W" B
    5 |1 e) p% J$ x9 Z! m7 ?
    print(w.item(),b.item()) #结果4 S5 n% A2 m0 k
      |2 V! H# N5 s" h
    Output: 27.26387596130371  0.4974517822265625
    % {9 L+ v% n" |3 W: B$ P! b) `----------------------------------------------
    : R% X0 g5 M+ |最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    2 z# S  J7 Y! y% G* @. Z$ U高手们帮看看是神马原因?& K0 n8 {$ Z; t6 [' A- X- @

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 5 ~$ e) Y4 s2 y! {6 H; x; Z9 l  F

    3 G+ ~9 w9 S( J没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " r6 Z2 f  A% a! Y( W5 a! T% H( e% w! U-------( m  @6 h: y6 J. ~. W; j) N
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    7 s* L4 h& E& b5 a-------
    ( g! g7 a5 ~4 |- h8 m算法诊断部分,建议把循环次数改为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+ E) r! N: i没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?( }3 @1 Y* q& r  e8 V4 J0 f' v
    -------
    4 R) O7 n7 N, i3 G不好意思, ...

    * h' Z  G/ l, G7 J; Q+ C; `谢谢,算法应该没问题,就是最简单的线性回归。
    / ?- d" s, k- w- C我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    1 `! S! r: L& I4 b& Y
    雷达 发表于 2023-2-14 21:52
    5 h+ x4 }; B$ @& K3 r谢谢,算法应该没问题,就是最简单的线性回归。; W  h( ^- y' ~: [9 T' Q; R, o
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    2 J  z% G- n0 S5 s" q* {6 B

    6 N* a: r& V8 N- g# G刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    # Q5 P2 n3 F9 V! Y
    : w; E& L) [& z: N+ `6 p或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    , x& v) W7 z) G6 b- Q* i9 R! \
    老福 发表于 2023-2-14 22:00
    % [* v* v0 q# T2 Y0 Z8 L8 E$ |2 \刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。3 g( [( ]4 X- a: o; I

    % C2 ^. g& v+ h; |1 H或者把b但的起点改为1试试。 ...

    % [: C# T/ Q3 R3 D, c! N% x: D5 @5 F$ E+ G0 w% u
    你是对的。
    3 Z; g# e5 Q8 Q- T) z2 o去掉了随机部分
    1 W3 a% ]( E2 ?! z1 [6 H#y = (x*27+15+random.randint(-2,3)).reshape(-1)( y9 O1 N% \/ R$ K$ D' D
    y = (x*27+15).reshape(-1)! k1 [% ?% a4 H; ^4 x: t/ i/ y
    3 N& j- T/ B' c  {
    循环次数加成10倍,就看到 b 收敛了
    ( F, Y0 u0 f3 Y& m  jw , b4 l( X( ^5 k& f# Z
    27.002620697021484 14.826167106628418' t/ X* R3 Z/ r4 O* M9 M2 o
    5 \8 X) k$ g. W! s
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-15 04:11 , Processed in 0.065143 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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