设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 + I$ x* }  D- F7 G8 f. q

    , S" _  n, [' Y8 |为预防老年痴呆,时不时学点新东东玩一玩。  y) B3 n$ s0 f! q$ w: n
    Pytorch 下面的代码做最简单的一元线性回归:. S, N5 v( E& W0 J, v
    ----------------------------------------------: \7 J9 M, w4 e' b0 a' o* c( K0 X
    import torch  {6 [  u5 _' A6 C
    import numpy as np) N8 n$ Y: K( n/ y# A6 D
    import matplotlib.pyplot as plt0 `+ {" b& }; ]4 h3 A
    import random9 r3 Q3 |, s8 {: z9 p( W  F
    5 Q8 v" X# J- |  E6 k8 B' I# ^) v9 o9 w
    x = torch.tensor(np.arange(1,100,1))  Y. X  w! M# V: T
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    ! e" q2 U1 F8 K6 t7 h5 Z: Q9 k) c) N2 U  N/ M( @6 _6 n  [$ k, Y
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    * J$ A0 v5 G" H5 Y/ u! ^7 @7 ?b = torch.tensor(0.,requires_grad=True)
    ) }& x. u1 A' ], c8 [6 X/ ~: H
    - Z' I$ d2 R) B' iepochs = 100
    & `$ I& X* X* U# `) T+ F9 a3 x& g. Q; J8 t' Z: Q, c
    losses = []/ e4 _- O1 i' j9 p. K+ v
    for i in range(epochs):
    " q* u$ u" P, i: g' x& ?) G4 q  y_pred = (x*w+b)    # 预测
    + ?; _4 Z% Y! ]9 {9 o  y_pred.reshape(-1)( \) {; C, k* N+ _# A

    6 p* L  _. u; T; W) i# ]& R1 M  loss = torch.square(y_pred - y).mean()   #计算 loss
    ! [  x; o, x' k  losses.append(loss)
    $ L, A, i! j4 ?& o. N  p  A  
    $ W( ]& U# t# l  K* j5 q3 x  loss.backward() # autograd
    + i# s% d2 ^2 B2 F& F- l8 a3 Q2 r0 k  with torch.no_grad():
    5 P3 a! ^) Z1 y" L* x4 e$ G    w  -= w.grad*0.0001   # 回归 w
    8 o# b- ?7 X. q  K8 S, [( P    b  -= b.grad*0.0001    # 回归 b
    3 {7 M( i9 u! K) I1 \/ ^  w.grad.zero_()  
    & q4 o, v* N/ u0 z5 f- J  b.grad.zero_(); F/ b1 K; f) z( M
    * }7 G8 r9 r; i) W- S  i8 C# Q
    print(w.item(),b.item()) #结果% u5 R9 t, d2 \8 \! N" K% B
      f: }9 T: A4 ?, y( R
    Output: 27.26387596130371  0.4974517822265625" A; B3 f3 }/ R( }3 b, B
    ----------------------------------------------0 u  e/ w; s: l0 Y
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。$ c( V: ~7 G" J6 j  e% L# M8 S& Z5 k& L% L
    高手们帮看看是神马原因?
    & ~; L7 P! K, [& u0 g3 c" I

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    . a/ D  \& f1 T3 w* y% c' h  i/ R4 _3 R' U( [% l7 ?  P
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    1 [6 C1 ^  l+ l" h7 ~-------! t- q/ {. X4 O3 [
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。# K/ N2 @+ k0 R. J5 E9 k5 w
    -------
    : J5 n1 [! f' b. T" J- p8 b6 H. q算法诊断部分,建议把循环次数改为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:234 ~: Q. y: I# Y' u; o0 q
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    " F+ J, J$ q8 @- w7 }* V-------: H  ^0 ^+ ^! m' q+ n
    不好意思, ...
    9 D. I- A% ?: c) T1 y. N
    谢谢,算法应该没问题,就是最简单的线性回归。# b8 q* P( Q* Z9 g
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 $ R  r4 g  l! ?- v
    雷达 发表于 2023-2-14 21:52
    - O. L) j, B+ O, }6 k* ]谢谢,算法应该没问题,就是最简单的线性回归。
    # A  c& i, v6 P/ c6 b7 |4 ^  B; j6 e我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    $ u2 l4 |2 X* Q; @8 e

    : W: @6 Y8 Q3 [7 d) l8 w' t. v3 a刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。: _- t4 d4 ]' r& |  z
    + a, [# w4 r2 I& n2 {
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    : r! j5 J! Y( @8 W  X( S8 @
    老福 发表于 2023-2-14 22:00. I$ f9 _( u7 \2 M% Z
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。8 g8 `( Y# W' Y5 c+ L( V
    8 `) p  ~$ p  m2 @! J9 p6 k, [6 N
    或者把b但的起点改为1试试。 ...
    7 ?8 f2 X! ]% y0 {5 p

    4 a+ I" N1 G/ j. J你是对的。
    $ p: S2 F: U6 T/ v: M# ~# ?; _% {去掉了随机部分; N: O1 `- o$ a  s' h
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)" X9 L+ M' z7 w; N$ H0 S$ M
    y = (x*27+15).reshape(-1)
    $ }/ x4 j1 a/ Z) {  h, Y: Z. x8 J* Y: A7 k4 L3 }( ?- k6 J: d8 }( @  g! t
    循环次数加成10倍,就看到 b 收敛了8 e4 o4 r2 z! |! n
    w , b
    0 K, Z# L7 ]$ ^* R$ Y27.002620697021484 14.826167106628418
    * w7 U# ]+ \# F* h. u9 U$ `' ^+ r9 s+ B+ G# k/ S. t8 T: U
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-5 00:10 , Processed in 0.074240 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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