设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    : Q; v4 Q$ d/ S! H" }( R3 z. m
    ( a2 ?' b. }' \; N; z$ _  |为预防老年痴呆,时不时学点新东东玩一玩。/ r* f. G% u3 T3 l) C5 ]
    Pytorch 下面的代码做最简单的一元线性回归:
    , J" N* M9 ~* _( E----------------------------------------------
      y" h) z' c/ i; o  ?import torch/ l9 _; w1 {6 u# ?# y# t+ w
    import numpy as np0 U# \1 ]# x# d7 U# I, F
    import matplotlib.pyplot as plt
    + j, x7 A1 M& h- b4 [import random
    $ ?. a7 ~$ A; t. a0 n$ g
    * V& n1 C2 ?5 s0 b2 u- V% [x = torch.tensor(np.arange(1,100,1))1 w0 e9 `2 y, h5 G- ^0 H
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15* e8 G% G0 ^0 i0 z9 [
    ! n* _; Y$ T+ _$ W6 d( D$ ?0 p+ I" R
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b$ k. `5 p' q. t" A. z. m$ Z1 Q+ I
    b = torch.tensor(0.,requires_grad=True)
    ) @8 l1 w, c8 i. _. T$ e
    : g/ M( ]5 b1 H/ H! X. Lepochs = 100/ X5 P  i. v) T5 l
    ) O5 E7 N/ d* f- g. T
    losses = []0 q& j4 h) B$ h0 ~8 f
    for i in range(epochs):9 m2 Q& B, p2 y6 g! ]8 v
      y_pred = (x*w+b)    # 预测5 n, d1 Q9 X8 T
      y_pred.reshape(-1)) f- ?7 t& B! a% q
    # h  n0 Y$ ]$ Q' q* w
      loss = torch.square(y_pred - y).mean()   #计算 loss) G) X! i2 V5 K' g
      losses.append(loss)
    4 w! ^+ e9 W' G9 h' f  
    : X: J4 n% W5 E  loss.backward() # autograd4 K# S7 F) `4 {# D( U
      with torch.no_grad():3 u! n( Z4 L/ \2 e
        w  -= w.grad*0.0001   # 回归 w
    2 }( z+ [0 [  f; F- {5 q  Q    b  -= b.grad*0.0001    # 回归 b
    1 q% S0 D2 d# S( a! u  w.grad.zero_()  4 U# [, q) a% }% t& P
      b.grad.zero_()
    5 x  a# w3 [) X6 [7 F/ b/ ~: q' c8 D9 g0 p- t
    print(w.item(),b.item()) #结果
    & T" s+ V8 |& ^+ K0 V1 |- |/ B6 |
    ; e* s1 l  `& q/ x* z$ m" _Output: 27.26387596130371  0.4974517822265625
    & O% T$ _0 L6 d9 c8 U----------------------------------------------9 y) x4 `, z! ~7 z' U- Z9 O
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。# P( P7 j9 K! p/ f  I4 l
    高手们帮看看是神马原因?
    - n! s7 Q( t6 r' B, {, r2 f) U: F

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    9 S: H; Q- h  a0 _3 \# z  h/ J( W: C4 o: z# G, Y) f
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?+ {+ {& Y5 l) _0 F! m
    -------7 D& G5 y: i5 E" U. D
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    # t  H6 t! r, U; q3 |-------
    - y% t' y3 s, e. @算法诊断部分,建议把循环次数改为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& F& f* X& |% |3 C1 q没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ; [$ r" |% F+ r" F; B-------
    9 A1 `0 V, k8 A" m* S不好意思, ...
    5 J0 k4 H* M- j2 P
    谢谢,算法应该没问题,就是最简单的线性回归。( t4 X8 q- f# _) y6 z0 E
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 8 A8 E: x. f: G6 J( A- Y) m% ^2 t
    雷达 发表于 2023-2-14 21:52* \' ?! @& C8 z! V6 O
    谢谢,算法应该没问题,就是最简单的线性回归。
    6 h, k/ t% M0 G+ O8 |! a我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    2 x; S! D9 ~1 }' H0 }: o& R" _9 F# [
    6 ]9 c: g6 K+ X# V刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    - e- y# R4 e1 ]# r0 V5 C( E3 S% ?7 q3 t% M
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    * y. k  S8 }& d" |$ A2 |
    老福 发表于 2023-2-14 22:00, f- P# D' \0 M, p( k4 R
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    " k' r3 A1 f$ t: E+ n  x  {
    + _+ t% f  K& u0 |2 ^- F  |或者把b但的起点改为1试试。 ...
    ! M" q. m4 \! a
    ( ^8 m9 a: B- Q  t7 ]$ p
    你是对的。% R/ h( W9 \! F
    去掉了随机部分
    : C0 o) q# C, d) l+ @9 C#y = (x*27+15+random.randint(-2,3)).reshape(-1)0 c0 W$ }" E- `; ?0 j
    y = (x*27+15).reshape(-1)
    , a6 Z# m! @' R1 R9 P2 ~' j9 V; ^; E
    循环次数加成10倍,就看到 b 收敛了5 v% _# }6 S  D+ D: B; `
    w , b8 }/ i; f4 j# g+ O5 S1 P  N; v5 z+ i0 Z
    27.002620697021484 14.826167106628418
    3 B1 i0 f$ X; k1 }% u7 h( f& l; K& H! V% D
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-22 05:21 , Processed in 0.074737 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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