设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 " M& l5 y5 U/ V8 b, B2 H" e
    ( _& m* R* L6 v3 R+ F. `4 @
    为预防老年痴呆,时不时学点新东东玩一玩。
    $ R9 o$ k% A2 v( @, VPytorch 下面的代码做最简单的一元线性回归:
    ( b: i" r: o" v1 [- Z! o) _! W/ s----------------------------------------------
    3 l0 s; ^$ l& x" @- P- jimport torch: F  [% p. ^! `
    import numpy as np
    ( z' U5 h! E. w' v* d0 X8 b2 l% simport matplotlib.pyplot as plt
    4 _* F: I; |9 N% Q2 o- t0 }import random; h% P' G* c3 w. L2 ?9 Y- }

      L' A6 E8 \. ~  c- i5 a1 W( Ix = torch.tensor(np.arange(1,100,1))9 b5 N# w7 H9 e0 f/ R
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=153 F7 \6 ~2 q5 j9 d, N* |( {

    & K4 q* V9 D" ^5 r& E" F7 s% pw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    - A! K; @4 e* V2 h1 k7 ^& Wb = torch.tensor(0.,requires_grad=True)9 b$ Y* D, w# w: m! V  u

    5 @2 O' A8 l( n! J& k4 depochs = 1008 ~  x: }6 \9 U, l. j9 u* Q% e

    % {; U' g1 \6 u- R5 l) q& j3 Alosses = []5 r# s$ f, y( i- f& H
    for i in range(epochs):
    7 E, i9 W  L6 y  y_pred = (x*w+b)    # 预测
    7 e0 b, [* B; @6 p9 N) `$ Z) {  y_pred.reshape(-1)( s9 b% P! F% C: \' D2 r9 P6 Y

    0 z& G$ Q% j. x- O  loss = torch.square(y_pred - y).mean()   #计算 loss
    : _: m1 k+ H# ], ~4 M  losses.append(loss)
    - Z0 C- n# A; ~, |8 P. N' X  - g, c  u. \! W: @7 B( a% v0 A
      loss.backward() # autograd
    ) @* P: Y# r* ^2 d/ F  with torch.no_grad():
    7 k4 _2 [1 p* ~: F) J    w  -= w.grad*0.0001   # 回归 w, b2 O( y& x. x) b% ?  L- y
        b  -= b.grad*0.0001    # 回归 b * n4 \7 }. q, H" t  j
      w.grad.zero_()  
    + Q; _5 |* N6 s4 X3 Q+ x" @  b.grad.zero_()
    1 y& P- B5 M# m$ n# R- t5 H; d' T$ r- T
    print(w.item(),b.item()) #结果  R% b& F7 q% _% J5 @

    0 s3 l5 j/ P  |$ S, B0 R& ~/ P! jOutput: 27.26387596130371  0.4974517822265625
    $ e' a( G3 t6 A( S( J) R; K----------------------------------------------' Q& q8 n6 \- W$ k! }. N
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    : w" l& n+ {' g; x1 |4 O5 X0 c$ j高手们帮看看是神马原因?
    ( T2 A8 v5 {3 k6 h, Y+ d

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 % D6 c# b9 O/ g) }  h
    5 C" u1 |0 |( [2 Q$ R
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    % `  e  D1 h: Q; {' K" }-------9 L! }8 |, `% ?! g7 W# C* r: N% ^
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    # w- }/ l9 N! a2 J) q: V-------9 c) E' I! R$ H7 d0 k
    算法诊断部分,建议把循环次数改为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. `# v/ h6 P  r* o0 a
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?0 L. p; @( |2 [# v+ P3 p' L, h
    -------! Q  ]) y) M6 U- h: o
    不好意思, ...
    - b" G; W$ M9 I; E
    谢谢,算法应该没问题,就是最简单的线性回归。, \; n! o. U. o
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    + A" g) d7 Q$ a9 v% g
    雷达 发表于 2023-2-14 21:529 R/ z. |' f9 L% w: L8 w9 x; V$ D. G2 a
    谢谢,算法应该没问题,就是最简单的线性回归。
    + ^  P6 s: o2 A" |我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    4 _) b" U1 k; H; O& f
    $ x- R, i% J) i* C" z; n2 `刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    5 V/ b, [- W9 U8 h, |
    & H; b$ A6 |* F8 I或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 ( ^# O) U' A0 G- g. P3 i; |3 K
    老福 发表于 2023-2-14 22:00
    0 K/ s; @: ~. M1 x1 K刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。9 R7 w) {$ U8 n, n+ l' v
    ( O0 V) _! B* ^& a6 ]2 L
    或者把b但的起点改为1试试。 ...
    ; o6 X' y! o, |; N

    % n7 \3 y6 e$ `8 k. L2 D8 q$ v3 a你是对的。
    5 Z+ k8 m) Y" `6 H3 u! G去掉了随机部分
    : n$ T% Y$ t0 i! I" I/ C0 m9 H9 h#y = (x*27+15+random.randint(-2,3)).reshape(-1); n9 S0 R! e; ]) N/ H
    y = (x*27+15).reshape(-1)/ ?: Y( T. D1 f  ~: s1 e, i
    ; r5 H+ C# S+ Y. {4 `3 r8 z& k
    循环次数加成10倍,就看到 b 收敛了
    3 e: B3 h9 f& i" q& E8 m. |+ Ww , b
    . Q  n7 y2 u: t/ H, x+ T% }27.002620697021484 14.826167106628418
    0 ^% q5 g7 ~, a1 L
    + C, ^' {% v+ [, k和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-5 17:17 , Processed in 0.027364 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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