设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 ( e3 E/ Z/ W3 R& ~

    & \4 E" Z& d  t; j为预防老年痴呆,时不时学点新东东玩一玩。
    * O6 ]: q+ u) J+ ~* N% aPytorch 下面的代码做最简单的一元线性回归:
    : e. Y' h5 m& V& \/ e7 ]/ \6 u! g----------------------------------------------4 K* p0 |% S6 {" B9 T8 N
    import torch
    ; a  W( o& R) A6 himport numpy as np
    ' y, ~. J+ l- S5 L4 I) Simport matplotlib.pyplot as plt
    ( s8 `  m# {! t1 c/ H  himport random3 o& @; k) }4 S* s# ]

    ( d( Q7 f9 x- g0 |4 z; i; cx = torch.tensor(np.arange(1,100,1))
    - b" c8 [/ z" f0 Z& B" ^y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    3 A3 ?+ E7 H4 x+ Y
    / p5 u; d! J1 k0 L# H4 Pw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b' @+ ]8 q+ \( }' n+ V0 J5 |; j4 V- y
    b = torch.tensor(0.,requires_grad=True)
    + i5 F4 x2 u6 d: R, B" C, U$ A  p7 J  `5 y6 y$ M0 S
    epochs = 100
    3 v" H6 f+ b; l
    9 Q( h8 }% \3 qlosses = []% o% T. n) P8 @0 q
    for i in range(epochs):3 w: H' V2 ]2 d' Q7 _! e# g) `0 P
      y_pred = (x*w+b)    # 预测3 H7 P- v6 T' x+ z* y
      y_pred.reshape(-1)
    7 q7 [' J2 [# _8 y2 O
      O* W1 J  g7 ~- }$ d$ A/ n  loss = torch.square(y_pred - y).mean()   #计算 loss
    + J7 d3 E- ]/ c  losses.append(loss)( y9 D1 h2 I& l2 }
      , z& @4 u2 E$ y/ Z
      loss.backward() # autograd
    5 Z' y, }6 ~& D  [  with torch.no_grad():
    ' [' d7 f5 y& E, z$ S    w  -= w.grad*0.0001   # 回归 w) L: W* a& j9 D& O
        b  -= b.grad*0.0001    # 回归 b # E9 N+ f0 T$ \
      w.grad.zero_()  
    ) S( X: z; j' y" E0 T  b.grad.zero_()
    , `- _. ~: k% b0 N- X3 t: |! K: [" J
    print(w.item(),b.item()) #结果, i0 k5 B, p8 \0 B
    8 m+ M9 R; I$ ^+ i0 `
    Output: 27.26387596130371  0.49745178222656257 F1 Z) a! I  E+ o+ ]) T7 u
    ----------------------------------------------
    $ N/ Y! e& z2 `3 x& f5 V" b6 G% E8 A最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    , v; d4 x! f/ v/ g高手们帮看看是神马原因?# ?/ q' N! V! F

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    & r1 ^; L. B" J, y. ~( S' h, \3 W9 U5 Y0 P$ F
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    # y- W# `+ K; ~. o# C' Q-------- _6 c5 k5 T, K- c& B
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。6 ~" Q+ k: A3 n- Q' U" s6 }8 u6 i
    -------
    $ L( b" \- c4 n# q算法诊断部分,建议把循环次数改为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# f3 I, J* _" h7 L
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    1 i1 H+ L% z$ c  a9 J9 k  H-------0 a$ D- f# A+ h& @/ {
    不好意思, ...

    ! U+ O) V/ m5 x( ^  ]# k" E谢谢,算法应该没问题,就是最简单的线性回归。
    ( ]$ l+ n% b% o2 j6 K) O. Q. b, I我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ( A9 @4 l+ `* @6 P! b: W
    雷达 发表于 2023-2-14 21:52
    1 |' m" ]( q  [. B% q谢谢,算法应该没问题,就是最简单的线性回归。  e  L4 Q9 `( ~
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    : j% s; M* R8 j2 C5 C& f0 Z# b

    8 L/ M  w% I3 t/ a2 Z1 v5 D刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ( j+ \1 u$ H4 D5 [3 \8 O0 D5 G% _5 g& w* g+ Y2 ]3 N
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 0 ]# H, p$ s) q. T0 Z0 J: v
    老福 发表于 2023-2-14 22:00
    * N6 z5 [  J4 ~9 p刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    $ `7 S) A+ f/ H/ I0 W8 J9 E8 j7 \7 z
    或者把b但的起点改为1试试。 ...
    - E, R' D8 y/ H; H0 a1 g, f/ v! J

    . r+ u, @: {/ T- R, `: T' V1 Y你是对的。
    , D" Q4 C1 _; L8 w8 [% u& @去掉了随机部分) `. u4 i" U+ E  Y  Q. Z2 E* P% P
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)/ d8 O" [: _5 _
    y = (x*27+15).reshape(-1); g7 p) H8 q: h% ^

    9 w% Q' c* p  q" e循环次数加成10倍,就看到 b 收敛了
    5 F& f5 {' L! k; ]w , b6 R' C+ z2 a6 g( X
    27.002620697021484 14.8261671066284183 e/ h: j& j& \4 @: k
    6 [, b: C2 Y% J1 o4 O1 P
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-22 18:51 , Processed in 0.060859 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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