- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
SGD是什么% @$ q% G5 Y/ R" j7 I5 O4 |; T
SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。, E. T2 ~3 u T3 \* h# R
怎么理解梯度?
) p& L, N0 u8 d( f假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。
# k3 W- L5 T2 o2 B# s! @. j( h# w# d' W7 `8 |
在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。- Y( ^& f; Q% ^# }
* p% b* B5 `$ [% ^% e( H/ m; s
每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。) h: N( |% C3 y' |/ j) `0 v1 ?; G1 X
. X1 U$ u: n; n& M为什么引入SGD" e* O9 B- O& J# U/ l
深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。
# U. Y! F! e; y4 H) }' A* S4 b8 g, o7 F0 R, g% Z" h" w, P& [
怎么用SGD- import torch
. v( i2 p+ }0 Q. I7 J - \" A3 P8 y' u$ E/ V7 k9 H
- from torch import nn\" E! Z* |# g0 l2 ]) G
- * K' S+ k& M, Z( j
- from torch import optim; h9 W5 W; `' q; n* B. S3 ?) ^7 c
6 `# }& c9 d& H# h. o3 V
- W% @9 x6 e; Q# _0 I. h) |: T( l- B\" R1 O# c3 U* Y2 T) j' k
- data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)0 E3 X% u$ U5 l6 ]
; b! p N+ F3 _! s: d- target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)\" N5 R7 m: l% W' r; P
- 0 b$ j- n\" |5 i( \( {
5 C1 Q: z' C' C0 ^7 [9 R- / R4 z& N* T+ h7 w
- model = nn.Linear(2, 1). I3 \* x4 Z# }1 Z. T
$ }& f6 D/ d) S0 ^! z- 9 r0 ~\" a2 {5 }+ A' S6 Q
- 1 f$ p z; e4 n6 w
- def train():
; ]) t' M* u7 i\" @1 h5 I7 \; M4 V. O
* `( c1 {) R v( f* F- s2 W- opt = optim.SGD(params=model.parameters(), lr=0.1)
g8 A$ J( t0 B x1 y0 M% @5 S - 7 Q9 B, M Y# {
- for iter in range(20):9 |- R4 q. u6 w- h7 W- T' m
( E* B- b6 L+ J% m5 l( e- # 1) 消除之前的梯度(如果存在)
* k2 {( k6 y% f( W) y0 V
/ [7 x' t7 u5 [4 f$ [- opt.zero_grad(); z: S* A$ a9 R1 @7 j) A
- / c( u$ k: y: K4 O
! c+ Z; {- m k, _, ~; H( A: y
: J: ~8 L: r2 O; o/ P/ V- # 2) 预测7 l0 Y\" m2 n* N v\" I7 e2 v* M
& F0 N. N2 M: Z$ d- pred = model(data)# z: M/ i9 w0 l$ q
% ~\" d9 U& }4 L* S1 ~' ]- X. V' o
, k/ X/ N7 H: a
9 }1 N1 N3 _( A2 y; J% b- # 3) 计算损失0 |' d( R& _* ^. \; r* I
2 V* I/ D6 G j& G- loss = ((pred - target)**2).sum()% F3 b s7 j7 b& n* H
8 v\" h$ Q9 l, y\" J- 6 D& y6 k% M\" w7 f% S
- ; d6 r: F. q. |& M\" n7 o
- # 4) 指出那些导致损失的参数(损失回传)
% f& z5 J, _' x9 S5 W
, v. u9 D/ V' k\" X/ K, D: k- loss.backward()
( z/ Q\" W6 j- M$ p2 j0 f- r
0 ], B5 h* e D- for name, param in model.named_parameters():
% w: c8 Z. R- l+ ?. s4 }' [
/ @: d) K+ c$ S- print(name, param.data, param.grad)
6 z( F$ y5 |- X$ v6 g - 7 ?\" _+ \* [8 ?7 `2 K' ]1 \: G4 Z
- # 5) 更新参数\" E2 A9 h5 i) t! m+ w
- \" e8 J8 T5 m+ e8 [
- opt.step(): i- a# e! |: O6 m
8 N+ ]# p0 P* `9 f4 G. M, {6 O8 y
% M0 f4 t8 G. N9 c% {6 M) ~
4 i7 @5 i7 X! ]5 p- o- # 6) 打印进程
9 {% P- A6 K7 ?7 j J. r - , U* W5 M2 M3 i4 }/ @1 u. c
- print(loss.data)
% K. [4 B; U7 G* ? - + W8 ~- w; u! B. @! N! Y7 b' l9 U
6 u. T [; C8 G7 c\" `
- `- y9 u& \3 `\" @' }7 G\" L- if __name__ == "__main__":
- @* c) C) D5 ~
% `2 B- D$ K$ A5 R9 N- train()
2 C- S! d4 j }$ u$ j$ V, T9 j* d - : X. t. n) N. H' ~
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
: z n& n& j* ]! o# k" L* q9 a8 B. w+ V' C. z! E/ N! f8 d# G
计算结果:- weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])
, P% _; i: d& o# s. E+ }
% J8 u' X! F' u3 Y# b- bias tensor([-0.2108]) tensor([-2.6971])! V\" P. p$ e4 j8 l+ x1 i: ]
- & N: f; ?- ^$ |
- tensor(0.8531)
/ _# f' n0 B p& w) L) j; ^ - + e- Z/ ?3 C8 S( W
- weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])0 U/ Q- V- z' a8 Q7 s
: l, N* t x2 c! L% I6 b2 C. } q/ J- bias tensor([0.0589]) tensor([0.7416])
^) U& P6 S/ C
* U8 m# \) u1 S! Y- [% X/ j- tensor(0.2712)1 u; r7 ~- k) x/ p! {9 m8 K' h
- * c n7 q9 ?# t# L\" f# S1 H
- weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])
' d\" C H- T\" \1 ?' R& U - 5 P' j N* o* M( U1 ~0 `& M6 k
- bias tensor([-0.0152]) tensor([-0.2023])
& {. ]6 m h& m4 L - \" d/ ]4 e8 y& M
- tensor(0.1529)
4 t0 H! Q, r1 m) q. f m( \
7 [8 l- l# R$ |$ X5 g* |- weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])' m8 H2 W/ U' F
4 L5 o' U9 C: |6 z) D* V* Y- bias tensor([0.0050]) tensor([0.0566])
' G8 Q- z2 } X; }5 O
/ {! ?+ Y/ J9 F( `7 A% J* k- tensor(0.0963)
C$ ?' D3 }% Q& Q
6 Z( V+ a( B& R6 w& r- weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]]), b$ H0 p9 f9 i
8 \* m& e+ ^3 P0 r1 s' [- bias tensor([-0.0006]) tensor([-0.0146])# C8 C c3 i( ]9 Z/ ?' i5 I
- ( P! K1 e: Z) T. ~9 |! [0 W6 q1 {
- tensor(0.0615)
. G\" C, g( w' W1 D
7 q$ e6 n0 j1 p- v- weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])0 S: I! ]+ B4 b- g3 D* C, f; F
- : M# f. z# s# r- o0 X+ ]# w
- bias tensor([0.0008]) tensor([0.0048])8 F. {! K2 L, H* m3 ^& p
- ( w# e! a3 J/ y% A$ u0 g
- tensor(0.0394)4 a7 \7 O0 |9 q) k0 Y
* v; s. u9 D5 y! Z1 Q7 x- weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])
4 w4 K, G+ N! M$ P
- [; h* `# B7 C+ F! T* X' u% q$ s# x- bias tensor([0.0003]) tensor([-0.0006])) m1 U. n4 [* I- |3 g, ?0 w0 M
2 _0 W$ H, Q- _9 s* X8 A3 {- tensor(0.0252)' J/ K9 t- b$ b' @! T
1 S- F3 g0 J, T5 [4 K& s- ]! k }5 H- weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]])1 B* I( [/ P* l T3 {0 I
- . P* W3 g- X( \$ {) m6 B
- bias tensor([0.0004]) tensor([0.0008])
: `. L( ]) A4 K
\" f6 ^9 f\" v# a. `( \- tensor(0.0161)
/ `, t) B3 |0 L8 f2 J: r2 M - ) r' {, E: i7 ?- g
- weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])
\" c, ^% g( i$ ]7 P; x9 I# k/ e. i - ! ?; h, v( |# b! {
- bias tensor([0.0003]) tensor([0.0003])) }( A- Q7 ]. i$ B7 q
5 k5 ~- ~$ \0 m; g7 E- tensor(0.0103)
2 [. y* l9 ]5 Z% J, f
# Z' U3 j7 `0 p* k+ T7 p- weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])
- X% f `8 ?( j0 i9 o
. i' W4 P; u6 t- `* ~0 |$ I9 M- bias tensor([0.0003]) tensor([0.0004])
2 }, }' f ^! {8 Z- @6 s! ~# D! Q' x
\" E2 i( Y+ |6 Q2 r: _- tensor(0.0066)- ~7 B. ?8 r\" L+ T
, _% t9 H; |% @, s- weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]])& ]2 R+ Q3 T7 H! A$ I
/ q1 `' ` `( j- ^: [# _- bias tensor([0.0003]) tensor([0.0003]): A, [$ K+ `\" L9 r- H& u$ x. K
- 9 e y' k3 u/ E5 f
- tensor(0.0042)
0 R+ E( ~$ H$ [0 F, h# n4 G. }
\" U! e. w9 a+ D9 f) ~\" V- weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])7 r1 g9 P7 R4 D/ d& m v( ?
- 7 h' W4 B) Y- s+ |8 {6 Q
- bias tensor([0.0002]) tensor([0.0003])
- O9 A5 _9 V0 l! ~ - 7 W2 d+ n' N- F3 K5 v
- tensor(0.0027)( E9 w5 M8 c' z( g. p k' y. Z
- 4 q: E* H0 @* W7 V8 W* Y0 u5 E
- weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]]): `8 `# _* E+ C) L% S3 E9 ^
- ; m# j0 a7 i\" B/ ~; E6 |
- bias tensor([0.0002]) tensor([0.0002])
( M' N4 J+ i0 A3 f( N - % e9 U, C& ?' R/ r* H% M
- tensor(0.0017)
; j2 e\" V\" ?4 t4 w\" ` - $ g- t- e) K6 e$ p
- weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])- r$ x6 ^+ e6 o3 L& D
- {\" @# h0 v2 _; c1 z: ^ {- bias tensor([0.0002]) tensor([0.0002]): L% j( a$ ?5 A$ K* f P
5 L9 H+ S/ F6 h) }- tensor(0.0011)
. }; A. s! ]$ ~5 n
# L4 d+ g4 m& h3 ?5 Y) C- weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]])
* {& L\" B) [6 {8 T
2 b g\" O4 X u: M# H7 W) O( K. y- bias tensor([0.0001]) tensor([0.0002])
' ?& t9 @# g- W) I r9 v
; N5 r3 x\" b/ M6 k- tensor(0.0007)* P6 Z9 b0 e9 C* K4 {9 J
6 ]8 \ s2 {& j* H6 \- O- weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])
, K- s5 ^. X; a4 |* \
B1 q' P5 z A! }- bias tensor([0.0001]) tensor([0.0002])1 n5 \6 g1 l/ l3 I8 p% w, s! g) w4 P
5 j, B4 |6 ^' I; v- tensor(0.0005)
8 v, w( E1 t+ } _ - 8 V4 X ~( z\" g! Q' ?
- weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])
2 o z+ N5 Y9 |) T\" L - & ~1 o7 @* A1 t
- bias tensor([0.0001]) tensor([0.0001]) }3 d, K* ?/ G. M; Z- O2 X. o2 x% W
9 D5 a/ b4 W, U0 z- tensor(0.0003)3 ?8 I/ c6 [' |9 p
$ A6 L3 T( g3 T\" z8 Y- weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])$ A I M6 c/ Q, Q+ \
! R8 E& J7 r1 j' {\" Y- bias tensor([9.7973e-05]) tensor([0.0001]): a+ b- s) }5 p! C4 |
$ g. v- H+ z5 O8 q, ~/ S\" c2 {- tensor(0.0002)9 Y, x% A3 s$ R. t% h/ A3 J
- ; a) C8 Y! W' i. ^3 B L
- weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])' b+ H! C2 o( s6 b0 T; c! Q
- ; Y& I% Q) S) y
- bias tensor([8.5674e-05]) tensor([0.0001])
/ B. \0 y$ p* t/ B\" m - 1 z* x3 }3 |; ?5 A
- tensor(0.0001)
' _7 o [7 x* R* c) w U; A\" g( M6 ^
/ h j7 v) g) R& R- weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])
9 ~3 t: ]4 ?! \1 z5 m9 ^1 |7 X2 R
- I( X) F# f7 Y- bias tensor([7.4933e-05]) tensor([9.4233e-05])
3 A7 h3 W z6 \
- H( N/ v9 s0 N3 F' @; m9 v- U9 X- tensor(7.6120e-05)
复制代码
/ E+ \6 F7 `2 q: W2 G% X |
zan
|