设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 1 ?+ I4 A3 r) t  Y/ |

    " j) u  u7 _# p# _为预防老年痴呆,时不时学点新东东玩一玩。# K/ g5 @2 l3 y+ z
    Pytorch 下面的代码做最简单的一元线性回归:
    6 ~9 M. l8 }- k----------------------------------------------
    4 C" g8 J; G8 o# v& Cimport torch. Z% \2 t* d  E
    import numpy as np: ~. G" o6 L- r/ M! A' S: ?2 X
    import matplotlib.pyplot as plt( l$ v" I- F: N" i( Q+ U. ?
    import random2 N6 ^5 S4 D0 U6 N: }5 K" w5 z  D
    2 V; P) Y' [1 p7 R0 f6 E, n" w
    x = torch.tensor(np.arange(1,100,1))
    . K6 g+ c+ _2 ?; m! j9 T3 Ey = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15$ J  `+ K" w/ _5 I7 Z* p/ \2 ^
    ; T% A' k/ X/ T$ y8 s7 @  u  B
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b- W: {1 {8 F7 L& W! [
    b = torch.tensor(0.,requires_grad=True)
    7 {: A3 A' j. Q$ t% W; s9 i) A6 m- m9 R
    epochs = 100
    3 k! s+ a+ ]( q- g' K
    6 q. `. u5 v, q# alosses = []* k0 ]; b  q4 a, w
    for i in range(epochs):
      O( n: y$ I/ z0 w/ i$ x; O  y_pred = (x*w+b)    # 预测$ h3 q- q, Q, `+ D0 C2 s
      y_pred.reshape(-1)( M: T, q4 l. B6 ]- W0 u7 p

    7 I4 _, P  i# d& k3 o" D; x4 B  loss = torch.square(y_pred - y).mean()   #计算 loss( Y# Z( P/ \5 C2 i. Z5 }8 k
      losses.append(loss)
    % w3 S& P+ H& T6 I1 w* y  7 b4 d; L* H. Q
      loss.backward() # autograd7 ]4 n$ a0 B  G( j/ C9 u
      with torch.no_grad():" c" i% Q1 }) m* D0 \
        w  -= w.grad*0.0001   # 回归 w
    " z; b6 ~8 _: s- L- o    b  -= b.grad*0.0001    # 回归 b ' O6 d7 {8 p5 F+ [" Y0 O2 K' V
      w.grad.zero_()  
    $ R+ s4 L/ l& }, [  b.grad.zero_()
    % Q/ Q% r& \" B8 m. X; a. v* U$ `% l5 c
    print(w.item(),b.item()) #结果' ~/ H& k4 b. }' P, B

    ! ]- R  z, j& G, I% @Output: 27.26387596130371  0.49745178222656251 ?7 N# c: z3 N* x3 U( @- c7 b' d
    ----------------------------------------------
    ! A1 r" e) _  V最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    . q% r+ ~1 T4 u/ ~高手们帮看看是神马原因?2 h4 T- h5 t* q

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑 / Q, s1 ^, _8 O  a2 b+ B0 Z4 M

    6 ?& t: S  u2 f* t. K没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    , X$ l4 H4 x: V; H. M-------
    1 ?( o1 h6 _& z  f( S. e, b不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。- `1 c7 h3 X* z/ [
    -------% M# K& w8 K" _1 Y8 u/ u% U
    算法诊断部分,建议把循环次数改为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' a/ x" Z8 I* z8 V2 P6 `( d* W+ C
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?/ F7 y% J3 x# t' K! e+ |
    -------
    2 F7 N/ Z/ ?$ u# A3 A不好意思, ...

    ' H6 x. w% A- x# {# C谢谢,算法应该没问题,就是最简单的线性回归。& s( b, v. e! x# ]+ n( K
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 3 T' M1 X* D0 }# {$ G/ d
    雷达 发表于 2023-2-14 21:52
    7 I3 s- |0 `5 v7 |! w/ [" L5 G谢谢,算法应该没问题,就是最简单的线性回归。9 ^& G/ A' Z& v7 Q
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    2 ?0 q; o2 n1 c* T% `
    + _" z! Z- I* N4 b" o刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    4 J) Q7 [" p- {  j! V
    & q- h/ g+ [/ Y7 S- K5 s或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    8 K5 u* f9 t. B
    老福 发表于 2023-2-14 22:00
    ( O2 ^4 f, h2 C+ I刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。; `8 v# c5 c: Y4 R! e! ~
      o  X. W5 W; c' H# s) w7 G
    或者把b但的起点改为1试试。 ...
    ) ^4 [- T1 C% Z* j# z, \# O- @. j
    9 T# }0 A5 q) X- m% s) A4 n& p
    你是对的。
    6 K- l# v) {0 K& z去掉了随机部分
    & P  V1 L4 T: T' l5 l#y = (x*27+15+random.randint(-2,3)).reshape(-1)( S4 n7 B* m  ^& `: {
    y = (x*27+15).reshape(-1)/ {" D( D! `4 \2 h  e! x
    3 W  o2 o6 ]2 w7 w1 d
    循环次数加成10倍,就看到 b 收敛了
    $ c0 K- e: h4 @  Zw , b
    % A* k6 `" i3 b( ~27.002620697021484 14.826167106628418- n( s# z& u3 q- K* E8 _

    7 v2 j3 u- _" Y: x; b和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-4-26 03:13 , Processed in 0.058199 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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