- 在线时间
- 482 小时
- 最后登录
- 2026-9-6
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7872 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2951
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1179
- 主题
- 1194
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
SGD是什么4 k1 e) O( S) p1 |5 ^
SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。
K+ x; |) n0 V7 K e' d7 q2 s8 b怎么理解梯度?6 @) @# S8 r T! p, A: u4 Q8 A
假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。) W# p- t$ K$ R& p
V& O+ y% C) @: _( s
在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。
' S; D4 s7 u7 u) Z3 }& o; x- r$ c; _5 |0 q. }
每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。
* V7 H+ h5 y* K: \% C( L
, Y5 n8 p$ h$ j% L. z4 ~; L为什么引入SGD
2 v, v: m/ a5 f- E! }深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。
3 J9 @( t* d& w! `1 _# n" S( `0 L2 ?# n* j4 ?
怎么用SGD- import torch- g* j8 d% E4 R! U
. e1 N e) X! V* M+ [- from torch import nn
1 X0 q# D [, G
) o0 r8 ?% k7 e. j) K3 Z7 L\" W c- from torch import optim- G! B- Y5 k0 q% N( C
- 5 v/ K$ c; i7 v: }* O- P* t
- ) {5 a# F2 _2 C' J/ l* ]' o: T
4 h# [) x9 T; u- data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)6 A; V6 u0 O# \8 y/ p
- . p+ W! ^: y\" M
- target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)9 t4 D; L1 X8 y/ `+ v% f
/ \8 ~3 [\" p- y- G\" ~
\" c( H8 L- Y2 V# I, o- : m# g/ r( l. f5 x1 }* Z
- model = nn.Linear(2, 1). y) \6 x( G1 _- u
: w6 `9 {4 ]$ l2 \. a; n
& M/ q! z3 I+ y* Z
! k6 A. [, T% Q8 t- def train():
) ]% a1 l v1 d O! h' m. \' [& p - . k' m6 m3 d4 M: R9 q
- opt = optim.SGD(params=model.parameters(), lr=0.1)( x$ U, h( x+ X
2 R X' R) L' J0 J- for iter in range(20):
\" p* s2 U% s! L6 P' ^& c3 s
8 b7 S3 `; N4 r. J/ z5 N3 m5 t- # 1) 消除之前的梯度(如果存在)
$ i+ S5 S1 q% x1 B( [ - 2 q; ^- E+ K- J8 y
- opt.zero_grad()
. S- \* ]% l. j\" @ - 5 D; e5 u. ~7 h8 d t; M1 ]1 s. N: Y
- . s! d7 V- Z\" ]' b9 c
- 8 B6 I$ H5 X+ J2 e& ^+ C6 D* x, @1 t
- # 2) 预测
, g( Q- u& U! ~3 ?; n. a: { - 8 M8 E6 y: Z; |! P
- pred = model(data)
$ B2 D9 n1 u! W* _
$ C\" U( D( w; O+ X- 1 b1 E. |& {) H/ B1 D
6 m3 N* }+ ?5 Q2 h6 M4 w1 h- # 3) 计算损失7 W6 b2 ~' p j) Y8 p; W3 z
- * L. Y) x4 N# b) K4 L8 T
- loss = ((pred - target)**2).sum()3 E/ z' w# ^1 P( t- K3 y
* }- V2 @, C0 A% p3 E0 E- * D6 s: }8 o+ a1 o% a0 ?
- 5 o8 {2 c0 n1 o7 z: L4 F
- # 4) 指出那些导致损失的参数(损失回传)
/ M A# c8 {% I: R; Y - 0 }* F9 p+ W t\" E/ U. W4 X
- loss.backward()
' J. k2 s c ~4 i Q; h\" S
& L7 n. @ p; t- V- for name, param in model.named_parameters():
0 G& f w# x( S. e$ e9 H3 |/ M1 x) }
& n+ s9 Y- o! p+ I\" A\" U- print(name, param.data, param.grad)
+ A2 p, f9 \8 S, d; j3 E% T - 9 D ]7 G! c2 l+ N& z v& r
- # 5) 更新参数
/ ]! @3 f, p) W& w
5 e4 ^+ b\" ]- N, S1 q7 D- opt.step() W' X) I9 g1 \; _# L& o+ q5 [9 C
' M: b9 @. I, C\" a
% u: r7 G/ w5 T
9 @+ I' q' ~$ n& R S+ ?- # 6) 打印进程7 |; }0 z3 S0 h' Y3 [( A! p7 u
- 8 J9 i# [* l1 l2 {4 f
- print(loss.data)
- \4 u4 ]$ H. F. |1 R0 c$ b& f3 F
8 S1 a4 \- P& I- # P9 {# A; v! B! ?2 L: n }# l1 u% `
/ ^! ?' i5 T8 X* o7 N: H- if __name__ == "__main__":( ^) ?% @9 L# T: K! x
$ Q _, \4 ?4 @+ T5 e' I- train(). {* t# Y% a, M2 Z\" h0 q* B3 e
- 5 A! M9 J' y a! }9 t
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
: ^( V4 f% e) F: c8 F
, F- ], ?2 p& M& V计算结果:- weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])1 h/ U& t4 n' |; v: E9 b
( ?' Z+ G/ J\" g, T- bias tensor([-0.2108]) tensor([-2.6971])
/ }+ W0 r, K3 U- G - 8 Z! O4 n* f% g, c+ H
- tensor(0.8531)0 a- J/ A& {6 L I
1 f+ h7 j. [9 P( c7 P% Q9 a6 B- weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])2 ~4 x% T5 m* e
- u* d4 g' q C
- bias tensor([0.0589]) tensor([0.7416])
0 N+ x2 K' z- J - 6 S7 Y# |2 E0 A2 F' W
- tensor(0.2712)
, y a M- \! c\" L* D - 8 t7 A% R& B\" l+ s/ p6 |1 M
- weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])\" b* o+ b\" Q; ^\" {3 u\" x0 I4 S
- $ S. }9 r9 E) q5 q\" x& S+ g, @* y+ b5 r6 ^0 n
- bias tensor([-0.0152]) tensor([-0.2023])4 F5 w5 c3 J& d5 \5 r; N( z+ d
7 W/ R7 i1 F& K& ^+ p& k- tensor(0.1529); D' f: B# f6 b$ ?$ v9 J& w
- ; s+ M0 q0 K, Q9 Y. b N
- weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])
- C3 y4 E b) ` - * [; `' w* s6 R% C. L, ^6 z# e
- bias tensor([0.0050]) tensor([0.0566])
2 E+ G q% D8 d1 u& {9 E
5 N% k\" f& o+ R9 Z t& W9 X- tensor(0.0963)
\" t0 J/ x( ^( |/ _\" {5 k& M, | - 9 P4 O& M+ m) K5 @, x
- weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])9 s( M; \* `- G
' [- ]\" g6 x+ ? Q% O! a: ~- bias tensor([-0.0006]) tensor([-0.0146])
0 J% ?2 _ G9 Q ~# C4 J: e( R. {* J - * n7 k5 y0 c# c' k! m; ~% C
- tensor(0.0615)6 t% O6 ~' u4 {, H
- \" h5 \) D5 z\" v8 v1 {) \
- weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])
1 O' V# f5 U+ k3 t$ m% |# S* N; j - * [. F1 m* l- r$ }' a
- bias tensor([0.0008]) tensor([0.0048])
2 m2 h9 q& x) z6 K: q! G% B0 e
i4 v$ R! g0 |* J- tensor(0.0394)
* n9 L7 d# E, l' e/ a2 A# X8 r: Q5 f/ o9 h
' B {6 p( f) u/ ?& l9 f- weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])4 g! |& r+ n- |
- ' E j\" d9 {4 }1 |. y4 E
- bias tensor([0.0003]) tensor([-0.0006])
5 c9 h6 ^3 E- v D; d3 a - + g4 I6 c\" H2 x/ D2 p' l- h
- tensor(0.0252)
' p: e! h4 [; s O8 h2 g
: g, k& V, X1 c' h0 ]3 I7 {; q, V\" Y- weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]])
# u6 f3 Q/ |1 Z
4 h! z* N* C) W% E- bias tensor([0.0004]) tensor([0.0008]): q1 z' a- |1 y+ r5 z
+ m X9 w3 B+ o- tensor(0.0161)
R& [% A7 ]+ `4 v. P' s
9 n, L) A- f- H$ D- weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])& |, D6 t( Q9 u( _ M( q% A
% u7 y8 `# I\" U( c M7 u- bias tensor([0.0003]) tensor([0.0003])
- n- t t6 f& y\" x- z) l: a: D) f* _
( o8 r5 |\" l, B; v5 ]/ A- tensor(0.0103)* p4 o8 S3 G( f: o
0 E' d3 ]; ^$ T5 u- weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])
; S9 p4 v9 r7 S. F; a% ~
, [: E @- w; S& s9 n8 d3 Z- bias tensor([0.0003]) tensor([0.0004])( b: J1 p* G+ }0 [
. @1 B5 h+ V. M) P# R9 m- I# O- tensor(0.0066): g6 s% r0 Z0 S/ Y7 ~2 P, h5 M( L
1 W% F# P3 D. H$ R; l# \- weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]])
( s1 u' I8 A) l- m4 r
, @$ j1 f8 z6 X# t! j8 Z) O+ Z; B- bias tensor([0.0003]) tensor([0.0003])
( {2 z9 e% d. M - 8 t/ X! d+ i* E4 `- i! j# \+ I, b
- tensor(0.0042)- R$ P, m9 H% ]) _8 d
: O& f: M7 a. z, U6 a# R- weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])/ K+ v9 R' i- q/ B
$ a9 D7 d8 F: q( }- ^6 ^; P1 J- bias tensor([0.0002]) tensor([0.0003])+ x& x1 f. w5 n& B
- ; Y7 M0 J/ C0 U* Q( j, G0 g
- tensor(0.0027)/ l' }1 [+ p- I# D% L0 _0 M9 ]
\" J3 z* F, \+ e- weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]])2 `, k. a! X4 M2 m. n! L3 g
2 A/ c\" S# G, |/ R- bias tensor([0.0002]) tensor([0.0002]), \. _# B\" R$ m\" D( @
- 3 P+ O' ~; a/ [3 S. J5 D% t
- tensor(0.0017)0 G# l% } f; J6 l- N
: D) S: p- `1 v# n d- weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])3 S) S$ L/ G$ P. x' U
- & v6 I4 `: |# w! K
- bias tensor([0.0002]) tensor([0.0002]) \; F, z3 _2 P
& z/ s! g0 U# t- tensor(0.0011)/ L% g8 v# X0 M, s' a7 y
/ c; ^6 K! {8 @! e7 r7 \) ?1 V- weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]])& u: `# X, l5 T6 n: r6 B( [- w
$ ^' b, O3 x6 U. N+ Q9 r; O0 b- bias tensor([0.0001]) tensor([0.0002])
# U7 r* p5 U\" I7 z1 S, v
& i: `1 I' |3 G6 \- ]7 s- tensor(0.0007)) @3 }6 |\" U3 Q5 h7 Q- ?# h, Y# W2 _
& P$ b& w\" j4 P( o1 L- weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])! e- c- n- D8 V* [2 B
; {6 `+ Y6 ^) @9 a; O8 ~, c- bias tensor([0.0001]) tensor([0.0002])
; w1 l. C; [% q2 b9 M5 A
# R2 p; W, a/ U8 Q+ E% B- tensor(0.0005)3 ~ [8 v) {2 }$ }
- ]2 y\" A1 [- x) Q\" q- weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])
Y( b- r' ]( r: ] - 0 j. f4 Y' g: R
- bias tensor([0.0001]) tensor([0.0001])
. T m# h+ o6 O
+ E9 O% e l T0 @7 J6 F5 b- tensor(0.0003)
, \% E( E, e P9 d6 k% Y
/ N% M! U' `- T: z\" d6 j- weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])
! v1 ?, y# Z5 c: e1 J) @% y
% _8 P/ r/ \( a' J8 t8 x2 b6 G- a- bias tensor([9.7973e-05]) tensor([0.0001]). t% \& v, _) I- w1 Q U% V
- 8 ^7 W% J1 `; u
- tensor(0.0002)$ g7 |' Q( v9 Y, L# ^5 c
- 1 u. H4 _' ~\" s6 R8 r6 f- d
- weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])
\" @0 b% O, k+ \/ d# @
\" i& Q- S7 v8 ?6 H* N- bias tensor([8.5674e-05]) tensor([0.0001])
4 c: d0 l, f; s5 u9 x+ J9 [
7 N\" h& k1 h- W* U; S7 S1 d* s- tensor(0.0001)
$ G, r. ]; E+ |, ]) o0 g# H9 c6 w
9 j( `4 g8 W+ ^. x7 e% Q/ [- weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])
) D2 R9 }/ m- m8 }1 ? - 6 ^$ K4 q; ?: E
- bias tensor([7.4933e-05]) tensor([9.4233e-05])2 V9 |# Y! P1 e3 K' n/ n
- + O' X* \8 L( u+ b) N3 a K\" e l2 o
- tensor(7.6120e-05)
复制代码
& i" [3 L' I$ N/ I7 c# H$ ?' U |
zan
|