- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
SGD是什么% [& g6 [ b- T! g2 B, B
SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。
6 G# j# K" j3 g6 P/ C N: _怎么理解梯度?
; N2 D* @- d% ?* P/ o7 [+ z. ^0 ], r假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。. b2 j5 n# d" S( ~( x1 g3 B
% U- c# y1 |( x( D
在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。3 _' r' k/ l( X8 [8 w' Y9 A
_5 g8 b2 u" B$ r, E每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。9 F0 r* i2 s6 E( K
& w$ J B. `7 z. ^! S
为什么引入SGD" v: u+ ]$ R: G0 z* {
深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。4 D" K4 B5 c; y( r4 w
' \5 u# ^. x0 `5 n: y3 ^; y+ I3 l3 u怎么用SGD- import torch' q p8 w9 d* B& c$ V( B6 K% V
4 }# M2 o; _# _7 z+ _ ]- from torch import nn7 x+ G0 `& Q1 U2 L
- * f\" O6 ]; ^/ S/ `! l& U4 V# H
- from torch import optim5 B# m6 K5 F G# h7 j
8 C* E( k5 }' O; ~8 V
* M `. s a, x5 r$ R0 H8 v, Q- 3 _0 R& e; f4 l. } e8 K! ]
- data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True) x3 Y) }! o0 F0 G; A8 o7 D
- , y9 y/ p4 Q9 A6 z
- target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)2 o. x& X2 Z5 G' z* S- E9 g) a
- \" A4 b- T& R; V4 _% F\" u
- \" t5 P9 ]# I! ~$ E1 g6 _
- 4 F5 W4 @: G- X) T: T
- model = nn.Linear(2, 1)
* h& r7 q- T5 [5 Q - 4 z5 b# k# j9 X/ H
y\" z' m8 w$ ^! f- C7 `
4 k9 P\" Y$ w0 Z/ r& ^4 o* k- def train():: v% z9 C% w2 s\" `; Z( D
1 G, B9 |8 s0 Y\" ?7 ~ T+ w- opt = optim.SGD(params=model.parameters(), lr=0.1)4 c) L& E0 a, v7 ` W$ s9 h
' B- ~5 B! u, d\" A. C, O; x6 Y. O- for iter in range(20):
I0 k6 h8 s l - $ F u8 V+ I8 U- J7 f
- # 1) 消除之前的梯度(如果存在)3 \( y) v5 W% l2 \. B) U
- ) l1 u$ y! K, s
- opt.zero_grad()% e3 _# x2 o1 j
; i1 g2 d# Z8 ^& s3 l\" y, G7 E4 G6 _
; r/ ?& W) _3 R* M( R& N6 j
( f1 A$ m, H9 `8 f7 a\" ~/ g2 w- # 2) 预测$ \, n3 [, F0 `9 W! k' y9 `8 T
( R, z( {; X% H- [! U- pred = model(data)
; t) r3 s9 O2 L* G5 K [* E - ; @: r# n( \5 K3 k5 U0 z, g1 S2 F
/ G v0 v( b6 U, s\" N- 4 U9 J/ r5 I8 I4 u; Y! t
- # 3) 计算损失
4 g4 Y* l B/ V
6 D- E/ c4 S\" P L4 q {, i- loss = ((pred - target)**2).sum()1 g' b, N- Q\" X; e
- 5 g, R7 l* M, b4 h3 {. X. h( J- A
: [- q4 \- {0 O# U- ' H9 q+ M' _% h6 \& ^5 `( w8 S1 b
- # 4) 指出那些导致损失的参数(损失回传)
. k/ o5 b3 [# E/ c2 I5 L - 4 y8 i7 k g: A8 x4 ^% r% k' j
- loss.backward()
' j9 B1 R3 t; Q& s
! }7 H; y/ U; M/ I- for name, param in model.named_parameters():
0 s- p( L1 `, p; \( N1 P$ T
* l$ Z% Q/ x- Q3 P n) l! _+ a8 |( {- print(name, param.data, param.grad)
0 W4 @# \& N1 c. [ p2 {9 m/ ?, X
/ Z) O4 f+ u. N) t* Y2 s+ ?- # 5) 更新参数
# `+ n7 F8 r/ [\" ?% z
5 }8 j/ _, M9 H6 K- c- opt.step()1 Q3 J2 n7 {$ r2 a# a
$ X1 G. {% I% ^( N/ }5 i# B
3 G$ e7 t8 v. l* _! P
' R( s% [, g# W5 t7 C$ F- # 6) 打印进程( e+ k% {3 O8 N1 ~) x
) t; N# M1 b1 u8 T. e8 f$ m- print(loss.data)1 T; T+ I! e4 u4 |8 k. C; R& C
$ V6 m( J* J7 v, ?5 K! z- 1 C! h4 D6 k8 W\" l t
! B' Q\" K) m; u- j6 a' I3 X\" J- if __name__ == "__main__":9 i; x4 ~( C- x
- $ Z \+ q4 k9 F5 X9 S, x
- train(); V* T2 l3 m1 B' q
- 8 \: S a5 P( g: [/ J) |: ~\" K
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。) t% J6 u7 E" u' m* q
+ g2 ?3 T' y3 e j计算结果:- weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])% h- `: }7 l0 q, p- ^* ?1 h
7 v3 s) S/ n% t$ g T4 q* d- bias tensor([-0.2108]) tensor([-2.6971])8 Z( ^& u! e( b
4 o. L# s1 [) {. t5 G- tensor(0.8531)- o2 Y* p# Y( r+ Z
5 M\" C. D* X* I a& o- weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])8 N; F$ P8 G& R! `. ^7 V
- * C; k u\" Y1 _: c% C2 g
- bias tensor([0.0589]) tensor([0.7416])5 o9 o/ ]5 L- R/ [' W$ Y
& p\" I2 I6 |1 N3 L- tensor(0.2712)
6 d$ m7 ~( H; S% n, s. ? - . v4 H0 [' D& u' {& }
- weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])
6 s4 d/ Y9 W8 s- _4 Y0 @- c2 r - 7 W4 n# {; S1 h+ N/ o; k& V
- bias tensor([-0.0152]) tensor([-0.2023])
6 C& q; J4 d6 L+ C
, H2 J6 E: X0 f# g4 G0 H* |, [- tensor(0.1529)
e) Y. w1 o# Z3 j - & J1 x2 @7 i5 J; G, z: L5 R1 k% F
- weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])
! B) H! R( \! ]1 C e( J$ } - 3 ~: w$ y' B: y\" d8 o( b' N
- bias tensor([0.0050]) tensor([0.0566])/ H+ s+ P- \4 M2 ?) B, e
: X\" f2 E. W. h- tensor(0.0963)8 s b8 J8 H\" w9 t8 e- w. U5 O& Q
; K% r2 K. d/ }) }. j- weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])7 ^! x9 B0 [0 r4 L* T* n- F\" k2 D
9 S O: d* S\" L- bias tensor([-0.0006]) tensor([-0.0146])9 @7 d$ ]- a5 n4 _/ c3 a* T* L
- - W\" V* h8 M0 o/ Z6 y
- tensor(0.0615); C7 r4 _ |% Q7 `1 s, |2 t
- 4 | I: v% g* @% F( C
- weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])
. b3 g2 w2 S1 p; I3 I
9 `/ W' D* n$ H+ r, P t- D- bias tensor([0.0008]) tensor([0.0048])( Q* @/ W: l9 g) z5 G8 Y/ Y: r0 x
. s/ P4 P( J B4 t1 n5 u% u; C. ]- tensor(0.0394)
/ q6 c8 H2 l1 q0 U: O% _+ H, `
8 v( S; X3 w0 o6 X7 m$ o- weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])
. z. |9 |; G; Q7 a - 1 Z9 `4 ?! K' _; X/ ?
- bias tensor([0.0003]) tensor([-0.0006])
+ e% g1 Y# ^$ L4 n
, I. Y5 N: f8 r- tensor(0.0252)/ \. V, {# R2 ^, `; o
\" v2 @; s/ f+ T5 i& Q- weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]])& m& R9 u7 V4 n3 F2 f% ~# D# I
- - w% ^: c7 i8 f6 X0 N8 d3 V; D
- bias tensor([0.0004]) tensor([0.0008])
* |( _0 `$ V\" O, ?( L
# ]6 q6 h# W' ~! y- b. o' e- tensor(0.0161)1 j. b2 H7 y6 w* x' c9 \
3 w7 W( p& ]) {. Z$ x\" w- weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])6 V. o- s( t\" _
; s8 k5 c4 v4 S, G4 j6 H- bias tensor([0.0003]) tensor([0.0003])
2 }; {6 q9 e& d
4 ^1 w3 b; u3 r0 @- tensor(0.0103)
( Z* u- k: o+ \; W1 D0 E2 z - ( B$ I @4 ?+ ~$ w, Q# X
- weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]]): T- Z\" q; h1 Z8 s+ B3 p( A
- : ?8 C1 \( g. m5 E, D2 ]; ~' [3 T
- bias tensor([0.0003]) tensor([0.0004])8 \5 Y+ |8 p% I% p7 F) C/ H( _4 a+ [
1 W& D3 S4 L* K3 d- tensor(0.0066) P9 {) G& @% X; q9 i. a6 @. J$ M! c
6 E' x2 O; `1 R9 E- weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]]) C: j) \* u( x, m7 l
- v2 c0 I3 j2 r$ s
- bias tensor([0.0003]) tensor([0.0003])$ A. A9 X1 T) x$ A9 U. Y6 P
. x+ }( q. y- `4 m d- o- tensor(0.0042)
$ z: d+ H1 T: Z: L0 w& b1 ~' F) ` - * j, \- q) q5 L D3 J m
- weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])' Z; |7 d, ]5 ]
' E. e& I0 F5 e4 ^5 ]: F% i6 o- bias tensor([0.0002]) tensor([0.0003]); y4 o1 X$ O& I6 k: [
- 2 y; c$ ^5 ~9 b2 F4 s6 B$ l
- tensor(0.0027)- e/ c1 s7 Q6 [* @( l
6 p$ q8 S\" t9 ^! L- weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]])$ h8 r6 k, |4 U' t5 T$ y4 H' M
' r7 c+ B- _5 ` @: ~1 I- bias tensor([0.0002]) tensor([0.0002])
8 q- g+ _7 l! }+ c( R7 |8 `5 W4 c- `* m
9 }: W# {7 f- e w9 I' A+ j- tensor(0.0017), M% O7 J8 V: _0 l/ Z# g8 X1 i
- 4 D8 V9 o2 }' G; ^& W
- weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])
2 `! j' O3 H\" N. u8 J3 ^, K
3 e1 C$ d! V- r. X* H+ W! p; M. g- bias tensor([0.0002]) tensor([0.0002])
. v. d$ |\" u9 o9 a
& e+ v$ A5 s) {! d% e- tensor(0.0011)
8 D; n9 _0 R1 I$ v) n8 _: ` - 4 l. o' S( i8 F0 R
- weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]]): D2 k( H* O: Z' A/ ~; a
2 Z% n. ^6 b3 s/ F! ~( |' ]- bias tensor([0.0001]) tensor([0.0002])
$ |6 B. \/ n$ N1 i! |+ C. V3 P - $ c6 D( |0 H0 s) w- x
- tensor(0.0007)
& _6 L U$ X\" G/ S3 Q - 7 u$ f* v% c\" {# W1 U6 ^2 r% p
- weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])\" g) q\" v/ g( B
/ u, h( N! _! R9 d% c- C$ I$ m% T- bias tensor([0.0001]) tensor([0.0002]): { i8 ~9 n C$ a5 u K
: x* F. i' v9 q- ~3 N* ^- tensor(0.0005)
, v) G2 o- |$ h3 p
: _' S# C\" S8 k/ k' u4 l0 Q7 h- weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])
4 [( ~9 k! g# n& x0 u4 D
0 a! z& M4 i. o5 C) _: p- bias tensor([0.0001]) tensor([0.0001])
7 Z$ \( _4 Y7 J8 @
: V5 Y8 z! c% B+ U6 C' ^/ K- tensor(0.0003)
. a1 _6 f8 x6 `- ~
9 X6 p: E\" g! U- weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])% s' q9 G }5 O1 m o
- 5 `3 {1 Y/ ~ Q\" l& v8 D! W
- bias tensor([9.7973e-05]) tensor([0.0001])
+ ?8 Q; [; h3 H3 [/ g+ d/ P
& ~% Q2 ^+ j s, ]1 Q& B- tensor(0.0002)
5 C0 P1 `7 y/ p; q\" @, b
- n3 h. S8 x0 m/ Q4 ^& N- weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])
! T, Y2 ^\" ~ d\" F
+ Q0 V1 V: M4 X- bias tensor([8.5674e-05]) tensor([0.0001])2 I3 j7 } `2 n7 i( h3 a
- ! G s1 N4 o; ~- `1 o$ d# [; n3 l
- tensor(0.0001)
& N( Y/ z0 z+ \5 s2 D3 H
2 H) v# a2 b2 Z5 p f4 @\" A2 p- weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])+ ]! d! O! C$ F% p/ W2 ` g
- 1 T, H+ F+ } A. Q X3 j0 j2 _
- bias tensor([7.4933e-05]) tensor([9.4233e-05])\" |! _0 K6 u7 I& Y. c3 R0 t
- + }1 \6 k& U% I$ b- R4 Z
- tensor(7.6120e-05)
复制代码 E7 t3 h8 u5 D: G+ ~7 f; \
|
zan
|