- 在线时间
- 479 小时
- 最后登录
- 2026-4-13
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7789 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
SGD是什么
" N% V+ ]! p8 i2 xSGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。
2 f. ^2 B# G' p怎么理解梯度?
+ f, K. `5 J. L( A假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。
0 B. y! K/ ^/ K1 J
3 h# y5 ~- \: h在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。( d1 d8 C1 q0 b1 g0 c S
5 G" w4 Y8 ~; b) |3 B' s每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。
: g/ I; _: v6 s2 ~9 }9 Q& l/ E( W$ r9 p
为什么引入SGD O1 e' H9 J$ B4 [4 ^
深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。
: x2 F4 x/ U [( y; b$ R$ ]
8 y1 n- P0 T6 W) }8 g- i4 q! H怎么用SGD- import torch
6 m+ c l6 u0 A* b+ O* D6 B; F. c
8 Q* s5 o4 }( H4 J5 V9 L5 B- from torch import nn9 o5 n+ x. k, z. l$ U6 f
- / B) e/ M- E\" R9 ]! Z
- from torch import optim
( s4 N& ]1 A\" z& n/ V6 [
% A T\" b\" ]% V8 l- + R6 V( K' ?8 S. z- h6 Q( Z
- y8 Z8 J8 i3 T. R- data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)( I3 a8 z* p0 y' [ K
- 0 B8 s( [+ k& a+ V# f* t
- target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)
+ O2 \3 ~3 T* J' n- V\" v( |\" p5 r - 7 c p8 ^' x1 ~: T9 P8 X
8 }0 P$ C# U. d! w: g y- + ]% _( u9 u( M8 D! p9 s
- model = nn.Linear(2, 1)- k5 r5 |\" p6 q1 N
$ @% |; h* D& z\" c9 r# I
# Q0 l\" a4 X$ H O3 y* q5 c( i- & S- @4 {! v/ h* k& `
- def train():3 {! d: r+ f) C5 N! J/ ^$ b
\" v! i; O% }: ?( f- opt = optim.SGD(params=model.parameters(), lr=0.1)- [\" X s: B3 \$ U8 r Y) n
- * r1 H! J. U* K5 F- @$ b/ n
- for iter in range(20):
9 T3 C/ K& p' x; h& `
/ N' V( r9 |8 Z! M- # 1) 消除之前的梯度(如果存在)
' D! }5 _+ {/ m- T0 T7 z
+ A! q. ~, ^4 O k! _0 o/ w- opt.zero_grad()8 ~4 O, P# h9 p* v1 K. ~+ S2 q. S
- + n4 C8 p' p- r% I' g& ?% N( e\" j* I
- ' Y. a\" c; b- c% x* A
# U H6 U7 U( q5 `8 c- # 2) 预测9 W& a1 r6 e! F9 x: `
- \" {* ?* t; {; M0 R4 h) }. E3 d
- pred = model(data)& K: o6 o: T4 q( n7 N7 n; ^' [
- \" ? V+ c/ V+ V# d
- 0 ?: V; _7 O% L9 `( n
- ! {: F* N* T1 b v% s1 n
- # 3) 计算损失
# i& d9 `: C/ S' Z
$ Q+ S) x- `# |! K' h- loss = ((pred - target)**2).sum()
$ N: X& T0 i, O5 R2 Q) [! v) X y - ! K; v. u; F7 e* W; s4 L# s
- $ [4 r& Y\" o1 l1 U- d
- 6 G, g\" V* Q! z' h. y @* r
- # 4) 指出那些导致损失的参数(损失回传); B$ y( x+ J\" _, T/ d8 R* q
8 t) h0 ~% [) f' q4 C& }- loss.backward()
& l) S, }' l* L\" `2 [- ]$ X. B\" b - ) V, u; C- O5 w4 a, j& c2 T
- for name, param in model.named_parameters():, `! v$ m5 B& ?6 K8 ~\" O) p8 B\" l
- ( Y6 ]3 I( ^7 H\" Z. l
- print(name, param.data, param.grad)
0 b+ Y1 v5 v, u0 @ H8 @ - \" B' Y4 _4 \* P5 P1 D2 z# \
- # 5) 更新参数; [- |9 T9 L* M; R) b
- 6 y3 i% Q1 K9 N
- opt.step()8 ^. B' J$ Q. Q
5 I4 r\" j& z7 I- 4 T, g) K& O2 R2 U% |. E, \. v# x
+ j2 X7 C\" F+ n' I3 b, Y- # 6) 打印进程 @9 B p2 G7 b# E
3 z- m8 N+ i& y, c5 o- y2 E- print(loss.data)% f* g! r+ X. r: ]9 R' r3 K
7 d& N1 O8 X3 c; h
' Z3 e4 w' q+ v+ @# V
& S/ A\" n% I0 L- if __name__ == "__main__":
& l7 ]. k! N% n
: I3 |& B5 g8 q$ w\" p- train()
`! B% I4 o9 y; I. S! [2 I
\" e8 v: O9 h: ~( l- j) K
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
8 H$ a6 c( c, D. K5 i" H' H5 }+ L$ W7 x- [& t8 _2 `3 g( [. Z
计算结果:- weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])
, b8 ^2 E/ x1 ~/ B9 z2 `5 U+ Q - # i2 `* V. z\" \ b, U
- bias tensor([-0.2108]) tensor([-2.6971])\" q8 A2 L/ ^) c9 F' V
/ b ?: m\" g' {) o5 q/ H/ z- tensor(0.8531)3 o4 y% ]6 f: o' x9 Y
( J) t) I* B, M& o- weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])
0 v* Q7 p k/ O, J# a - : } u v) }7 X\" Y- c
- bias tensor([0.0589]) tensor([0.7416])$ K! M1 K6 ?. Z. M$ B2 K/ m
- ! i ~, D% |( z2 {9 @& c
- tensor(0.2712)8 O9 D+ `\" h! ?
& n$ H+ d% b1 O& I0 \$ y2 d( H; D- weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])' V+ }) Y6 Z5 D. V: w
- / v- z+ q5 s& ]
- bias tensor([-0.0152]) tensor([-0.2023]); _1 q h\" t, y6 V, X6 s
9 F. k7 X6 R. k* d. G\" @- tensor(0.1529)
! g8 p( J& A! U p - 8 m% o9 \! a8 C
- weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])
+ }, |& F, o/ W- L( ?7 \7 U4 C% v/ V - , B. _8 |: ?( y4 [( T4 S) Z0 q X
- bias tensor([0.0050]) tensor([0.0566])
! Y* g\" N- g) Z8 q - # S0 K\" T1 i$ r9 _% Y
- tensor(0.0963)) F& E* P& V0 J/ W% D* p
- * h1 I+ S) L7 I9 }; N& G
- weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])
6 r4 l\" r; K9 C: {% [& V
( f4 L: y, s1 B4 i, {- bias tensor([-0.0006]) tensor([-0.0146])
* d\" G/ z7 V# W J - % d5 R. g# q# a/ [
- tensor(0.0615)* g) O% t, u, A1 H* J$ J
- ; D, S4 R6 Q9 m, v T9 X4 f5 @) Z
- weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]]): }, s\" N8 Q& b+ K7 S) |
/ J0 }3 m+ u, r. H- Y9 Z) q4 L\" [# F- bias tensor([0.0008]) tensor([0.0048])
7 N* [3 e# F: l& b
7 B. ^- R7 j k- tensor(0.0394)4 q8 R\" h+ `: D. K
: M/ B5 a4 A8 O# n' |( [- weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])
5 Q4 L5 R+ W# D
7 i) q\" M9 y6 r( q% c! |' |- bias tensor([0.0003]) tensor([-0.0006])
) m; A2 ]3 B6 D7 O
3 a6 p' X* X) ]% Q* d! {8 x- tensor(0.0252)
4 K! N+ D) i0 ^! _4 ^1 G: P' u\" C9 p - 1 a3 @) x\" ?1 g\" `
- weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]]); D* A( e) i2 }: j1 ]- a
- 9 C0 [) ^$ [# `; \' [5 K9 r# b4 d\" c
- bias tensor([0.0004]) tensor([0.0008])
- u2 j7 t9 s- V, G5 h
6 R! @/ t7 r; m+ {2 A$ u) B5 K) `- tensor(0.0161)5 G\" h' P( } V8 O$ \
, H3 A* y% Q% m0 L3 c- weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])
( y& [1 H% c4 R+ }0 s
! C1 p- R0 ?: X4 k- bias tensor([0.0003]) tensor([0.0003])8 g9 y8 b1 g% C6 G
- 5 o/ A' K' ?3 B. _$ H
- tensor(0.0103): N) X! H! h$ f) @# I' Z- v
- 2 v8 U! j+ c' k. {' e1 t
- weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])
3 c& I$ S* M# b' \ - , G, }6 A) d; j+ g' M! B$ o. M. X
- bias tensor([0.0003]) tensor([0.0004])& `8 H) C1 h) I; l) ^; s* ~) W2 e
* X/ N L8 B+ A7 D- tensor(0.0066), \6 r- S5 n4 V) P! C
; m- R5 _# W ]: Y* C$ Z, T- weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]]) Y. U( T5 v# ~' @* q
! B/ w0 `- z' G3 f. E: _- bias tensor([0.0003]) tensor([0.0003])( r% h\" H0 S) z
% M8 x: G0 n# e$ u* q3 O- tensor(0.0042)2 n4 N/ C \ U: p1 _
- ' B\" I4 t# l- K* t1 H
- weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])
% \$ k$ l1 D/ y4 Z/ A0 {0 S: h - & P- B4 ^: ?\" b+ W s+ \/ n3 L\" q
- bias tensor([0.0002]) tensor([0.0003])0 l+ j) E( B; D& Q2 N' i
& y' N; m# T7 Z0 l! N) h3 V- tensor(0.0027)7 w. u4 C; I1 Y) P4 m) C
- 0 p; V$ X! S, T/ k# Y9 L7 G- J# ]
- weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]])
9 [0 Q, M3 S, U( l3 U4 H$ j\" Y! H
; p% g8 A% K; Y N7 a1 J- bias tensor([0.0002]) tensor([0.0002])% F( [4 ^5 p; F6 C, p$ ~6 @- Y; i% E
- $ K2 _) I8 d4 f
- tensor(0.0017)\" j$ k5 L8 i$ j8 ~0 V) D
- 6 |7 B* j- N& d% P1 Z. v8 r
- weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]]): V4 B( l& d! G/ u; x. o
- : t! B3 s e+ N* X: M- \9 {
- bias tensor([0.0002]) tensor([0.0002]); _) {: i, x4 v0 B
0 X q3 n% `) |4 U$ L+ A. L- tensor(0.0011)+ |2 a& @8 M1 T7 Z
1 H. c) k! c\" ?1 O) C; ]: Z! ^- weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]])
% a( ^: u\" f- q+ a - - v. [\" T- @7 L' H$ B
- bias tensor([0.0001]) tensor([0.0002])- `6 U/ W( {2 d\" q
- ) j, i, O! ?2 h6 n, t8 e
- tensor(0.0007)8 c# V, K* i g) v/ s
- : [* R- Z- _2 {\" S3 v3 B Y
- weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])\" S( H% Z4 T\" p2 d
7 U! R8 A( l% \7 _+ H$ |- bias tensor([0.0001]) tensor([0.0002])
% U, q8 Y1 z+ I) G7 ~ - ) c: C! F ]4 V\" ]$ U
- tensor(0.0005)% }' d( F0 h7 {& E7 o- U
- : m, r9 H* P8 l i+ K- i
- weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])
' h: m0 P/ s& n4 r2 }! z
7 ?) q# u- l. {7 ]5 @; k- bias tensor([0.0001]) tensor([0.0001])3 o, P' k6 O/ T9 S0 I9 ]
7 n- _2 {\" A* ]! d3 f- tensor(0.0003)
7 v8 v7 `\" H ?1 F V8 M$ X - $ e( R4 G/ w5 l; D\" K3 K
- weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])
9 O& x\" V$ |' {% `( n- c
0 t$ y2 ~9 n8 K- bias tensor([9.7973e-05]) tensor([0.0001])
' Z' s! [/ r' Q' O1 g
9 b7 a1 d. t7 s7 r\" _- tensor(0.0002)
9 s n( Y* C* d; V3 s1 t
! B1 H( m$ L7 F; T! g\" q0 Z- weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])! D+ h# r. P$ z0 D3 t
- 0 r2 p9 N; r8 g5 g; a& h2 t2 r\" K
- bias tensor([8.5674e-05]) tensor([0.0001])
/ Z% h2 P' [+ \ - # u# F+ ^- L1 w4 D/ o+ N\" _
- tensor(0.0001)
9 x# P$ P0 V\" d! _2 T( Q
$ Y( p3 R- [* n' I& K) ]8 c- weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])8 l9 K; y$ u5 y: k
! |# y# M7 I1 n6 ^- bias tensor([7.4933e-05]) tensor([9.4233e-05]) z9 X4 ^0 s3 f! h* n1 U: O
- Q1 f3 N D7 T; g* N* W- tensor(7.6120e-05)
复制代码 ; T8 ^, }% T' t/ x
|
zan
|