QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-28 14:57 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
SGD是什么% @$ q% G5 Y/ R" j7 I5 O4 |; T
SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。, E. T2 ~3 u  T3 \* h# R
怎么理解梯度?
) p& L, N0 u8 d( f假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。
# k3 W- L5 T2 o2 B# s! @. j( h# w# d' W7 `8 |
在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。- Y( ^& f; Q% ^# }
* p% b* B5 `$ [% ^% e( H/ m; s
每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。) h: N( |% C3 y' |/ j) `0 v1 ?; G1 X

. X1 U$ u: n; n& M为什么引入SGD" e* O9 B- O& J# U/ l
深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。
# U. Y! F! e; y4 H) }' A* S4 b8 g, o7 F0 R, g% Z" h" w, P& [
怎么用SGD
  1. import torch
    . v( i2 p+ }0 Q. I7 J
  2. \" A3 P8 y' u$ E/ V7 k9 H
  3. from torch import nn\" E! Z* |# g0 l2 ]) G
  4. * K' S+ k& M, Z( j
  5. from torch import optim; h9 W5 W; `' q; n* B. S3 ?) ^7 c

  6. 6 `# }& c9 d& H# h. o3 V

  7. - W% @9 x6 e; Q# _0 I. h) |: T( l
  8.   B\" R1 O# c3 U* Y2 T) j' k
  9. data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)0 E3 X% u$ U5 l6 ]

  10. ; b! p  N+ F3 _! s: d
  11. target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)\" N5 R7 m: l% W' r; P
  12. 0 b$ j- n\" |5 i( \( {

  13. 5 C1 Q: z' C' C0 ^7 [9 R
  14. / R4 z& N* T+ h7 w
  15. model = nn.Linear(2, 1). I3 \* x4 Z# }1 Z. T

  16. $ }& f6 D/ d) S0 ^! z
  17. 9 r0 ~\" a2 {5 }+ A' S6 Q
  18. 1 f$ p  z; e4 n6 w
  19. def train():
    ; ]) t' M* u7 i\" @1 h5 I7 \; M4 V. O

  20. * `( c1 {) R  v( f* F- s2 W
  21.     opt = optim.SGD(params=model.parameters(), lr=0.1)
      g8 A$ J( t0 B  x1 y0 M% @5 S
  22. 7 Q9 B, M  Y# {
  23.     for iter in range(20):9 |- R4 q. u6 w- h7 W- T' m

  24. ( E* B- b6 L+ J% m5 l( e
  25.         # 1) 消除之前的梯度(如果存在)
    * k2 {( k6 y% f( W) y0 V

  26. / [7 x' t7 u5 [4 f$ [
  27.         opt.zero_grad(); z: S* A$ a9 R1 @7 j) A
  28. / c( u$ k: y: K4 O

  29. ! c+ Z; {- m  k, _, ~; H( A: y

  30. : J: ~8 L: r2 O; o/ P/ V
  31.         # 2) 预测7 l0 Y\" m2 n* N  v\" I7 e2 v* M

  32. & F0 N. N2 M: Z$ d
  33.         pred = model(data)# z: M/ i9 w0 l$ q

  34. % ~\" d9 U& }4 L* S1 ~' ]- X. V' o

  35. , k/ X/ N7 H: a

  36. 9 }1 N1 N3 _( A2 y; J% b
  37.         # 3) 计算损失0 |' d( R& _* ^. \; r* I

  38. 2 V* I/ D6 G  j& G
  39.         loss = ((pred - target)**2).sum()% F3 b  s7 j7 b& n* H

  40. 8 v\" h$ Q9 l, y\" J
  41. 6 D& y6 k% M\" w7 f% S
  42. ; d6 r: F. q. |& M\" n7 o
  43.         # 4) 指出那些导致损失的参数(损失回传)
    % f& z5 J, _' x9 S5 W

  44. , v. u9 D/ V' k\" X/ K, D: k
  45.         loss.backward()
    ( z/ Q\" W6 j- M$ p2 j0 f- r

  46. 0 ], B5 h* e  D
  47.     for name, param in model.named_parameters():
    % w: c8 Z. R- l+ ?. s4 }' [

  48. / @: d) K+ c$ S
  49.             print(name, param.data, param.grad)
    6 z( F$ y5 |- X$ v6 g
  50. 7 ?\" _+ \* [8 ?7 `2 K' ]1 \: G4 Z
  51.         # 5) 更新参数\" E2 A9 h5 i) t! m+ w
  52. \" e8 J8 T5 m+ e8 [
  53.         opt.step(): i- a# e! |: O6 m

  54. 8 N+ ]# p0 P* `9 f4 G. M, {6 O8 y

  55. % M0 f4 t8 G. N9 c% {6 M) ~

  56. 4 i7 @5 i7 X! ]5 p- o
  57.         # 6) 打印进程
    9 {% P- A6 K7 ?7 j  J. r
  58. , U* W5 M2 M3 i4 }/ @1 u. c
  59.         print(loss.data)
    % K. [4 B; U7 G* ?
  60. + W8 ~- w; u! B. @! N! Y7 b' l9 U

  61. 6 u. T  [; C8 G7 c\" `

  62. - `- y9 u& \3 `\" @' }7 G\" L
  63. if __name__ == "__main__":
    - @* c) C) D5 ~

  64. % `2 B- D$ K$ A5 R9 N
  65.     train()
    2 C- S! d4 j  }$ u$ j$ V, T9 j* d
  66. : X. t. n) N. H' ~
复制代码
param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
: z  n& n& j* ]! o# k" L* q9 a8 B. w+ V' C. z! E/ N! f8 d# G
计算结果:
  1. weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])
    , P% _; i: d& o# s. E+ }

  2. % J8 u' X! F' u3 Y# b
  3. bias tensor([-0.2108]) tensor([-2.6971])! V\" P. p$ e4 j8 l+ x1 i: ]
  4. & N: f; ?- ^$ |
  5. tensor(0.8531)
    / _# f' n0 B  p& w) L) j; ^
  6. + e- Z/ ?3 C8 S( W
  7. weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466,  1.1232]])0 U/ Q- V- z' a8 Q7 s

  8. : l, N* t  x2 c! L% I6 b2 C. }  q/ J
  9. bias tensor([0.0589]) tensor([0.7416])
      ^) U& P6 S/ C

  10. * U8 m# \) u1 S! Y- [% X/ j
  11. tensor(0.2712)1 u; r7 ~- k) x/ p! {9 m8 K' h
  12. * c  n7 q9 ?# t# L\" f# S1 H
  13. weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692,  0.4266]])
    ' d\" C  H- T\" \1 ?' R& U
  14. 5 P' j  N* o* M( U1 ~0 `& M6 k
  15. bias tensor([-0.0152]) tensor([-0.2023])
    & {. ]6 m  h& m4 L
  16. \" d/ ]4 e8 y& M
  17. tensor(0.1529)
    4 t0 H! Q, r1 m) q. f  m( \

  18. 7 [8 l- l# R$ |$ X5 g* |
  19. weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059,  0.4707]])' m8 H2 W/ U' F

  20. 4 L5 o' U9 C: |6 z) D* V* Y
  21. bias tensor([0.0050]) tensor([0.0566])
    ' G8 Q- z2 }  X; }5 O

  22. / {! ?+ Y/ J9 F( `7 A% J* k
  23. tensor(0.0963)
      C$ ?' D3 }% Q& Q

  24. 6 Z( V+ a( B& R6 w& r
  25. weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603,  0.3410]]), b$ H0 p9 f9 i

  26. 8 \* m& e+ ^3 P0 r1 s' [
  27. bias tensor([-0.0006]) tensor([-0.0146])# C8 C  c3 i( ]9 Z/ ?' i5 I
  28. ( P! K1 e: Z) T. ~9 |! [0 W6 q1 {
  29. tensor(0.0615)
    . G\" C, g( w' W1 D

  30. 7 q$ e6 n0 j1 p- v
  31. weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786,  0.2825]])0 S: I! ]+ B4 b- g3 D* C, f; F
  32. : M# f. z# s# r- o0 X+ ]# w
  33. bias tensor([0.0008]) tensor([0.0048])8 F. {! K2 L, H* m3 ^& p
  34. ( w# e! a3 J/ y% A$ u0 g
  35. tensor(0.0394)4 a7 \7 O0 |9 q) k0 Y

  36. * v; s. u9 D5 y! Z1 Q7 x
  37. weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256,  0.2233]])
    4 w4 K, G+ N! M$ P

  38. - [; h* `# B7 C+ F! T* X' u% q$ s# x
  39. bias tensor([0.0003]) tensor([-0.0006])) m1 U. n4 [* I- |3 g, ?0 w0 M

  40. 2 _0 W$ H, Q- _9 s* X8 A3 {
  41. tensor(0.0252)' J/ K9 t- b$ b' @! T

  42. 1 S- F3 g0 J, T5 [4 K& s- ]! k  }5 H
  43. weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797,  0.1793]])1 B* I( [/ P* l  T3 {0 I
  44. . P* W3 g- X( \$ {) m6 B
  45. bias tensor([0.0004]) tensor([0.0008])
    : `. L( ]) A4 K

  46. \" f6 ^9 f\" v# a. `( \
  47. tensor(0.0161)
    / `, t) B3 |0 L8 f2 J: r2 M
  48. ) r' {, E: i7 ?- g
  49. weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440,  0.1432]])
    \" c, ^% g( i$ ]7 P; x9 I# k/ e. i
  50. ! ?; h, v( |# b! {
  51. bias tensor([0.0003]) tensor([0.0003])) }( A- Q7 ]. i$ B7 q

  52. 5 k5 ~- ~$ \0 m; g7 E
  53. tensor(0.0103)
    2 [. y* l9 ]5 Z% J, f

  54. # Z' U3 j7 `0 p* k+ T7 p
  55. weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152,  0.1146]])
    - X% f  `8 ?( j0 i9 o

  56. . i' W4 P; u6 t- `* ~0 |$ I9 M
  57. bias tensor([0.0003]) tensor([0.0004])
    2 }, }' f  ^! {8 Z- @6 s! ~# D! Q' x

  58. \" E2 i( Y+ |6 Q2 r: _
  59. tensor(0.0066)- ~7 B. ?8 r\" L+ T

  60. , _% t9 H; |% @, s
  61. weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922,  0.0917]])& ]2 R+ Q3 T7 H! A$ I

  62. / q1 `' `  `( j- ^: [# _
  63. bias tensor([0.0003]) tensor([0.0003]): A, [$ K+ `\" L9 r- H& u$ x. K
  64. 9 e  y' k3 u/ E5 f
  65. tensor(0.0042)
    0 R+ E( ~$ H$ [0 F, h# n4 G. }

  66. \" U! e. w9 a+ D9 f) ~\" V
  67. weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738,  0.0733]])7 r1 g9 P7 R4 D/ d& m  v( ?
  68. 7 h' W4 B) Y- s+ |8 {6 Q
  69. bias tensor([0.0002]) tensor([0.0003])
    - O9 A5 _9 V0 l! ~
  70. 7 W2 d+ n' N- F3 K5 v
  71. tensor(0.0027)( E9 w5 M8 c' z( g. p  k' y. Z
  72. 4 q: E* H0 @* W7 V8 W* Y0 u5 E
  73. weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590,  0.0586]]): `8 `# _* E+ C) L% S3 E9 ^
  74. ; m# j0 a7 i\" B/ ~; E6 |
  75. bias tensor([0.0002]) tensor([0.0002])
    ( M' N4 J+ i0 A3 f( N
  76. % e9 U, C& ?' R/ r* H% M
  77. tensor(0.0017)
    ; j2 e\" V\" ?4 t4 w\" `
  78. $ g- t- e) K6 e$ p
  79. weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472,  0.0469]])- r$ x6 ^+ e6 o3 L& D

  80. - {\" @# h0 v2 _; c1 z: ^  {
  81. bias tensor([0.0002]) tensor([0.0002]): L% j( a$ ?5 A$ K* f  P

  82. 5 L9 H+ S/ F6 h) }
  83. tensor(0.0011)
    . }; A. s! ]$ ~5 n

  84. # L4 d+ g4 m& h3 ?5 Y) C
  85. weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378,  0.0375]])
    * {& L\" B) [6 {8 T

  86. 2 b  g\" O4 X  u: M# H7 W) O( K. y
  87. bias tensor([0.0001]) tensor([0.0002])
    ' ?& t9 @# g- W) I  r9 v

  88. ; N5 r3 x\" b/ M6 k
  89. tensor(0.0007)* P6 Z9 b0 e9 C* K4 {9 J

  90. 6 ]8 \  s2 {& j* H6 \- O
  91. weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303,  0.0300]])
    , K- s5 ^. X; a4 |* \

  92.   B1 q' P5 z  A! }
  93. bias tensor([0.0001]) tensor([0.0002])1 n5 \6 g1 l/ l3 I8 p% w, s! g) w4 P

  94. 5 j, B4 |6 ^' I; v
  95. tensor(0.0005)
    8 v, w( E1 t+ }  _
  96. 8 V4 X  ~( z\" g! Q' ?
  97. weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242,  0.0240]])
    2 o  z+ N5 Y9 |) T\" L
  98. & ~1 o7 @* A1 t
  99. bias tensor([0.0001]) tensor([0.0001])  }3 d, K* ?/ G. M; Z- O2 X. o2 x% W

  100. 9 D5 a/ b4 W, U0 z
  101. tensor(0.0003)3 ?8 I/ c6 [' |9 p

  102. $ A6 L3 T( g3 T\" z8 Y
  103. weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194,  0.0192]])$ A  I  M6 c/ Q, Q+ \

  104. ! R8 E& J7 r1 j' {\" Y
  105. bias tensor([9.7973e-05]) tensor([0.0001]): a+ b- s) }5 p! C4 |

  106. $ g. v- H+ z5 O8 q, ~/ S\" c2 {
  107. tensor(0.0002)9 Y, x% A3 s$ R. t% h/ A3 J
  108. ; a) C8 Y! W' i. ^3 B  L
  109. weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155,  0.0153]])' b+ H! C2 o( s6 b0 T; c! Q
  110. ; Y& I% Q) S) y
  111. bias tensor([8.5674e-05]) tensor([0.0001])
    / B. \0 y$ p* t/ B\" m
  112. 1 z* x3 }3 |; ?5 A
  113. tensor(0.0001)
    ' _7 o  [7 x* R* c) w  U; A\" g( M6 ^

  114. / h  j7 v) g) R& R
  115. weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124,  0.0123]])
    9 ~3 t: ]4 ?! \1 z5 m9 ^1 |7 X2 R

  116. - I( X) F# f7 Y
  117. bias tensor([7.4933e-05]) tensor([9.4233e-05])
    3 A7 h3 W  z6 \

  118. - H( N/ v9 s0 N3 F' @; m9 v- U9 X
  119. tensor(7.6120e-05)
复制代码

/ E+ \6 F7 `2 q: W2 G% X
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-11 01:23 , Processed in 0.571789 second(s), 50 queries .

回顶部