设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    2 ^& s' i! C, v* s
    9 j4 ~3 M2 V& ^. E+ ?/ U为预防老年痴呆,时不时学点新东东玩一玩。0 H3 ~# X5 E/ q2 L; a) N  w
    Pytorch 下面的代码做最简单的一元线性回归:
    " x- f0 P& \$ V" d----------------------------------------------/ U& ], U" L1 G
    import torch
    4 K! N4 S7 V6 J* o- R, p- @1 nimport numpy as np, I7 n! ?) s7 b5 A" a. P4 d
    import matplotlib.pyplot as plt8 t9 b% G/ D8 v" p: v' q" I% b
    import random" I7 @( s( |) U# f; c8 q$ p

    2 E4 p* f3 s) ux = torch.tensor(np.arange(1,100,1))
    " p1 K  c4 Y  E" M' Z8 q; \y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    - L5 O/ d' x. ~! q8 X2 e
    , T+ I5 b( L. }; |w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b& }9 i0 ~0 K: s* A7 z" O5 t& }1 N
    b = torch.tensor(0.,requires_grad=True); c  o, O# H& W- d

    $ o! J. k. O( s: Y! r2 \epochs = 100' D! K7 J9 n. c) ~. n

    ( W7 V" k# `0 q1 n4 Qlosses = []$ b" a8 W; [5 l9 @
    for i in range(epochs):
    1 H, q( E2 @- S& ]: {; p2 u  y_pred = (x*w+b)    # 预测
    ) q4 H/ m* I! }- W* @4 ~( r  y_pred.reshape(-1)
    0 }+ c6 H' t( c7 d. D# H( B7 [
    % G8 |# _; M- U! ~  loss = torch.square(y_pred - y).mean()   #计算 loss0 X! x9 S. M# J' @. t" `
      losses.append(loss)
    " V' ?! L7 t  z9 j$ Z( ]$ }3 b  
    4 {4 o+ @2 m4 W0 l) ^) Z  loss.backward() # autograd
    & b! f5 `: @- C# d7 `, Q  with torch.no_grad():
    & {% E; c# J7 u  q, R1 u9 U: s" c    w  -= w.grad*0.0001   # 回归 w
    , `2 X  D: N; o+ q  p8 ]/ r* j    b  -= b.grad*0.0001    # 回归 b
    : p" Q0 w& T. ]# t1 q3 ~# j  U  w.grad.zero_()  
    7 b/ p$ u7 i& c, _  b.grad.zero_()
    2 x7 b# G5 T6 e& A; ~) W4 O; O: {3 E) m9 T+ u
    print(w.item(),b.item()) #结果
    - r8 E4 t, z" ?, Z
    0 ^. |! a2 x/ B4 }6 P( v7 qOutput: 27.26387596130371  0.4974517822265625# }5 _5 j* M' f0 {( s$ n( H
    ----------------------------------------------# E$ H8 f- t8 @  u! k* b# H" t
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。4 m. @4 }4 ?! c5 j6 A, ?
    高手们帮看看是神马原因?# ]- }" S  [, D; X' ^

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    & p: `& h( D  X/ J3 `9 D# A6 z. @( Y; e1 C/ M9 ~
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?) O  m' `  r0 S' O
    -------4 _$ F+ i! S& a3 e2 S& r" I
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    $ ~1 `" z4 g" L+ F: A: ^-------2 F2 V$ y# O. F2 a, X! {4 _
    算法诊断部分,建议把循环次数改为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# B3 k* h4 E# w/ T. d. s% K2 p. Z
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ; Y& Q8 t% q0 W( _" l. I-------  E% v* b  g3 j: V) E/ e
    不好意思, ...
    0 i( u4 e# H$ j2 q( S, v) I
    谢谢,算法应该没问题,就是最简单的线性回归。5 O& d% ]4 @( J0 F) D+ ]; W
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 3 L  Z. v" X# a5 }# T
    雷达 发表于 2023-2-14 21:52% s' P5 V2 c& n0 @- O2 B
    谢谢,算法应该没问题,就是最简单的线性回归。5 H  F: m# Z8 S& o' {; {
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    ! P! `" R8 W2 N# G$ [' G8 ^# |
    # i$ p; _/ X5 G: @: H: v5 f刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ; n, R, `( _8 ?0 x' l1 \$ N" M# c9 [& Z7 u# a
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    - S$ L. g6 F/ c+ E
    老福 发表于 2023-2-14 22:00! T( n$ _; Z7 h' S' y% J
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    : p0 }4 t+ F4 i, o2 y
    3 n5 `, @; u( y' V1 R- h或者把b但的起点改为1试试。 ...

    ' X! M3 s7 `0 z* o$ C% i1 Y
    . j8 a$ U2 x/ [9 L$ H! H  o你是对的。4 Y& ~% S5 b; z( X: L4 y
    去掉了随机部分
    4 s2 a. o6 B& N7 y% k& g0 C" }: y#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    $ j( O2 ?' B5 jy = (x*27+15).reshape(-1)- C; s+ I- Z% ~' L# J, Y5 X
    ( \- j9 r( H5 k# L
    循环次数加成10倍,就看到 b 收敛了' i* M7 H5 C4 ^! T
    w , b( f' Q( d2 `9 f1 L
    27.002620697021484 14.826167106628418
    ; F" y% m' t9 B) a* w  @  Q) T. X8 p& T# Y
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-11 16:20 , Processed in 0.061278 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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