在线时间 480 小时 最后登录 2026-6-1 注册时间 2023-7-11 听众数 4 收听数 0 能力 0 分 体力 7823 点 威望 0 点 阅读权限 255 积分 2934 相册 0 日志 0 记录 0 帖子 1174 主题 1189 精华 0 分享 0 好友 1
该用户从未签到
SGD是什么
# q l6 }+ f# g ]8 r SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。+ O0 j& X A$ ^. ]: _4 t/ s7 E0 N7 }
怎么理解梯度?
3 }! }5 d _% F) b9 `; ` 假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。* K! F7 ]8 h6 R- C+ I
/ `1 A2 M1 F6 _+ V' E, o; s 在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。4 a; O, S" m2 X3 x* k3 Z; q
: C3 F9 B2 P5 u$ r
每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。
. K' A3 z+ a" j! V 7 y% i- S% K1 e$ }8 x0 N
为什么引入SGD
, ]! _5 Y) Q% i& `; L8 F, F* ^% t6 V9 J5 _ 深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。
, J+ ?; E( ^( b2 x2 t" T& ^. O " C/ P7 t% M- f! U# n
怎么用SGDimport torch: `, C\" x! X0 h( |: e$ E0 j
2 X\" T, {3 k! S: D0 ~ from torch import nn5 Q6 x9 Y5 s\" k6 D/ f# m6 Z+ ~: Z
6 A4 p4 b9 @' k+ D) K from torch import optim8 i- q q* j+ O _2 S
8 Y7 p1 N, P9 Z0 G2 P4 K
0 y6 J4 b7 {5 _( R( e
+ b( h6 @! V6 c9 x! b3 ]; g% x data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
, j- a' P# {+ ]+ l
5 t5 g8 [. W$ ~7 c4 i target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True) d- s* C; Y0 }+ I
5 n f' r$ D8 ~% g, ?* [0 b6 P 3 [) i/ N6 Z\" |
1 E' O, O y& H) K7 z* J* X model = nn.Linear(2, 1)
\" f6 a1 F\" o: d1 N l
, H+ u5 s+ E\" L3 k6 ~. M. |% w5 K
; g P- w- X\" S
. I! x/ r9 k- T& n4 |8 ` def train():1 P) T4 N) k. g n; D& r+ Z* Y\" E
* j: o2 `( v( e8 Y* a0 w$ @$ R opt = optim.SGD(params=model.parameters(), lr=0.1)
' [$ f8 e* y x 1 T, y/ @' C4 Z$ z\" b8 b
for iter in range(20):
I\" `' M8 O6 H% X, A
+ j* z+ `2 u/ W4 M5 i( Z\" J2 a # 1) 消除之前的梯度(如果存在)
! ]) B$ g0 d1 L! w# b3 f, Z0 F% i / {; H d) }6 J7 d0 f& c; D
opt.zero_grad()6 N$ I; r; D9 w0 P& Y; u1 Z
+ |( z) }# c, n% z+ |0 p\" l
( J1 X. s: S% M2 W( A2 C! Q) S$ q
# e1 ~- T- \. X # 2) 预测
+ m C3 d* p$ f$ d4 i; L; M $ U& r; Y' a0 M! U: h0 ?
pred = model(data)
* F/ R$ J! W0 o# x. g4 } % S3 |9 F, E6 W* \4 |* p
( Y2 I0 u# F8 O
& `* Y+ L/ B8 w # 3) 计算损失; g9 S4 I6 E4 q% ] T+ @( K
, r$ N; \7 ?: }0 W- S
loss = ((pred - target)**2).sum()& r9 R( {9 u) o X4 j
* h' z0 {\" |\" _/ a8 l7 F 0 x; |) R2 @4 T+ v\" O. e
, C& D& y T: Y, ~% r+ S$ c# x
# 4) 指出那些导致损失的参数(损失回传)
4 E1 r5 b: W7 i ]0 m, I4 i6 U4 C, l
loss.backward()$ H9 p: @; X9 g4 j9 j4 i: J
3 e) ~6 r$ m$ Q0 M# j\" K5 R. K. @1 G for name, param in model.named_parameters():
! z7 E5 D1 Z; k 4 i4 S! D; g. L; u\" q
print(name, param.data, param.grad)/ D# _, N$ m5 H/ L, W
# c+ t8 k% a z: Z5 P
# 5) 更新参数
- D! z' Z+ `/ @. Z. c
$ } M+ f: `8 h% I opt.step()/ V J! \8 ^' \& b5 }# n. m
s- k, R C& Y! F% L3 N
& h\" Q9 t& c, m7 N+ D) c+ |0 K: Z
$ S, {/ ^4 A% \; p5 J) X& v0 U
# 6) 打印进程
3 d* e, B( ^( l
2 c$ c) B5 X. }4 Z print(loss.data)$ {$ |4 \& H9 p8 X4 m1 [1 ]$ i
' I\" i$ v3 U. F* A) y h' `9 X
! b7 m6 K% v/ Q\" |/ P . W& v4 Z* P. i. Z
if __name__ == "__main__":9 n3 P! X9 {1 X
7 P5 u/ E( M7 c e5 z
train()
( Z+ Q9 k0 a* C 5 ]. w6 Z+ L8 I8 Y6 b+ V4 ]6 G% J7 u$ e
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。6 K7 ~# S6 v3 x& C v+ B. J
% k7 h, i5 _" ]4 {. u 计算结果:weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])
+ g8 s$ q j/ U9 c+ U/ w% z+ T v
' v d& ]6 W9 K! L: e( M bias tensor([-0.2108]) tensor([-2.6971]); J( s1 G& x9 a0 t4 l\" i
; L e/ Y, v+ G$ N) c# R! R1 A$ Q: f, _ tensor(0.8531)
1 G$ }/ b8 l& ^\" U8 a: j) R - D; t1 E( t/ U* p: r# o6 N- w
weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])* [1 T2 X8 P5 b\" V& w% D
2 d) ^4 }6 S% {
bias tensor([0.0589]) tensor([0.7416])
# H, u1 i/ i- w % z! H2 Q: G. q
tensor(0.2712)/ c* K, H/ X& d: B
# V$ x0 p/ M% @- t weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])# L% V! W% I* t/ [: M# j8 M: A( m
* a# U+ K* ~$ K* F5 w& J! K9 Z bias tensor([-0.0152]) tensor([-0.2023])
6 O+ o! J5 a$ l1 e* }$ {3 S ! J4 u3 B( n2 m' F/ s! Z& D# X
tensor(0.1529)# N; t6 X1 L7 D% y+ q8 @7 S
N7 `6 U+ A( `; f! ^, x- j) R\" E\" F
weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])8 @6 _4 H/ J. f7 \+ I. Z2 J; m
, Z4 R\" N' \7 K9 Y$ T bias tensor([0.0050]) tensor([0.0566])
, V5 M- {) d- z7 P+ O: r
, }+ ~% r2 b c, p |0 _( q) @ tensor(0.0963)' O1 m# P+ U; m4 a
' c* ~7 j& u- g. M. d# ? weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])$ }4 d( v( p3 D# w* z
# q* k: @$ K6 ]( p& T
bias tensor([-0.0006]) tensor([-0.0146])2 ]/ q: [8 |4 G$ D- a\" @; S; {0 ?
( {\" A k j$ p( D* g\" i
tensor(0.0615)
* X3 H! G8 @& `/ ~5 C9 V 7 i$ k+ G. m; A$ K) e4 R# |0 `- K
weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])4 j, j: P' n\" Z5 q: ?\" D
8 L$ t$ D; b4 r3 y! U
bias tensor([0.0008]) tensor([0.0048]), e$ e/ a4 ]+ K- D. h1 \4 ?, b+ e K
7 P: ^% t$ c T6 w
tensor(0.0394)& U* e( q# T; e3 r, B
5 G3 _! {8 w! |$ D
weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])3 x1 n% K- X+ R
9 m\" T J* T% ~+ [% m
bias tensor([0.0003]) tensor([-0.0006])
7 Q: ?& H0 r' I9 t, H* @ % q# ^% x\" t J
tensor(0.0252)
, V6 W- v+ T$ Z\" X3 p1 B
& u\" `; A8 Y\" o5 T8 i weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]])
' t4 B( {8 V, w; f; _8 e\" M
: r# X5 i% r/ C7 ?* S bias tensor([0.0004]) tensor([0.0008])3 I* ^+ m' f7 [# j
, d6 w9 ?+ \! I9 ~# K
tensor(0.0161)
6 R7 g0 D3 D1 P* A
# {& |( z E- P# e2 d weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]]). Z$ {6 |7 u9 c! Q* ?: [0 I/ Q, u
; u7 L# w# T5 ^ bias tensor([0.0003]) tensor([0.0003])
8 D/ r# K2 v- _. k
% F. S6 y7 |8 ^8 K# Q9 u6 i\" x tensor(0.0103), Y1 ~, G# V) T' U' v
X# O& Q$ h6 J, @% z$ o
weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])
1 e! H6 Y5 b5 a: L, r0 ?& g t\" O j- w c6 y7 l
bias tensor([0.0003]) tensor([0.0004])
& I+ x\" J; @\" `( n; j2 X0 G
1 R) u3 f2 g3 p! S& D tensor(0.0066)' E; x7 N6 n& O
0 N; g# M- V0 y' |& Y' O. W9 l weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]])3 a# E' l H- _/ e4 ~
* F) G% S) J, x. m( S7 E* q/ m bias tensor([0.0003]) tensor([0.0003])& f) O, j8 f7 @
/ L5 M; ]/ E\" e$ b' f+ U tensor(0.0042)- I; B+ i5 q! y' Q4 f- I! s) ` N! j$ G
( B, o7 b; R' N1 y# o( J% L0 p weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]]), T7 n, v\" A' n
6 h, F7 t. c) u! B2 k\" x bias tensor([0.0002]) tensor([0.0003]) Q2 o; _; G7 D\" H3 L6 \
; B3 S; o1 E# R. e* j
tensor(0.0027)
u( {0 u6 ^+ m ) a9 j; g: w\" u/ u1 R! Y8 e3 W
weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]])3 x( m3 M3 t; @; y# P
1 r& U- _$ Y5 S ?, |% j
bias tensor([0.0002]) tensor([0.0002])' F% r* f) ~\" g7 V4 q; u
# J% r9 L- B7 p4 {2 t* q
tensor(0.0017)
! o6 H$ P; e4 k. t' i) L4 O / U. I' d. t; A; K; ?* J& ^
weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])
, ^7 T T0 N: Y+ v5 n! ~; g + a. Q0 M& O\" F
bias tensor([0.0002]) tensor([0.0002])
) |5 x* ]- m2 K! I. }. U
9 j5 b7 t* F L5 n9 g' N9 Q7 }+ Q tensor(0.0011)
\" E1 Q8 o; n- G/ } $ x1 \2 v+ [6 A
weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]]), q. ^& |& l: Y4 F
* F! t& P% G& Z3 ?
bias tensor([0.0001]) tensor([0.0002])
1 ~( |% J$ ^$ @2 P. o) s i) I8 f. ^5 w4 g2 Q6 j! r6 Q
tensor(0.0007)
. c+ Z# Y! o9 e E( j* ?* f \" C# ^4 a* e2 s1 e
weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])
2 x% ]/ \/ v( J; e3 @- j ) H5 q/ h1 u, |( O! R% ^
bias tensor([0.0001]) tensor([0.0002])
$ w* L* v' \5 H+ I/ \: \3 G ' A# ^7 J# B& y
tensor(0.0005)
& Y1 C9 f5 P5 y. r8 C# c; X2 [% Y
\" g0 |! a: D# t weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])8 ]# P! \& g. T
u- T! m* b% p0 Y( a* W bias tensor([0.0001]) tensor([0.0001])1 o/ q; R; y\" S
) a+ o; }7 B\" Q4 l6 @& o$ n* W, D tensor(0.0003): `5 W. U, C& h4 A
7 ?$ r3 M. I4 E1 e1 [& B weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])& m j' C; ], }\" J5 P! D
# I- @2 e. w\" M7 ?; P6 z9 | bias tensor([9.7973e-05]) tensor([0.0001])& ^4 c/ m\" X9 w6 W0 A/ |6 ]
! o\" G; I, U, p9 m) D6 c/ b tensor(0.0002)9 Q( U) d6 U7 `+ n
5 G% a\" t* F+ E. L i+ F weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])' ]* G/ M1 B% M) t; D' C
. d\" C5 V\" R. j e$ P bias tensor([8.5674e-05]) tensor([0.0001])
]; L; Q0 }+ }8 G2 ~+ G& l$ D $ h7 H5 e# k0 ~6 Y
tensor(0.0001)+ y* b: I8 ^- J. P- M! D
2 C' `+ s! w& ^* Z\" E8 V
weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])! G\" A\" U0 s) c\" u* v* y8 e# O
# q, x1 f0 o- B9 i6 d
bias tensor([7.4933e-05]) tensor([9.4233e-05])
' a\" \$ e; J! J7 Z
2 }\" q% E. a6 @4 Q; _6 \! P tensor(7.6120e-05) 复制代码 / f/ v: T& H% ^: z; @- D8 N S2 ^7 l& h( j
zan