设为首页收藏本站

爱吱声

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

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

[复制链接]
  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 / v- s8 {3 N$ R, p# f+ f8 c5 x
    % Z; s$ u6 E4 O$ o
    为预防老年痴呆,时不时学点新东东玩一玩。
    $ Y2 b. m* z) ]% F& J6 Y& o, |Pytorch 下面的代码做最简单的一元线性回归:
    7 V$ i$ R$ q. M7 r& ~----------------------------------------------
    * h0 `2 E: f( }% H" b1 u. Z, ~- }! fimport torch# O; s6 W* A; X- ?8 x
    import numpy as np$ i; ]) O/ b" I0 t9 b: q4 _
    import matplotlib.pyplot as plt
    2 ]  N5 T$ ~# O% b7 k+ c1 cimport random9 c% ~, z% J2 j3 M8 N

    0 A0 v6 s4 o4 J+ d+ Mx = torch.tensor(np.arange(1,100,1))
    5 F& F6 f. Q0 G+ f9 h! [6 ]8 By = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15: e; a/ |1 K, v; l
    3 w) ?) Y& s' {' c+ Z  F8 K  h
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b: y- h2 h( w. x- v
    b = torch.tensor(0.,requires_grad=True)4 a2 V# T' [+ ~- _& C

    $ f; _! b$ o6 Y5 U8 gepochs = 100
    # y7 d' g# `$ V+ [2 ~! b& x( y2 A5 k% Z" f( b$ P1 |5 i! Z- c
    losses = []6 ^/ i% G8 {* @5 _2 `) E# J* K/ {
    for i in range(epochs):, c2 ~% |, O" _' m$ k, y2 R/ X
      y_pred = (x*w+b)    # 预测
    6 z; V5 r, D# p, }  y_pred.reshape(-1)' r( ~% t: F" X: {+ t
    5 ]+ Q8 n8 w; x( y) {& c
      loss = torch.square(y_pred - y).mean()   #计算 loss! y5 \; S1 c6 K5 R7 s: A
      losses.append(loss)
    0 `2 u  o& T( Z  
    . Z2 t4 n1 X) T  loss.backward() # autograd
    1 x7 Y& _# b4 C  with torch.no_grad():2 }) R9 ]  A2 a2 Z& a4 Z$ k
        w  -= w.grad*0.0001   # 回归 w6 R9 {/ k% C; {) h* V
        b  -= b.grad*0.0001    # 回归 b
    ! n' ^" d. e' S  w.grad.zero_()  
    6 B( F: o+ z, b! ~  b.grad.zero_()
    ( [6 w  i1 |6 y3 j6 F/ z0 x! v$ m1 i9 m2 [1 h0 Q3 S; M
    print(w.item(),b.item()) #结果* ]6 r. z7 }  v5 K9 ~

    1 d, ?& C8 ?# J& d) ?& lOutput: 27.26387596130371  0.4974517822265625, ?& z% s8 O4 b! d
    ----------------------------------------------" m( V7 w: {6 w) O' Y& P
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    9 _* B& c# e* w( E6 V+ {5 ?/ x) H/ V高手们帮看看是神马原因?
    / m3 d: E$ J/ }- z/ o& k9 a- s

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 # l1 f2 Q+ L7 `7 H3 ~
    % w+ x+ d) [2 m' Q* Q" G
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    8 ~: o! n) e4 _9 F4 b% O-------1 |1 w* h. [) U  j( u" r( h" u
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    ' D' O( W( W9 ?: n  u5 s# E/ T* r-------
    ; ?9 Z$ D  _" t  l5 a( r% n2 Q2 l算法诊断部分,建议把循环次数改为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" F9 d- C* G/ |# t# k8 h! V6 O: I! Z没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?. p  i9 |! D; D7 Z  \0 Y) s9 p
    -------
    ) [8 p' z0 ]' c* E& q. o不好意思, ...

    4 Z0 \$ ?) P( x% W4 G  h8 V谢谢,算法应该没问题,就是最简单的线性回归。! J2 Q. C3 H$ r7 A# y
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    % ]. A) Y5 t/ _' b. |) P
    雷达 发表于 2023-2-14 21:52+ v  g9 m8 N% X4 G$ N
    谢谢,算法应该没问题,就是最简单的线性回归。+ S( i  P: X$ ~7 k/ w
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    + k8 E  G# |9 `* D9 F( i- g

    + ?" n& s7 c: z% d6 x8 J刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    # x3 l1 S( v( _6 h. f3 d5 \. ]; G  }" R
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    怒
    2025-9-22 22:19
  • 签到天数: 1183 天

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    / m. y/ [$ L: R
    老福 发表于 2023-2-14 22:00! k& g% |. l) b6 Z- w$ `( R2 ~
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。6 I. ]0 m5 g6 x( j, a6 q
    & q, h  l) _6 j
    或者把b但的起点改为1试试。 ...
    5 w; S/ E# ]3 Q6 ]( ~
    1 ~  S( @4 g9 |$ E  b3 j
    你是对的。
    6 B3 _7 A& y% ~0 ?* D- A& c2 M7 k: \去掉了随机部分
    " Q" |7 Q1 o  }; Z#y = (x*27+15+random.randint(-2,3)).reshape(-1)" Q: E9 F, I. q. B! W
    y = (x*27+15).reshape(-1)
    % h, G7 g3 z4 L( Y0 L2 V8 E" O" g: D& j5 T
    循环次数加成10倍,就看到 b 收敛了
    9 r9 N1 ^  g- F& [6 `" o  Q; |w , b5 T: S3 j7 a  j& b6 I# F
    27.002620697021484 14.826167106628418
    / ^9 T$ x" s, @: n, v
    * {! ]# f+ Y  ^* B+ j1 ^和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-7 11:52 , Processed in 0.057952 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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