设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 - H; W+ A$ Y! j

    % Z* b+ A; U8 b. J6 j3 |0 P  K为预防老年痴呆,时不时学点新东东玩一玩。; ?7 T; T4 V% W  p; {3 m
    Pytorch 下面的代码做最简单的一元线性回归:
    3 b( y& a; R! ^# v8 P----------------------------------------------
    : I  S. A, ]% y. s* S7 C/ i) |import torch
    0 ]3 G9 N$ w% S$ _; kimport numpy as np
    # H8 w* B* t% A( himport matplotlib.pyplot as plt; L3 z0 L& s9 A
    import random* E& _/ }+ Z; r0 ?/ V$ \7 J6 ]' d  u$ a; ?
    . b, ~: D/ }! {  ~
    x = torch.tensor(np.arange(1,100,1))" ?/ x  z8 C$ Z" N3 k; n
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    . R7 `# J' I4 F  D% ^
    3 b) A6 B* i- r. fw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b5 \9 u1 c/ n# l7 [! a# V# o
    b = torch.tensor(0.,requires_grad=True)* d; D$ R2 F! y8 Z3 B+ F
    2 h# J; ^# o' D1 _+ V% q+ }
    epochs = 1000 o& P" E6 T7 d) s$ g5 |1 `
    % S; V9 `4 R! J0 u5 Z* Q" y, H
    losses = []
    + J, n" q' J; n0 U2 {# j5 Ffor i in range(epochs):. F+ E5 j/ ~' A" ?9 P0 ~
      y_pred = (x*w+b)    # 预测: ?: o# p/ K$ o) C$ T# Q" ^3 u7 z
      y_pred.reshape(-1)
    ! K! |8 l9 @  W% {$ I2 c
    4 I" U7 t( `* o( K+ Y  loss = torch.square(y_pred - y).mean()   #计算 loss
    5 k6 I8 W9 C  x* A# i9 a- ~  losses.append(loss)4 ?, R, {+ t& z8 k# e( q
      
    4 L% r: |6 e. v# q/ S  loss.backward() # autograd/ ?9 y6 G% z% f9 r8 v( H
      with torch.no_grad():" P, ^+ M, S8 R* J# J$ S
        w  -= w.grad*0.0001   # 回归 w& a6 g! b' k, d: L6 \/ f/ r2 r, ]5 F
        b  -= b.grad*0.0001    # 回归 b 7 t$ P" }5 |9 H# o( I( \% M0 Q" }' @
      w.grad.zero_()  9 a* q- k+ L* g: F# X2 ]" K
      b.grad.zero_()" ~7 Y$ |0 R! F: \7 B

    $ [1 M  G/ V0 E" hprint(w.item(),b.item()) #结果! H( q7 K* u: m

    2 g3 h8 o! N" A: c6 d( l. uOutput: 27.26387596130371  0.49745178222656256 K. s- Q$ W4 @: X3 ~8 o
    ----------------------------------------------" c3 \' w" }7 n. v8 [* g
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。- C% ]9 z, U' U  Q
    高手们帮看看是神马原因?$ _8 u2 ~5 f5 ~0 F

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    7 e/ e! |1 g: B' N3 v4 x# Z8 ~2 f! ~: A$ ~( e7 Z: b5 z* s" e- O1 Y
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?4 n. T. Q( \! M9 s
    -------: c( _* ]: \& S# O3 S$ B/ H) o  s
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。: m) c. z4 y+ Y" {1 F
    -------
    5 g( v* @: o+ O4 L6 I算法诊断部分,建议把循环次数改为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:237 g' f. r# Y$ T# `( k% w
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?1 f/ B  j, M5 G& E
    -------  f2 t7 e. V/ f. ?1 b
    不好意思, ...

    2 s% K4 s' O: e2 D谢谢,算法应该没问题,就是最简单的线性回归。
    7 e: p; U7 Y6 O: O4 Z  k$ \我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 ) t8 i2 ~8 q) ~0 q6 b, t6 u  ]
    雷达 发表于 2023-2-14 21:526 u& L1 O2 O  }# _
    谢谢,算法应该没问题,就是最简单的线性回归。
    . q  s) f" v: Q- W8 d. N1 ^, t2 Q' `0 r2 R我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
      M1 y  ~2 W) A( ?
    8 Z# i1 z+ J" P" N$ R1 N3 W- _9 z
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    " f( |# O0 Q) B/ E9 u
    ! K/ H! A2 |+ V/ [" J或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    : o! h3 w+ r% e1 K0 }! d' B8 W5 w
    老福 发表于 2023-2-14 22:00
    0 u/ K7 n2 G/ l  u+ T" a1 v刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ' d0 G6 t9 K$ y
    2 ~- G/ s. S8 I; q1 z或者把b但的起点改为1试试。 ...
    6 C0 }2 R# O/ f3 u3 L

    2 h3 K7 U4 }0 D# G# }% y你是对的。4 Z% z6 a( i' H% _
    去掉了随机部分
    , C: @5 {) y4 H. ^# C9 M: Q#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    2 |/ V) U5 r3 Dy = (x*27+15).reshape(-1)  k# \( A; V* Z) U6 o% I& p

    ) p; j' ?& N/ q% m3 o循环次数加成10倍,就看到 b 收敛了% Y' b0 V( h4 R8 N) `4 h3 v
    w , b
    4 R+ s( |* O+ c9 q* O# `- D* l" ~27.002620697021484 14.826167106628418
      ]3 I, R4 G+ N, ]$ B; W* M6 d+ k8 V  }5 Y7 |! F; O  s) [/ f
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-7-21 11:30 , Processed in 0.076121 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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