QQ登录

只需要一步,快速开始

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

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

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

1198

主题

4

听众

2978

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-28 14:57 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
SGD是什么
& U0 [& m) l( Y( g6 v! V( v; k0 iSGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。
) G) s9 [9 w- k. Z9 X7 \怎么理解梯度?
2 K5 L3 w2 P+ S6 T/ n. f, r假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。7 _( `: [( a8 N7 `# X" E! f
- @5 Q$ J* c! k7 e& ^9 W$ y6 D
在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。8 u# a, t* I: O' E8 G0 L

0 [. K7 R1 f, \& K" N每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。; t* `/ b  W8 n
. b, e: d" U8 w* u
为什么引入SGD
7 ^! s4 O$ k' @% ^2 \) f深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。
; j' {+ w; L8 E2 f! q5 v
" Q( n) ~* f/ i8 Z, |; N/ v怎么用SGD
  1. import torch
    , \  ~- {5 z: W  d
  2. & h3 y- c! g\" |4 W, g! E% @! L  D5 r
  3. from torch import nn0 j* D  b7 P  t+ P) I4 r  C
  4. 0 F4 T9 _' I: ]0 O, U+ `
  5. from torch import optim
    2 ~1 \7 g# C9 C# m
  6. 3 \  Y8 j5 t) H5 n' b' M+ y

  7. - c8 L6 l1 d8 `' E
  8. 0 B6 z: e' F& }, V$ ]5 L
  9. data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
    4 @+ Y4 x- J- z& h

  10.   t9 B6 p4 G7 j. \# [- U) F4 z: F, N
  11. target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)4 m: E) F9 j5 @6 s2 x. I3 h

  12. 4 D0 X/ ~  Q\" S
  13. + r6 H3 Z1 p/ t

  14. # k1 C. ]& \3 X  |\" q3 _
  15. model = nn.Linear(2, 1)
    1 K+ |  }! _+ e' i3 s4 ]6 M
  16. 7 Y6 Q5 K* H7 J
  17. 0 K! C5 v3 W( D& N2 ~& w: \% l
  18. 3 _' O! N5 A# B8 H\" v( @  M& E+ I; }
  19. def train():. E: c4 W! c1 n; J0 `. T4 k

  20. ' E4 |# }% f, t
  21.     opt = optim.SGD(params=model.parameters(), lr=0.1)
    1 t7 ~  ~/ d9 X( f! x+ F% o
  22. 8 |- p. ]& y' G- L) g: I; H
  23.     for iter in range(20):: B. `; ^4 e7 `
  24. $ n. P( R! x! M% u6 D
  25.         # 1) 消除之前的梯度(如果存在)1 t! `. ^& s5 `% ?

  26. : x( X5 Q$ [, {5 B  `* ?8 F# r, ?9 @
  27.         opt.zero_grad()  M$ l3 K\" F+ Z1 ?- m

  28. ) B' q9 L0 s) Z4 d2 x
  29. & `# a$ Y! g! C  ~7 p7 m5 R

  30. ' m/ s2 B( o% W# I/ h
  31.         # 2) 预测
    + D! c, I0 H$ |& R; S0 O9 G
  32. 8 @/ L+ K  D* y! A# q$ G6 |
  33.         pred = model(data)  I% ]2 ~7 k; I; |* B4 L9 R7 M0 Y2 h

  34. 5 x' d/ X) W6 f0 A$ D& K
  35. 8 _8 n' ~) @6 y: B3 A; Y$ i4 W
  36. ) H$ `& q; a  F0 ]+ I8 G. c- \
  37.         # 3) 计算损失  B# S6 F0 e\" e' W+ g5 G4 h$ P
  38. / G0 I+ X: U5 i4 g0 V3 `
  39.         loss = ((pred - target)**2).sum()  Q5 }% e' W$ e0 v! n* ?. X
  40. % v: H8 n0 g7 u$ n/ h& j
  41. 3 u\" d+ q9 D5 ~1 S1 O* z- A' @7 w
  42. $ n; r2 h5 ?0 L1 K# z0 L
  43.         # 4) 指出那些导致损失的参数(损失回传)# D& p2 j! O4 |; ~- x

  44. 1 k1 r6 ~4 s! W! {
  45.         loss.backward()
    6 ]0 Z\" Z, S1 |- u! w4 a

  46.   f$ x5 G7 B* i1 C6 g7 `9 V- l5 Z
  47.     for name, param in model.named_parameters():) e& ~- n) I  T

  48.   u- q6 U( s: }+ ?5 d
  49.             print(name, param.data, param.grad)
    ( U, U( b9 }3 s, M7 o
  50. 9 }6 L' }1 ~8 n) ~9 W3 D
  51.         # 5) 更新参数
    4 a4 h0 Y/ \+ I' [# L
  52. + p0 u4 \1 u  L$ M
  53.         opt.step()0 x9 m) X/ @; a2 u+ w: d5 T. l
  54. ; c# \- B. B% {  K
  55. - N0 q( }, @+ B5 R& N# y% ?, ?
  56. ( o7 Q0 p\" A/ j# ^) C1 @: \1 d
  57.         # 6) 打印进程
    0 s$ n9 h. T1 K4 ]0 }' W\" k! C
  58. $ R5 v0 z2 F( r% P, Z
  59.         print(loss.data)  X) S. T. W( C6 R4 t% ]  C
  60. - n# e) T; h* `/ {
  61. & G0 K\" C& P; m% H( x; E

  62. % I8 r5 z- F. h0 S0 R# T: I
  63. if __name__ == "__main__":7 k6 i: w. G% R6 n5 q6 @5 h  ^8 O

  64. ! I9 F  Q# T: r- H# h% P
  65.     train()
    2 K. M) g& J; l  i# T% b
  66. 3 `0 p' X& w# S) v/ H- _
复制代码
param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
: h/ V! ^0 z( i2 S! E1 W4 i. q; l! k' w9 V" S, P0 ]0 Z+ H
计算结果:
  1. weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])
    / L& {9 ^- x9 s1 t

  2. ( p1 R! W\" s% d% `9 {) g
  3. bias tensor([-0.2108]) tensor([-2.6971])
    4 {3 o! _0 _/ y- S9 Q( S! H

  4. % }5 ], P+ T2 k
  5. tensor(0.8531)4 y) C0 N8 Y5 [. L

  6. 7 p# n- W0 v\" F/ F
  7. weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466,  1.1232]])
    4 |* {2 _5 e7 c8 O
  8. $ [9 h# q/ `& [5 |2 K; e' G
  9. bias tensor([0.0589]) tensor([0.7416])1 W2 K& `- V$ L$ q% U) t: r

  10. 0 a: a9 D1 j8 D# R) K! k( Q, F1 [
  11. tensor(0.2712)
    ) v7 U% x) @; U\" ~

  12. 4 T/ j+ H$ U5 q\" z# x
  13. weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692,  0.4266]])3 |# k# f6 l- d, d

  14. ; d! Q' V) e4 e) R9 R
  15. bias tensor([-0.0152]) tensor([-0.2023])/ Z+ U\" S7 v4 r2 B/ B. D7 S. D( z

  16. 9 S$ T! V8 l! t; p; \. K% h
  17. tensor(0.1529)4 H& h0 b; a7 {! {
  18. / g! c. x$ n4 o: z3 t* Q
  19. weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059,  0.4707]])$ ^2 r\" R5 h5 J# m) H
  20. + J2 q  Z: \# f% x( w# k1 N& w
  21. bias tensor([0.0050]) tensor([0.0566]), c' e. ~0 F# B2 ^. _  w4 |+ \

  22. ; e* Q& @0 l3 L
  23. tensor(0.0963)
    8 T3 Z* f* J% S7 \, K, ~3 T

  24. $ j! K4 B1 k  Z; o! Y2 A% [
  25. weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603,  0.3410]])
    + Y. u# w2 C7 }: X* C
  26. ) d% O6 G% K5 M7 v1 L
  27. bias tensor([-0.0006]) tensor([-0.0146])# M9 p+ S) s6 {6 ^5 T6 B
  28. # p& e6 n! F- [6 g
  29. tensor(0.0615)
    3 ~' j6 ^1 o4 Z; q& b' \
  30. 5 r! r) z  f1 ?- ]) S
  31. weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786,  0.2825]])% [% [3 \! q/ B) s4 b3 p) B

  32.   P5 w8 V, O% O1 V/ V' q0 y6 @& O
  33. bias tensor([0.0008]) tensor([0.0048])
    5 M: h5 |. ^! r4 l

  34. 1 k  f7 U. e! }\" d
  35. tensor(0.0394)1 I& {1 ~\" x& q5 ^8 T% P
  36. ( X1 ^- l& D2 w+ q3 v: e. x
  37. weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256,  0.2233]]): U$ K5 \9 ~' [# l

  38. 3 [4 J+ J\" j8 j; ^' d, F) z! y* n
  39. bias tensor([0.0003]) tensor([-0.0006])
    7 M) w/ k! T  q7 v
  40. - M/ J3 u7 u. O
  41. tensor(0.0252)8 i8 G$ R- z. F2 B\" [
  42. # X% S+ e0 m7 O9 K) P
  43. weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797,  0.1793]])& f+ g' Y1 A2 C( ~
  44. 8 x0 d) U0 X2 B4 p, q0 u
  45. bias tensor([0.0004]) tensor([0.0008])
    , w\" c' o3 Q. h- w! I
  46. / s& _' W1 j7 W
  47. tensor(0.0161)
    - g' x+ q9 g$ F0 K5 T5 v; k7 D

  48. \" e  ]2 l. k; B
  49. weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440,  0.1432]])
    - w$ J\" |% g! b  B# z& l/ F/ _) X

  50. ) `# O6 B% A3 q% P6 Z( J
  51. bias tensor([0.0003]) tensor([0.0003])
    . r; K+ z7 @, k9 b; X
  52. 6 r* Q% o7 e3 c) H* c
  53. tensor(0.0103)
    9 p. N; }* ~$ \+ d1 m3 `3 m

  54. & L4 p/ }+ c6 z0 [' x+ @' l
  55. weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152,  0.1146]])
    % Q$ U; x6 p- ~( b
  56. 9 \* r+ K6 ]: h: w' Y# ]/ o
  57. bias tensor([0.0003]) tensor([0.0004])0 |4 i4 g/ `$ F- E5 M; I
  58. % h. \  V8 l* K; e\" _, ^& w1 X$ ]) |
  59. tensor(0.0066)
    6 D\" B+ C: l8 b2 b: u! Y
  60. 5 {$ _) }4 A' w2 g! l( b3 \9 D
  61. weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922,  0.0917]])! S7 _0 K# _\" T0 l5 J0 l, x
  62.   D/ D( ^/ @5 c9 d5 H
  63. bias tensor([0.0003]) tensor([0.0003])
    / M9 @2 o2 N\" \; k. C& Z
  64. 6 S4 J1 M, q7 \+ w! @5 G
  65. tensor(0.0042)8 F- X1 ~. r7 `4 J7 L

  66. ; i- Q8 }' N' q0 ?; [( J
  67. weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738,  0.0733]])8 i7 x% r& c+ P( \1 m& S, X
  68. 2 H+ D8 J+ `' f: o1 S9 Z
  69. bias tensor([0.0002]) tensor([0.0003])( v6 C& l! H, K* |) ?( V
  70. / N( L* G. z  H0 O
  71. tensor(0.0027)
    % H0 C' i: T8 G& g) [% w3 w
  72. 8 U; U! y* I* G: i( H2 m
  73. weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590,  0.0586]])\" A5 X$ ^\" H$ o

  74. \" r4 }7 L3 l& ]2 R
  75. bias tensor([0.0002]) tensor([0.0002]), |& E7 s. d/ F  o* h6 S- Y! @
  76. ! ^- z, `1 g0 _5 G0 f) }9 M
  77. tensor(0.0017)
    7 r/ d5 F1 a8 J* W, D- w

  78. 4 C0 d6 M- ~  \. U6 @2 W
  79. weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472,  0.0469]])4 j\" t, I\" X: }% S0 I3 T) w

  80. 1 c3 E3 k: ?% J$ \
  81. bias tensor([0.0002]) tensor([0.0002]). m' Q2 P! J5 B! @$ V+ C* U. u

  82. 3 Q% \$ b5 c0 k
  83. tensor(0.0011)
    7 S2 B* ?9 K* O\" O/ G1 g3 h7 H3 @

  84. 0 B) y/ m2 ^/ V7 z! N
  85. weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378,  0.0375]])5 d; }, F3 x$ ]+ Z! r$ _9 g% b6 f

  86. 2 D7 p2 j, A# P  t4 Z1 Z
  87. bias tensor([0.0001]) tensor([0.0002])0 z' }: P- \8 Z7 S2 T

  88. , A+ ^& d1 r0 Z9 L$ F
  89. tensor(0.0007)
    5 e, L- [0 C4 r& H4 _

  90. * ^8 L: G! q\" A5 l9 J( r0 h
  91. weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303,  0.0300]])3 b  w& `9 Q% x' h% L$ m4 m

  92. \" H\" ^5 N( o; a* H! u. H1 }
  93. bias tensor([0.0001]) tensor([0.0002])5 N7 S( i1 z; a4 M
  94. 9 ~  }/ Z) t! F
  95. tensor(0.0005)
    , S, U  j( f, t! U
  96. 6 }) F\" v# v1 g) {: ^2 ?
  97. weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242,  0.0240]]): @\" B3 X. k- v% M0 A6 I4 k( w

  98. 6 o( p. |$ v, a: J
  99. bias tensor([0.0001]) tensor([0.0001])! A8 g( G3 M6 |% {( {

  100. % W: q1 c7 ~% |8 q: }( b: y
  101. tensor(0.0003)
    / i# K3 a/ `( o9 Y8 B

  102. ) G. g6 }  a# r- U
  103. weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194,  0.0192]])
    5 E( Q1 f$ ~8 u4 o& ~& S
  104. 9 x4 f( z( h* K& `9 }# y
  105. bias tensor([9.7973e-05]) tensor([0.0001])
    ; U' w/ j$ u  g7 q4 _$ Y9 I  Y

  106. 8 h/ m6 z\" Q) x- H6 R
  107. tensor(0.0002)' O! w2 }; R  p
  108. \" S; o, j2 ?! Y& K* O
  109. weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155,  0.0153]])/ S0 o5 M9 s5 Y$ Y7 y

  110. ) q6 K$ Z; U; E
  111. bias tensor([8.5674e-05]) tensor([0.0001])
    + [, }5 `/ e\" H$ P, ~: Y; k
  112. ' T7 `: E1 b; f/ I1 z
  113. tensor(0.0001)  R/ y\" {1 [! U4 Z+ X6 o# G, K0 s
  114. . M\" W\" b. s# I; I' d
  115. weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124,  0.0123]])
    * b& T, O+ m# \
  116.   j6 @- {. u\" Q/ ^
  117. bias tensor([7.4933e-05]) tensor([9.4233e-05])
    9 J8 v$ U, e+ V: i% u/ [3 |

  118. 4 b, Q4 U\" C: y& S9 `
  119. tensor(7.6120e-05)
复制代码

- W: s  a* X, R5 ]1 v
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-10-15 05:16 , Processed in 0.280263 second(s), 51 queries .

回顶部