设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    & {  H, x8 E" j- |  T8 {9 v7 v& _0 j
    为预防老年痴呆,时不时学点新东东玩一玩。
    ! H1 V8 b; Q" Z9 f6 I/ ^Pytorch 下面的代码做最简单的一元线性回归:. _  d6 Y! r* |3 \
    ----------------------------------------------
    9 x. Q( U7 ^0 u" g# N. g: pimport torch
    8 G- [' O% i. r4 S9 ?5 B' I1 \import numpy as np* _7 ]. \' r- z3 v0 x6 c2 \
    import matplotlib.pyplot as plt! O. j1 ?3 g" S
    import random+ D  i5 H6 m, f
    ! [& T% @/ y% c- G6 ~9 l
    x = torch.tensor(np.arange(1,100,1))+ f/ V2 K$ r' I% h
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=150 q: D( `8 J6 R& V/ x# f# e4 ~/ o
    1 O2 k, o7 K* P& {4 ~$ K
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b. N+ I3 ~, N7 H
    b = torch.tensor(0.,requires_grad=True)/ O: Y1 S" [8 D9 {3 S5 p
    $ s7 P. w  l9 j. `* M! p# e
    epochs = 100; y/ i( s, u- i4 E
    0 U- D3 q, P# I0 B0 G3 Y
    losses = [], ?; |2 \3 p! o& A9 `
    for i in range(epochs):
    5 z; N) f6 ?8 \  y_pred = (x*w+b)    # 预测* U; N  Z7 t8 J+ o3 |
      y_pred.reshape(-1)3 X. \* r# u1 S
    . r5 e1 n: W5 L' n  B( Y7 ~# ^
      loss = torch.square(y_pred - y).mean()   #计算 loss) x) n/ W/ c$ d/ e
      losses.append(loss)4 |- w- {1 b* ]( W9 @2 B% f
      
    5 K4 t" |5 f) U( s. O  loss.backward() # autograd
    4 q8 d5 x* t$ \# a% F  with torch.no_grad():
    2 h3 k# z* C8 w% @3 J) O+ G    w  -= w.grad*0.0001   # 回归 w
    . z" j* ^; h& }% [* p2 @    b  -= b.grad*0.0001    # 回归 b
    7 z0 L2 h* R+ Q- _. {2 T( t  w.grad.zero_()  
    8 T3 \+ T8 j: S, M  \6 Y- x, u  b.grad.zero_()" J6 \" ~4 R3 j* u+ Q3 o# J
    ; Q; t( b9 L7 I! o8 E& R) Y" G
    print(w.item(),b.item()) #结果
    4 O' Y  }* L; u8 R' S& m) |* `( D3 K- A7 F3 i
    Output: 27.26387596130371  0.4974517822265625# h2 ^0 o$ n8 a9 z
    ----------------------------------------------
    # Q! I" S' d$ Q5 M  A最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。% ~% g; m) w6 c% e" R: _" T
    高手们帮看看是神马原因?
    ( n) Y! t& h4 s. I1 s

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    # s) p8 m! o8 ?- @  B9 i; `2 E$ j5 r* W# l/ |9 b9 w
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?( \3 G# _$ z4 u6 F( @/ U: X
    -------7 V6 }* `& r% O% P6 C2 K
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    6 M2 F2 q3 G2 ^5 c' Q-------
    . c. s$ N. D" O0 A8 \1 Z7 j7 T算法诊断部分,建议把循环次数改为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
    , y$ h" d2 y$ z  m$ ~没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?+ B7 {! s5 w' E9 w0 e8 M
    -------+ F6 O! N- C" g1 e
    不好意思, ...

    - b0 a6 o- y+ }- @谢谢,算法应该没问题,就是最简单的线性回归。: X! z% {% {- m" l+ Q8 T4 a
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ( \  |9 I, Z8 {/ z! U* v+ G, i
    雷达 发表于 2023-2-14 21:52- H9 w7 T$ a% u5 y: D# _' k2 y
    谢谢,算法应该没问题,就是最简单的线性回归。
    3 t8 W0 O  ~" E) F; H我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    4 z5 O: [  F0 z, ^: M' s
    : w; ?- f# O# J3 l$ ?. u刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。2 p" Y9 B. W% f% q7 B
    * B* p! Z3 ^+ e1 t, ?2 b
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    4 O. Z3 v3 a- V  s3 q
    老福 发表于 2023-2-14 22:004 m! c  u) y$ V$ p& z% W& k
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。7 U  Y8 F, H# e; O
    2 t* B( S% j; [0 p% k2 C
    或者把b但的起点改为1试试。 ...

    # j- c" [+ [3 m5 x# w, B, B) w3 @7 W- U) j# F; p' T
    你是对的。# m* i$ g/ {2 m; w
    去掉了随机部分% t; o1 g+ R2 `2 l
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    * v1 }, K& n6 E' ty = (x*27+15).reshape(-1)# V" y' [% J$ d" t9 K" [
    . n1 S- @: p/ v' L9 {
    循环次数加成10倍,就看到 b 收敛了' ~& ?( V# n& d7 {2 E8 P
    w , b2 ]4 X1 K1 B/ b6 M* V, C- ]
    27.002620697021484 14.8261671066284187 r0 P* w* S, v  M
    - @$ p. M7 W3 s, R' `( M7 W' F
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-30 14:33 , Processed in 0.058287 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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