设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    9 V5 s" {3 j7 o) c7 c& x0 |3 Z/ n/ D
    为预防老年痴呆,时不时学点新东东玩一玩。
    2 D3 ~9 R* o, A* e- L+ pPytorch 下面的代码做最简单的一元线性回归:
    ! M1 [/ j! A# S3 s----------------------------------------------- t$ m6 b6 a$ k% ~; t2 A8 h
    import torch
    ( q6 b$ C% u) c1 p8 Uimport numpy as np
    ' q1 K+ K/ k. l$ l) e9 Cimport matplotlib.pyplot as plt! [  Y' B. K5 d( G! v
    import random& c0 G0 J/ T( z" j

    5 P4 \6 P; F5 z$ E* L  {1 Jx = torch.tensor(np.arange(1,100,1))& {' ]. K) C/ e% k
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15: I  p$ V' \' e9 A
    # `; y) t2 ?2 m* g7 [$ ^+ J  R
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    0 ?$ v/ s, W: K- I# S7 ^2 rb = torch.tensor(0.,requires_grad=True)
    8 F2 _4 e$ q$ ~7 |/ w3 I9 S& N/ }& r- i8 d2 t. f, [+ a
    epochs = 100& M4 O0 g4 s0 I  ]5 g. X
    / Q% p) D* }( @2 c. y
    losses = []$ X  t) @) Z1 }4 y1 E
    for i in range(epochs):
    ! B6 I% h2 _( y6 M5 i0 M  y_pred = (x*w+b)    # 预测
    8 v6 a# V$ A  S+ A+ m  y_pred.reshape(-1)
    1 e9 y' M1 I' J( u6 [/ q $ }# p7 m% Q9 S
      loss = torch.square(y_pred - y).mean()   #计算 loss
    3 G; \; z# _* R0 u- {0 S  losses.append(loss): I! ?8 l" C5 t/ ^1 U" d
      
    8 R% }, E7 H8 S6 g; U' M  loss.backward() # autograd8 r" `& k4 G+ w9 u$ }! W
      with torch.no_grad():9 t( {/ E% T0 O: e  F# q
        w  -= w.grad*0.0001   # 回归 w6 S& t% I  W2 Y, M9 d2 C
        b  -= b.grad*0.0001    # 回归 b # K7 l* y3 V6 ^: B4 u
      w.grad.zero_()  1 G) U9 b2 q  `( o
      b.grad.zero_()
    ! u7 q5 z- P& ^8 U- w# x# a
    9 b* o% e6 U6 K' Zprint(w.item(),b.item()) #结果
    : w+ z# v) q1 _; z5 @3 H& I& W& u* ^. J  H; `
    Output: 27.26387596130371  0.4974517822265625
    $ y3 a* v) g% m----------------------------------------------
    ! y2 x2 ]/ K) W! q最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。/ ]( S; c0 x9 Y+ O: T  y
    高手们帮看看是神马原因?
    # r; D$ W* c6 J

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    4 t/ M) \# a4 m" Z9 [& h" s# p# Z0 R
    , w# Z' [" ?: L1 R/ T" k没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?' a) u3 ]' i) S0 s' J) |1 \
    -------
    / s5 h, G' U; |+ [+ q- O不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。. E% ^, x& Q+ O7 |8 N
    -------2 ~( K: p- {7 @+ B5 g2 d9 v- F! j
    算法诊断部分,建议把循环次数改为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:233 F( v) A& C* p, V3 R
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    0 f6 C4 y8 {) K( j9 }-------( N; {5 n* A# n: _' A
    不好意思, ...
    1 P5 _$ U9 P# c; C/ j, N
    谢谢,算法应该没问题,就是最简单的线性回归。% m; \% w8 M5 c( V- m9 B1 R- P
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ; W+ r7 C0 O& R3 q
    雷达 发表于 2023-2-14 21:52( g* x  ^4 w! _( `: M4 z) K
    谢谢,算法应该没问题,就是最简单的线性回归。$ ?4 p  k& G7 w; m# `2 B
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    5 u6 Z9 k/ ?3 q
    9 t6 F% h  a6 d7 ~# G: o! }刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。& m3 f7 e2 v7 L/ ?* C4 g

    ( ~7 t) g; a5 D8 g) z# R/ @2 S或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑   X, }! @( U7 j- J7 U
    老福 发表于 2023-2-14 22:005 k$ \7 N# N+ T
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。- l: N, P# B) r; x" _1 _
    # t5 ~6 n4 y4 P. c" d; l" d; T
    或者把b但的起点改为1试试。 ...

    ) b6 U1 F$ M) G  C7 ?. ?8 p7 ?! U2 `! F9 \/ l$ Z2 l/ w) O% d
    你是对的。  d! L2 J$ e& s3 ?. a; T8 \9 H0 m
    去掉了随机部分
    * x) s% C' Y6 W8 V9 r  K& J  ^#y = (x*27+15+random.randint(-2,3)).reshape(-1)9 B- I- ^$ m0 ~# M. v# ]
    y = (x*27+15).reshape(-1)
    0 I1 l0 {; E" ?& y! m5 _4 ~% h" ?9 W$ ~$ Z  Y0 O3 Y
    循环次数加成10倍,就看到 b 收敛了1 X0 c& ?9 Q# q5 O  u- b, m# I
    w , b
    / u5 l7 |% d# S1 o+ t0 n: g27.002620697021484 14.826167106628418! n$ J5 X) H. L2 m$ K- ?
    4 s! K' B2 i, w3 e2 Z  F" X
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2025-11-6 21:14 , Processed in 0.047741 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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