QQ登录

只需要一步,快速开始

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

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

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2023-11-28 14:57 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
SGD是什么3 q& t( W2 f# F* ?$ f7 i1 e0 c
SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。
8 ~. U3 H0 V3 y1 h- e6 v怎么理解梯度?2 [9 G, y: m  P7 h$ L6 p
假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。
! t( {2 n8 t6 O0 Z2 j" \" ~' l- w. Y& h: i/ b/ ^, Q
在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。
; P6 J" m8 e! ~- ~$ ]5 R& U/ p+ y: G& F1 W9 x0 R# y
每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。- r) E& K$ j# c9 v0 O# t
" W, B2 B1 E5 k+ O% P3 g/ @9 A
为什么引入SGD) G; O8 b; I, |1 R& l/ }
深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。/ h. D# p; _* i" c( k
' K* y7 ~8 g! t, Z
怎么用SGD
  1. import torch
    7 C+ g$ l3 @6 O

  2. / X- E  x% c) P8 {
  3. from torch import nn: V+ X. P3 ]5 H; r

  4. & z! W& m, |2 c3 M
  5. from torch import optim7 P& o9 p# {: @+ h. K

  6. ; L8 z, c7 N0 @1 v0 ~& a

  7. 2 E6 U# A* R9 d1 w3 O' T) i! p6 l
  8. 9 F) r) A7 K9 n  ]4 U0 B
  9. data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)5 b0 B9 I( e! K% P

  10. * \& @+ r; n7 Y# G8 }
  11. target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)  y/ E* v+ c2 c8 c& y# L/ |
  12. # D* P1 }! A7 e' y; b# B' y* t0 o

  13. 9 B* U7 @1 S8 G

  14. 3 d. z0 ]7 [\" q. O* N\" }
  15. model = nn.Linear(2, 1)& ?. a) J9 T, W4 ]6 e) j9 p9 T3 t
  16. 0 l- a* R9 F\" X* s
  17. 4 h% a2 D. O/ G8 }' _
  18. 0 C- ~: W* b6 J3 w$ p- @4 y
  19. def train():/ S0 k. V1 P( e+ M
  20. \" f! e2 q8 b/ O; {: {' t( ?
  21.     opt = optim.SGD(params=model.parameters(), lr=0.1)+ t2 V\" j$ b$ F3 D' k

  22. 5 y, p5 ?: q: U2 A\" ^
  23.     for iter in range(20):7 A6 q; m4 q  C( m* E# W6 P

  24. 1 W8 q  J9 H* S: i& h
  25.         # 1) 消除之前的梯度(如果存在)
    3 K9 N6 @) N( f, Q8 i
  26. 9 X: M( K- N( V4 Y5 A3 }. Y
  27.         opt.zero_grad()
    , i8 V( D0 r1 H
  28. . a4 G- U5 x3 d0 M9 [
  29. 8 x. T3 S- E, o; S7 m3 Q\" M- _
  30. / K- `0 ^5 G% s8 w9 r) E
  31.         # 2) 预测
    % j5 }4 }9 X8 V' g. h2 L3 `

  32. , ~  Z$ H& l$ s
  33.         pred = model(data)
    5 [. K: w; R. j( S! q

  34. 8 o+ M7 A3 X' V7 \- W4 l

  35. & z; i; c6 E- h+ ^

  36. 9 n) f- Y  d7 ~4 {
  37.         # 3) 计算损失
    , r4 l2 y- s# k% K/ }

  38.   a' S/ q1 G6 X; F5 f. v
  39.         loss = ((pred - target)**2).sum()# C9 r$ {  n' v\" `0 f: i

  40. ( F' U\" u; t8 ^/ Y

  41. * }- H: _- }4 A; q( \- i$ c: ]

  42. 4 d5 F: ~. M: w. `5 O
  43.         # 4) 指出那些导致损失的参数(损失回传)
    / B0 ?9 O0 k0 F8 q2 G* ?+ G& g% T

  44. 6 C( Q* Y5 Q. s6 y1 D  X5 u
  45.         loss.backward()
    7 J: J* U/ D\" ~/ n3 w4 Z/ ?7 P
  46. & T& Q2 U) A1 ^- n4 U6 q9 N
  47.     for name, param in model.named_parameters():
    1 P/ A; A# b$ [: v9 o; m

  48. 2 Q2 z* H6 i, n
  49.             print(name, param.data, param.grad)
    3 t- N1 r6 E+ l( I  V

  50. . g\" J8 e# \* F3 M: W2 g
  51.         # 5) 更新参数2 Q: L5 [9 f+ N- `9 l3 s; Z9 V

  52. 6 [$ x* W: ]5 `5 o
  53.         opt.step()
    / D7 h! e5 }7 W& v4 n& H

  54. / V! `, H6 j. f( _$ U( |# C
  55. : ~1 h3 [  P- ?' v
  56. , J0 M( p6 ]+ W; b* h\" ]. n
  57.         # 6) 打印进程\" {4 A# @  A' {6 I\" ~( n( P6 g% u3 t
  58. ( G4 B9 n$ U1 ^+ z& s* d3 ~: B% A( ^
  59.         print(loss.data)
    * a6 q0 ~8 f3 ]- h
  60. ! c. m8 }3 y6 d- u& Y( Y
  61. $ s* `& n0 e. Z

  62. 0 M/ G6 y8 M' ^$ i- i; q
  63. if __name__ == "__main__":
    % L5 N5 ?6 ^. ~! F$ T7 e
  64. # y0 W' z* @6 F6 \& J1 V! O
  65.     train()* l+ q: ~0 y* V

  66. 6 Q4 n& u6 V# O- x. I
复制代码
param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。' C+ d$ ?3 u6 r+ h
# w) W3 C# i/ O# d0 [* ?
计算结果:
  1. weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])* b# G; j; N! [8 ^( Z+ O
  2. $ y7 o' U  \6 d- X# `
  3. bias tensor([-0.2108]) tensor([-2.6971])# R4 m# _# _2 s6 w

  4. $ @5 T- y6 f; c1 @
  5. tensor(0.8531)
    7 B- X0 P) Q9 _5 A; n* o
  6. 3 c8 ^/ y! Z( J8 z. i- U4 r
  7. weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466,  1.1232]])+ e5 @7 i' W1 e1 v
  8. 7 n2 m( `, w# e% C\" e& S$ L2 V) ^
  9. bias tensor([0.0589]) tensor([0.7416])0 u2 ?' c4 ~; d( I6 c\" E
  10. 3 P' y; J' v  W9 h( {: y
  11. tensor(0.2712)
    + C! I9 ~9 X% ?1 b7 u

  12. ' k7 E$ ^0 u  G& [8 [5 _
  13. weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692,  0.4266]])7 V: z8 q/ p6 X

  14. 8 D- ]+ r+ F$ R9 Y( `, r& p
  15. bias tensor([-0.0152]) tensor([-0.2023]): f8 H2 ^' c( D, K
  16. : z7 Q6 ~( ?1 T
  17. tensor(0.1529). q0 c0 [5 b\" F5 B* g
  18. % O' R7 o6 n- L! _/ L* `
  19. weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059,  0.4707]])5 B, l# T0 t( u8 E  u9 Y. Q
  20.   s7 o; F: T0 t
  21. bias tensor([0.0050]) tensor([0.0566])\" s+ c8 F4 E/ s  p, X
  22. # t. K* |- W8 s- @/ P
  23. tensor(0.0963)6 L) r- t9 e\" v\" \

  24. 0 I3 g( h3 g$ J7 Q8 T
  25. weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603,  0.3410]])
    \" z' T/ q8 c: ]

  26. ; ~0 R+ W3 Q: S* z2 J
  27. bias tensor([-0.0006]) tensor([-0.0146])
    # I4 t) C. t( T
  28. ' n( Z- H$ e: T\" q& o- U4 T
  29. tensor(0.0615); H$ S4 S( y5 w2 ~\" ~

  30. 3 f3 T( x% r- {/ e- H$ y
  31. weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786,  0.2825]])
    $ C* l3 B2 k: S
  32. 0 A0 I( b! y8 H6 ^' \7 d
  33. bias tensor([0.0008]) tensor([0.0048])5 L* S5 @) L' t6 L+ D, p

  34.   \/ J. G  ?+ }, c% L) P
  35. tensor(0.0394)0 Z4 Q6 X2 T5 ?  M6 f& d7 `; ~
  36. : y* {4 h) z3 T6 w$ K) o' y* Q
  37. weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256,  0.2233]])
    / P. t  U9 _  [' Y, p
  38. 5 a+ p! z0 t/ x& N4 R2 k; A, c
  39. bias tensor([0.0003]) tensor([-0.0006])
    8 A2 w4 m: ?3 V6 ]) K9 b
  40. ) a: x; _4 [9 a2 L' }' x
  41. tensor(0.0252)
    # l9 K: P\" x- Z6 ^  a% i# b

  42. 8 X; \( D\" y) _; ^1 N& [
  43. weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797,  0.1793]]). c0 G) Z6 E* D2 n- p% T; h! S

  44. 4 ?9 K9 }4 h0 j
  45. bias tensor([0.0004]) tensor([0.0008])
    \" }# g; f\" K/ A$ z8 d1 E2 L; P
  46. 5 n5 v3 T8 |; P7 T- i- [7 \
  47. tensor(0.0161)
    4 y5 y- E  z% @' }+ o0 Q

  48.   W* `+ Z3 y8 m2 d6 r
  49. weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440,  0.1432]])
    3 d# z8 j% X' o* ?  e' C
  50. \" U; {: m# x: |. n
  51. bias tensor([0.0003]) tensor([0.0003])
      D# v* L# h, E0 }  P* N
  52. 8 m: n3 ~# q& }/ Z3 M
  53. tensor(0.0103)  h& N# x0 Y1 z* \$ y$ E, {# }4 l
  54. # L0 n% S$ ]7 _! x+ m
  55. weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152,  0.1146]])
    ( A8 M  E) G1 q: S% J& r
  56. ( V& e; e# ]0 j5 `\" e
  57. bias tensor([0.0003]) tensor([0.0004])
    - C( O# u2 n; ]2 k0 Z( V2 ^3 C
  58. , ~' R4 G: i* s% A1 _- q/ \3 A
  59. tensor(0.0066)/ J; e- u' ~; a, e2 t; l8 L
  60. $ t) N  V+ {3 U0 J- G
  61. weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922,  0.0917]])! T: N1 K) d7 X

  62. 5 a+ W( r\" f; `7 K! N
  63. bias tensor([0.0003]) tensor([0.0003])
    ' O. _. X8 _\" a. B
  64. 7 B3 Z- v7 X# ~* X
  65. tensor(0.0042)
    # l: {6 ?$ }1 x\" X

  66. 7 ^% z/ j& P. A/ ]
  67. weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738,  0.0733]])6 e5 m5 X4 O3 r. _9 D. C. p

  68. & M: z* q. {5 ^) r
  69. bias tensor([0.0002]) tensor([0.0003])4 \$ W0 S, [4 @: j. B7 Q& M
  70. 1 B' ?- ~0 c$ ~1 @% Z
  71. tensor(0.0027)
    ! _( @; y( [4 a4 y
  72. 9 |! w% u/ j! x
  73. weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590,  0.0586]])! F8 L+ L' x7 T* ~$ F
  74. 7 V/ H* B+ e. o8 b1 V$ B/ ~
  75. bias tensor([0.0002]) tensor([0.0002])
    3 x2 }( R! g: P2 _

  76.   e, m& J\" _3 C' q0 q\" V: A\" b
  77. tensor(0.0017)
    . L\" q+ ]6 ^, F3 O& u8 h3 ^0 b
  78. + d  T$ w, ^* j4 q! j
  79. weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472,  0.0469]])
    3 V& {5 o4 ?4 h5 c5 ]$ u
  80. # [! ]) E3 y\" P; Z( x. R) i0 }
  81. bias tensor([0.0002]) tensor([0.0002])& f7 _3 L2 h% E' R8 {# d
  82. 9 X0 h& C8 X3 s\" `
  83. tensor(0.0011)
    ! R0 L$ {# z5 b+ B4 n& o) ?  c
  84. 9 M/ J+ I7 G) ]! l! V: u. }0 ^
  85. weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378,  0.0375]]). R( \5 \1 h3 \6 y

  86. 5 t4 G* F! K  j. {3 ]; f, n$ o' t
  87. bias tensor([0.0001]) tensor([0.0002])  d7 @- y1 P) Q9 ]7 X3 E
  88. ! O9 b3 ?. B) R' @- O+ T. R
  89. tensor(0.0007)8 _  D4 A3 \\" e. i4 t

  90. - h1 l  ?. e, k: q\" @: [( x
  91. weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303,  0.0300]])* X7 f4 B) p/ M0 C( q; N6 `1 @
  92. 1 S1 R7 v& i5 s( x( B) T
  93. bias tensor([0.0001]) tensor([0.0002])
    & R+ f1 E  ^# p

  94. ' W) V0 }  X% V6 g\" r2 h1 D# j. `9 F
  95. tensor(0.0005)) H+ G1 i' e. W3 m+ {9 g
  96. ; v3 D+ k8 t# [/ W8 p/ a
  97. weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242,  0.0240]])3 Y9 ~9 c4 H! J0 K2 X' W

  98. % a. }  x7 ]; {5 f$ ~6 W7 u5 M
  99. bias tensor([0.0001]) tensor([0.0001])5 p  n\" R& P$ D$ A8 I

  100. $ t) L/ U4 k/ _8 E* R\" S% v! t1 P
  101. tensor(0.0003)
    5 d\" A1 v* x7 r5 i* S* O

  102. # X( e: i( t( A3 O5 _( Q: p
  103. weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194,  0.0192]])8 G$ u2 [9 J% w+ I( e
  104. 2 R9 M$ c5 v! B) H) }# u* K
  105. bias tensor([9.7973e-05]) tensor([0.0001])
    % m- i\" f( A+ ?% C& O
  106.   }3 ]+ q% \) s, J5 n7 V1 Q2 \
  107. tensor(0.0002)
    & c: Q4 h' m+ G- r  H7 ?; z: e7 m

  108. ( }2 E\" b# T+ J
  109. weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155,  0.0153]])# n% Q% E\" t6 k

  110. ; I2 ^& d, E+ c
  111. bias tensor([8.5674e-05]) tensor([0.0001]), c, [0 V; d3 B# g- m& V, L7 e  _
  112. ; e: g! \! \) [
  113. tensor(0.0001)  j/ H! r' \1 p, a: j

  114. . A: H, a+ L) j- Q
  115. weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124,  0.0123]])1 |: `& g% h0 H8 `. K8 J

  116. / _5 F* P! ]9 b* r1 b1 U; Z
  117. bias tensor([7.4933e-05]) tensor([9.4233e-05])
    ( x& h+ _: a- l

  118. \" Q6 F: S! F3 E3 u# N
  119. tensor(7.6120e-05)
复制代码

% B+ \2 Y3 A7 L0 j% t& N& ~8 ?
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 10:38 , Processed in 0.372769 second(s), 51 queries .

回顶部