设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 % @6 {6 v, B" M6 N3 b
    ) {% J# P, t) ]% j) b6 ]5 E
    为预防老年痴呆,时不时学点新东东玩一玩。
    , E9 z2 b4 H/ ePytorch 下面的代码做最简单的一元线性回归:
    ' Q, I5 E, |/ ~----------------------------------------------3 t1 h( }2 k3 e% ~6 a; }  _
    import torch" B' f* G1 S, t9 I! H+ q8 M
    import numpy as np
    2 z* d# g( O- Kimport matplotlib.pyplot as plt
    * n& ~$ \0 J" F: H9 `1 Wimport random
    3 s4 V" W+ F# S6 z4 a, b
    7 C: c: u& b, D# G. t; x  tx = torch.tensor(np.arange(1,100,1))8 C4 A% ~) d. N( {0 U
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15+ T4 [8 B: K! S6 G" i! p* e

    / n# @* a. E& Y* y5 h8 Kw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b0 H  @2 X6 u, _& ?
    b = torch.tensor(0.,requires_grad=True)
    % c% O8 t/ @! O: o4 x0 L5 O* s7 a# v, G9 Z8 O
    epochs = 100
    0 Q9 T' v# N2 ^8 s2 i' k% R6 Q* [7 G) q$ ^1 |& H+ L" A
    losses = []
    + Y6 H6 d6 y5 M3 i2 {for i in range(epochs):5 O0 c- Q& A2 A1 I1 O. _' s  w1 B
      y_pred = (x*w+b)    # 预测5 e+ r5 X+ {: V, \  l
      y_pred.reshape(-1)3 ~1 D0 x- o. B0 g& W
    1 [/ K* V6 O8 A* l
      loss = torch.square(y_pred - y).mean()   #计算 loss
    ; z/ M- ?0 C) I3 F) R  |  D! {, I  losses.append(loss)
    7 L9 i( T( A$ D9 }2 s/ E  
    % f, }5 Q, K2 ]! S6 N, O+ K! [0 u  loss.backward() # autograd
    $ {0 }' j1 x7 E9 \( `  with torch.no_grad():
    " [) h0 _2 \8 y- h    w  -= w.grad*0.0001   # 回归 w' f7 ~8 p: _0 b" s6 T
        b  -= b.grad*0.0001    # 回归 b : [* k) M" L& k" \: K6 |
      w.grad.zero_()  0 ]& d. o- x" s
      b.grad.zero_()
    , A& a: g; z4 g5 A! \2 K
    . q1 `4 l$ M6 k! d6 Jprint(w.item(),b.item()) #结果
    4 ]7 }2 I4 S' S0 O* k- |. Z) D# J* [- P: O/ j" A
    Output: 27.26387596130371  0.4974517822265625* L- o3 ^$ t0 c
    ----------------------------------------------
    9 ^8 k/ r# ]8 D, s. j最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。: s+ d& e5 o9 d6 n7 I5 g5 J
    高手们帮看看是神马原因?1 P) y2 e3 F) q. Z8 _& `/ D

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    " l' I: j4 L8 F! \% m2 f9 m1 s1 t( e$ s
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?1 v) n# x+ J" A8 ?/ r; B
    -------
    7 v0 x4 K" A% t4 Q不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。+ D3 x& ?& E  c2 p6 V5 e, Q4 g7 L
    -------
    0 k$ O0 P  F: n* G算法诊断部分,建议把循环次数改为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
    8 l0 Z; b1 H# k( |没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?0 W$ c5 O% [& j# x2 ~0 W
    -------
    . \3 a" |% [' |  D( o6 ~不好意思, ...
    " F) S2 y1 s& `# t. f
    谢谢,算法应该没问题,就是最简单的线性回归。
    - d0 w$ D6 Z1 e  X0 _: p我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    + p# m2 i. i0 U1 n+ A
    雷达 发表于 2023-2-14 21:52% G$ k) n) E7 I) b
    谢谢,算法应该没问题,就是最简单的线性回归。( N! n# k7 @6 O. t
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    / s# o+ t. `8 A/ ]. q% r! S
    4 h6 Z6 L# K( H( I% Q刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    $ s# {- w9 R! v' a  w( x/ [* L- S- N
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    1 j$ g. O7 _: t5 d7 I. C8 e
    老福 发表于 2023-2-14 22:00
      Z3 \. Y4 _' R# x5 P  J, s* f刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) k! o( D# F3 P' l
    - }& }' S1 ~$ ^: {或者把b但的起点改为1试试。 ...
    2 E5 B/ `) l9 ?

    ! [0 R& F7 f3 x/ D4 G+ G! ?+ Q你是对的。8 q: i0 I4 }. q/ Y2 C% U! W
    去掉了随机部分/ }7 o- i! I2 l# J# Q
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)0 e( x( {4 n2 w$ t, j
    y = (x*27+15).reshape(-1)# b8 D$ t, t; B# [

    " b& I3 l3 K' b+ Q, C2 B9 b循环次数加成10倍,就看到 b 收敛了$ \' [3 m0 E& s7 ^, y5 P6 v$ T
    w , b
    & i3 ^* h4 s& a' F8 A; l2 V27.002620697021484 14.8261671066284181 Q0 l: f- e$ B4 E: Q( a
    . Y; Z: ~; a5 }' r* Y
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-7 16:14 , Processed in 0.057514 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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