- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
SGD是什么
- A% k" W6 R1 lSGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。7 I4 w6 M% y9 G
怎么理解梯度?1 J' P$ V5 v. V: [' ~8 Q
假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。0 z8 \+ H4 t9 b8 y: Q; p8 c
# x. a& E% E$ k' p' M/ ~# f: H2 j在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。
- d8 P1 r- x& a- Q: W; p2 g' H$ U9 M, l1 r% s- ^ w( q
每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。
1 z! x/ H4 ^. f5 t9 w: v b+ g7 ]: b* j8 c2 |$ q
为什么引入SGD2 g) P, k# j5 O0 D
深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。
a- p8 L% @; ]& ?* A( f5 m; W8 @1 f. A7 {- v
怎么用SGD- import torch
' i+ D# x1 {\" D. P! c8 t\" w' u: S, a - 9 U' j0 t9 Z* t9 a; v- H7 J1 g
- from torch import nn( o0 c# j& o- |- d4 n
- / G( |5 {0 S1 e: o- J; ]' G
- from torch import optim
( U9 N) O+ ]7 n+ T/ G* l - 6 c9 O! r% z4 P4 d' _$ z6 C4 H; n; z: [
% L$ p$ W& D( r. S
2 Q$ {* j$ K9 y2 V: h5 @- data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
( X0 ]* q* u: _% O/ f) A8 O - 0 u G& I' `. V: k7 z
- target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)$ F; Q0 Q+ l0 I W0 v- Y
0 I; W. v5 @ X1 U
9 [8 ]3 k6 A# K
6 r1 k. t9 }5 J7 x9 [ v- model = nn.Linear(2, 1): j* |( O; `% ^; B9 p' A$ c; f C0 ?
+ _& j/ L2 E1 n- 6 S2 O8 F8 O- d8 C9 r% }5 }
- ! b% k2 h$ l+ f
- def train():
$ O/ Z! u v; l# l/ @- A( v& L: o9 p
. R* S\" k( C+ f# C- opt = optim.SGD(params=model.parameters(), lr=0.1) e3 w9 Y2 p1 P2 \+ l. L
- 7 u: U5 O |# ~5 F: I& E: h: V
- for iter in range(20):$ c/ F! H1 h9 m% c! h
, [9 n u( m+ T7 G4 l2 d0 P+ j+ N, v- # 1) 消除之前的梯度(如果存在)
% R4 D7 s- n( m2 C; Y/ o
* \( k5 |! \\" ]3 p1 Q2 [$ b% n\" J- opt.zero_grad()
5 S\" a+ r7 G$ g3 |, o. t
* Z. i+ s. {! o6 J% B+ m/ o/ d- . }+ u7 @9 Y4 v0 C
4 R7 Q4 y+ U' q# ^9 G- # 2) 预测
% L& g. Z {. h\" x7 o. h - 3 s2 j. C) W) L1 ~/ G9 {& k
- pred = model(data)7 O+ A( ]1 h$ G( J; W, o. G+ ?$ x) u
\" N; ^! Y2 e) y3 S' o; o$ g
7 A& `) }& Y) K! ?\" |$ X+ O- # K6 @' C1 r; z' F
- # 3) 计算损失
\" m. n6 N4 r& ]! T
% v& h( ~( Y; ^$ Z& G5 r- loss = ((pred - target)**2).sum()
5 X4 r* z* z: z x
2 x% e3 B% ^3 k( @- $ }& r0 Y. J: M$ |\" a) ^* j
$ |% c* a3 h, R3 T# X7 O; C- # 4) 指出那些导致损失的参数(损失回传)
* S, `) C# p& z2 v* R5 X/ { - . c( ?\" p\" |* {1 R) U
- loss.backward()
8 j3 r. b* c! [- P0 G; C1 o+ l$ P+ n - ' f- j9 D3 F\" f
- for name, param in model.named_parameters():
Q% F7 l$ X\" T! ~' o; B
* d A- ^% y; I* [1 n- x) ~- print(name, param.data, param.grad)( N+ p; b# T2 j8 O2 G
& b+ U2 _* f; R8 Y3 t- # 5) 更新参数) A+ i, W# M4 G# Q
) O7 X7 V! X9 Z- i0 K- opt.step()
( u6 L% e) V; r4 x4 [, Y - , G8 X8 g3 ?/ _/ k7 q, y* @( ?
: t0 @3 R) G% o* R) d- 1 G. @$ D\" ~* r: r
- # 6) 打印进程
9 R# M2 D7 s$ e( U\" r4 T - 5 J& A3 E9 @; j2 P$ R
- print(loss.data)$ f& o$ e1 x9 m; t4 v% j
- H R; U7 T+ E( X% R! t. ]
! \\" j$ Z* w; U
5 l0 g* z( s `$ c. j- f6 G- if __name__ == "__main__":
# r% r3 d\" u/ _# ? - 3 w. M' L( _\" s; `
- train()
) I' Q& ?' @7 ?7 ~; B( |3 M* A - ( D/ |1 x3 }9 x
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
! x! S; K( j0 p6 h2 J9 ~( k4 L5 }) C* J" f3 z! h" y; H8 o7 K% D
计算结果:- weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])
+ u. S, O) z2 A* A8 O+ O
1 E; H1 x+ }. S1 M5 V4 H7 [- bias tensor([-0.2108]) tensor([-2.6971])
4 ?' z. j# D* h& r
! ?2 a! H9 Z\" o\" b6 |- tensor(0.8531)
! Y9 H4 I& I$ `; t8 A9 L# I9 a; g8 j
* h( S, i3 c( {2 y* c8 w7 |- weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])
: Q/ q$ E. ^) q1 q1 S
' c# n3 P2 S$ Q& Z- bias tensor([0.0589]) tensor([0.7416])2 I6 c# s1 A! g1 _
\" B8 V. N+ S3 H8 ]9 L, ?- tensor(0.2712)& d* H4 t# ?* I- v) k\" w8 R
# z) i f3 i, d- weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])( t$ u\" C' K+ q+ M W- O9 \
- + D4 m! k9 T( \/ G
- bias tensor([-0.0152]) tensor([-0.2023])0 z j* r4 X5 M: S0 i. L* I
P& c- m/ q) Q+ k/ J- tensor(0.1529)' ]9 p/ r* x4 L
- ( V/ [4 T4 G& T( r# O
- weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])( A2 u\" Y R( Z4 a7 g+ w
- 4 j3 z2 J5 K9 i! m
- bias tensor([0.0050]) tensor([0.0566])
1 h. ~& p3 c/ e - 8 }# T+ C- ?7 @8 x+ h
- tensor(0.0963)6 [$ A/ Q7 d4 X\" G7 A( P
- & S+ `8 }3 [5 I0 ]$ a) u) D
- weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])
: c1 |7 N' \2 T# B6 r3 e - 1 B. H* ]- l' y) a
- bias tensor([-0.0006]) tensor([-0.0146])
% y1 ~: C# G8 l M - , h2 ?7 y: j! p) ]) I
- tensor(0.0615)
- U9 N) s3 ^% B: h
; B8 t% P& J) K: N- weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])
8 Y7 n( ~3 l6 K6 l! z# j - ! k' [ h6 A. m3 t0 r1 L5 Z
- bias tensor([0.0008]) tensor([0.0048])$ a, f! |- S) Y! ~* A z3 t
- & _# x% S# d8 R/ f4 h
- tensor(0.0394)
+ G0 W+ J6 i& t6 |/ A
+ R0 x* {4 N% ?4 X* N( V- weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])# U9 |& i% q. X- r9 Q
- 0 @) @ Y: ]' I
- bias tensor([0.0003]) tensor([-0.0006])$ t8 E\" H$ p9 |: }5 g9 w2 k
- 4 O$ R1 s: [2 Z1 e* ^
- tensor(0.0252)8 c) Z) P5 j3 H+ { x. a5 j
0 _% r7 \( {, P2 O9 O, b- weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]])
w& ]+ @; u* B - 0 u! i* B; {. s: i& r: [
- bias tensor([0.0004]) tensor([0.0008])
7 b# W9 E0 D* V+ L' {7 ~) y% n& r
' f) T+ p# C/ X) c! y- tensor(0.0161)/ a+ Y8 b! Y; g5 [
( M7 d8 U: e# G: f. p- weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])
4 y- Y4 p8 i& q% }% z, [0 f\" ]\" F) I - 2 \6 e' q. q5 u& T! R\" r' O9 t
- bias tensor([0.0003]) tensor([0.0003])
! r* i7 U1 c7 _\" E9 N. [
0 A/ i1 N, K% j- tensor(0.0103)2 q$ \; S\" }* r% R. x+ O' z4 U
- * A5 `2 K* M2 D- s
- weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])
. X1 A0 c0 o% P
) h6 }* c1 H6 S. C7 w- bias tensor([0.0003]) tensor([0.0004])/ W2 n, T! T7 t( h; S+ h
- % M\" m. J) W$ Y$ ?8 A$ e\" w
- tensor(0.0066)6 `5 L5 p8 d+ h6 n, H E
- 3 d4 G3 d- i3 p, U* j0 g
- weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]]). ^) o\" U% O1 O0 h3 v\" Y
- ; l3 w# E: h/ s' [* f' k( q
- bias tensor([0.0003]) tensor([0.0003]), q8 g' ^9 a/ V6 a% l3 y) \9 p9 M
$ v\" X& t0 w\" ?$ e- tensor(0.0042)2 ^6 @* s8 M\" ~- \, W9 |
- , @: H$ o: S+ D\" ~6 Q( Y: {& V
- weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])
1 X' A: m9 N* c) `4 p\" z
4 \9 J' d- h p- bias tensor([0.0002]) tensor([0.0003])# w; f$ Z& `$ o. W
, ]! ~) Z1 x0 U- tensor(0.0027)/ `9 I/ ?% P3 S7 ]# L& t; }6 Q: y, j1 N
- 1 W9 X. w0 r& h+ c% Y
- weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]]); d2 x( r0 g) c6 S, P# Q
- + p2 `4 m# t; ?6 H' P1 U
- bias tensor([0.0002]) tensor([0.0002])! T4 ^8 Z, U2 r) b: Q7 q- B
- % J4 U, A/ R- f
- tensor(0.0017)
2 q# j+ |& \$ p& }$ V- \ - : {7 V7 A0 K( b% p\" p1 W
- weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])
' W4 m4 G# y+ O\" ? - $ F. j$ }+ A* ~9 A
- bias tensor([0.0002]) tensor([0.0002])
0 g8 n( f2 T\" P$ \ - ' i* J7 e& W: T' [\" t; L
- tensor(0.0011)! n( Y8 B7 A: x' y: k1 {* q
+ H3 c* [) ?5 K- weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]])
. O9 {4 f3 F, R' a4 A/ p7 {
' h) q- b! }6 X\" }& G8 S& o5 N- bias tensor([0.0001]) tensor([0.0002])0 q$ v2 u1 [# G# o% b
- 0 H+ X* B6 w9 O) a, A
- tensor(0.0007)
+ N: A. x) N* K0 `% O/ V: U$ i - v# Y e: M0 Z5 M3 m) {
- weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])
# r, f w0 C4 w2 k9 u6 x+ X - ; @) c3 A% b) G( g# m% E
- bias tensor([0.0001]) tensor([0.0002])
2 Y. X3 |/ _! Z. I5 i M6 N, T8 o
, F+ [+ T( _6 v8 R$ c0 o- \4 f5 F- tensor(0.0005)
2 f4 o+ d: F! c. \3 ], Q7 w
: @6 @( e7 F1 ?. Q4 T& G- weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])
3 x0 ^, b/ I# F8 s- k6 ? - 7 C f2 W8 h- B9 R- [5 r
- bias tensor([0.0001]) tensor([0.0001])
6 B% a( x# p6 S2 E6 I9 l - ; o) L& N% ]0 }7 Y5 q
- tensor(0.0003)
, w% [+ C5 \/ F0 m5 J( d
: J0 [2 y& B: _- weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])
; Z! E! N- z9 Q, |9 |, n
% X' W, G$ M9 p, k0 V- bias tensor([9.7973e-05]) tensor([0.0001])\" G. h% ]7 |( R9 u
- * ?( e0 k8 ?% d! E# F. y
- tensor(0.0002)# ]: d7 W+ h6 A
- & ?2 v\" R, `/ Z% ^
- weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]]): s; X2 e6 B$ J, j! H q1 S
9 W) |; A3 j) S5 l2 V- bias tensor([8.5674e-05]) tensor([0.0001])
+ v. q; H/ |; R4 N - * |& q6 t! d) C# {9 x
- tensor(0.0001)
1 |! \$ z4 J. g7 _7 P% ]0 j' h. C# U
* [. e P7 T6 u% ^9 k8 C- weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]]), ?2 D! O9 _3 w- L
- . E2 Z' r( H% @% Z! w4 ]4 g5 E
- bias tensor([7.4933e-05]) tensor([9.4233e-05])& {% X6 n( ~$ G* {. m9 D
# y/ l$ H8 y. l9 @4 a- tensor(7.6120e-05)
复制代码
: b6 H1 R* |/ D1 i. d9 E& G |
zan
|