设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 / U" `# [7 c' Q' |
    3 [$ N* b; @( ]& Z/ {
    为预防老年痴呆,时不时学点新东东玩一玩。$ S6 ]+ }  y8 k: Y
    Pytorch 下面的代码做最简单的一元线性回归:  |8 D! ^% I( s# F
    ----------------------------------------------
    2 A" R. J: a1 m' Timport torch& |5 }- l5 s: W4 S* W2 _) G+ V
    import numpy as np
      g5 S: c/ i; z% \- ]import matplotlib.pyplot as plt
    + }2 G& h( I5 T: ]% j8 \" Z3 Dimport random
    0 R$ Q; ~# x' J/ p2 t  `* ^& c/ V, Q) w5 T8 U- Y2 C( W9 ]8 b
    x = torch.tensor(np.arange(1,100,1))% t' l. q$ o9 @; q% u: l
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15! Z0 L  S4 e5 ~( \
    % M. E! ?, G5 `5 X
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    / I8 @7 N) d; W% N! u, F( u. H- Lb = torch.tensor(0.,requires_grad=True)
    # H% L# C+ {; }/ J% k, a. U3 x' H5 O+ e
    1 S' N$ e4 }4 t' c' ]1 \9 lepochs = 1002 {4 U$ Z2 j3 K# T+ i
    ' K$ p7 {8 a9 Q  r- ~) _
    losses = []1 Y' B( L# K  j8 p
    for i in range(epochs):
    ; a$ [! }7 h6 n% d+ a  y_pred = (x*w+b)    # 预测
    , D$ p" R2 N4 V: E) h* ?2 \  y_pred.reshape(-1); f  w5 }7 ^+ o/ t! J' ]

    6 j* E, l# i% ~+ i, y5 p7 `  loss = torch.square(y_pred - y).mean()   #计算 loss
    + B) _1 Y9 ~: U  losses.append(loss)
    $ o' x' @! ^. E# {  
    # ]: g, @: j% W& p4 m6 L  loss.backward() # autograd7 U5 ]4 g& C1 d" }  ]- s: J: h
      with torch.no_grad():
    : i' R4 X' C- H; v$ L* C    w  -= w.grad*0.0001   # 回归 w
    % s+ r& r( F' ]# |- A* r, u8 s6 f    b  -= b.grad*0.0001    # 回归 b 2 ]+ P  d5 [" V& m
      w.grad.zero_()  
    0 s% Y0 X) X$ \# a* U5 C  b.grad.zero_()! G5 u/ c0 P/ g* _

    5 e; x$ P! h' ^/ _+ k! `  t: V2 L; wprint(w.item(),b.item()) #结果
    % P( Q. A4 j( Q9 x) T+ g* T. ~2 h1 _* o9 U4 L0 p8 Y9 a
    Output: 27.26387596130371  0.4974517822265625
    * V2 R) ?1 d1 R, D----------------------------------------------1 Z  ]- m, [* k( A
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。- L$ v( `1 L+ T7 J+ [) h
    高手们帮看看是神马原因?2 d( [2 y) Y; u$ q( L

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 / f, s1 l+ V3 u% t

    # A+ H, k  o' C+ J) X5 k没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ! z* l8 z2 N4 a, x1 ^$ h+ p7 F-------
    0 w4 o% Z. b$ u& V4 t& p不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。3 p" y+ u% R! Q, q
    -------
    , [* M4 M( \0 i7 N3 c/ F: B算法诊断部分,建议把循环次数改为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. q1 w! b9 L: T3 T3 D0 D! [6 R
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ; J0 ^' N# q2 L5 N-------* E7 T! i8 m$ C: t# A9 F: P
    不好意思, ...
    # d% V1 T7 H0 g( h( a& o" W
    谢谢,算法应该没问题,就是最简单的线性回归。( `# m" ]: V! L  F% z6 v# \) {$ p
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ' Y7 b7 s0 w+ c) B: @5 k
    雷达 发表于 2023-2-14 21:520 T/ z/ w8 l& |' N+ P# M
    谢谢,算法应该没问题,就是最简单的线性回归。
    $ M& g# S( n' ~6 P$ q6 G+ L我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    ; c, v8 O+ ~* X  V& g# z/ g/ }: Z, W3 C( Q3 ^
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。2 c! \: F; @4 F* t( s' X' S

      P# g- G- e' I. r! M% W或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 ( Z5 @+ }9 P6 M/ ~
    老福 发表于 2023-2-14 22:00; h+ e# Z* b& g9 f
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    3 L$ L. X& b0 F2 y# m  I& l5 s4 p+ }5 U" z2 R% o! d! z
    或者把b但的起点改为1试试。 ...
    % t9 Y6 ~* j7 K! d8 p

    , V2 ?) @9 E$ d$ X5 P; _你是对的。
    ; B+ r, `% n0 Y去掉了随机部分
    $ w5 H4 v+ I8 E! P& U7 l0 R3 E8 B3 r" l#y = (x*27+15+random.randint(-2,3)).reshape(-1)) `( V8 K, f5 a+ D4 J
    y = (x*27+15).reshape(-1)
    0 N' |% K: L) Y6 @5 h
    6 Q- `9 ~9 ?- r# R循环次数加成10倍,就看到 b 收敛了' J4 _$ }' A. `/ P) x% |. q4 m
    w , b
    ( W* N  B5 q8 H* k27.002620697021484 14.826167106628418
    7 [* u) n: o0 ?, i% W- l- c1 a
    * S8 R2 Q, _) t4 J和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-21 13:21 , Processed in 0.066272 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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