设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 # u" r; j) q. {2 c5 s% E1 K

    % {- \) A: W% f1 {5 I( h为预防老年痴呆,时不时学点新东东玩一玩。
    ( J/ o2 R$ m- W1 X3 T: e4 aPytorch 下面的代码做最简单的一元线性回归:. p3 \8 M4 i$ B# w6 G' B% q% `
    ----------------------------------------------( a! h: E8 l' X7 c) l1 l$ @1 N
    import torch  A0 C' J! d6 z/ |/ l7 m
    import numpy as np
    $ z, Q$ H# D( x6 J9 ~* N" ~, ximport matplotlib.pyplot as plt) h3 y6 a' Q# L3 Q. |5 j9 K
    import random
    0 b4 U: P  D+ @. L8 l% c4 H3 j8 _2 M$ X7 ]$ u( t9 ?- x; I
    x = torch.tensor(np.arange(1,100,1))
    # B( p1 {  x3 Y. {, F: ^! C9 ^y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=151 r6 k+ t1 m# m7 X) h# ^

    3 g$ O( S" x) q4 D5 F% _+ Ww = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b7 D( `  ~$ D2 j- g5 }( p
    b = torch.tensor(0.,requires_grad=True)$ n) x5 C2 v' y+ \

    0 d: D* T, l% x: X6 N8 Repochs = 100
    & V$ D3 R6 ^& K) k6 _/ P' |# U5 r5 u" S5 l/ X  b
    losses = []* `7 R  V& Z( L1 p* n
    for i in range(epochs):& X( I) i3 F* [
      y_pred = (x*w+b)    # 预测- M1 G# ~/ c) p8 V8 t% X& G
      y_pred.reshape(-1)
    9 g8 ]& b/ M) e: J( r* N. J5 S2 v7 ?
    ! i* w7 t+ `1 s  loss = torch.square(y_pred - y).mean()   #计算 loss
    & }8 v1 R+ W8 j2 X7 ]' y* y  losses.append(loss)( G5 N! c2 q3 ~0 H7 X8 A! h' y
      
    8 O# h' ~2 o7 i" Z: q: o  loss.backward() # autograd
    ) _+ w7 O3 k0 m3 C7 D7 ]. k7 k  with torch.no_grad():
    0 Z- m; u9 j5 H2 [: c" g- e% k" l5 q    w  -= w.grad*0.0001   # 回归 w2 l3 b; j1 g2 I* w" y# w+ e
        b  -= b.grad*0.0001    # 回归 b
    7 {2 z4 h- q7 ]& g. R5 W6 x  w.grad.zero_()  ' y8 [+ _- F' j. O
      b.grad.zero_()
    $ O* |$ T4 y' b9 W/ @- @
    " ?& @) i3 Z% D* |% w' ~print(w.item(),b.item()) #结果0 Y" C8 U2 b2 @. P3 x& L" g3 C
    ! a# \0 h" E& a1 j4 `/ o: y% S
    Output: 27.26387596130371  0.4974517822265625
    5 N6 S0 Y. `. z/ ?. O----------------------------------------------
    ! V2 ?, a1 V5 B, z' N- R最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。* o1 `/ |0 M$ X2 c4 [9 g+ U
    高手们帮看看是神马原因?
    , L6 U" W, T8 L

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    / [3 F+ g2 A% l- s
    5 J% n3 W9 J; K- C- o没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?5 F* B+ N! h' L3 u
    -------% k4 S% O8 s: R, v* i! e
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    $ f: K5 D! ^" n# O; U4 {-------
    2 @4 j$ I2 u8 Q+ P9 k算法诊断部分,建议把循环次数改为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
    - B& D" @$ Q, W! ^! _+ L) u没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?# |& i( w8 C! f4 B5 |6 D% N9 p$ J% Z
    -------
    & [7 X. t; i( K" h( K2 Y: t不好意思, ...
    + }6 m1 d! ~* e# H" E* U
    谢谢,算法应该没问题,就是最简单的线性回归。
    . q/ `3 |- V5 ]3 W( I我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    - C: y1 r  i; p
    雷达 发表于 2023-2-14 21:52
    $ D5 }- k4 U/ o; I- ~; E: D谢谢,算法应该没问题,就是最简单的线性回归。
    5 T! t: I) H: Y( @  }" W) o我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    ' x% `5 G) x, S0 T/ e
    0 u0 N& Z* o* K, w2 Y
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    2 D4 c& ~" e# I/ t5 f5 P- w3 O! {$ P5 r! }  C0 q, L) _4 m
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    9 J& T/ c. _' j$ ?
    老福 发表于 2023-2-14 22:00; g+ a" l8 k, [$ C6 ^& u/ H
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ; J; O$ g# D, r
    ( d7 p: L: H0 p- ?; C或者把b但的起点改为1试试。 ...
    " [4 z  o0 e' }/ K2 }# Y5 T  n
    , }9 m' {* W3 i  P$ o
    你是对的。$ N" t% L1 g) K7 R
    去掉了随机部分
    9 Z& i4 ?9 v0 _1 T" E( _6 U0 a#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    ( L# r4 k& Q- T+ Ny = (x*27+15).reshape(-1), t' R6 s# C! h! H# n

    " Y" q# P1 W! X( n循环次数加成10倍,就看到 b 收敛了  O, j6 I5 N& v
    w , b0 ]. e6 Q) ^* T
    27.002620697021484 14.8261671066284189 f  z) w8 k2 h, u

    # R3 W8 [" d0 b: w  w* N* I和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-6-10 13:58 , Processed in 0.056152 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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