- 在线时间
- 482 小时
- 最后登录
- 2026-9-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7953 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2978
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1183
- 主题
- 1198
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
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- import torch
, \ ~- {5 z: W d - & h3 y- c! g\" |4 W, g! E% @! L D5 r
- from torch import nn0 j* D b7 P t+ P) I4 r C
- 0 F4 T9 _' I: ]0 O, U+ `
- from torch import optim
2 ~1 \7 g# C9 C# m - 3 \ Y8 j5 t) H5 n' b' M+ y
- c8 L6 l1 d8 `' E- 0 B6 z: e' F& }, V$ ]5 L
- data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
4 @+ Y4 x- J- z& h
t9 B6 p4 G7 j. \# [- U) F4 z: F, N- target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)4 m: E) F9 j5 @6 s2 x. I3 h
4 D0 X/ ~ Q\" S- + r6 H3 Z1 p/ t
# k1 C. ]& \3 X |\" q3 _- model = nn.Linear(2, 1)
1 K+ | }! _+ e' i3 s4 ]6 M - 7 Y6 Q5 K* H7 J
- 0 K! C5 v3 W( D& N2 ~& w: \% l
- 3 _' O! N5 A# B8 H\" v( @ M& E+ I; }
- def train():. E: c4 W! c1 n; J0 `. T4 k
' E4 |# }% f, t- opt = optim.SGD(params=model.parameters(), lr=0.1)
1 t7 ~ ~/ d9 X( f! x+ F% o - 8 |- p. ]& y' G- L) g: I; H
- for iter in range(20):: B. `; ^4 e7 `
- $ n. P( R! x! M% u6 D
- # 1) 消除之前的梯度(如果存在)1 t! `. ^& s5 `% ?
: x( X5 Q$ [, {5 B `* ?8 F# r, ?9 @- opt.zero_grad() M$ l3 K\" F+ Z1 ?- m
) B' q9 L0 s) Z4 d2 x- & `# a$ Y! g! C ~7 p7 m5 R
' m/ s2 B( o% W# I/ h- # 2) 预测
+ D! c, I0 H$ |& R; S0 O9 G - 8 @/ L+ K D* y! A# q$ G6 |
- pred = model(data) I% ]2 ~7 k; I; |* B4 L9 R7 M0 Y2 h
5 x' d/ X) W6 f0 A$ D& K- 8 _8 n' ~) @6 y: B3 A; Y$ i4 W
- ) H$ `& q; a F0 ]+ I8 G. c- \
- # 3) 计算损失 B# S6 F0 e\" e' W+ g5 G4 h$ P
- / G0 I+ X: U5 i4 g0 V3 `
- loss = ((pred - target)**2).sum() Q5 }% e' W$ e0 v! n* ?. X
- % v: H8 n0 g7 u$ n/ h& j
- 3 u\" d+ q9 D5 ~1 S1 O* z- A' @7 w
- $ n; r2 h5 ?0 L1 K# z0 L
- # 4) 指出那些导致损失的参数(损失回传)# D& p2 j! O4 |; ~- x
1 k1 r6 ~4 s! W! {- loss.backward()
6 ]0 Z\" Z, S1 |- u! w4 a
f$ x5 G7 B* i1 C6 g7 `9 V- l5 Z- for name, param in model.named_parameters():) e& ~- n) I T
u- q6 U( s: }+ ?5 d- print(name, param.data, param.grad)
( U, U( b9 }3 s, M7 o - 9 }6 L' }1 ~8 n) ~9 W3 D
- # 5) 更新参数
4 a4 h0 Y/ \+ I' [# L - + p0 u4 \1 u L$ M
- opt.step()0 x9 m) X/ @; a2 u+ w: d5 T. l
- ; c# \- B. B% { K
- - N0 q( }, @+ B5 R& N# y% ?, ?
- ( o7 Q0 p\" A/ j# ^) C1 @: \1 d
- # 6) 打印进程
0 s$ n9 h. T1 K4 ]0 }' W\" k! C - $ R5 v0 z2 F( r% P, Z
- print(loss.data) X) S. T. W( C6 R4 t% ] C
- - n# e) T; h* `/ {
- & G0 K\" C& P; m% H( x; E
% I8 r5 z- F. h0 S0 R# T: I- if __name__ == "__main__":7 k6 i: w. G% R6 n5 q6 @5 h ^8 O
! I9 F Q# T: r- H# h% P- train()
2 K. M) g& J; l i# T% b - 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
计算结果:- weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])
/ L& {9 ^- x9 s1 t
( p1 R! W\" s% d% `9 {) g- bias tensor([-0.2108]) tensor([-2.6971])
4 {3 o! _0 _/ y- S9 Q( S! H
% }5 ], P+ T2 k- tensor(0.8531)4 y) C0 N8 Y5 [. L
7 p# n- W0 v\" F/ F- weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])
4 |* {2 _5 e7 c8 O - $ [9 h# q/ `& [5 |2 K; e' G
- bias tensor([0.0589]) tensor([0.7416])1 W2 K& `- V$ L$ q% U) t: r
0 a: a9 D1 j8 D# R) K! k( Q, F1 [- tensor(0.2712)
) v7 U% x) @; U\" ~
4 T/ j+ H$ U5 q\" z# x- weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])3 |# k# f6 l- d, d
; d! Q' V) e4 e) R9 R- bias tensor([-0.0152]) tensor([-0.2023])/ Z+ U\" S7 v4 r2 B/ B. D7 S. D( z
9 S$ T! V8 l! t; p; \. K% h- tensor(0.1529)4 H& h0 b; a7 {! {
- / g! c. x$ n4 o: z3 t* Q
- weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])$ ^2 r\" R5 h5 J# m) H
- + J2 q Z: \# f% x( w# k1 N& w
- bias tensor([0.0050]) tensor([0.0566]), c' e. ~0 F# B2 ^. _ w4 |+ \
; e* Q& @0 l3 L- tensor(0.0963)
8 T3 Z* f* J% S7 \, K, ~3 T
$ j! K4 B1 k Z; o! Y2 A% [- weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])
+ Y. u# w2 C7 }: X* C - ) d% O6 G% K5 M7 v1 L
- bias tensor([-0.0006]) tensor([-0.0146])# M9 p+ S) s6 {6 ^5 T6 B
- # p& e6 n! F- [6 g
- tensor(0.0615)
3 ~' j6 ^1 o4 Z; q& b' \ - 5 r! r) z f1 ?- ]) S
- weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])% [% [3 \! q/ B) s4 b3 p) B
P5 w8 V, O% O1 V/ V' q0 y6 @& O- bias tensor([0.0008]) tensor([0.0048])
5 M: h5 |. ^! r4 l
1 k f7 U. e! }\" d- tensor(0.0394)1 I& {1 ~\" x& q5 ^8 T% P
- ( X1 ^- l& D2 w+ q3 v: e. x
- weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]]): U$ K5 \9 ~' [# l
3 [4 J+ J\" j8 j; ^' d, F) z! y* n- bias tensor([0.0003]) tensor([-0.0006])
7 M) w/ k! T q7 v - - M/ J3 u7 u. O
- tensor(0.0252)8 i8 G$ R- z. F2 B\" [
- # X% S+ e0 m7 O9 K) P
- weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]])& f+ g' Y1 A2 C( ~
- 8 x0 d) U0 X2 B4 p, q0 u
- bias tensor([0.0004]) tensor([0.0008])
, w\" c' o3 Q. h- w! I - / s& _' W1 j7 W
- tensor(0.0161)
- g' x+ q9 g$ F0 K5 T5 v; k7 D
\" e ]2 l. k; B- weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])
- w$ J\" |% g! b B# z& l/ F/ _) X
) `# O6 B% A3 q% P6 Z( J- bias tensor([0.0003]) tensor([0.0003])
. r; K+ z7 @, k9 b; X - 6 r* Q% o7 e3 c) H* c
- tensor(0.0103)
9 p. N; }* ~$ \+ d1 m3 `3 m
& L4 p/ }+ c6 z0 [' x+ @' l- weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])
% Q$ U; x6 p- ~( b - 9 \* r+ K6 ]: h: w' Y# ]/ o
- bias tensor([0.0003]) tensor([0.0004])0 |4 i4 g/ `$ F- E5 M; I
- % h. \ V8 l* K; e\" _, ^& w1 X$ ]) |
- tensor(0.0066)
6 D\" B+ C: l8 b2 b: u! Y - 5 {$ _) }4 A' w2 g! l( b3 \9 D
- weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]])! S7 _0 K# _\" T0 l5 J0 l, x
- D/ D( ^/ @5 c9 d5 H
- bias tensor([0.0003]) tensor([0.0003])
/ M9 @2 o2 N\" \; k. C& Z - 6 S4 J1 M, q7 \+ w! @5 G
- tensor(0.0042)8 F- X1 ~. r7 `4 J7 L
; i- Q8 }' N' q0 ?; [( J- weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])8 i7 x% r& c+ P( \1 m& S, X
- 2 H+ D8 J+ `' f: o1 S9 Z
- bias tensor([0.0002]) tensor([0.0003])( v6 C& l! H, K* |) ?( V
- / N( L* G. z H0 O
- tensor(0.0027)
% H0 C' i: T8 G& g) [% w3 w - 8 U; U! y* I* G: i( H2 m
- weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]])\" A5 X$ ^\" H$ o
\" r4 }7 L3 l& ]2 R- bias tensor([0.0002]) tensor([0.0002]), |& E7 s. d/ F o* h6 S- Y! @
- ! ^- z, `1 g0 _5 G0 f) }9 M
- tensor(0.0017)
7 r/ d5 F1 a8 J* W, D- w
4 C0 d6 M- ~ \. U6 @2 W- weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])4 j\" t, I\" X: }% S0 I3 T) w
1 c3 E3 k: ?% J$ \- bias tensor([0.0002]) tensor([0.0002]). m' Q2 P! J5 B! @$ V+ C* U. u
3 Q% \$ b5 c0 k- tensor(0.0011)
7 S2 B* ?9 K* O\" O/ G1 g3 h7 H3 @
0 B) y/ m2 ^/ V7 z! N- weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]])5 d; }, F3 x$ ]+ Z! r$ _9 g% b6 f
2 D7 p2 j, A# P t4 Z1 Z- bias tensor([0.0001]) tensor([0.0002])0 z' }: P- \8 Z7 S2 T
, A+ ^& d1 r0 Z9 L$ F- tensor(0.0007)
5 e, L- [0 C4 r& H4 _
* ^8 L: G! q\" A5 l9 J( r0 h- weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])3 b w& `9 Q% x' h% L$ m4 m
\" H\" ^5 N( o; a* H! u. H1 }- bias tensor([0.0001]) tensor([0.0002])5 N7 S( i1 z; a4 M
- 9 ~ }/ Z) t! F
- tensor(0.0005)
, S, U j( f, t! U - 6 }) F\" v# v1 g) {: ^2 ?
- weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]]): @\" B3 X. k- v% M0 A6 I4 k( w
6 o( p. |$ v, a: J- bias tensor([0.0001]) tensor([0.0001])! A8 g( G3 M6 |% {( {
% W: q1 c7 ~% |8 q: }( b: y- tensor(0.0003)
/ i# K3 a/ `( o9 Y8 B
) G. g6 } a# r- U- weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])
5 E( Q1 f$ ~8 u4 o& ~& S - 9 x4 f( z( h* K& `9 }# y
- bias tensor([9.7973e-05]) tensor([0.0001])
; U' w/ j$ u g7 q4 _$ Y9 I Y
8 h/ m6 z\" Q) x- H6 R- tensor(0.0002)' O! w2 }; R p
- \" S; o, j2 ?! Y& K* O
- weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])/ S0 o5 M9 s5 Y$ Y7 y
) q6 K$ Z; U; E- bias tensor([8.5674e-05]) tensor([0.0001])
+ [, }5 `/ e\" H$ P, ~: Y; k - ' T7 `: E1 b; f/ I1 z
- tensor(0.0001) R/ y\" {1 [! U4 Z+ X6 o# G, K0 s
- . M\" W\" b. s# I; I' d
- weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])
* b& T, O+ m# \ - j6 @- {. u\" Q/ ^
- bias tensor([7.4933e-05]) tensor([9.4233e-05])
9 J8 v$ U, e+ V: i% u/ [3 |
4 b, Q4 U\" C: y& S9 `- tensor(7.6120e-05)
复制代码
- W: s a* X, R5 ]1 v |
zan
|