设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 9 R$ c; \1 A# {' R/ O

      Z* S$ e; `6 @1 K为预防老年痴呆,时不时学点新东东玩一玩。
    ' d  a- W$ t9 n5 ^4 [$ q1 T, ^Pytorch 下面的代码做最简单的一元线性回归:- T  h7 L1 K, E+ g% A/ B
    ----------------------------------------------: j4 ]3 X% ]5 Q3 ^9 N/ e
    import torch9 O& z& E! P% {& M# {  R! N
    import numpy as np. }, D0 E* h4 q% M! u8 N
    import matplotlib.pyplot as plt# y% ]) }4 }/ K, h7 k
    import random+ I2 a- h( e! I* b& h

    % \8 O2 k! [7 C5 ax = torch.tensor(np.arange(1,100,1))
    - l8 x( \1 |! f! X( D. V1 Q! I" Q( ^8 \y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15  S( k/ H$ Z5 o) }- j

    2 e& @" l( [/ x& ?  K  x& F8 _w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b/ m1 `& M* W* y4 B& h6 t8 s
    b = torch.tensor(0.,requires_grad=True)2 R# x4 L) P/ R2 c; Y4 t5 P
    7 K# g0 [' B1 D" C: |4 P
    epochs = 1001 F& W6 C4 K+ }3 M0 C4 ~0 X+ N
    0 Z' r& m. l2 c; k% y
    losses = []
    2 D: Z6 K, F" m+ M+ ^for i in range(epochs):
    0 t( l( z. [6 v- |  y_pred = (x*w+b)    # 预测
    1 L6 G- f5 X* f. `- S  y_pred.reshape(-1)
    " C% I, ]) b! b9 D. J( v- m: p
    - `7 R, f5 k1 h  loss = torch.square(y_pred - y).mean()   #计算 loss/ Y# V! b$ Q+ f' w  n
      losses.append(loss): F# x, Z( U5 a' Y
      
    0 P7 e" |$ a+ W' X$ r  loss.backward() # autograd
      c- ?. C& z$ Q- V  with torch.no_grad():3 i9 i& @) j9 z5 B0 Y, Y
        w  -= w.grad*0.0001   # 回归 w1 T# p* E. L5 M: b/ b
        b  -= b.grad*0.0001    # 回归 b
    " S3 D! @) K) i  w.grad.zero_()  
    3 @/ M* ], f- A% ?5 j0 g, M1 U  b.grad.zero_()
    4 K' x9 j9 ]" j- w( ?3 c# ~; }3 x& m! o# s) v; T2 l5 G" D
    print(w.item(),b.item()) #结果
    " d8 a% L  }5 ?3 u5 m9 B3 \% c* W& [$ S5 i: x& ?- d9 `
    Output: 27.26387596130371  0.4974517822265625
    2 Z" u9 r8 c' X. X+ f----------------------------------------------# H, {3 V, B8 ~$ d
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    , ]' A6 o2 A2 P8 ^高手们帮看看是神马原因?
    + @) S) D  A5 X/ m2 M0 V

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 5 s1 P& n# C& J. \; ^  ^: r- r
    # M" C; @. ~2 ?+ X. b; E6 u% C2 G
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?; g2 J; }. J3 Z2 ]
    -------2 R% o# `6 ~) ^1 O9 N) x
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。* D# \4 i9 C+ ^2 ], A
    -------
    & J! ~) v) G4 F  O( [: 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
    ; a6 J, w4 \% F' {6 x没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?- y$ ^, _: j$ Z' S0 P
    -------
    $ w4 n# D5 ?5 Y4 _不好意思, ...
    % b1 V6 O/ |# i
    谢谢,算法应该没问题,就是最简单的线性回归。
    6 Y1 c! {2 l; P$ O' v我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 1 Q8 P0 c* N$ @! S- I0 A! {% n$ L
    雷达 发表于 2023-2-14 21:52- N! ]) H6 B$ R% {
    谢谢,算法应该没问题,就是最简单的线性回归。  F$ j- a5 v4 `4 f$ x
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    7 z( t5 Y' p# s; x2 \, u2 v; e. m# d* E3 ^
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    7 `0 }* ^' ]! {  Z
    5 n5 g6 b; C. H, q7 P7 _或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    . F. Q4 G& k* q
    老福 发表于 2023-2-14 22:002 H% V+ W: {* y. x
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    2 e! _! F4 f+ |- s  ^/ s& c6 U# r" ^; _" p3 O5 H6 e8 I- ^
    或者把b但的起点改为1试试。 ...
    8 A6 U) }& _8 f* o2 p0 A. z' Z/ e
    & @+ S, T) E  O8 L8 t
    你是对的。9 M3 E7 o' u% Q. C
    去掉了随机部分  d* z0 I1 p" \* q6 ?
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)& X  q) U& I* s( `/ g8 N" F6 N
    y = (x*27+15).reshape(-1)
    9 C* v, ]  i. j6 N2 Y! u! [
    - ^( {! \8 `2 v' G循环次数加成10倍,就看到 b 收敛了
    * S* W" D  h; |& t) R5 s/ K. uw , b
    2 T% E, m& o4 w) ?9 n8 E6 s/ g" i9 s27.002620697021484 14.8261671066284182 ?3 `( x( z# w5 \& R! O7 q- B
    & Z3 T( b" O: K8 y
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-20 07:43 , Processed in 0.056938 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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