设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    + D7 |/ Y8 _* }& ~, S! X4 r) l! ^- ~+ q5 z+ y
    为预防老年痴呆,时不时学点新东东玩一玩。
    : i( d  h9 R# o; K+ MPytorch 下面的代码做最简单的一元线性回归:
    9 S- B9 U6 W! a----------------------------------------------& c; H  Q: H- f; p: V- I
    import torch. u4 a9 _$ u& K9 M- [$ g8 K
    import numpy as np
    9 i# w7 \% ]+ ~3 Z8 O* bimport matplotlib.pyplot as plt: X1 @. [' [* K" l/ u/ h$ b
    import random) P; k7 C2 X' p' i
    0 i: t# u0 {+ S. \. R* @
    x = torch.tensor(np.arange(1,100,1)), B( a, z; ~2 {+ |, l% z8 s$ d1 h
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=151 v8 b2 K% u  \! H

    9 L" m8 g" q. f4 `5 G/ G5 f, j8 _% {- Qw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b, e+ {3 F' o' I) y* A' F
    b = torch.tensor(0.,requires_grad=True)" u7 E0 V% t4 X
    6 q/ g! N) F% X2 B1 L/ |/ I. B  W
    epochs = 100, @# h  X  j" F2 h& `* x% N6 Z

    ! V$ p" P& |4 h" _- a$ W/ t. M) I1 tlosses = []
    5 N! D+ Y1 ~( l8 vfor i in range(epochs):
    3 h$ p! V( o: x/ `  L* L. W; s5 K  y_pred = (x*w+b)    # 预测
    ! p& @( B; W9 D/ k  g1 X  y_pred.reshape(-1)  _% j: X2 m" x

    ! N& ~- t' D" R- d1 O  loss = torch.square(y_pred - y).mean()   #计算 loss
    ' {8 ^* j" U4 H9 K: \: G8 }  losses.append(loss)% t( e- x) m5 ]' C' P
      / @; Y( F( D/ h  z# Y4 x) V7 C; X
      loss.backward() # autograd
    + J# ~6 @# V7 S  z  with torch.no_grad():5 ^6 B3 |6 {7 K
        w  -= w.grad*0.0001   # 回归 w
    % W( B/ U# j# P) \6 Z% {    b  -= b.grad*0.0001    # 回归 b
    " o1 ~$ E) ^* G' K8 l8 @' G  w.grad.zero_()  
    . @3 H" z3 ~9 B  b.grad.zero_()
    # W3 W  E9 U1 m& A% @& F. k
    + g) u' s. s0 l( g" l* c+ Nprint(w.item(),b.item()) #结果* X6 B" z# u2 N: Z/ z5 y

    ! e. }4 \% Q- @7 sOutput: 27.26387596130371  0.4974517822265625
    9 t/ h8 q3 j8 H) b0 F4 |3 b! h7 U2 b----------------------------------------------0 P$ p. t# r! \: `* O
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    7 T" a0 R2 ?6 J! \3 D: U高手们帮看看是神马原因?
    & a/ q' s. W( ~' C) c% _' y

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ! Q4 y2 h+ c( K0 R9 f* a0 c

    9 E! D# g% |& w9 k1 D3 P' P没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?. Y( O) b* i9 j- P& M1 _5 R/ s/ G
    -------2 f# [0 u+ M- l( c# b$ V
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    % h( y' o4 x- y  w& G( c7 `-------6 E2 ^6 g$ V8 H3 }& B/ X
    算法诊断部分,建议把循环次数改为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
    - D, X5 M% U" o! Y* q) ~; b没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?# Q! T& V- R+ X# N& i' p' W* d
    -------' H" n+ |" y3 t8 o: f0 @2 r
    不好意思, ...

    ! c3 S( p1 }( w  f4 b谢谢,算法应该没问题,就是最简单的线性回归。
    6 _1 O& w& m8 U1 m( S) e4 ]) a2 ^我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑   Z0 M- C& G, b5 \8 T- f
    雷达 发表于 2023-2-14 21:52
    5 Z5 F( [1 b. j! k" X+ Y谢谢,算法应该没问题,就是最简单的线性回归。- w' ?2 O1 a# v. W. ~
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    4 m  Y) l) Q" Q4 n/ X( t5 I
    * q+ P/ j' C5 e' ^. X
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    1 p. v9 a# L) a& ?& v5 q" r$ y$ ]3 y6 Y/ Y) a4 A0 d
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 ( l+ R9 ^% [+ n5 C
    老福 发表于 2023-2-14 22:00# o- `1 \9 j* i( N% ~/ O" D
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    * }/ U8 _7 R  E2 o, F9 C9 ?7 \& _
    或者把b但的起点改为1试试。 ...

    , S% G7 q- t/ y$ _5 T% ]) ?+ @) Q
    0 \  E5 S. X% P; r5 X- p. f你是对的。
    ; k8 W/ y4 V3 g4 T3 Y去掉了随机部分
    9 d: u+ O+ T0 R' u#y = (x*27+15+random.randint(-2,3)).reshape(-1)" N9 I+ m6 \. }: I9 P/ a
    y = (x*27+15).reshape(-1)( O  ~9 t% p& s# F
    # w- Y9 x  P0 z* h1 e
    循环次数加成10倍,就看到 b 收敛了$ r9 P8 d+ o0 R; n% E; E
    w , b
    ) D1 ]4 s4 i0 C  U0 C; {' N9 f27.002620697021484 14.826167106628418* P" J5 G; }9 A

    ( K) j0 G! W/ L0 N3 P5 p和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-6 07:20 , Processed in 0.064899 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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