设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 8 r: G) K) C, L" {7 E. v4 L/ m
    9 B$ Z" I3 S% c/ A; U% m8 p
    为预防老年痴呆,时不时学点新东东玩一玩。
    & k3 t' I& x6 I! F! ?9 Z# wPytorch 下面的代码做最简单的一元线性回归:+ e- ~, r3 o* X0 x8 i5 E8 F
    ----------------------------------------------: h! f( {! o; t& W2 ?
    import torch
    9 r3 N2 f' w) Wimport numpy as np
    % m8 f2 D% f% ?6 Q- bimport matplotlib.pyplot as plt
    6 h. c; v6 J- ?: m$ }5 ~5 [7 }- Mimport random% w4 w2 g* O6 J
    4 u" T7 O+ P5 m# ?
    x = torch.tensor(np.arange(1,100,1))" F+ v+ J" t) K; l9 o
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=157 b8 Q% ~- g( D" d; G, l* W

    . @6 K6 t" d2 {2 y) n1 N3 u: jw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b  B% @& H% x; b8 m; D5 J
    b = torch.tensor(0.,requires_grad=True)3 U; h; H( ?2 \3 ?4 g) q
    . F6 r: M$ w' p6 W# x, x
    epochs = 100
    7 D7 p: n# f0 t- [/ {/ j) w  P0 }9 C2 ?5 ^! _
    losses = []" m0 c7 y" j+ O; y9 V, W* \+ R% l* y
    for i in range(epochs):
    3 k. U; a% L- a8 j% a: V  y_pred = (x*w+b)    # 预测0 P$ X& n& u; U+ b) ]/ z/ J- i1 w
      y_pred.reshape(-1)
    * Y2 ]3 m) e7 q) H8 u, y ( Q! m8 }* w8 J
      loss = torch.square(y_pred - y).mean()   #计算 loss
    2 Z! g* ]: ?6 c; c1 H  losses.append(loss)2 a* {# t. T) g) }+ H
      
    7 J2 X. |  ]& L# a* R  loss.backward() # autograd
    5 Z+ W8 c" H( T7 R9 `: d3 g( [  with torch.no_grad():
    & C. W) Z* a6 w) M    w  -= w.grad*0.0001   # 回归 w/ h' J/ `' b" {% a
        b  -= b.grad*0.0001    # 回归 b
    4 N0 n1 Q! B" y  y9 [7 F. x  w.grad.zero_()  
    * `0 c- z" Y$ A; U4 r. o# D7 E  b.grad.zero_()5 e9 Q8 x, g- I( o4 Q; N- ^3 P9 P) B

    # Y% E" Q/ f: M2 y6 S0 Oprint(w.item(),b.item()) #结果
    8 b+ X$ X* ~0 D4 G6 [9 @( q
    3 n" o/ v+ n: k( z  {Output: 27.26387596130371  0.4974517822265625
    ! W( Y% |+ H$ c----------------------------------------------
    * o" p  N1 g1 C最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。* K: f* S9 X( M3 b. m6 `" }" r
    高手们帮看看是神马原因?% v; E+ }; x# E; Q0 f

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    1 n4 ?9 C% I0 J8 S
    # L) k" J' y6 F5 P- A没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?5 x  G" S/ c, O
    -------- w4 C- t9 N4 r, \# R0 B! P* b
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。. h  [' f5 }4 O& C4 l
    -------
    : z9 B3 V8 q( f- m6 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
    ; Z) ?$ _/ I; _5 j  n( m没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    1 b* U% ?7 H1 \  Q8 p$ k/ w: @8 b-------
    - Z8 s2 G# [' N* i, V; Z/ p7 @不好意思, ...
    9 i" Z# k+ R' u* ~+ M1 G
    谢谢,算法应该没问题,就是最简单的线性回归。
    5 k8 t7 V9 g, O- k8 n$ _我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 - `$ S1 o; R' X6 k0 n# T9 W7 p- C. z8 |
    雷达 发表于 2023-2-14 21:52
    9 r' ~7 s/ i9 I+ Y  c; i# F谢谢,算法应该没问题,就是最简单的线性回归。
    ; ?$ m6 X) K( |" x% |我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    4 f) t0 E. l1 p$ R2 k  n" ]9 Z9 ~! i, L' ^% W
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    & W' l7 i/ P  g* {3 x
      y! p# h7 f2 x' P( U或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    , b; U: ^# B$ K  g2 ^
    老福 发表于 2023-2-14 22:00$ I+ d8 w9 o$ Z9 Y* E* F2 ?4 o& c
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。1 Y2 D5 h% O& {
    2 h) {. e4 P: t* s
    或者把b但的起点改为1试试。 ...
    / ^# Q/ e9 B" c  t  u$ G: `# B; R
    ' |: K6 W: K6 p' k: a
    你是对的。. M# p7 @" x, j) [
    去掉了随机部分4 c& a: O  d& {8 h+ x
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)- X8 t6 ~; F; ]1 f* T0 X6 z% [
    y = (x*27+15).reshape(-1)
    7 j! u/ a; d" P9 f4 U
    ; g; n- q% o' N( t; S9 r, h循环次数加成10倍,就看到 b 收敛了; |1 U: s9 f0 B3 ^. Y1 O
    w , b
    9 q  L5 N% z2 X27.002620697021484 14.826167106628418
    3 x% N/ t: ~) L: E$ y' F7 `- f, w7 o- l- s
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-15 03:41 , Processed in 0.028707 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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