设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    / |$ I& t4 S0 b/ b! {% I
    $ {4 v9 p4 j) t+ e: i7 q2 d为预防老年痴呆,时不时学点新东东玩一玩。
    . X" t9 [  X9 M3 _9 r7 VPytorch 下面的代码做最简单的一元线性回归:/ l9 K! H: a+ F. D/ K) }2 O8 z
    ----------------------------------------------. @; }% D) A& _; N( K8 g' i( R
    import torch: ?4 X: {" e/ ?! }8 W
    import numpy as np
    2 p. }; g, R" U' nimport matplotlib.pyplot as plt
    - `  B  \5 d% p1 Kimport random
    4 @% X- E# f/ Y: a# K1 p! K  E; o* M8 b3 o4 p
    x = torch.tensor(np.arange(1,100,1))& P6 J+ C% F- P4 S) W1 A# G
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15  F  L2 V! a' a' l' ~

    3 t7 e% o. [/ L# m' e7 O, Jw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b$ L) H/ r* Q8 C
    b = torch.tensor(0.,requires_grad=True)
    " n4 N3 V9 Q% _2 P8 Y  d9 Z5 o
    " V5 C0 D# R9 o4 T- |1 |! eepochs = 1008 y- q# |8 e6 O6 W, G

    * X$ j2 U" x& }/ M$ y4 {5 q; C4 G3 zlosses = []
    , f( g8 E7 |. R' N4 P  Ifor i in range(epochs):$ @+ E' {" j' h( l& a& ^' i5 S7 b
      y_pred = (x*w+b)    # 预测' u& F2 c0 X1 f( L. z3 |$ E8 k0 w
      y_pred.reshape(-1)2 ^4 m- s& w# z7 R0 I

    : Y( [8 j; }; x  loss = torch.square(y_pred - y).mean()   #计算 loss
    # w& M0 q' x# n' o6 A0 u  losses.append(loss)9 N' c9 [' K2 F. C8 q8 I$ a6 ^
      
    ; z2 A( C3 @9 @$ @: Y+ X  loss.backward() # autograd7 O2 Z6 R  ~* g0 a
      with torch.no_grad():
    % F7 o# i+ s4 n* D0 Z; [+ D    w  -= w.grad*0.0001   # 回归 w
    / ~. n7 W8 Q, P, s" Q) L1 f    b  -= b.grad*0.0001    # 回归 b
    * z9 \) ^; v2 O7 r3 t$ X9 M  w.grad.zero_()  
    + g- c2 a8 i) s$ l  b.grad.zero_()
    * M3 f5 L# h* W# f& z2 i; L' X  |& E
    print(w.item(),b.item()) #结果
    $ ^$ \# e0 ?% ]+ M# _1 e) r% w- m: I4 ?
    Output: 27.26387596130371  0.4974517822265625
    $ R1 |- C( p, M! q. _' r$ e----------------------------------------------
    . N2 c/ B) {1 q7 u" w; [. g2 u  ~4 l最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    2 n7 C  R& \5 w' n% Q+ U6 R6 U高手们帮看看是神马原因?
    7 ~; Q% E% a) `0 P' [

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    * b$ n. j7 Z5 M/ t! T7 ~
    8 c' t; [: l8 Z# M* I  D没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?! F  I6 o# F& M# {* P7 [& y
    -------6 S( H% \" V% j  B( Z
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。+ {9 ~7 y; g: J
    -------# m' O6 n/ W( D! ]) N, g
    算法诊断部分,建议把循环次数改为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:234 b, Q+ j9 N7 Q5 a6 j) e0 S
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?: n3 b+ C7 o, ?0 W! u
    -------$ B9 ?" ]0 D2 ~3 Q0 \/ h
    不好意思, ...

    9 d( u/ d; L8 o8 M- _; n* C谢谢,算法应该没问题,就是最简单的线性回归。. i1 J8 }9 A9 }7 @% r# e
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 / S: |5 t, a* Q6 B
    雷达 发表于 2023-2-14 21:52
    ; k3 l/ Y, |  S  k! b' s* g# Y* \: q谢谢,算法应该没问题,就是最简单的线性回归。! F* t+ F. a/ e  t
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
      ?- ^; `; F1 D/ `: q- v- h

    ) l+ C( o; F5 @* C$ f- b刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。+ W) L4 ?7 Z4 x  N* @
    % T2 r. n8 J4 z0 q8 a7 b5 E
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 / ~' ]* n! H# b
    老福 发表于 2023-2-14 22:003 p+ h6 x& l4 P
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。5 o0 a  S+ J8 x

    ; A4 {+ O7 L) O: g或者把b但的起点改为1试试。 ...

    6 K+ W+ T& M% Z/ A# K" m8 D! k. `1 D4 f- E# d+ u3 s5 @
    你是对的。/ \; X6 s+ ~  r3 u5 K$ {
    去掉了随机部分& d/ z  ^" Q5 H9 x% ^2 N  ~( x
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)" z: K( @/ j! q2 P
    y = (x*27+15).reshape(-1)
    & [! }0 v# m) K% w+ b7 b  Y; ]! y9 D
    - X" F  J! q* f2 p2 [+ m$ Z- g' p循环次数加成10倍,就看到 b 收敛了
    $ e* a4 I1 S/ g, a8 W: ^6 P3 \w , b
    7 f( S- Q- |  R0 o* U& g, x27.002620697021484 14.826167106628418
    5 Z- m2 N) g8 T
    # N4 {7 J0 A. u1 T9 w和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-12 23:52 , Processed in 0.028634 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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