设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 2 j6 p( O1 ^& d" L- l3 p
    * f4 P* p: w9 K1 S: K9 n$ Q9 y
    为预防老年痴呆,时不时学点新东东玩一玩。4 p4 Q2 v! T2 ]) d. F; A0 r5 U
    Pytorch 下面的代码做最简单的一元线性回归:9 n6 t, e5 t) b# U1 p+ ~9 c  @, n( h: [
    ----------------------------------------------) A" L7 w6 j  ~. L
    import torch: N, g* A+ E9 Z/ Q; \
    import numpy as np
    * I" C( s4 }8 @2 c5 }. u3 Bimport matplotlib.pyplot as plt+ R5 c* p" h+ i
    import random/ ^; K& [# J& ]& ~* k3 c9 J: I6 [

    7 e3 ]" H( s0 r3 Q! Q  L* T1 P9 u2 Dx = torch.tensor(np.arange(1,100,1)), b. Y+ A# J: [% o+ W
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15% y) u2 p- z, Y3 M6 I9 V

    $ S" \! s. R% s% ~2 }! ]9 B5 Aw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b: ?8 L1 M0 e! o& t4 G' V5 i7 I
    b = torch.tensor(0.,requires_grad=True)
    ( \8 N7 s  q, I! }/ Q6 w
    ) V9 K' a8 H# J; d# W2 i. [epochs = 100
    7 ]$ E3 S$ {: `, P) W
    5 l  K. D1 o8 Nlosses = []5 |) P! O) q" w1 V- O0 A
    for i in range(epochs):/ t  R; M, r& }) h
      y_pred = (x*w+b)    # 预测
    4 p" q5 b1 x! c1 n+ U  V4 B  y_pred.reshape(-1)7 R/ g$ z$ d( G6 Y) T2 f5 J

    ' x: d- e& C; U8 ]  loss = torch.square(y_pred - y).mean()   #计算 loss+ g+ n. f* N1 F
      losses.append(loss)" W1 F4 t$ y9 T+ a
      7 I# d& k9 C9 [$ J
      loss.backward() # autograd
    5 E4 A0 t( |! E; h  I5 S7 y  with torch.no_grad():* s+ b" e  b, x6 E8 T# q3 V" l, {) s
        w  -= w.grad*0.0001   # 回归 w
    $ i3 a# F: ~6 P4 a2 ^5 c7 ?8 K    b  -= b.grad*0.0001    # 回归 b % _3 n  S& D+ b+ W! `+ _* g
      w.grad.zero_()  ( N: v; u  F7 ~. `" H! T5 A2 @1 {, g
      b.grad.zero_()
    # D* E9 v) `4 l# P" p
    % r; {& z% k$ j0 c7 }: Qprint(w.item(),b.item()) #结果( D( j3 g. g5 x2 l5 }! a- b0 i
    ) P$ B7 m# J! S. k5 [
    Output: 27.26387596130371  0.4974517822265625
    2 M0 z& h/ D5 k, w- x----------------------------------------------
    ; P* \4 }0 b5 z' x* P+ s2 j* B最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    - o$ n2 u/ {4 i0 Y高手们帮看看是神马原因?
    & Y' `: e9 a7 m( a. C9 h

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 , a$ B  N0 U, l6 ^
    & Q& h) y6 l/ K, K
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    ( _+ G8 }- q2 W5 a3 R-------
    5 H  L: E* y/ r# E不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    ' \) A/ a8 [7 n' ~8 M$ v$ |-------8 b9 X% x! j  D3 H# z
    算法诊断部分,建议把循环次数改为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% k+ |/ A, o( B& |5 W5 \4 f
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?( q) [1 f/ y' Y/ S  V
    -------
    % i+ V" U% y8 s7 P6 {不好意思, ...
    0 S8 M/ N6 k/ s
    谢谢,算法应该没问题,就是最简单的线性回归。) o- A; m+ r- p
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 9 H: F' x$ ~) S$ L6 n
    雷达 发表于 2023-2-14 21:527 ^7 S  \( o9 P  G* [. E+ a
    谢谢,算法应该没问题,就是最简单的线性回归。  L1 X0 n. d1 ~0 L0 b) a
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    % U* o+ q' A1 ~4 J+ n( Z; u# [0 A
    : M) N) e: ^/ |' Q0 H: m6 Z1 H, q
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。. ^9 j3 ?6 |1 p3 C$ W& q+ ?) }, |

    9 Y4 s! s( X( K! p或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 ! q3 H7 ~! R6 s/ B
    老福 发表于 2023-2-14 22:00. S: D; G& g3 v! Q! H# C0 Y$ Z
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    9 [0 s% E7 }: T. F4 n
    # g4 m0 L  H5 j. o) {4 E- N& v$ j或者把b但的起点改为1试试。 ...

    & ~+ D( w6 l. h& E
    , m, o' b9 _1 `6 ]8 n8 ~你是对的。
    % F: e# }) v$ W5 ]: Q1 K去掉了随机部分) t& M" y- D. T! Y: L% {
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)5 D9 N% v. I: @2 Q) w- Y  r
    y = (x*27+15).reshape(-1)* g2 g+ h% y$ D" `$ V, r
    5 s  }' w3 e: |& f0 k/ ^
    循环次数加成10倍,就看到 b 收敛了
    / l' I3 Z) z4 t' L3 ~w , b% e  o6 U! u# x* n0 b0 ?; q
    27.002620697021484 14.826167106628418  }# [- H, S0 G
    + B1 D( K, w! o* {
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-5-14 15:19 , Processed in 0.059357 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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