设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    8 V" x2 B, ^2 |4 Z! }2 {8 A; b. v' q9 v/ @; m
    为预防老年痴呆,时不时学点新东东玩一玩。" J2 n/ v4 A3 ?& |% b  \
    Pytorch 下面的代码做最简单的一元线性回归:
    ( r0 @% D6 W: L9 K, F5 C! D$ j----------------------------------------------( k, `$ r) R# s* ~& o6 K
    import torch. y" o, a9 ]0 w8 a- @/ W
    import numpy as np7 j5 h( h& X, `  Q: ^
    import matplotlib.pyplot as plt- S; Q# `7 T8 r" u" g2 @
    import random
    ; x5 i6 D3 s" r8 h$ d5 B6 o- l1 O, M/ Q. Q1 L( }0 p
    x = torch.tensor(np.arange(1,100,1))- v. ?% j5 @* i4 S7 C8 P
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15
    ' p1 `4 P4 W% v& k+ C, k: d- ~2 i  s/ e$ p, q2 O) C
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    6 z- K( ^) q7 d9 k- s5 rb = torch.tensor(0.,requires_grad=True)
    : P5 [' ^7 o. T7 ]) P& D% Y3 L; E) P: p
    epochs = 100# B! E5 D7 n. i: m  W* u

    2 C' E7 T  {2 j& G. p9 }losses = []  s! J" `% m7 t, ?2 [8 W1 L
    for i in range(epochs):
    : M( R( }/ p6 e8 z" l  y_pred = (x*w+b)    # 预测
    1 u' y1 L9 L9 h1 Z$ f8 J  y_pred.reshape(-1)
    & c7 b" D) S$ h1 u1 Q
    3 q: M9 G- m. F: W  loss = torch.square(y_pred - y).mean()   #计算 loss) x  H- V3 s- a. l: O
      losses.append(loss)
    1 k4 w  t+ r0 S$ Y$ x4 C  
    4 I0 {2 L! G4 k4 x' ]  loss.backward() # autograd* j& a6 C6 r/ N6 U2 b1 C$ ]
      with torch.no_grad():
    ' }; t% U7 k) j& q+ d% ^' |; h    w  -= w.grad*0.0001   # 回归 w6 H( c% A/ B6 w* W& c9 h, H
        b  -= b.grad*0.0001    # 回归 b 9 W, c4 s1 S. i. F, i  T
      w.grad.zero_()  
    7 ?  \( c( g9 R# }: L9 f  b.grad.zero_()/ H7 ?- G$ s: u3 U9 S& M, z9 d  s# Z
    2 C0 o- p7 F% O
    print(w.item(),b.item()) #结果0 I- ?1 z- Z; R' u# a% N
    8 i: T: ^5 i, V' x4 U
    Output: 27.26387596130371  0.4974517822265625
    # ?( H6 O- i% {; y----------------------------------------------7 ]0 x- y5 k% H
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    9 ]( |  ]. d4 w高手们帮看看是神马原因?& P' s& @3 ]2 [' |) c- ]

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 ; v/ D! B  t: R" k; h! U

    & x# E7 J  K! ^# u1 @没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?0 }" @7 q, P( {$ g
    -------
      ~7 E' Q  F0 \2 a9 g+ W不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    ! z  s# e( A, e- |4 t- t) u6 n! u  S-------
    4 L7 o$ i# ^6 W# Z7 e算法诊断部分,建议把循环次数改为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
    / ^- \  t' e& V( |" J$ D" a3 U没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    3 n6 D0 v& [* B9 |1 F$ Y$ @* {-------/ A# z3 O% h4 y2 ]: G+ X
    不好意思, ...
    $ y3 ?' _! ?- j; d* R9 i4 {
    谢谢,算法应该没问题,就是最简单的线性回归。3 R- |1 {2 X! o; q& w' r; Q
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    0 Z( u  _  w6 [: Q. H
    雷达 发表于 2023-2-14 21:52) Z- _1 K. e' b" ~/ G0 V9 Z
    谢谢,算法应该没问题,就是最简单的线性回归。
    - b% g$ l5 n5 q, O6 z: h我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    7 e  v* j' N' y9 W$ U

    % @$ M( n% J" o3 j' q刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。: ]7 J3 u$ S- `' u  v/ x1 N
    5 d* O" A* H9 P3 R, O2 r3 v& B' V3 ?8 s
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 ( u) r8 Y9 c9 B$ X" ]$ |
    老福 发表于 2023-2-14 22:00% h$ P: g* J% C2 n
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。" }+ {* ~: x! {; w3 s" `& @
    % _( B2 D, J; d! T- n) }
    或者把b但的起点改为1试试。 ...

    + L: G$ K% T' w9 t" j4 F% t1 S# o" g4 P/ h( H' ^
    你是对的。- z; I; C$ D8 K* b1 G; C
    去掉了随机部分
    3 d9 ~) c2 O5 `) K#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    0 D0 Q5 m' u0 ^y = (x*27+15).reshape(-1)' y2 N  a# x" \

    ' {+ D% x  }& \) s) d循环次数加成10倍,就看到 b 收敛了: }# `/ G- G( L# |. R% t3 y+ ]
    w , b; P1 J9 {! p& f3 `$ q( e: n
    27.002620697021484 14.826167106628418
    4 X0 H, H; ?! _5 l, ~) p0 k6 B7 r" o3 m$ n  n2 x  M
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-10 15:08 , Processed in 0.063091 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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