设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 : g) [7 v. `" J; O+ i7 H* A4 `
    , _. W9 y5 B) b2 t
    为预防老年痴呆,时不时学点新东东玩一玩。* {- a, K2 M: t1 S+ o
    Pytorch 下面的代码做最简单的一元线性回归:
      a' E/ d& d8 h: p' z----------------------------------------------# N7 v" l, F( S5 p) }  n0 U
    import torch% i5 u# i8 p$ r. I9 @$ D8 J
    import numpy as np
    $ H% Y3 K- V3 fimport matplotlib.pyplot as plt
    4 g# i2 {0 g1 [0 q* C+ Qimport random' n/ H& B9 Y" \6 F
    # ?. D( [$ X8 O8 v9 O( S& x* ?: U; f' L
    x = torch.tensor(np.arange(1,100,1))* Q& b( R0 y2 l7 e0 E
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    7 g9 [! z3 Y% H# V3 f, Y1 A
    ( N5 T+ H$ W+ a3 H) I; P* ~w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b; |+ y  g' y% f: U( n7 B3 @1 B
    b = torch.tensor(0.,requires_grad=True)3 ^$ \3 Y2 }* g* u8 R! Y7 O
    1 d( |( T% _0 m" ]
    epochs = 100
    - w# v  \/ e2 d# L2 G1 q% \0 t! I1 b/ Z6 L$ J
    losses = []" S. ?+ F  H) b6 X6 [  H
    for i in range(epochs):
    . N. z, g: S+ J2 P  y_pred = (x*w+b)    # 预测9 {: s  z$ |! P) g! h  m4 O
      y_pred.reshape(-1)
    ; z! q2 i- b/ m9 z. m. q: N* T1 W) H
    9 E# g9 T& ~) F5 V  g  loss = torch.square(y_pred - y).mean()   #计算 loss
    " N0 a% p3 B% ^9 t3 c* x) o/ o/ l  losses.append(loss)1 s. H4 x, c$ m
      
    ' j3 @0 f7 l* [$ h( c  loss.backward() # autograd- z3 s7 `! V# X& d7 h
      with torch.no_grad():1 J5 L- |# e) k, M7 K, R2 z+ C7 A" e
        w  -= w.grad*0.0001   # 回归 w+ ^! A& J. I* T! z3 G- f4 o& A
        b  -= b.grad*0.0001    # 回归 b
    7 b2 t% v3 x) k- A$ d, f9 h* Q' z% C  w.grad.zero_()  / p! v- _- c1 \
      b.grad.zero_()8 \3 {2 ^2 |7 ]/ j% \

    + y6 {) Q- {. u, H" y; Z* U7 `, vprint(w.item(),b.item()) #结果
    # ~) h1 ~; D. T# y
    . p* l. l; w8 m: q  l/ v, p; fOutput: 27.26387596130371  0.4974517822265625
    * ~) I- {8 }' ~0 s6 ~# a6 B/ H) S2 u----------------------------------------------
    ' U* B: N, U* u0 m! p3 N) ~最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    8 V& G4 @! V5 U, ?* b; ^3 J- S" R高手们帮看看是神马原因?  H+ X( w! H& X, t) X

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    & Z. Z; k, L% r4 L; D9 l  S- m! W( ]2 x1 P8 }* v+ K
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?' I6 |( p( x" }
    -------0 k& R' ]6 B2 O' W9 _" K% Q( T5 k
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。. f1 Z. O% A2 `  e4 {7 @; E
    -------9 f+ ~( A2 C0 Y0 [+ c% F
    算法诊断部分,建议把循环次数改为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
    4 y" e+ f5 a$ t2 p' R没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    6 b) Y& [7 Y8 J& B0 c8 g3 N' K-------
    + |- s: r1 P0 _: I不好意思, ...

    + j# c  ^+ d/ c* ]' j谢谢,算法应该没问题,就是最简单的线性回归。9 h' E* j: J$ S1 L$ s' i
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 1 J! C/ Q' x/ a9 c
    雷达 发表于 2023-2-14 21:527 v$ q) {8 r* s- m% M3 g5 K" a
    谢谢,算法应该没问题,就是最简单的线性回归。, T8 B1 ]: e- W! ?/ c0 @) {+ u6 U
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    . m2 P, w+ e% [# ~+ h# j" y6 r' t/ F
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    $ z. S2 ~" y9 ~4 x
    , _5 C! r7 S$ p1 U或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    8 a% g3 X, L, p# `; [- i$ u
    老福 发表于 2023-2-14 22:006 `3 L3 _; |0 W0 `, B1 z9 L0 z) e
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。4 c9 H  [$ K- e1 x

    $ x2 B- c' H% q8 F# \8 B- w或者把b但的起点改为1试试。 ...

    ) h5 j. J9 F( v" a# p
    0 \/ V0 t# ~6 |# ?2 j: W& B你是对的。
    2 N& h  B3 w- `0 r5 |- u( A去掉了随机部分
    + A- Z' g" @/ l, ^2 Q( q#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    1 ]: P* H& _2 {8 Z" j3 L8 b! uy = (x*27+15).reshape(-1)4 Y0 z, d- W& p5 i6 A& H" m; t
    3 y/ U" E  f9 J& a' R  A6 x
    循环次数加成10倍,就看到 b 收敛了
    % M1 z/ O! W! Lw , b6 E' }2 B7 J! Z' A' Z0 G% P3 t
    27.002620697021484 14.826167106628418
    ! j: n" I9 F" ]7 {0 R' E
    : a2 }- a8 u+ d0 e- \0 D) H: M  m0 E和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-9 14:02 , Processed in 0.066648 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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