QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2684|回复: 0
打印 上一主题 下一主题

随机梯度下降算法SGD(Stochastic gradient descent)

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-28 14:57 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
SGD是什么% [& g6 [  b- T! g2 B, B
SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。
6 G# j# K" j3 g6 P/ C  N: _怎么理解梯度?
; N2 D* @- d% ?* P/ o7 [+ z. ^0 ], r假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。. b2 j5 n# d" S( ~( x1 g3 B
% U- c# y1 |( x( D
在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。3 _' r' k/ l( X8 [8 w' Y9 A

  _5 g8 b2 u" B$ r, E每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。9 F0 r* i2 s6 E( K
& w$ J  B. `7 z. ^! S
为什么引入SGD" v: u+ ]$ R: G0 z* {
深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。4 D" K4 B5 c; y( r4 w

' \5 u# ^. x0 `5 n: y3 ^; y+ I3 l3 u怎么用SGD
  1. import torch' q  p8 w9 d* B& c$ V( B6 K% V

  2. 4 }# M2 o; _# _7 z+ _  ]
  3. from torch import nn7 x+ G0 `& Q1 U2 L
  4. * f\" O6 ]; ^/ S/ `! l& U4 V# H
  5. from torch import optim5 B# m6 K5 F  G# h7 j

  6. 8 C* E( k5 }' O; ~8 V

  7. * M  `. s  a, x5 r$ R0 H8 v, Q
  8. 3 _0 R& e; f4 l. }  e8 K! ]
  9. data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)  x3 Y) }! o0 F0 G; A8 o7 D
  10. , y9 y/ p4 Q9 A6 z
  11. target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)2 o. x& X2 Z5 G' z* S- E9 g) a
  12. \" A4 b- T& R; V4 _% F\" u
  13. \" t5 P9 ]# I! ~$ E1 g6 _
  14. 4 F5 W4 @: G- X) T: T
  15. model = nn.Linear(2, 1)
    * h& r7 q- T5 [5 Q
  16. 4 z5 b# k# j9 X/ H

  17.   y\" z' m8 w$ ^! f- C7 `

  18. 4 k9 P\" Y$ w0 Z/ r& ^4 o* k
  19. def train():: v% z9 C% w2 s\" `; Z( D

  20. 1 G, B9 |8 s0 Y\" ?7 ~  T+ w
  21.     opt = optim.SGD(params=model.parameters(), lr=0.1)4 c) L& E0 a, v7 `  W$ s9 h

  22. ' B- ~5 B! u, d\" A. C, O; x6 Y. O
  23.     for iter in range(20):
      I0 k6 h8 s  l
  24. $ F  u8 V+ I8 U- J7 f
  25.         # 1) 消除之前的梯度(如果存在)3 \( y) v5 W% l2 \. B) U
  26. ) l1 u$ y! K, s
  27.         opt.zero_grad()% e3 _# x2 o1 j

  28. ; i1 g2 d# Z8 ^& s3 l\" y, G7 E4 G6 _

  29. ; r/ ?& W) _3 R* M( R& N6 j

  30. ( f1 A$ m, H9 `8 f7 a\" ~/ g2 w
  31.         # 2) 预测$ \, n3 [, F0 `9 W! k' y9 `8 T

  32. ( R, z( {; X% H- [! U
  33.         pred = model(data)
    ; t) r3 s9 O2 L* G5 K  [* E
  34. ; @: r# n( \5 K3 k5 U0 z, g1 S2 F

  35. / G  v0 v( b6 U, s\" N
  36. 4 U9 J/ r5 I8 I4 u; Y! t
  37.         # 3) 计算损失
    4 g4 Y* l  B/ V

  38. 6 D- E/ c4 S\" P  L4 q  {, i
  39.         loss = ((pred - target)**2).sum()1 g' b, N- Q\" X; e
  40. 5 g, R7 l* M, b4 h3 {. X. h( J- A

  41. : [- q4 \- {0 O# U
  42. ' H9 q+ M' _% h6 \& ^5 `( w8 S1 b
  43.         # 4) 指出那些导致损失的参数(损失回传)
    . k/ o5 b3 [# E/ c2 I5 L
  44. 4 y8 i7 k  g: A8 x4 ^% r% k' j
  45.         loss.backward()
    ' j9 B1 R3 t; Q& s

  46. ! }7 H; y/ U; M/ I
  47.     for name, param in model.named_parameters():
    0 s- p( L1 `, p; \( N1 P$ T

  48. * l$ Z% Q/ x- Q3 P  n) l! _+ a8 |( {
  49.             print(name, param.data, param.grad)
    0 W4 @# \& N1 c. [  p2 {9 m/ ?, X

  50. / Z) O4 f+ u. N) t* Y2 s+ ?
  51.         # 5) 更新参数
    # `+ n7 F8 r/ [\" ?% z

  52. 5 }8 j/ _, M9 H6 K- c
  53.         opt.step()1 Q3 J2 n7 {$ r2 a# a

  54. $ X1 G. {% I% ^( N/ }5 i# B

  55. 3 G$ e7 t8 v. l* _! P

  56. ' R( s% [, g# W5 t7 C$ F
  57.         # 6) 打印进程( e+ k% {3 O8 N1 ~) x

  58. ) t; N# M1 b1 u8 T. e8 f$ m
  59.         print(loss.data)1 T; T+ I! e4 u4 |8 k. C; R& C

  60. $ V6 m( J* J7 v, ?5 K! z
  61. 1 C! h4 D6 k8 W\" l  t

  62. ! B' Q\" K) m; u- j6 a' I3 X\" J
  63. if __name__ == "__main__":9 i; x4 ~( C- x
  64. $ Z  \+ q4 k9 F5 X9 S, x
  65.     train(); V* T2 l3 m1 B' q
  66. 8 \: S  a5 P( g: [/ J) |: ~\" K
复制代码
param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。) t% J6 u7 E" u' m* q

+ g2 ?3 T' y3 e  j计算结果:
  1. weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])% h- `: }7 l0 q, p- ^* ?1 h

  2. 7 v3 s) S/ n% t$ g  T4 q* d
  3. bias tensor([-0.2108]) tensor([-2.6971])8 Z( ^& u! e( b

  4. 4 o. L# s1 [) {. t5 G
  5. tensor(0.8531)- o2 Y* p# Y( r+ Z

  6. 5 M\" C. D* X* I  a& o
  7. weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466,  1.1232]])8 N; F$ P8 G& R! `. ^7 V
  8. * C; k  u\" Y1 _: c% C2 g
  9. bias tensor([0.0589]) tensor([0.7416])5 o9 o/ ]5 L- R/ [' W$ Y

  10. & p\" I2 I6 |1 N3 L
  11. tensor(0.2712)
    6 d$ m7 ~( H; S% n, s. ?
  12. . v4 H0 [' D& u' {& }
  13. weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692,  0.4266]])
    6 s4 d/ Y9 W8 s- _4 Y0 @- c2 r
  14. 7 W4 n# {; S1 h+ N/ o; k& V
  15. bias tensor([-0.0152]) tensor([-0.2023])
    6 C& q; J4 d6 L+ C

  16. , H2 J6 E: X0 f# g4 G0 H* |, [
  17. tensor(0.1529)
      e) Y. w1 o# Z3 j
  18. & J1 x2 @7 i5 J; G, z: L5 R1 k% F
  19. weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059,  0.4707]])
    ! B) H! R( \! ]1 C  e( J$ }
  20. 3 ~: w$ y' B: y\" d8 o( b' N
  21. bias tensor([0.0050]) tensor([0.0566])/ H+ s+ P- \4 M2 ?) B, e

  22. : X\" f2 E. W. h
  23. tensor(0.0963)8 s  b8 J8 H\" w9 t8 e- w. U5 O& Q

  24. ; K% r2 K. d/ }) }. j
  25. weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603,  0.3410]])7 ^! x9 B0 [0 r4 L* T* n- F\" k2 D

  26. 9 S  O: d* S\" L
  27. bias tensor([-0.0006]) tensor([-0.0146])9 @7 d$ ]- a5 n4 _/ c3 a* T* L
  28. - W\" V* h8 M0 o/ Z6 y
  29. tensor(0.0615); C7 r4 _  |% Q7 `1 s, |2 t
  30. 4 |  I: v% g* @% F( C
  31. weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786,  0.2825]])
    . b3 g2 w2 S1 p; I3 I

  32. 9 `/ W' D* n$ H+ r, P  t- D
  33. bias tensor([0.0008]) tensor([0.0048])( Q* @/ W: l9 g) z5 G8 Y/ Y: r0 x

  34. . s/ P4 P( J  B4 t1 n5 u% u; C. ]
  35. tensor(0.0394)
    / q6 c8 H2 l1 q0 U: O% _+ H, `

  36. 8 v( S; X3 w0 o6 X7 m$ o
  37. weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256,  0.2233]])
    . z. |9 |; G; Q7 a
  38. 1 Z9 `4 ?! K' _; X/ ?
  39. bias tensor([0.0003]) tensor([-0.0006])
    + e% g1 Y# ^$ L4 n

  40. , I. Y5 N: f8 r
  41. tensor(0.0252)/ \. V, {# R2 ^, `; o

  42. \" v2 @; s/ f+ T5 i& Q
  43. weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797,  0.1793]])& m& R9 u7 V4 n3 F2 f% ~# D# I
  44. - w% ^: c7 i8 f6 X0 N8 d3 V; D
  45. bias tensor([0.0004]) tensor([0.0008])
    * |( _0 `$ V\" O, ?( L

  46. # ]6 q6 h# W' ~! y- b. o' e
  47. tensor(0.0161)1 j. b2 H7 y6 w* x' c9 \

  48. 3 w7 W( p& ]) {. Z$ x\" w
  49. weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440,  0.1432]])6 V. o- s( t\" _

  50. ; s8 k5 c4 v4 S, G4 j6 H
  51. bias tensor([0.0003]) tensor([0.0003])
    2 }; {6 q9 e& d

  52. 4 ^1 w3 b; u3 r0 @
  53. tensor(0.0103)
    ( Z* u- k: o+ \; W1 D0 E2 z
  54. ( B$ I  @4 ?+ ~$ w, Q# X
  55. weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152,  0.1146]]): T- Z\" q; h1 Z8 s+ B3 p( A
  56. : ?8 C1 \( g. m5 E, D2 ]; ~' [3 T
  57. bias tensor([0.0003]) tensor([0.0004])8 \5 Y+ |8 p% I% p7 F) C/ H( _4 a+ [

  58. 1 W& D3 S4 L* K3 d
  59. tensor(0.0066)  P9 {) G& @% X; q9 i. a6 @. J$ M! c

  60. 6 E' x2 O; `1 R9 E
  61. weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922,  0.0917]])  C: j) \* u( x, m7 l
  62.   v2 c0 I3 j2 r$ s
  63. bias tensor([0.0003]) tensor([0.0003])$ A. A9 X1 T) x$ A9 U. Y6 P

  64. . x+ }( q. y- `4 m  d- o
  65. tensor(0.0042)
    $ z: d+ H1 T: Z: L0 w& b1 ~' F) `
  66. * j, \- q) q5 L  D3 J  m
  67. weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738,  0.0733]])' Z; |7 d, ]5 ]

  68. ' E. e& I0 F5 e4 ^5 ]: F% i6 o
  69. bias tensor([0.0002]) tensor([0.0003]); y4 o1 X$ O& I6 k: [
  70. 2 y; c$ ^5 ~9 b2 F4 s6 B$ l
  71. tensor(0.0027)- e/ c1 s7 Q6 [* @( l

  72. 6 p$ q8 S\" t9 ^! L
  73. weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590,  0.0586]])$ h8 r6 k, |4 U' t5 T$ y4 H' M

  74. ' r7 c+ B- _5 `  @: ~1 I
  75. bias tensor([0.0002]) tensor([0.0002])
    8 q- g+ _7 l! }+ c( R7 |8 `5 W4 c- `* m

  76. 9 }: W# {7 f- e  w9 I' A+ j
  77. tensor(0.0017), M% O7 J8 V: _0 l/ Z# g8 X1 i
  78. 4 D8 V9 o2 }' G; ^& W
  79. weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472,  0.0469]])
    2 `! j' O3 H\" N. u8 J3 ^, K

  80. 3 e1 C$ d! V- r. X* H+ W! p; M. g
  81. bias tensor([0.0002]) tensor([0.0002])
    . v. d$ |\" u9 o9 a

  82. & e+ v$ A5 s) {! d% e
  83. tensor(0.0011)
    8 D; n9 _0 R1 I$ v) n8 _: `
  84. 4 l. o' S( i8 F0 R
  85. weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378,  0.0375]]): D2 k( H* O: Z' A/ ~; a

  86. 2 Z% n. ^6 b3 s/ F! ~( |' ]
  87. bias tensor([0.0001]) tensor([0.0002])
    $ |6 B. \/ n$ N1 i! |+ C. V3 P
  88. $ c6 D( |0 H0 s) w- x
  89. tensor(0.0007)
    & _6 L  U$ X\" G/ S3 Q
  90. 7 u$ f* v% c\" {# W1 U6 ^2 r% p
  91. weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303,  0.0300]])\" g) q\" v/ g( B

  92. / u, h( N! _! R9 d% c- C$ I$ m% T
  93. bias tensor([0.0001]) tensor([0.0002]): {  i8 ~9 n  C$ a5 u  K

  94. : x* F. i' v9 q- ~3 N* ^
  95. tensor(0.0005)
    , v) G2 o- |$ h3 p

  96. : _' S# C\" S8 k/ k' u4 l0 Q7 h
  97. weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242,  0.0240]])
    4 [( ~9 k! g# n& x0 u4 D

  98. 0 a! z& M4 i. o5 C) _: p
  99. bias tensor([0.0001]) tensor([0.0001])
    7 Z$ \( _4 Y7 J8 @

  100. : V5 Y8 z! c% B+ U6 C' ^/ K
  101. tensor(0.0003)
    . a1 _6 f8 x6 `- ~

  102. 9 X6 p: E\" g! U
  103. weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194,  0.0192]])% s' q9 G  }5 O1 m  o
  104. 5 `3 {1 Y/ ~  Q\" l& v8 D! W
  105. bias tensor([9.7973e-05]) tensor([0.0001])
    + ?8 Q; [; h3 H3 [/ g+ d/ P

  106. & ~% Q2 ^+ j  s, ]1 Q& B
  107. tensor(0.0002)
    5 C0 P1 `7 y/ p; q\" @, b

  108. - n3 h. S8 x0 m/ Q4 ^& N
  109. weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155,  0.0153]])
    ! T, Y2 ^\" ~  d\" F

  110. + Q0 V1 V: M4 X
  111. bias tensor([8.5674e-05]) tensor([0.0001])2 I3 j7 }  `2 n7 i( h3 a
  112. ! G  s1 N4 o; ~- `1 o$ d# [; n3 l
  113. tensor(0.0001)
    & N( Y/ z0 z+ \5 s2 D3 H

  114. 2 H) v# a2 b2 Z5 p  f4 @\" A2 p
  115. weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124,  0.0123]])+ ]! d! O! C$ F% p/ W2 `  g
  116. 1 T, H+ F+ }  A. Q  X3 j0 j2 _
  117. bias tensor([7.4933e-05]) tensor([9.4233e-05])\" |! _0 K6 u7 I& Y. c3 R0 t
  118. + }1 \6 k& U% I$ b- R4 Z
  119. tensor(7.6120e-05)
复制代码
  E7 t3 h8 u5 D: G+ ~7 f; \
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-7-10 15:02 , Processed in 0.382837 second(s), 51 queries .

回顶部