设为首页收藏本站

爱吱声

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑
    4 o( z; J0 |! G: [
    6 O! |% Z5 n$ r为预防老年痴呆,时不时学点新东东玩一玩。
    0 E& ]% D3 r7 c# m8 X) C! o2 y. TPytorch 下面的代码做最简单的一元线性回归:
    3 l$ z* j! M/ i( |  C: v----------------------------------------------
    " g$ L' W0 o5 ?7 Z" B: simport torch
    + N* d9 C* Y+ _6 V4 z! x& Rimport numpy as np
    * C8 Y, ]$ @6 l: O1 P) Pimport matplotlib.pyplot as plt/ H2 r. E  w1 L$ p) Y- n
    import random
    0 e0 i( A: c/ \0 Z- X1 A) C, Q
    ' P: E( C0 X7 `9 O/ U- S6 \8 z- qx = torch.tensor(np.arange(1,100,1))$ R% L# Q/ v0 T/ V1 R+ `
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15; e+ m0 x3 g' h" |) v# y
    6 _5 t: y) ]2 l0 N- S1 U1 ~* l7 r7 x
    w = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    0 @2 ~( D8 V7 t2 ^0 H$ t2 A$ _b = torch.tensor(0.,requires_grad=True)* @3 ]' I% N: f/ K$ V! J; c4 o

    ; _5 {% c8 E# v) {4 P( y* Oepochs = 100
    , c: d4 E6 s7 b7 ^9 V- {$ u
    , A& u$ M; ]/ u  X$ V6 blosses = []
    % ^( E- g/ l& e8 |/ xfor i in range(epochs):
      c) W8 B! b5 ~" P/ I) i: i  y_pred = (x*w+b)    # 预测$ G5 t" `9 ]; m/ h+ F* I- N
      y_pred.reshape(-1)  a4 m* j7 z( d4 S. {9 ?

    9 x* [% |+ H5 c  loss = torch.square(y_pred - y).mean()   #计算 loss
    2 p0 R5 w+ r. i  losses.append(loss)1 p5 f: }( ]" t0 V8 Z# v
      - o# r* c# I' g8 d9 F+ d- N4 m: h! X1 W- B
      loss.backward() # autograd
    + Y- {+ E7 X& R) H" a  with torch.no_grad():( c( F. x, s( ~$ B4 W( H
        w  -= w.grad*0.0001   # 回归 w
    8 B; C. W# t' z- {. z6 Q    b  -= b.grad*0.0001    # 回归 b ; w3 G. ?. U, L6 g$ ^' r
      w.grad.zero_()  
    & _5 T& |, Z/ U; a0 l% v) J; L  b.grad.zero_()
    5 d* `( O: O8 u( ]  q) r8 G( z
    5 \" x9 b, }. I. U4 o: O' s# Sprint(w.item(),b.item()) #结果
    - u. N+ f6 v5 |9 |( J4 v* }2 C! f; {) {) V
    Output: 27.26387596130371  0.4974517822265625
    " g  F: Y* R7 U5 @# o) \- q----------------------------------------------; L; V7 N7 H0 g2 |1 c9 [
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    8 \9 l( f# U% ]% K: F高手们帮看看是神马原因?  r; J% g. `1 X0 @( n/ Z

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    * X. W8 }- ^$ W0 Y7 s
    + \6 B) ~7 k* r9 \  c, q5 U没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    $ S0 \( ?3 v8 P  E8 D' {6 r* e-------
    . q" w2 g! Q% O/ C5 j3 @" G% {% v不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。" A0 r3 G7 n' ?
    -------$ i$ A( ^& X8 {. S- s0 G1 q
    算法诊断部分,建议把循环次数改为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: O4 Z. I) i% F* J( ^
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    9 I" I: h. |# ~; G* r-------' s. }- q3 Y' Y* E" h
    不好意思, ...

    / g* `+ W* x8 h: q; a  c谢谢,算法应该没问题,就是最简单的线性回归。. ]- h8 x, Q+ n' h' \3 r# r
    我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 : J; m6 j, h& I+ z7 w
    雷达 发表于 2023-2-14 21:52
    ) ]: K1 t) s* k1 w谢谢,算法应该没问题,就是最简单的线性回归。
    8 P. y8 d$ [7 m0 q  I我特意没有用现成的工具,就是想从最基本的地方深入理解 ...

    , W7 _9 }# ?. S; ^/ q* y
    8 ~) d0 t9 M3 [/ p# m, N# L$ i刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。% v/ C4 x( s. w0 c: ^3 m0 F
    # V5 F7 _& A% W
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    $ L$ t+ u. \. Q3 t  G
    老福 发表于 2023-2-14 22:00
    2 v" z6 N/ }, V* t  x/ u刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。& i/ Y' L- ?; p

    & k& G. W! @+ ?0 ]或者把b但的起点改为1试试。 ...

    0 ?/ T) {( g+ G, U# C1 |' n$ D  D+ b( z' @6 i
    你是对的。( K% W* `3 g6 `8 E" V
    去掉了随机部分
    ; x" W# A0 q; K: ~8 ~#y = (x*27+15+random.randint(-2,3)).reshape(-1)
    + {! a! }& d7 J7 J& Fy = (x*27+15).reshape(-1)" l- u: q1 z. b" l
    * G% ?0 g) B7 t) W
    循环次数加成10倍,就看到 b 收敛了, A& N( x  P, U5 h" b
    w , b# a* }2 a% r0 `! w6 [* a
    27.002620697021484 14.8261671066284186 k7 U: ~+ \; E

    1 T2 v' w0 ~: L- }: E和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-9-28 17:14 , Processed in 0.071452 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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