设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    1 Y- P8 j  D$ U# U7 {7 s- I/ x. i$ N8 i6 @4 T: Q6 _* \( S; L
    为预防老年痴呆,时不时学点新东东玩一玩。+ Z' S- {/ U: m4 ?  ]. e
    Pytorch 下面的代码做最简单的一元线性回归:& i" w& y& e- l2 k/ d! L/ _9 O
    ----------------------------------------------# [8 ]8 _5 i; E# a9 X: \
    import torch
    % H# Y+ u/ [3 I2 Y0 q4 S2 Kimport numpy as np
    & ~3 E1 g! @* Wimport matplotlib.pyplot as plt! E  D! e2 q$ S! _2 a/ Z
    import random
    5 b) R' k5 ?- y; F2 |  {: i: V, u% c, Z
    x = torch.tensor(np.arange(1,100,1))
    ! U- R8 _9 d* |3 g! N1 J6 Ty = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    0 U8 U7 W- L0 v0 }$ Q; {7 f2 x/ n6 L7 e- Y1 S, \; q/ F
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b# f% K" k4 n, Y# a9 V
    b = torch.tensor(0.,requires_grad=True)
    # ~! Q8 d" M, |9 _
    , n: p, F% m4 Fepochs = 100
    # m1 F" ~1 N4 ^. u' \- n6 A& H9 [* s1 O- q) O
    losses = []& p( o( [' R& U; S) ]6 V
    for i in range(epochs):
    ) y- w# g7 |: u' z+ x) W  y_pred = (x*w+b)    # 预测
    . |0 E* ?6 u/ O* \2 [8 j& I& H  p  y_pred.reshape(-1)
    2 d9 D6 n+ t# W2 [9 ~* A1 r( g' v   Z3 v" H3 }+ I$ g, m8 L
      loss = torch.square(y_pred - y).mean()   #计算 loss
    ; f6 t1 W# T. F( _1 ^  losses.append(loss)
    2 q- ?  c# D0 w2 x; {$ N# s, \  4 _  D8 k/ @7 c- o+ d2 v- w
      loss.backward() # autograd0 p6 D  k, M) q7 G0 q
      with torch.no_grad():0 [6 D$ n. q6 r0 d5 c' o
        w  -= w.grad*0.0001   # 回归 w
    * \" B3 s$ Z- Q0 z/ ]- \$ P    b  -= b.grad*0.0001    # 回归 b
    2 n1 ~# l2 q: L- s. m  w.grad.zero_()  
    ! v/ O( p0 l; T. {7 o  b.grad.zero_()
    6 q! q: h, l0 d4 z  W, t0 \/ l7 S# A1 @) W- H' o1 P
    print(w.item(),b.item()) #结果
    2 p2 h7 Q2 Z8 r" n: d/ Y3 y. `9 e  d1 q( v6 A
    Output: 27.26387596130371  0.4974517822265625
    2 ?; w+ D9 I2 M) x1 r8 r. x4 D----------------------------------------------* T5 }4 S1 O% `
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    , k2 D3 O  E5 m& I1 s3 y( ?* ~6 Z高手们帮看看是神马原因?$ r/ A/ t# n3 K$ L

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    2 g) i3 Z" b; T0 P
    , M) U, S: s' A; \; G  P没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?. |9 Y1 r0 H6 L) o1 h6 Z
    -------
    5 E3 d3 ^& Y& V/ M8 A+ @  I8 [3 K" m不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    5 ]) q; O  @6 {$ ~1 J-------
    1 t: Z: w" Z+ _  L6 R) |$ T8 {算法诊断部分,建议把循环次数改为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
    0 C( H8 @" ?) e& ?9 h+ H1 Y7 d没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    - |# l# _# m, h-------
    6 f8 H4 ]8 c, B$ g4 d; e  u不好意思, ...
    , b" c1 t3 H: R
    谢谢,算法应该没问题,就是最简单的线性回归。
    , H4 \, e+ Z) D( M; E1 P我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ! K7 o) L( \1 a7 Y* S
    雷达 发表于 2023-2-14 21:521 \' }( r1 U" U0 R) R
    谢谢,算法应该没问题,就是最简单的线性回归。! X* R) Q9 F5 ]+ r9 J0 z+ F; g. W
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    - k% z. s; l$ n3 P1 F$ }9 ]

    . y7 ^, K+ k. _, j6 [0 [; R/ Y( C& J刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ' m% v* _; j1 `" ?+ v1 Z7 e
    1 w/ J7 V, D: f6 S: O: _或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 * o/ }/ ^0 @' M" R+ z4 j. A
    老福 发表于 2023-2-14 22:00
    0 e" ^5 D. P  }  t, {9 P刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。. {( }$ [: d7 P9 \
    6 Y/ W* L$ H8 J' {
    或者把b但的起点改为1试试。 ...
    7 L2 f$ Y# q+ Q( y, @# k

    4 H3 K. d+ V- q( J7 v你是对的。/ g5 k. x8 Q/ k  u( Z
    去掉了随机部分' H4 S2 g  G; q- w1 n
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)+ d8 w" ]& H+ O
    y = (x*27+15).reshape(-1)
    ' V: w; y$ F7 F6 M# y" B4 m
    % p" m' L4 B5 w, E) s" ?循环次数加成10倍,就看到 b 收敛了
    : |# _/ o. b! @0 |" ]/ F6 _w , b* d% v- Y9 [: u  M6 {! [
    27.002620697021484 14.8261671066284181 b5 ^' h* ~. I3 E4 S
    4 s- c+ e5 A* ]9 p  K8 y
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-6 06:13 , Processed in 0.066448 second(s), 22 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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