设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 : `3 |5 Q( O! F8 d7 ^% U

    5 k1 q; [) `* x/ v  n为预防老年痴呆,时不时学点新东东玩一玩。; ~- J! j$ q5 ~
    Pytorch 下面的代码做最简单的一元线性回归:
    7 @: Z# Q  [8 [/ K----------------------------------------------1 x/ t- Z- ^2 T0 s4 s, w
    import torch, B0 c3 r, o: ^! |* [8 g
    import numpy as np3 C2 ^& ^) X+ P. U4 u
    import matplotlib.pyplot as plt; j% \. X3 c$ u/ @
    import random8 i/ _# X  s! b" y9 g# z8 k
    * ^( s3 m  W; m8 y
    x = torch.tensor(np.arange(1,100,1)), t. S7 r2 F1 s% d
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15& \5 D+ @9 x9 h& R* |8 z0 M6 [

    6 p. W- U/ J$ y) k9 ~. [' f/ ~w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b4 o$ d' W4 [2 q+ C! V
    b = torch.tensor(0.,requires_grad=True)& U2 n2 a. r$ O5 j8 B$ b* P
    % n; S( B: m9 H+ W; X
    epochs = 100$ F: f9 ?8 ?2 f. Q
    6 A8 Q; R2 j2 n. D0 F
    losses = []
    7 B- M; W7 ?$ |7 Q* T9 ^2 J3 ufor i in range(epochs):4 i. a% h  D5 V- B; I$ j  I
      y_pred = (x*w+b)    # 预测
    - P" G/ k4 u+ `4 ^! A6 F$ u  y_pred.reshape(-1)
    " w( F. g. G% \" K  i& o ; C2 H6 W. Y3 n5 i9 ~% s# I: F
      loss = torch.square(y_pred - y).mean()   #计算 loss' \: @6 m: b$ M+ n
      losses.append(loss)" _; \6 q/ ?& ~; o6 |% N
      1 @! d6 b5 S& [# |8 ]' G
      loss.backward() # autograd
    ! ]7 t5 ?: f+ z& w  with torch.no_grad():
    " ?- R# [5 B8 ?" _+ f    w  -= w.grad*0.0001   # 回归 w( B5 E; f8 c" x( `  j
        b  -= b.grad*0.0001    # 回归 b # l) g/ |0 q/ }
      w.grad.zero_()  $ v/ G- C7 V  m1 q% x- f! p
      b.grad.zero_()
    ' `. W# _, p) y4 V. k6 }" ]7 B7 k1 E( J
    print(w.item(),b.item()) #结果7 l* y' z; d5 X3 u" Y

    ' A: k. q. [, r/ P! k. WOutput: 27.26387596130371  0.4974517822265625
    4 U% V6 k- }7 _) ^----------------------------------------------  @3 s9 L" w! \! g7 |1 m5 |# y
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。7 l/ W, r. N; I
    高手们帮看看是神马原因?
    . Y9 j2 z2 _" z  L8 j

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    - O' p3 F2 h. L/ s! I' d; {. G
    / a, F" G3 S, J+ I0 [0 u没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?% D8 Y: W! i& @: \6 G8 e
    -------
      `9 i: M8 G5 p0 H3 g不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    ; o/ n! M, N0 [* U# ~-------' J* m2 f$ Q( R* L( e$ P$ W% 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
    & w3 s3 Y( s, ]7 z% w, c  T没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    3 a2 `" e( l. n7 _+ e+ [; O! Q-------
    8 w/ b' y( X- K4 ^3 n* s3 L不好意思, ...

    2 e8 s$ V4 S# D5 z; b% t谢谢,算法应该没问题,就是最简单的线性回归。
    / k: _, U: S: H' G' p我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 $ J8 `& p5 c7 K( I5 i( p" Z( s5 N
    雷达 发表于 2023-2-14 21:52
    * y" ^) I( E+ E' R% l( @谢谢,算法应该没问题,就是最简单的线性回归。' ?# P. D6 b: ]& ?9 f0 u
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    . I  f- V) r1 {9 m' z: S+ }% X

    * S2 S$ h$ {* f9 O- U刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。: J/ Y! e% n/ n- P7 ^

    : u- k' v6 I& A" B* y或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    : L- x+ G( r3 X- z* o! X9 N
    老福 发表于 2023-2-14 22:00
    , w0 U* s$ K5 E9 H8 T刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    5 l& R5 Q$ m1 v0 V$ y, |/ l
    9 C5 G5 m4 B4 z9 q9 O或者把b但的起点改为1试试。 ...

    ' k4 U! v- |7 O( D; c% h" i) o( L9 m5 i+ {& b1 ^9 E
    你是对的。
      Y) f8 b, _6 `6 N" P7 x7 f4 J# d: T去掉了随机部分6 T: e8 v. I8 F! D6 Y' ^
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)" t1 F0 ?/ l  N8 B
    y = (x*27+15).reshape(-1)
    % ]" [! H/ w- S% _: _8 v* |" k1 ?8 c# B) \" p
    循环次数加成10倍,就看到 b 收敛了: }( |8 |0 @$ x7 s8 O# Y
    w , b; N# p  z" o# C. I+ m
    27.002620697021484 14.826167106628418
    * w' }- [  p$ E1 d" e. E6 ]8 d1 i, h- V  u3 T0 L0 Q" \) n
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-8 22:48 , Processed in 0.058450 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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