设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    1 c  F$ f0 ^# i* B3 ^& A+ Y1 P  k) a6 Z* O" D6 i0 L
    为预防老年痴呆,时不时学点新东东玩一玩。
    6 [- ~; V! i' w5 t, N7 Q+ s% ePytorch 下面的代码做最简单的一元线性回归:
    ! I* y, M; z4 _9 B/ {8 C* f4 r----------------------------------------------0 i- K! y! I$ e/ m( m
    import torch
    1 U3 M5 {. r/ n1 w7 e; y6 [; t9 Uimport numpy as np
    8 v& G+ h& `* m( Z' dimport matplotlib.pyplot as plt- B& w& j6 v6 j7 `
    import random
    $ v& K! e9 O1 e" Q( g/ Q! q$ |- e& Z* _; Z9 J- f- F" B7 I  w
    x = torch.tensor(np.arange(1,100,1))( F9 T$ @1 m! Q' m: z: b! f9 P. G
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15" \/ q) n$ a/ o3 l* x% ?9 y4 e

    , w! e% U/ O9 I, l3 l: V* h2 m4 e- W6 g/ lw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b* k7 F3 k; j! y  p5 ~) @9 E
    b = torch.tensor(0.,requires_grad=True)# v5 {% V& c6 F/ V& a0 d
    " @* e# Z; H7 J5 k: `
    epochs = 100# X( J  j: U/ |
    . S* ~2 c; l* k4 Z0 M
    losses = []% |# f4 \# s3 }* G0 j7 s* A
    for i in range(epochs):1 }: L1 @) k7 ~2 Z
      y_pred = (x*w+b)    # 预测
    ! K+ X3 u7 X7 t5 F7 _  y_pred.reshape(-1); E: I% l' b. x" x
    $ p8 q! p0 t/ Z: \2 H
      loss = torch.square(y_pred - y).mean()   #计算 loss
    5 g0 a/ ]# ]: G$ p. \5 C  losses.append(loss)
    ) n: x9 n0 K4 r7 F' y! O; k  
    / _! V4 i8 b# a  loss.backward() # autograd
    8 p3 h5 E% l/ q2 G+ t3 l, W; W$ D  with torch.no_grad():
    ( T. T* ~+ {- V3 ~" p& n    w  -= w.grad*0.0001   # 回归 w2 ~* S8 m  U6 `! h3 u/ u
        b  -= b.grad*0.0001    # 回归 b ( E2 X' r# H% v8 f
      w.grad.zero_()  
    ) @; w2 f3 N4 P: V" @  b.grad.zero_()
    8 u8 S; E( a, w; i0 M; r0 J( v. w/ f( {# h, I
    print(w.item(),b.item()) #结果$ T# X, {9 T( N& t
    ' U  O: S! j9 l4 g* S
    Output: 27.26387596130371  0.49745178222656251 x0 F! ~3 o, x0 X2 Z; G" ], J' ?
    ----------------------------------------------+ B- i+ A4 \3 G& H/ j, |
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    3 g  o4 H6 S" d5 f. b9 _+ h高手们帮看看是神马原因?
    ' g) U- [9 C7 v8 |! w& Z

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 + x# |0 f( r" t

    , g! f2 I% o+ `没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    # ?. P: `* c; r3 W-------- C# o3 G; F. `& t. ^
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。& _! o0 F. ~; s
    -------
    ) ~4 z6 h0 J- H) H算法诊断部分,建议把循环次数改为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
    7 g2 B; p, v( V2 X4 G没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?9 R# J: d9 B+ I
    -------
    & r% f- T2 `8 S! A不好意思, ...

    1 d1 X- ]2 J% g/ ^+ g; V! _4 \; g谢谢,算法应该没问题,就是最简单的线性回归。
    ! o. q# S0 ~* |& U我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 . f% S! H$ B, D6 f
    雷达 发表于 2023-2-14 21:52
    " J0 \8 K$ h6 [& `+ p' x谢谢,算法应该没问题,就是最简单的线性回归。- _# n: y: v( W  L  O5 j" a0 W
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    5 X9 K- E! n4 O4 ?
    . s* I8 _- K5 X' j6 G! u; G刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。3 E) X% ^- J8 x- B$ ^- D

    8 e* p' k$ `% i9 C或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 0 ]' }7 I: v6 o& j, Q8 g9 f/ N
    老福 发表于 2023-2-14 22:00
    7 A; }! [5 {1 h. p5 ]4 w刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。$ M! J! F3 r2 ^% x( T0 H
    & K* ?3 B& \$ ?. Y. J- G
    或者把b但的起点改为1试试。 ...

    ; q4 z7 h: `! I. @" q, }2 f6 N
    . P2 X6 y! \5 m7 I% g. v1 x你是对的。3 Z. ~2 I  A  A
    去掉了随机部分
    5 E9 T* n+ G+ h1 o3 v#y = (x*27+15+random.randint(-2,3)).reshape(-1)+ w; U0 x, P  C3 ]  ~4 _" D
    y = (x*27+15).reshape(-1)) n$ s- {+ Z( W) `7 I3 N
    & A& H* U5 a& [( C; X) q7 e
    循环次数加成10倍,就看到 b 收敛了
    & i& G+ c1 I" g9 Aw , b7 {. O8 ]) ~+ ^3 L1 W7 q1 G9 p
    27.002620697021484 14.826167106628418
    * m0 [. ]1 ^0 u) t# E$ ~" ~8 {' b5 ?& m# F$ v
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-5 10:34 , Processed in 0.057222 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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