设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 : q0 J# n9 ~8 M

    & g) G: t2 C& i$ r  u$ \# _6 U为预防老年痴呆,时不时学点新东东玩一玩。0 o0 s, S6 H) f* Q1 q
    Pytorch 下面的代码做最简单的一元线性回归:
    6 B8 o4 i' i' f* o, \2 w" R----------------------------------------------8 x+ U2 |7 x0 }0 t0 V( Z
    import torch' B: A( N3 i6 q: A
    import numpy as np
    % y) q% \8 I* \$ c% d  Iimport matplotlib.pyplot as plt( |8 p1 {" O* ^) z! S' @7 H: [5 |2 I5 D1 O
    import random/ r4 Z" I5 z' O, K7 v, z
    7 j% g! ?. h& A0 i  b" c$ v$ l- ^
    x = torch.tensor(np.arange(1,100,1))6 Z. L8 R; z# }4 }9 Y
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    3 x) p. e8 `0 K! n7 l) s$ t1 n( D- A+ Y) y, B( g& V- z
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    & M) W; }" D6 b3 W. D' {b = torch.tensor(0.,requires_grad=True)2 N, S" b1 @' Z

    ' C7 u/ T6 X3 g& G+ y# }" Tepochs = 100
    & O+ k" @5 f5 I6 i  {+ b2 k- q7 d+ \& J% N
    losses = []* ?" {1 b! X# Z8 ]
    for i in range(epochs):
    . X( ^( S; ^* P" q9 Q1 [  y_pred = (x*w+b)    # 预测
    & R: c1 l1 V8 l  y_pred.reshape(-1)
    - r" N5 K; X( [( @ ( t, ~9 P) u% U4 j
      loss = torch.square(y_pred - y).mean()   #计算 loss. C# S) }1 B! G/ k/ I! Y, J; U
      losses.append(loss)+ E. @& {' ~- E5 d& l9 Y' m& M
      
    ' R  V' t( g" b8 z, O  loss.backward() # autograd) L; Q& ~8 z9 A0 ~. L5 x
      with torch.no_grad():
    ) U; g% H+ ~  \5 E/ W4 ~    w  -= w.grad*0.0001   # 回归 w
    ; `! Y1 O. A- ?( v/ f3 p    b  -= b.grad*0.0001    # 回归 b ' B) Z* h9 o9 L
      w.grad.zero_()  
    , F6 ^6 U0 o; d  V  b.grad.zero_()
    - M( d1 K8 I; c' N/ m. Y/ T* z6 E! d- M8 m( H  Y9 e. Z
    print(w.item(),b.item()) #结果
    9 E4 |; I  H4 e' z# [! {# [& n7 i1 u4 c7 z! `( V( x
    Output: 27.26387596130371  0.4974517822265625$ P5 M  ]' S  P3 n4 k) m' K% U
    ----------------------------------------------
    3 O- m& Q$ V+ q7 |最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。/ F. S, Z. }3 e' p4 W( a
    高手们帮看看是神马原因?
    0 `" W# u4 }4 N/ A

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    2 ^: s' n+ ^0 O" s6 n
    7 l9 R" \0 C# Q没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?. x. L8 _5 \: Z( C7 w( W
    -------, G5 F% ]+ k8 `/ n' _; f, O
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    - C7 y3 o  g# j& f3 z-------9 E( Y- {, \8 }" I7 Z7 s; `3 _
    算法诊断部分,建议把循环次数改为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; w& [2 t; |( r( g0 r  ?3 |2 w
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    0 W1 l8 R& Q4 p+ K, m" S4 o-------
    3 a6 C, S: s$ V8 V$ P8 W0 g  @) `不好意思, ...

    9 L/ ~9 d' |% ~- i3 E谢谢,算法应该没问题,就是最简单的线性回归。
      ^! \- n) z# S8 j4 y- p" w我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 $ f' u5 T" D  k6 X; D7 J
    雷达 发表于 2023-2-14 21:52
    - e8 A. t, g' A. I: ]% B4 ^0 U谢谢,算法应该没问题,就是最简单的线性回归。  Y2 \" d; V3 k' ]. H" o2 ^
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    1 y( w; A, L5 R; L

      _! P% L5 y# O刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    : Z4 _/ \0 `8 L7 l9 b! [1 I& D" j2 A# O* C& b3 N
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    * v4 q( U) }1 N; N; A. h
    老福 发表于 2023-2-14 22:00
    & A1 F/ `& }% W1 X3 D% R! \刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    " j! ~* R  r! q) j! Q* P5 W5 S. z! P, L7 F# p3 m' L1 w( J
    或者把b但的起点改为1试试。 ...
    % N9 R5 `% i+ U' T5 t. f* x

    2 @4 M0 Q0 x' J/ \' F你是对的。
    $ i) U2 s+ Y0 v$ \) \- k去掉了随机部分& ]; w. C$ I6 F7 D, D. x/ O' H5 h
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)0 w" ~3 A. b+ G1 D; _
    y = (x*27+15).reshape(-1); w9 N( a: |% r8 d) L# d2 R
    0 g& P, G9 N7 c, ]  u  b5 x+ x
    循环次数加成10倍,就看到 b 收敛了3 D+ C  ?" }4 G+ \9 y! e8 c0 }/ D9 t
    w , b6 k8 b6 k" D9 z! b
    27.002620697021484 14.8261671066284188 K1 A3 B1 G( y  _4 Z

    ) a0 w0 Z. V  }. B: \和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-30 21:55 , Processed in 0.052856 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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