设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 . q3 u- y5 S% y5 b9 f
    , f6 k2 }, q4 o+ v
    为预防老年痴呆,时不时学点新东东玩一玩。
    2 x9 {4 b, p8 P+ k6 QPytorch 下面的代码做最简单的一元线性回归:4 D% k% Z9 _8 L, ?0 w7 u
    ----------------------------------------------0 b' }% o4 E$ D4 v7 O1 R9 n
    import torch+ ^2 y( O- v  |. T/ c
    import numpy as np
    / q1 x/ j( J: {# b8 |8 |2 |+ u7 U. Aimport matplotlib.pyplot as plt% |8 ]+ a, u$ q
    import random
    8 y6 ^; L$ w  }) P- N6 [) n. a) g( P2 g, ?$ e: j7 M
    x = torch.tensor(np.arange(1,100,1))+ ]2 ~6 s7 a5 ]% A- J2 v
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    * T- W. e; v4 U- I3 o- |" d$ W2 y; f# W( V8 S+ S3 d
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b3 O/ ^3 q& c% C3 u/ O
    b = torch.tensor(0.,requires_grad=True)
    ' q2 B1 D$ y$ j
    1 L. ^8 s" B3 N* ^7 J7 k) W7 Fepochs = 100
    ; @. i7 T" F/ A  p1 O* V3 f- z/ L7 j" W3 q  B* ?+ A( H$ ^) L
    losses = []3 S$ B( s  Z% `3 e+ |
    for i in range(epochs):
    3 R. n- p* {) v8 }  y_pred = (x*w+b)    # 预测1 e& X1 f. T& @4 M5 P# D7 B
      y_pred.reshape(-1)
    1 ~# n. r3 I! f1 m3 f$ B/ W ' n$ ~7 h9 N5 n$ e* C0 J7 h0 R6 \
      loss = torch.square(y_pred - y).mean()   #计算 loss5 g$ w2 P2 `5 n) O7 u
      losses.append(loss)
    ; W- z2 N0 o1 _" l  
    ' O4 t1 }  n8 W; `8 C; q7 W  loss.backward() # autograd2 @6 K% C$ S" n5 ]* C. F' T& K
      with torch.no_grad():
    1 k; W7 K' ^. f6 b    w  -= w.grad*0.0001   # 回归 w
    7 o# c5 y7 B0 O6 c; Z5 n  I: {    b  -= b.grad*0.0001    # 回归 b
    4 M  z6 ~$ z# l$ q# q; P% K  w.grad.zero_()  
    1 L1 ?( S2 k9 z0 j- J  b.grad.zero_()3 `0 p& Y; K$ y5 x' W+ c' U5 P
    2 e9 {0 ^- V3 {0 O
    print(w.item(),b.item()) #结果
    . J/ M* R  ~9 m8 t) L5 Z$ k6 r0 q+ `, B  p8 @6 D5 ?. {' f
    Output: 27.26387596130371  0.49745178222656252 H3 V! ~" F, h  x
    ----------------------------------------------; g$ h9 Z2 c  L& }1 q7 d
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。4 F  G# t. {3 Y) B# G: |* O; C
    高手们帮看看是神马原因?6 @8 W' K: y2 y, w3 Z( |; ^4 F& J

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    7 d4 q0 Y9 v" W8 {. o# T7 X, w' m
    4 c. d1 j8 x4 g, m) u& ]: {0 \+ B" u没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?/ [  T7 @  r; Y/ }: P7 H/ j2 O
    -------
    ; Q4 S$ U) t" H; H不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。1 q9 d* i1 i7 C7 V! g) p$ ?
    -------$ x7 F; K. r/ r! L/ y9 m& s
    算法诊断部分,建议把循环次数改为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
    9 w" n3 `# J3 v- L! i$ T+ c没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    # V9 I7 q5 n3 l2 A& b4 \-------7 O3 j( U7 O: L6 k/ L( J' X
    不好意思, ...

    $ t( @- g! R5 m1 V+ U8 |+ @# W4 ~% J( Y谢谢,算法应该没问题,就是最简单的线性回归。
    ; B& O* V% ?7 b/ Y. T: ~我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 + f+ p  \( H% H2 m* }4 _" y7 A
    雷达 发表于 2023-2-14 21:52
    - ^: A) q% c- [谢谢,算法应该没问题,就是最简单的线性回归。
    $ ?9 p- b# L$ z我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    + @  {/ r& X5 @$ r& Q2 {- O1 }" H5 }1 `5 }* z2 b% I( y3 w
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    2 f) V0 k7 }" d/ @% t
    0 G* j8 d' o$ {0 d+ r0 y2 Q, M4 a; j或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    $ e; q% N: O5 f# d! G5 ?" g* B7 u
    老福 发表于 2023-2-14 22:00
    3 m* a1 X0 j9 T- k. j1 h, \刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    1 M3 l/ }1 y8 Y0 s- R
    % o2 C0 A; i7 P) J- ]或者把b但的起点改为1试试。 ...

    * W/ q0 L9 g, H& z' v  ]
    ! e9 [4 Q$ n& A! |- m你是对的。* P5 v* x/ S1 e, [6 m, @' y
    去掉了随机部分& p! Z+ p3 O4 {
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    7 B0 R; @4 S  k& t( [- by = (x*27+15).reshape(-1)
    4 R5 ~& y2 [6 E+ @6 G( q& G1 ~2 v. l+ A0 J
    循环次数加成10倍,就看到 b 收敛了9 H. e7 I$ U* p+ M4 N
    w , b. l: M! f# h. d, Z
    27.002620697021484 14.826167106628418
    5 i) v4 z! f* P% Q+ H" i/ U
    : I/ k$ b. o+ G和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

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

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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