设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    ' a, F  B. _6 q) c3 b. A+ [
    ! K* `( x6 _4 |4 b7 z为预防老年痴呆,时不时学点新东东玩一玩。4 S. T( M5 q4 H* j6 a3 [) z
    Pytorch 下面的代码做最简单的一元线性回归:0 l+ w- R7 b) N, u+ N: d6 r
    ----------------------------------------------
    1 `# U5 f7 U- m. c8 p. P3 Z) O' uimport torch
    % C2 {# l! T$ g3 F1 |9 aimport numpy as np
    9 D' w( f1 i' |( H# Limport matplotlib.pyplot as plt" g4 }! Z& ?( v) B( J; N6 o& B4 v- p
    import random
    : Z, Z7 t! k! x6 C6 B% ~
    + s' \& }4 B3 q+ dx = torch.tensor(np.arange(1,100,1))- i: S. E/ f1 p8 t' W
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15' M* U2 x, P! t# ~
    : b( |: ^# O" a, z
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    8 n/ ]# o6 [1 h% Z7 u% Eb = torch.tensor(0.,requires_grad=True)
    " l; q' v6 m* v- q, L
    % ?' V: n! i9 l2 q& mepochs = 100
    8 J, V- ]. L* n& j! E0 s
    ' I) p) M' N, g) @  Klosses = []
    " A  P/ r$ }) t: U* C8 f8 `for i in range(epochs):2 V. G( `6 N8 ^, j4 c" ]; G
      y_pred = (x*w+b)    # 预测
    $ X8 Q  N' b- l, H9 ]  y_pred.reshape(-1)
    ( ]6 @, p- s( r7 u2 Z; Y
    1 L3 Y( e& ?9 P: ~, m. q+ [' L  loss = torch.square(y_pred - y).mean()   #计算 loss1 k2 I" V0 K) G
      losses.append(loss)
      a8 G9 B# J- f- m  
    4 u8 B4 p) m* e. I7 p- E  loss.backward() # autograd( D  R5 N% x8 T0 ]' o, N
      with torch.no_grad():
    % x( g1 S. f9 }$ Z) U    w  -= w.grad*0.0001   # 回归 w
    " G* H( ]+ ~: H+ ~5 V8 D7 Y2 M    b  -= b.grad*0.0001    # 回归 b
    # T/ _# A7 C4 b/ y2 ~  w.grad.zero_()  
    " r* r- A) w  r! U; o2 l' L. K. E  b.grad.zero_()
    6 N( ^1 ?& N! `7 ?6 A3 H) z
    5 k4 v3 M! y! c* g( ]print(w.item(),b.item()) #结果* s. e7 w! K. q* l
    . R$ Y* {/ D8 ]. d$ D7 a
    Output: 27.26387596130371  0.4974517822265625
    - [; a/ F% l" Q5 x; {----------------------------------------------6 y6 y' v% K: T# P/ H9 j. W$ ?9 v
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。6 @% v$ T4 k0 O0 U7 S
    高手们帮看看是神马原因?, u( ^6 M4 X+ _4 O! k

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 5 r8 a% x3 ?( R+ S
    ! ^2 k7 e$ J: o4 G  p5 s( N6 z
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?" o, ?+ F$ Q  B9 C
    -------
    5 v5 B" e( X! q: K% W不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。5 b4 F/ W# u0 M6 }  U9 \* \- i
    -------1 R1 m! j2 ?5 E7 a# V
    算法诊断部分,建议把循环次数改为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:231 w# ?, U( F4 S
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?' t4 ?; T# ?: c) b! U
    -------  e% c, L5 X, z1 W2 g
    不好意思, ...

    : l% G0 R  h* G; m2 I/ \* G+ R谢谢,算法应该没问题,就是最简单的线性回归。
    - o( U0 ?9 ]% I- A2 B( g0 y我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    # Q" n- _) N; r( n% l
    雷达 发表于 2023-2-14 21:52' Y) F$ G* _+ Y( k8 A# N! x
    谢谢,算法应该没问题,就是最简单的线性回归。! l/ [" {. a- Y5 R2 r
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    ' A0 m+ M: r7 F- H
    . v4 u' f6 }  {6 m% G刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    7 z9 R% t9 G1 ~! M5 c) d: O& U7 K! p6 h
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    % L0 Q6 z# b: `% e7 ~' l. t- A
    老福 发表于 2023-2-14 22:00# r7 I% L$ [4 L& ^+ u
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。# }) G2 {& x/ N% T, N, ?
    ) i* ]" S% Q& v3 c
    或者把b但的起点改为1试试。 ...

    * V1 L: j8 y2 o) \/ z6 ^$ J4 k2 ?: u* m
    你是对的。) \4 L7 Q& T2 G# V
    去掉了随机部分
    0 l( B% s* V* O: l, h% x( ?#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    7 p5 ~( \( }/ c/ S6 gy = (x*27+15).reshape(-1)$ Q# P; u: E1 M& {5 L+ H

    $ R9 z) {, q, z6 R+ g循环次数加成10倍,就看到 b 收敛了
    1 F8 a* ]6 q! }4 dw , b
    3 S  R3 i. k  O6 E27.002620697021484 14.826167106628418
      p# x- u0 ^. t* @  w5 O/ ~. W, U0 B* P" x& y
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-10-4 12:36 , Processed in 0.073531 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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