设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 - x9 F5 V: \& H) k0 i- ]7 T
    1 ]/ K3 `/ `: u* s  R6 c
    为预防老年痴呆,时不时学点新东东玩一玩。
    8 Y2 X+ o" K4 m9 k7 u8 j% E3 B5 bPytorch 下面的代码做最简单的一元线性回归:0 D/ J- U* F8 H8 H$ Y" U  w
    ----------------------------------------------
    " i! b8 o: j: |+ @" Ximport torch
    2 F0 ~7 z+ U# j" Rimport numpy as np
    ) a$ `; o* U. `; _+ K& U8 Z$ kimport matplotlib.pyplot as plt8 `/ D( u8 m% @9 x
    import random
    ) o# l7 J5 z5 J4 i" f
    : Q$ K/ l0 W% g3 @; Wx = torch.tensor(np.arange(1,100,1))
    $ C: P: ]& _5 o. A1 T* A' w4 x5 wy = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=156 T  H3 G9 C( [, r2 C: q- k# c) a; J
    $ f0 q# w0 i7 J, z: G9 _" f
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b4 q3 _( n6 M- ]& a* \' W
    b = torch.tensor(0.,requires_grad=True)
    + N6 j+ c1 O  K5 D" [9 }" e, {8 B
    epochs = 100
    2 j& ~" \: a4 W8 {( G: d6 O8 i; }' G0 |' @
    losses = []
    * u+ J: y) r$ L' tfor i in range(epochs):, ~" c" L2 Q$ Z! p3 a9 U
      y_pred = (x*w+b)    # 预测# I: `3 O1 u) D) P9 j
      y_pred.reshape(-1)
    ! r0 @4 f! Z7 B9 z : Q1 l$ t' H7 G1 Q4 R: A- [  x
      loss = torch.square(y_pred - y).mean()   #计算 loss# j( A" }0 e4 o9 r
      losses.append(loss)
    + y9 z% v% _/ U2 O  
    $ n+ A# ~* v  W1 e  loss.backward() # autograd
    ( ]- j$ H* B  i7 z8 |8 j  with torch.no_grad():
    ) I- m" p. U% Y4 O    w  -= w.grad*0.0001   # 回归 w) k% n4 a* d4 J& l$ t
        b  -= b.grad*0.0001    # 回归 b
    ( A1 Z9 _3 Q; K  p3 O) R6 A  w.grad.zero_()  ' I+ A/ L' X9 G; m* F
      b.grad.zero_()0 N3 z3 l" D) k/ {
    + A5 |  r* [+ f) v# {" q8 g  T
    print(w.item(),b.item()) #结果: d& l' [! L3 Z8 [
    9 {" c  V9 t% X9 f! A' \& ?' \2 O; h
    Output: 27.26387596130371  0.4974517822265625) M2 X' _5 q2 B0 O- D/ e( y1 M: B& O' a
    ----------------------------------------------
    1 V. R6 j( c2 {: J# H最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    5 E3 A0 u7 R$ f+ i高手们帮看看是神马原因?+ g4 X) H3 r4 r: K

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 + `- l! O& ~( I: Q# y& n

    2 S9 P0 ]  H, R' j2 D没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?0 R$ ^$ i7 l: l8 B7 t# v$ r
    -------7 ], b5 C* _) e+ \5 V5 g
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    2 D. L7 Z) z  L, O-------) k, ^3 a# L$ y( o
    算法诊断部分,建议把循环次数改为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
    % f, b6 X, j8 d7 S; r没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?7 x: E, Z* r: M5 A6 r
    -------1 F$ \  U. J1 [4 |1 J8 u; V1 c6 c
    不好意思, ...

    : u- [( ^3 U) G8 d$ k" z6 c* @谢谢,算法应该没问题,就是最简单的线性回归。
      K+ S' a. U4 v我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    6 r" P7 y6 J6 _. }8 ?! D! {+ `% x
    雷达 发表于 2023-2-14 21:525 B( n) i! G! p/ a
    谢谢,算法应该没问题,就是最简单的线性回归。
      X2 ]9 d$ c( k7 r3 e& r我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    & g0 `9 R3 x* Z8 Q! ], Y

    * h! E2 {3 i) X( F* a4 a( U刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。5 Q, }5 y# b- @$ R

    2 U- H" ]& d5 b7 d" Z* d或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 ' C7 S* _- D2 S% G: f; c9 T" L
    老福 发表于 2023-2-14 22:00# b8 K. \. e, q- D
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。9 [- l2 y/ |& ?$ Z! D) j8 l( ?

    / \! d9 z5 A* x, b3 Z或者把b但的起点改为1试试。 ...

    $ G4 M1 z5 b6 R3 F$ P, s$ F. L9 f9 \/ _8 t. v
    你是对的。
    5 ]" d7 I. k6 }; [, T( C' z去掉了随机部分  Y% j& D8 e$ F# t
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    3 @( r) l& C/ S* Qy = (x*27+15).reshape(-1)
    $ q+ _) Q' F( J) c4 m6 m
    $ j6 Y" Q) m5 y/ e. J循环次数加成10倍,就看到 b 收敛了
    ' q6 J3 [" y# b$ N' rw , b/ d9 ^; L4 c/ r8 K! G! l
    27.002620697021484 14.826167106628418
    3 _2 K- R8 |1 g- g/ T4 K
    / O7 {# \0 p% w6 y1 \& u! C和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-1 04:42 , Processed in 0.055427 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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