设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 # p" b  J8 V4 q4 [
    9 x( J2 L) K0 i5 e4 ~
    为预防老年痴呆,时不时学点新东东玩一玩。
    % n1 `; U5 I) F( u0 aPytorch 下面的代码做最简单的一元线性回归:
    # l7 c4 g) t. `& l  q$ w0 B, a% v3 u----------------------------------------------
    $ E/ I6 L8 e) Limport torch, D+ l# U6 G6 h
    import numpy as np
    2 O" _" m: G0 r( x; [2 F$ O7 vimport matplotlib.pyplot as plt
    ) B) E8 |. _  ]8 Z- m$ d" _* }import random
    & @) E. C" @+ E" u  [
    ! U* m8 F2 O% n% _3 o: t9 O6 Yx = torch.tensor(np.arange(1,100,1))
    - x! m& r( p' W8 G' S+ H8 s1 ~y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    - S+ R0 y% \+ v$ {0 o4 {) T
    ; G! t, j4 s( O; M* `w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b4 K3 _/ G- d( c" m9 D4 s
    b = torch.tensor(0.,requires_grad=True); ~7 V6 S, b' a( R5 \. [% a& l

    7 E/ o  K: Q! `/ Q8 hepochs = 100% D: {+ j3 S/ h2 ?8 R, k
    . l+ B$ q  B! g8 E% D  d+ Z
    losses = []( \, i1 Y* T& U; W5 ~
    for i in range(epochs):! E" [  E0 D/ d$ y4 K
      y_pred = (x*w+b)    # 预测: X, s  z3 }, F' c7 N" Q$ [4 d- s* R: k
      y_pred.reshape(-1)1 a1 D' W, l) L
    : N0 S/ b& A+ M. N
      loss = torch.square(y_pred - y).mean()   #计算 loss& A, h5 G  u6 ~) i0 l5 _
      losses.append(loss)
    2 m3 y& Q" T3 ]' ^# ]  g  
    * [* k" E/ H8 j5 T+ j- \  loss.backward() # autograd
    & @: ]) \2 }/ s  v3 g6 e; N; d  with torch.no_grad():
    9 y& `% s/ j$ G) @    w  -= w.grad*0.0001   # 回归 w. `3 s6 Z; x4 L5 |1 A4 {+ R" i
        b  -= b.grad*0.0001    # 回归 b # D3 Q9 q/ g: t- W2 I5 _
      w.grad.zero_()  
    9 P: z. X% {% M$ }# M  b.grad.zero_()! n" I, U7 e" d# }) d

    ) \( Q  l! D" v7 I& j+ F: o  S: wprint(w.item(),b.item()) #结果; e+ D0 S1 h3 X8 O+ `0 V
    * d4 U% q4 @! _3 F9 S' P5 D
    Output: 27.26387596130371  0.4974517822265625
    - H9 B( a, b  p----------------------------------------------
    ' b4 [: P* t: u. s; S最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    * y+ e7 j. S. E- j" t: o$ D' u" M高手们帮看看是神马原因?
    $ d. X1 C, P9 f4 e7 Z

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    , w: m/ Z% T, j( a. K2 `
    - A' D# Z6 w4 F6 R2 k% E' h8 v, h没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    * B2 W) |9 z; l" n-------
    + j0 I: c+ t2 A2 }# a3 @不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    $ ?0 e2 h7 Y% i" J-------% ?2 E1 {4 h, j) t, C  v1 G# n
    算法诊断部分,建议把循环次数改为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
    6 H, G0 |5 |+ o% R+ M$ Y没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    - j0 H1 j/ |  e% {6 c, l-------! R3 x0 o* s( j! m/ I5 v
    不好意思, ...
    $ A' L# p3 X. v. L4 z  K9 U
    谢谢,算法应该没问题,就是最简单的线性回归。
    + i! }' M" J: r3 M; C, q我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    7 `- K* D6 K1 J) d
    雷达 发表于 2023-2-14 21:52, Y) m6 J, P7 ?! C7 x. w1 P1 ^: _1 d
    谢谢,算法应该没问题,就是最简单的线性回归。9 ^/ `$ e" ?4 \5 r" z& d2 g
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    ' ]- W4 O# i- R" v, m6 f, w& J

    9 B# P% k: y  V% H. T刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    . d% b" N" P2 I, ]5 V- l0 w# D3 @; o" t
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 # w* U1 b& c( E7 o" l) l2 V
    老福 发表于 2023-2-14 22:004 J4 B2 k6 A4 u7 j
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
      R* H( U! Q6 u* X0 q/ s
    , e$ T" g. h* Z# \/ G1 R或者把b但的起点改为1试试。 ...

    4 ~3 ^. i7 G6 c7 c* p0 ]; E0 [0 w" d( V
    你是对的。
    2 G9 k& `& K# V- B# d9 A去掉了随机部分, R2 R( v# [& U1 m9 K! v* h
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)7 s# o9 S' Y5 J+ N% k1 @" l
    y = (x*27+15).reshape(-1)1 y3 M( f- g4 k) I8 Q* Y; {

    " g2 w1 P0 z# a$ f: ?循环次数加成10倍,就看到 b 收敛了3 X! H( S1 U6 R% i9 j8 f% `+ D7 f4 H
    w , b! ]+ ?0 H  i, A
    27.002620697021484 14.8261671066284182 @; n9 h& Y7 s) H; u+ G* C

    / E+ T1 L3 w* P4 q  @5 P和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-4 15:21 , Processed in 0.058352 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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