在线时间 480 小时 最后登录 2026-6-1 注册时间 2023-7-11 听众数 4 收听数 0 能力 0 分 体力 7823 点 威望 0 点 阅读权限 255 积分 2934 相册 0 日志 0 记录 0 帖子 1174 主题 1189 精华 0 分享 0 好友 1
该用户从未签到
SGD是什么
- c, l1 t7 |' Z. r% g; a SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。$ V9 X, g8 {" s3 K% F7 `! z. [; x
怎么理解梯度?
; M* x+ A0 r; W& H$ D/ u) L; ~ 假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。 }+ X! ~8 |, g* `* C
- g9 t% o* `0 {( {+ B8 R
在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。% m2 L9 } A- x' J0 Q
! F& M: d0 T' C' @: L7 v9 B% E 每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。3 d3 L+ Z$ D O' @! W
7 F4 Y/ F) L( n) x1 B# h* L" \ 为什么引入SGD
h i3 F& U. i) z 深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。5 `1 O" W- _2 x/ n
3 a; p9 f% z+ P' u0 b9 D- E 怎么用SGDimport torch# X3 I7 C) [+ f- Y- Z# o
+ s- o; e T- o) a( g6 X\" C from torch import nn
* h1 {6 @. X* Q( j; z
% \8 Q! ?6 F& u6 g g from torch import optim
7 S9 n8 D\" |. I8 J) R
4 ]& c. M/ I0 I; l: ~' ]/ E* P ; y: D8 O& S/ D5 Y B4 b( h
; A1 }3 w! M3 k. h
data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
, k H) s* B) S& Z! ^# k ' D1 ^: Z* d5 p9 p\" ?
target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)
b3 X0 \; {4 N) X) V 5 c: u1 ? l! {: L2 G7 ?6 @
. W5 g$ |. c. S( q, k
# R( q/ A6 M2 Y5 a6 { model = nn.Linear(2, 1)
7 o9 `8 Q% K5 t3 j
& B, t( ]) o+ |8 |1 k9 A% ? 5 P' l3 j1 `\" ^- L ?
6 m, G/ D& B) j+ r6 w def train():: P' P7 L7 C: c& q* z
' I$ |7 b; z- }9 E1 j5 W4 M opt = optim.SGD(params=model.parameters(), lr=0.1)
* J/ L5 f: p6 a\" J! [8 L4 B; q
; m& T- P l7 q3 M. U7 r* M. H' W for iter in range(20):
& e: l5 @# v! l: h% G4 y- e $ R. p: R0 F& ] ?7 B
# 1) 消除之前的梯度(如果存在)2 x& s' h) S2 I\" H* ~8 z
: U0 S$ @& R: ~& t6 |0 n1 d/ V opt.zero_grad()7 K* X5 K% B& }# x+ \6 c
8 A: K t$ p9 z5 Y% d& R @
- ?9 Q* X3 q4 o3 ^6 ]7 U\" k- V- R
: ~) Q5 Q- J! l8 h4 _ K& e # 2) 预测
0 i0 e- @8 S! _0 M8 g, @3 G
8 t' N) p! `2 l7 F2 j9 ~ pred = model(data)
2 f6 o$ x' X3 V5 k n6 W) D9 I0 S* t0 C' }; \2 Z& C
1 a* q \ `# s6 N# |
2 X( P( W5 \; y% t' V # 3) 计算损失* U\" P* A) N5 Y! q+ R& C
/ g0 j% R! [; _1 W
loss = ((pred - target)**2).sum()& y) O/ K0 }1 g6 {9 `4 R5 c6 K
- J5 @5 F$ R' k2 p
7 f. _- t1 c' I5 I2 E
/ B- _5 I3 j. O, | # 4) 指出那些导致损失的参数(损失回传)2 ^& _\" g+ s3 Z! C1 b! g
4 y. `4 @( h( Z, \; f3 V0 q3 O7 E loss.backward()
& }% q. L: \' R# K2 I' W* V- @, r
! ^) R4 `1 l\" F6 c- _ for name, param in model.named_parameters():
6 B5 q\" m/ Y\" P, d) X \" [# \7 ?/ Q& \# R
print(name, param.data, param.grad)
1 a. a8 _) |5 S4 D
6 [; Q! \6 k5 U$ m: C# i # 5) 更新参数' q3 W9 B5 `7 {7 W3 l
5 P( E4 v, j: L1 O9 k\" O& a9 v |
opt.step()% H S7 K1 ^; ]# c
1 e, B0 C) }' e. J\" w: e
0 V4 W5 {% R- l
, b) P o; d* v) f2 A* [ # 6) 打印进程* k5 ?) b: J1 x5 a3 r4 a9 P
/ E$ L; q% ~+ @+ D2 H6 [- i
print(loss.data)8 }( L5 K& R: s, A# v
' q; s }+ `3 {8 @1 L ! @4 y# E( v- O. q' A& x\" ?
+ G4 x: K d\" j7 L\" i+ Q- n if __name__ == "__main__":
9 Z# c- e7 p9 o 7 `* _) |2 E% j1 V) r5 X G/ F3 f
train()8 z5 N, j6 i% K: r
7 ^# a1 M3 M0 Z+ U8 B& L 复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
- v5 M( }9 {) \ I2 _) h
$ f7 d; l6 I7 w 计算结果:weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])\" [\" G, r! U5 v3 _2 N+ o
# b! U1 U) Z# R( t' C& ^$ k
bias tensor([-0.2108]) tensor([-2.6971])2 G0 w3 p, M6 W5 ]
+ y\" q8 m- j. I: v
tensor(0.8531)
) B: B' G* E6 W( O1 {- _
) q1 [/ j; b. b3 o( }! O! A% e weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])
) c8 F9 Z1 r: z1 F( r* {+ X9 j: ] 6 g l* Y8 c& d1 H' D& m/ ?
bias tensor([0.0589]) tensor([0.7416])
2 T! X Z# G% w1 t ; p$ b M* z3 J6 j. q: L
tensor(0.2712)3 U5 o1 m7 N5 T) p7 I& B, w- b
9 O5 ]4 g) d$ E# g( D6 Y
weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]]): J3 L9 {, v; e! ?) b
0 s! g+ z2 Q0 W
bias tensor([-0.0152]) tensor([-0.2023])
. q4 N' |. r* n/ _! i( ^* E: g , u9 a1 H$ A7 B3 F, L% A
tensor(0.1529)& {# o' ~( v8 d, V# h6 v
8 W) v, }) |0 I9 m0 U
weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])4 A1 x) Y- z G7 ?% ?3 v
\" F* G. t& J. x: g! M5 x4 K
bias tensor([0.0050]) tensor([0.0566])
9 e4 ?7 L\" D- k0 v
$ F; Q# y! {4 S( Z tensor(0.0963)
' T: K# S4 b6 R
% K4 x% ?4 J8 \$ X/ F: c weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])0 t7 J# ^7 r2 Y* n3 Y
0 T$ L$ M: @8 F7 _ F
bias tensor([-0.0006]) tensor([-0.0146])
8 F2 e! {0 @; g% V- V& l# s
' F\" F4 k8 F7 g tensor(0.0615)/ N0 [4 {; \# w; ]2 v
$ A2 I. e+ J' _4 k# S* w- @ weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])
$ j8 [) X9 s W+ ]6 [8 t ( j2 c\" {0 ?9 F$ L7 v# I% w8 B
bias tensor([0.0008]) tensor([0.0048])
. o/ }$ m0 [5 H7 X& N' L, i ( a. }( g+ U e S
tensor(0.0394)
. Q5 M4 q* N& I1 S\" n% Y7 u & { p5 p# O- @$ v0 t$ q
weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])
+ K5 x2 y4 @1 U7 m9 Y, X D- j 6 `: c- {# {( E' R, Q' \0 C
bias tensor([0.0003]) tensor([-0.0006])
. V3 s. Q2 N$ C* \ d( e4 P
5 a! W! T7 P) W\" c# k+ { tensor(0.0252)4 ~/ ?: T$ B' s/ Z* J( ?
( D, \% U* C; Q& Z
weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]])
\" w% B7 A2 B. l
0 g' x\" z$ \: O) k- k l; g: \ bias tensor([0.0004]) tensor([0.0008])
! ^8 J h+ ~$ W
Z; {( D& h2 u1 j% M9 U tensor(0.0161)+ j2 F$ d\" ?# r: L, X& l9 W9 F\" ]# F
/ p5 _8 k0 U0 Y8 ~- \# }0 R\" s
weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]]). z8 p2 E0 \( ]\" { U
& k- ^6 R1 Q q8 @: }0 ]
bias tensor([0.0003]) tensor([0.0003]) D! v8 Y& Q2 W
7 p\" Z0 W/ A R tensor(0.0103)
, e9 E9 q5 z A6 U9 E+ \& k . S. O, H# S) ]
weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]]); _, j) S\" k5 [8 _( ]2 z\" W
j+ G2 g( R$ ^) o
bias tensor([0.0003]) tensor([0.0004]); _0 y7 o {; B4 k3 x
8 |2 M& C+ ~$ [# X* y) V\" D
tensor(0.0066)
/ X# Y8 U! A% i7 w: W; Y m. M- P
+ x& b8 J* ?! s$ V weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]])* E, O) a+ d/ k7 f- C\" }
3 p4 [2 Z5 c& G
bias tensor([0.0003]) tensor([0.0003])
' @- \6 u0 T2 |: J( n& C
4 [* V# Y' n% ]: S8 s tensor(0.0042)6 V$ Y0 a7 f: ?- o\" G5 F! c
3 W* `. Z) P, a\" y0 X
weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])+ J c& v+ T0 X( C* z0 G4 h& [
( H0 \/ l! o: I\" F( [+ J' J4 B bias tensor([0.0002]) tensor([0.0003])\" p\" R4 U' M) a4 \, h6 J5 _( U
5 q/ n; V7 q$ Y3 \0 j# p* F
tensor(0.0027)% g7 T! p4 _( k- z
: E3 R+ O9 r# o7 Q& u; @, [ weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]])+ F$ t5 _ U7 e/ G$ g
( {+ U% ]4 i/ H5 { bias tensor([0.0002]) tensor([0.0002])
- s9 y4 T0 N' i1 X$ t4 o1 F% H- P
\" C1 Z8 X6 @! t# X6 Q3 O tensor(0.0017)
5 n1 u2 M* Z. f 4 `7 c5 l5 a2 h5 Z, L; g
weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]]) i1 z0 {3 k/ ~1 e; \0 A. f3 L5 E
+ P# l) C7 ?\" T
bias tensor([0.0002]) tensor([0.0002])2 U; M0 Q: X7 V( @; ]* r# b: v5 o; _
+ U\" |\" W$ p4 H9 a! z7 `5 r! R tensor(0.0011)% ^- ~: `# v6 Z* F
1 k8 C0 F1 {* e% l' `7 i weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]])4 q1 m: {3 {3 ^! _
\" I; F4 S7 u4 c8 x, t2 i2 g
bias tensor([0.0001]) tensor([0.0002])$ g8 U/ o7 [: X! \+ E
0 p; f& C; ^0 m5 E! X tensor(0.0007); b- ]& l% }7 w9 m\" g+ m, a' O
$ T R/ }8 M; g0 l( @; t weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])
1 m F' Y% F9 [4 F( N
! z7 F+ H3 U9 v8 ~& Q, x! o2 c% I- w bias tensor([0.0001]) tensor([0.0002])\" e7 Y& X! F g
; z# Z& D, g8 f* \2 a( Z0 ?
tensor(0.0005)
% V\" x+ m2 n\" |4 w* s 2 b' R% a. D; D1 r
weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])- S/ K\" b$ a; _: e\" Y- W' o
* R2 O. \% P& F( }
bias tensor([0.0001]) tensor([0.0001])
1 m) O1 R\" G$ v ) \$ J; k8 z7 e8 c1 O
tensor(0.0003)
9 {0 S% P! v; X- m8 B+ W 0 _* m) d( h, E2 n/ J6 n
weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])1 ]5 g. c. ]4 [# K, N/ ?; u
7 P! s: o% Q) B5 G4 _ bias tensor([9.7973e-05]) tensor([0.0001])0 w, p2 I0 }: S9 m
' ]. J: l: e( q \4 g tensor(0.0002)
' u# `' h1 P9 T- @ I$ I7 |2 G6 f) v4 L2 z
weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])
2 B0 f7 y: v6 C/ U8 s5 e# C3 ]
9 _, B. G' q4 `& ?; K4 s/ P6 p bias tensor([8.5674e-05]) tensor([0.0001])9 B. a# b3 P: S+ O
& K2 i0 e+ O9 _
tensor(0.0001) V9 m0 |5 t3 s- @/ M: s4 e
- p+ a2 a8 z5 Z* S+ g8 V weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])
3 A4 M+ p# _8 {0 A& Q1 a2 H: C ( Z9 ^7 U8 B0 W* i- K5 Z* P! p
bias tensor([7.4933e-05]) tensor([9.4233e-05])$ O- ]! n! ^9 K% _0 ]1 u, R
+ M0 j- F: W0 M
tensor(7.6120e-05) 复制代码 # O8 u2 P% o* h! {/ x% ]* L
zan