设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 ; [% q$ }9 y# m/ o2 t6 T& O" \

    ( t! e6 F7 N5 b( d为预防老年痴呆,时不时学点新东东玩一玩。
    0 `0 v% w6 k$ }9 n: \2 U# m  G) `! ePytorch 下面的代码做最简单的一元线性回归:
    0 ?3 l4 F- s! J, _( w----------------------------------------------3 c  L5 J' Z( Z# g" q/ f
    import torch2 u3 u. d0 X) I; e- `" W
    import numpy as np
    : g. ]* S/ m8 P5 A, \/ \import matplotlib.pyplot as plt  n8 n' G" @% U9 r! T/ G6 \0 _* |
    import random
    4 i" V" k* v! s- R6 b
    * W6 v! \/ R* a( ~x = torch.tensor(np.arange(1,100,1))6 h, ^9 E5 w7 l: q) b
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=157 J  r6 }! n; C! o
    - `, o  T& C- f& f2 v% ~7 a
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    ! t3 B  m  F; S4 r2 m4 Tb = torch.tensor(0.,requires_grad=True)/ p9 q9 o1 o( P# A$ F7 g$ ~- \9 u
    9 a* z; B# T3 {; V  j' B
    epochs = 100% P/ L. |- K5 N" |! H

    ( ^/ e  Y" @; flosses = []2 I# O9 I) @- v, Q. J* M
    for i in range(epochs):
    0 }; w3 i1 `& m  y_pred = (x*w+b)    # 预测2 r* Z7 c: q( N7 V4 I
      y_pred.reshape(-1)* j7 Q$ I- S/ H

    . b, e& K8 u2 ^9 O% N. @  loss = torch.square(y_pred - y).mean()   #计算 loss
    6 O* j* r+ p; b1 X# f& [: G# J  losses.append(loss)7 |! t/ z! Y$ P( U6 d
      
    8 X1 t/ ?/ A3 V6 y  loss.backward() # autograd
    - p& q+ [5 f/ c) A! |; Y* h  with torch.no_grad():
    - I4 I* D7 I+ d0 P( r- h6 D( f2 W    w  -= w.grad*0.0001   # 回归 w9 t$ A: z! F% Q8 Y
        b  -= b.grad*0.0001    # 回归 b
    , J1 p5 {8 L: b3 i, Y: i$ W  w.grad.zero_()  4 [# j. A) `' H- s: e, A$ o" n: D4 o
      b.grad.zero_()5 V$ \- y2 `# _6 z
    $ V; w: \! K8 O
    print(w.item(),b.item()) #结果
    % b6 H( R  A: Y! d+ Q' S' j7 U5 J8 V
    Output: 27.26387596130371  0.4974517822265625) h" R5 L$ U" y& d6 a3 Z
    ----------------------------------------------
    - D- j- Q: |( h7 U! P最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    ' R+ E* F& W* `2 @3 z9 |0 N高手们帮看看是神马原因?  V5 m$ |! b! |

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 9 m4 N+ ~2 y1 {5 q0 b0 @
    7 J1 r" W5 @$ {4 f$ T+ s# |
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    & P2 Y: }& G- T' U, f# P-------( K/ L; k- l6 X
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    ) Y3 S. ?# W7 B. _% C-------
    ; Q" I# O- X6 h7 w5 N+ t. z算法诊断部分,建议把循环次数改为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& L4 w# q6 P# J1 c* @& y- s$ W9 w8 M
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?" Q* |" o+ A! ^: }! p1 q/ r
    -------" I$ p# u" u0 K9 R- v
    不好意思, ...
    1 v: ^5 S9 n/ }
    谢谢,算法应该没问题,就是最简单的线性回归。- ?2 D0 [" f2 k0 F/ J& R
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 * O/ j% c) X8 F% f. G* f% ^5 z+ a
    雷达 发表于 2023-2-14 21:52. @' Y9 R& c4 j: o4 R7 f# ~
    谢谢,算法应该没问题,就是最简单的线性回归。5 j- M8 a  C3 T* M6 u6 x
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    4 t8 `6 A1 l8 K3 x) w
    + z/ V5 U- I- D5 U3 k) B+ [# F刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。. i+ |# m; Z  M- b
    9 a6 K; i$ M7 A0 q: s6 p
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 , J8 i; @: q2 w: t9 ~' E
    老福 发表于 2023-2-14 22:00
    / R  [- x, y2 w1 ]& J( \8 V* \刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    3 e4 T) J$ x1 t6 }  I
    # u; g. s& ^9 d) k2 w或者把b但的起点改为1试试。 ...

    * }5 t) T+ |) B, M- ~2 O, U9 e1 y/ f* r8 ^; j
    你是对的。' k6 D( C) d0 p0 \
    去掉了随机部分
    $ C# `' R9 C$ |6 k1 t  n7 h#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    . H  m; F) e! `" R+ Zy = (x*27+15).reshape(-1)
    % @2 O) X) T9 T% Z7 @
    : |$ P7 q* P; \) ~循环次数加成10倍,就看到 b 收敛了
    2 o" `/ g- W0 W/ H/ @9 [' o  Yw , b8 X5 _; ^# }& a6 _
    27.002620697021484 14.826167106628418
    & ~2 g  B* j& @# L' l& H
    6 D  s: |# E3 l# f4 H+ V和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-15 13:25 , Processed in 0.058199 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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