设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 3 y* Z+ s8 S5 l# z1 B+ L& t

    ' W; M% C* y, F- O- b为预防老年痴呆,时不时学点新东东玩一玩。
    ; I$ f; j1 Q8 i% K6 o# [Pytorch 下面的代码做最简单的一元线性回归:
      i0 s3 g$ N) l$ }$ b. f/ a& u0 V----------------------------------------------8 Q: i0 ?# J) J* o# \' ]2 b- x
    import torch: Z% F' \) W/ Z
    import numpy as np2 M2 w5 i5 O3 s
    import matplotlib.pyplot as plt( O7 {, D1 m" I" z/ j! ^$ M' K
    import random) b6 s  d+ b4 t, o
    $ t8 e  L0 y9 u' h+ j5 }1 m
    x = torch.tensor(np.arange(1,100,1))
    , }. L9 Q& l5 I1 k! e0 {: y& @y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    2 P( l9 S& e  X# e" h3 g4 V) q  H3 O/ v
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    2 {5 a! O, i2 j2 j, V( _b = torch.tensor(0.,requires_grad=True)' q5 |1 v; U* I% O
    1 g, g) c% t: M2 U; c9 i" n: x
    epochs = 1001 N8 R% r; a; w5 c# O

    ) T, P/ y: ]9 o- zlosses = []9 m6 i# C9 k6 K' a* s: m3 Q
    for i in range(epochs):( P3 L. D( ^6 L/ e
      y_pred = (x*w+b)    # 预测- U6 {. W9 t8 O5 w
      y_pred.reshape(-1)
    ( o% t9 w4 P, m2 t6 k4 {( J* z ) R% S  ?4 q/ p
      loss = torch.square(y_pred - y).mean()   #计算 loss
    + u/ E/ _) P  u5 g. r* y/ X  losses.append(loss)
    & U' S8 q2 }1 c3 e3 M  ! o0 a6 f4 K1 L& U; Y  C$ R
      loss.backward() # autograd
    0 v& c5 w& Z) ~) A' D1 ~' N( V, ~  with torch.no_grad():
    # R, X4 L  w9 {8 c6 ?; a( V    w  -= w.grad*0.0001   # 回归 w9 t& j+ z9 w' f; E
        b  -= b.grad*0.0001    # 回归 b
    ! y6 l+ |8 ?% ?+ A3 @& f  w.grad.zero_()  
    : _$ B* m$ I" Z* f  b.grad.zero_()/ {5 h+ H5 M5 V, o& Y

    3 V3 d1 ?- p) h7 yprint(w.item(),b.item()) #结果
    1 R0 T! f9 H2 O% H9 C: z/ M8 g& A' Z8 _, i
    Output: 27.26387596130371  0.4974517822265625
    . c' E8 a, ~( a! z----------------------------------------------
    6 [  ^2 Z( o: Z最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    8 q/ k/ v2 f! ^; z! A& F2 |高手们帮看看是神马原因?
    9 B2 f& Y* @$ d9 b0 H  E" `

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 : X: c8 J" F/ o& F# T. Z4 w
    ; s4 t- I8 M, \0 a, R# d3 P
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    4 @- N' d( M- Z' H4 H7 O5 _0 ?9 w-------2 E# h8 o0 H$ K9 C4 I
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。$ l( ^2 B7 n% p6 M7 l0 X+ l
    -------
    + n9 c9 J# B4 O) a算法诊断部分,建议把循环次数改为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! s0 _& A) Y8 r! M3 f
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?7 t0 Q1 ~, G# L8 {
    -------
    8 p. o4 @  F" F* P# _不好意思, ...
    5 N$ b$ R& z. W1 O& n
    谢谢,算法应该没问题,就是最简单的线性回归。
    ! F- W9 r4 c/ J, Y3 ^. w: P我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    * B' M" x9 G$ D. ?$ h
    雷达 发表于 2023-2-14 21:52& h- }# v6 [) J8 Z& F3 H6 [% N
    谢谢,算法应该没问题,就是最简单的线性回归。2 n  \+ L# x3 e$ f7 Z; J
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    % o) K! d; i0 w$ y

    1 V4 Z' ?( }, g. b; R' I刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。! T/ K' H8 `* ^9 z9 U" C8 c& _* k& ^
    ! c! ~& A9 m% V7 h% i
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 % [3 V" `: w3 j- Z3 o
    老福 发表于 2023-2-14 22:00' o% G8 z, {/ C
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    0 Q: [+ Y* A7 m( J, W; q
    4 t0 U3 a7 o$ x0 L; L1 k或者把b但的起点改为1试试。 ...
    ; Z0 s! t' J# S- v1 f; ]
    9 d' r6 V, a1 v1 F% d5 |" O& F  ^0 _
    你是对的。
    5 Z5 h: c; U+ E% g; N8 w- |- d去掉了随机部分
    ) U7 ?1 j7 ~$ N#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    9 o/ _9 j4 m* K+ T8 I# O5 |4 L  Ny = (x*27+15).reshape(-1)0 E) m! o7 u, D2 p  E

    / n- ]# w+ t3 z3 d# _' z9 K5 B循环次数加成10倍,就看到 b 收敛了- \  P/ D7 H, w2 J5 {6 W/ w& a
    w , b' m# \4 X; w2 }' }1 w
    27.002620697021484 14.8261671066284181 I. j0 ~% X2 y- ^+ W

    : R: E+ O7 E: D* l5 Z* ^5 R和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-8-11 06:19 , Processed in 0.060241 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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