设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 : `: m$ q3 |( z- ?* X: y! z
    # I0 k" _& @6 C; E, H0 p5 N
    为预防老年痴呆,时不时学点新东东玩一玩。/ b( ~# F2 E! C) s9 }1 @3 o
    Pytorch 下面的代码做最简单的一元线性回归:$ m: C( }+ _8 L9 |) Z  _7 B
    ----------------------------------------------
    4 @. c% M% a' v$ @import torch6 p$ m2 |4 M/ I: ]* }8 y1 R" d
    import numpy as np0 S1 {* B! l) P' f# Y
    import matplotlib.pyplot as plt
    2 b8 w7 I  m3 h: S: e) Qimport random
    ) _, P- b8 ]! l1 w. Z7 |# g4 j3 c; V; @( `3 Z+ ~' W5 |
    x = torch.tensor(np.arange(1,100,1))# Y4 y+ ]3 u. o1 N' N) D& b
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=159 N  `& S+ y1 k4 @: I

    9 b+ |; F2 V! t" }; U* Q" yw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b1 s: E* w+ p; v* [# [
    b = torch.tensor(0.,requires_grad=True)8 Q: Y* [3 o* t; U! p
    2 I, t/ I9 r: d1 v5 ?5 j  ^
    epochs = 100
    : ^( w! V' i3 e4 I. n; S9 Y5 c% N0 F* h) g& U! J( Q2 h% F9 Y
    losses = []
    1 o9 c/ {2 @' D& j9 Zfor i in range(epochs):
    * n9 u6 p1 I, E. m. l7 w+ k) z  y_pred = (x*w+b)    # 预测& d  z/ p/ K  V; G7 E& n: _
      y_pred.reshape(-1)
    # x6 ^) Z( A- z4 D- {( D& X 8 g: X, w) A3 U; Z3 T# S/ w  i
      loss = torch.square(y_pred - y).mean()   #计算 loss% n# c9 O  t% ^' a
      losses.append(loss)
    ; c2 b# \, `4 {7 e/ {# m" K  
    5 c9 v: Q- {# T: [0 M$ @  loss.backward() # autograd
    2 i* Q2 N6 t# E" F( p5 [  with torch.no_grad():- t0 P* c* [! e! d: F
        w  -= w.grad*0.0001   # 回归 w
    + \6 s9 r- w# p4 S    b  -= b.grad*0.0001    # 回归 b
      v' P  p" s" H0 {$ K/ a" M4 E6 |  w.grad.zero_()  
    , W7 Y- \; l5 F  b.grad.zero_()' w1 e, V# k- a! D; P
    3 J3 d  |. [# F1 \
    print(w.item(),b.item()) #结果
    ) H3 Z% U4 j5 [9 H4 o# r/ B) h
    0 d% A8 ~% f5 x; Q; @Output: 27.26387596130371  0.4974517822265625
    7 m7 b; s& d  f----------------------------------------------* m& T7 \- l5 k& s
    最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。5 A/ w6 t. n1 E+ ?7 g
    高手们帮看看是神马原因?0 a3 \" D/ ~2 a) u; L

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    6 V+ S0 w# r1 m+ h1 ?! |. N) @- s
    " @" ]/ t* i2 S* V没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    6 G) ?' q% p/ r( b. i- i-------# S% B7 q# W5 Q' _7 R) e' l( E
    不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    $ Z- Y  _0 [$ x5 ~3 p0 l-------6 L; j) K- M% j9 h9 d5 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
    9 b1 V6 z4 g. g6 l, a" |6 M没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    * J/ ^9 }% c; u8 q  S5 d-------
    . D1 F- |: h, g/ F9 B3 M* e不好意思, ...
    - P* }2 z( t' w+ B
    谢谢,算法应该没问题,就是最简单的线性回归。
    , g+ {/ r6 {$ p. h我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑 . ?- Z7 r6 L% ?9 H/ L
    雷达 发表于 2023-2-14 21:52
    & \* A8 g, ^- O. T谢谢,算法应该没问题,就是最简单的线性回归。
    ) j6 }* V3 c- x* n我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    , B0 u- [' `8 ^5 R; U2 Y5 j7 h- Z
    8 }) ]. |: a' F! g$ B' B6 d
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    7 _9 a: R; _/ j+ m6 q6 e' _
    2 O/ j3 a+ }# u' o# x6 @2 s4 \或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑
    ; V4 k- w7 `7 N& X; L0 F0 ]  _$ u
    老福 发表于 2023-2-14 22:00" Z& W8 ~6 J0 ]0 F0 s
    刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    8 j& M( o" p& \; b! y. i. q$ s# n% S0 {
    或者把b但的起点改为1试试。 ...

    0 C1 J# T3 C* S( g! ?5 L: Q& {! E3 j# R$ l, y8 `/ w
    你是对的。
    1 B# K) }3 n: w去掉了随机部分$ Z9 c) H4 M( T
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)% p. S- X) @5 \2 o1 C+ V4 B: G
    y = (x*27+15).reshape(-1)6 b' W+ p# L, G  W
    ; H* N/ ~, l5 E6 r7 H8 c; g
    循环次数加成10倍,就看到 b 收敛了
    ; f1 z" H) @6 K9 z; T; V* iw , b4 e4 {# f: ~8 {1 G1 J6 p
    27.002620697021484 14.826167106628418) D: P+ M$ |& E8 I" @% R
    * x4 T# H, k0 d) O9 b: M% [
    和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-3-9 14:09 , Processed in 0.060157 second(s), 18 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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