设为首页收藏本站

爱吱声

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

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

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

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

    [LV.10]大乘

    跳转到指定楼层
    楼主
     楼主| 发表于 2023-2-14 13:09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 雷达 于 2023-2-14 13:12 编辑 1 A! Q/ U# `) V' k$ {

    9 Q* H6 a& u% @) ~& K; I' C为预防老年痴呆,时不时学点新东东玩一玩。
    & F0 r0 w, V8 s: y* `, WPytorch 下面的代码做最简单的一元线性回归:
    9 D/ _, [0 e0 G2 D----------------------------------------------
    7 W; r* l* A) h) ^) X) W! mimport torch/ F6 P: p0 w. i* ^( O9 _% s- W
    import numpy as np
    " V2 k8 m' y! R2 L) u4 Fimport matplotlib.pyplot as plt
    0 Y- ~6 c% Q. F+ M* U9 `import random/ H7 {0 [$ c2 z# s# r7 K6 U; Z

    4 v' |6 R/ ]  x. m" A' p* X. Hx = torch.tensor(np.arange(1,100,1))3 D' E" |6 s6 x. E& j1 w" h6 Y  z7 R
    y = (x*27+15+random.randint(-2,3)).reshape(-1)  # y=wx+b, 真实的w0 =27, b0=15: X$ R1 z' L3 \. T" {  C

    & w6 c1 o# w# C/ o- t; Fw = torch.tensor(0.,requires_grad=True)  #设置随机初始 w,b
    ) y+ u  F1 z) n# O2 `% Gb = torch.tensor(0.,requires_grad=True)' x1 s) b0 T' j  d
    ' t6 L  i3 W9 p8 c: J
    epochs = 1007 r! B" l/ P/ R9 v1 W0 w1 ^, L

    ( R# f1 \$ o8 {6 M6 Glosses = []
    & j9 F# J$ `5 x$ wfor i in range(epochs):
    ( V" e- z  f7 K4 s: }5 s  f8 N  y_pred = (x*w+b)    # 预测
    1 k8 |2 h; B. @* c! c  y_pred.reshape(-1)
    ' u* B0 J" o" Y) Z. k% B' w " s3 `# |  I5 z5 B7 w- {
      loss = torch.square(y_pred - y).mean()   #计算 loss9 ]. w3 V" Z3 t
      losses.append(loss)
    ) p' o' }* @- k  
    6 ]- [( X# @$ k/ x# ?! n. l  loss.backward() # autograd
    , _1 p; P* @# a; I+ o7 o$ S  with torch.no_grad():. p/ O7 N9 p3 E5 E, Y9 C5 ~! r* x
        w  -= w.grad*0.0001   # 回归 w/ [5 e6 ^. Y3 d( \5 {' b! Z- I4 Z
        b  -= b.grad*0.0001    # 回归 b
    % C% c( t% l. j5 R1 E" _8 X: B, A  w.grad.zero_()  
    6 H" w. X1 O9 o& m# f7 E  b.grad.zero_()0 j: H- q+ H9 Q3 [/ \
    " R6 P1 F$ `8 l# `' g
    print(w.item(),b.item()) #结果5 @! s; x6 t( K0 \
    $ r; N7 A6 o: `$ a) L$ q+ D) p
    Output: 27.26387596130371  0.4974517822265625, ^, k4 ~- ]; e8 h" ?
    ----------------------------------------------
    8 i6 Q% Z' w: a3 K+ B# D5 s最后的结果,w可以回到 w0 = 27 附近,b却回不去 b0=15。两处红字,损失函数是矢量计算后的均值,感觉 b 的回归表达有问题。
    $ f1 U/ n! }& t1 w1 \高手们帮看看是神马原因?5 O9 @3 b' u: o% r& ]. N

    评分

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

    查看全部评分

    该用户从未签到

    沙发
    发表于 2023-2-14 19:23:02 | 只看该作者
    本帖最后由 老福 于 2023-2-14 21:58 编辑
    + V% D9 L+ _9 M  U' z( d7 a$ F: }& ^2 {3 X6 |
    没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?
    * s' |: K* [  F1 G7 d: H-------
    ( K: B, @6 x4 g; X/ U不好意思,再看一遍,好像你在自算回归而不是用现成的工具直接出结果,上面的评论只有一点用,就是确认是不是算法有问题。
    - O9 _0 ?6 L/ T$ W-------
    ; C& C9 L& A. O, n2 Y1 s算法诊断部分,建议把循环次数改为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
    7 ^/ T. H, q" h! n# _- \0 Z没有用过pytorch,但你把随机噪音部分改成均值为0的正态分布再试试看是不是符合预期?& e9 k2 x$ K. M8 x0 K: e9 T1 `. o1 T
    -------
    + ?$ u" X% l1 P; ]- _  d, _不好意思, ...

    - V' ~  V- R* {5 c& C! S$ n谢谢,算法应该没问题,就是最简单的线性回归。
    + K$ u/ W; Z0 K) {我特意没有用现成的工具,就是想从最基本的地方深入理解一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    地板
    发表于 2023-2-14 22:00:48 | 只看该作者
    本帖最后由 老福 于 2023-2-14 22:02 编辑
    + y' C: `2 @3 C6 {) g* q! \
    雷达 发表于 2023-2-14 21:52
      C$ c4 k" j$ ]  y- H谢谢,算法应该没问题,就是最简单的线性回归。- s( F+ b2 W/ h+ z. n
    我特意没有用现成的工具,就是想从最基本的地方深入理解 ...
    , N8 l0 c5 B- h8 k" T

    2 P0 a3 u4 x; e+ S+ Y5 b, o0 t刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。8 X  b' `& l! ~7 L
    2 {8 p" Z7 w( q% c
    或者把b但的起点改为1试试。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

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

    [LV.10]大乘

    5#
     楼主| 发表于 2023-2-15 00:25:26 | 只看该作者
    本帖最后由 雷达 于 2023-2-15 00:31 编辑 + |4 s, Z# I2 Q6 G) K
    老福 发表于 2023-2-14 22:00
    " |, B- `: A. a, n9 m刚才更新了一下,建议增加循环次数或调一下步长,查一下loss曲线。
    ) Q6 J0 u$ X8 R1 R( v: ~. \% s( u4 Y2 v. Y+ S% [  q! }
    或者把b但的起点改为1试试。 ...
    4 d8 d3 ]9 F+ x8 K( [2 {
    * L5 w, [" Q  W2 U* }7 i
    你是对的。  n) x6 p0 U; c- j( ?; d% ]7 L
    去掉了随机部分2 e% v2 c# J( t9 a; w" o+ D
    #y = (x*27+15+random.randint(-2,3)).reshape(-1)
    " I' B& M, d* U8 Ay = (x*27+15).reshape(-1)+ y9 _# `! b9 h* _% S7 a

    6 t$ x* E' F' _& @; D8 T& w: s循环次数加成10倍,就看到 b 收敛了! W/ t- @2 Y0 ?) ]2 q+ u
    w , b
    + q; t+ X- q8 L  V5 u27.002620697021484 14.8261671066284180 y4 e2 A3 |+ W" y9 b! g( A

    2 r4 I1 [1 b; A5 F) ^3 S3 O9 ^和 b 的起始位置无关,但 labeled data 用 y = (x*27+15+random.randint(-2,3)).reshape(-1) ,收敛就很慢。
    回复 支持 反对

    使用道具 举报

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

    GMT+8, 2026-1-12 20:05 , Processed in 0.031360 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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