- 在线时间
- 478 小时
- 最后登录
- 2026-4-9
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7788 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2922
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
SGD是什么
! F% s8 B0 q' b3 V1 _SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。
! g7 y& G- [; ?+ T7 g- H' b怎么理解梯度?
" E5 S1 V0 a5 L, B0 v& [假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。
0 @9 [* }7 l6 G+ _8 @3 H
7 t7 Q4 Q, w" S" q在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。1 B% ~4 f+ V5 N" B7 r- B* _( j
' u$ w$ a* ^' X5 P每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。
6 d+ }6 i3 C9 N! k
. ~1 T+ J2 v# y! N0 m! g/ [为什么引入SGD
$ y0 k. U) L S4 x# u深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。3 f: U" B% s# s7 e# h1 Q7 l
2 p1 ^: W9 i' u怎么用SGD- import torch
6 n. L6 o4 x& ?. s - # G/ e4 a8 p3 a8 K) N
- from torch import nn' B# p: _3 o6 R1 h* E/ k
' @4 g5 m, H; K/ x\" M- from torch import optim, o& e, c+ i1 D; ?
2 c, z. i* a, t9 {' r, ?- % }9 e/ I4 T6 `\" a$ ]
) i2 f. ]( r6 l7 T, F, x7 G! T7 p- data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)' ~( J9 t\" h7 u' i! S: K
- ! a' ?1 V7 O) e- }: w1 o
- target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True): ?+ Z/ v1 S, s# H( U\" d& `
3 a# X4 C5 a- P3 {( g: w
6 U8 |% i* H. U8 f+ Z6 g- 4 q0 f% E. F$ L/ }; q8 Z' C
- model = nn.Linear(2, 1)0 _' s7 @1 n4 k2 p+ p
- ; e. w6 q4 S. r! O0 e5 ~! Q
% s7 i) P0 @0 [ W& r8 x
$ w4 w+ v2 z+ `/ F- def train():
4 d7 G7 x( g9 j- Z, z - 4 M) D5 m. G3 M% z* s) T; e
- opt = optim.SGD(params=model.parameters(), lr=0.1)
: p2 s4 K7 j+ ]4 u% f$ H% D\" S - 9 H5 ~4 h+ [ O2 V+ T
- for iter in range(20):, x0 y. t8 z2 l6 N0 q& ^
- ) f9 K) @\" x5 M* `. w3 R% r
- # 1) 消除之前的梯度(如果存在)1 Z, F( q/ W\" y
- / L& S* B2 M; r5 f\" y6 W' x
- opt.zero_grad()
, y) I\" j) z' r8 t0 s. ?) |4 H; t0 q - / H% D% [0 h. T9 y6 h* z\" c
- , n! U% ~! r0 p$ P
\" d3 y- g( r E, n- # 2) 预测
% g- i9 O! q( \6 f - ! ~( ?' E# {& c$ {
- pred = model(data)+ j {4 Z, W7 S Z- r- I+ ?' z
! G& i* B2 @' \+ H% h\" B6 G# i- , M5 e* t; \6 F0 H; A- n
- * E/ K8 v* I8 a u
- # 3) 计算损失
9 \+ g3 b `( z7 n! _7 M4 }# \ - 7 `% K4 a6 L9 _, P' G
- loss = ((pred - target)**2).sum()
\" [1 P! a8 S' J1 J, k - 3 w0 ~1 B% ^! t1 n- O* G! w
# I, i+ I% x# q8 C9 {7 J
. i6 y% P9 x; h8 U- # 4) 指出那些导致损失的参数(损失回传)
# M+ I& x# g' ^5 M% y ^* g - 3 t7 `# i) X3 Z\" q$ f' c
- loss.backward()
9 O) O. l0 j9 f# e
: p/ l, {* |\" P& x. R- p- for name, param in model.named_parameters():
- I: L. _& N# u1 A3 S
% b! r( i4 A6 k& c- print(name, param.data, param.grad)
, w8 l/ Z- m7 J# {
: Q$ F+ ~. F6 w' Z5 z( M- # 5) 更新参数
7 u* D, B5 n, L& l+ W( x
0 M0 F8 o* `6 h, p, E- opt.step()7 {1 _- R: Y7 E' _
: c9 _) l% ]& d9 j( D- + i: t* ~) E$ v' I
9 F- ^) |, M L0 {+ o' c- # 6) 打印进程
' l' \, Q1 d5 P7 p1 l
, I/ W0 s, X I9 t0 s2 c% A- print(loss.data)
0 V) a. \* z8 N
9 V! `1 _) _8 F
; @; l$ F* E, m8 I
( n1 t( N. W7 S* v+ i% V( F% H- if __name__ == "__main__":
! T+ v/ Y6 ^* d, w
* C7 w9 O' R, a\" a8 K- train()
' k* g0 P+ b) y1 T ]! N4 r
0 l' `; `9 [4 o# e4 }( u, @- F8 e
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
8 N p) }- i8 Q2 @* J7 d6 O |
: v) ^; Z# t& C; n# @计算结果:- weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])% |/ y, }* {- [\" X2 h) Q
- / b1 p$ T1 E3 Z' t! `# c3 ~* S
- bias tensor([-0.2108]) tensor([-2.6971])( w* p2 f# U! f& \( r
- ' K7 ^7 b, R3 z' R: `7 s
- tensor(0.8531) H o: w7 b% b$ e
- 9 X/ C8 H2 e' N H! J
- weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])
& y' ]' \* e6 P B# U7 B
\" N% x3 a. I: }6 W* a- bias tensor([0.0589]) tensor([0.7416])% S/ O) Y' d, F. U, J
9 {4 A% ^) _5 o- tensor(0.2712)& Y; q\" X# K2 Z$ z5 B n
- - `- j3 G% |1 S9 P
- weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])
; {2 w: n$ v. D
# {9 a8 l1 q$ v( a0 a) \* f$ ]- bias tensor([-0.0152]) tensor([-0.2023])
4 p9 x! P) j3 e; k8 L7 Y* `4 Z - & z* B+ z* T6 j, |
- tensor(0.1529)# U! j9 W\" f# Q! A& Y: v. Z- F' o
) Y. L\" k3 o# o- weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])$ D5 I# H' K) R+ R
- 8 p/ ]* M$ N2 {4 `) s* x: |
- bias tensor([0.0050]) tensor([0.0566])
; o# r; p* r; \5 f0 T
3 y- }( {0 l$ I5 u- tensor(0.0963)
1 ^& o$ i/ V2 D
4 b9 z8 {: p J- weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]]) H0 w4 I9 Y+ ~: R
- 6 ^0 Z+ E\" {1 `
- bias tensor([-0.0006]) tensor([-0.0146])
f/ o6 | V6 D1 _' [ i0 r
( k0 S; G3 U2 k7 }9 h) `* h) n, S0 @- tensor(0.0615) n& G' d* s+ G$ s
- - p\" i: R& ?5 F6 X# s6 A
- weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])
% w, `% t7 m* D. v1 s
0 g: p1 r: _9 K4 @; |/ F- ?: R1 x7 @- bias tensor([0.0008]) tensor([0.0048])
9 @\" e- }# `4 c$ Q. O - ! R2 r; @8 ?* ^. H% s3 t
- tensor(0.0394)
3 |0 T7 ]; O- v5 I\" }1 S
4 L# j; J V2 {/ h- weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])\" k& K% r* j6 S; L2 u- T% t& I
- 3 p6 b, N2 o1 i& y. M
- bias tensor([0.0003]) tensor([-0.0006])
; `8 G3 \ n {( |# O- S
* X9 C0 ]( `0 t- n8 e x- tensor(0.0252); _$ n& P* N- A: S
- ' n$ [, O0 r( B7 I7 }) R2 }
- weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]]) M\" ?) E& c2 n. h+ X; A3 A( r$ ]! T4 E
- # D1 N5 E\" {- p+ |, Q6 R, }; C
- bias tensor([0.0004]) tensor([0.0008])
+ B9 k# I7 X G) `- ]# \
, G7 Q/ }! g& k5 t+ S; ^' ^- tensor(0.0161)
\" o) M' `8 L, I8 L: x# d0 q5 Y; [ - \" P+ _5 W# M3 J5 [) P) v$ `
- weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])( @) q7 o. M N' ~
! y: N& J: i' O$ E( H' I# N- bias tensor([0.0003]) tensor([0.0003])
2 e\" \$ v6 h% @( Z2 H1 x9 Z
; i3 V% Q! E3 [, Y( ^; q- tensor(0.0103)
- b& R& R7 A* K1 u1 O2 C/ A# Q8 F
9 ]/ p4 s, |5 o* o* _% r- weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])
( W! ~* y6 a( h% { D - / y* y5 ~& W( c9 [! x/ A
- bias tensor([0.0003]) tensor([0.0004])
4 b9 M; R2 e- u9 B
: _- n( f- v1 E- tensor(0.0066)( p\" ^, l: n- g7 B! L4 ]! `! Z6 Y5 N
- 5 }) c& Q\" ]3 g& p
- weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]])
3 L j- R# x4 z( ^, R/ E2 W
9 B: b: R- G( Z- G( Y0 S6 `- bias tensor([0.0003]) tensor([0.0003])/ N+ y8 z0 p5 M c) y5 ?3 M) u6 j
- ! |% z1 l% |* E- T3 D: L8 r, l
- tensor(0.0042)
$ c) a9 j) {) H& o! o - # @% |# J. M/ S6 m
- weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])5 g3 j5 u3 d2 i9 P; d0 p4 I- p
% o- d0 w, M2 O4 v8 b- bias tensor([0.0002]) tensor([0.0003])
% a8 W- V\" z% V) L( g E - $ j- S% Y2 L8 ?, a( _7 r
- tensor(0.0027)3 X6 w/ s0 ]2 T S# \: T) R! [
& ~ k/ k6 j\" {) |6 N- weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]])
8 j, P/ O( Y) V2 a3 L, u
+ ^5 J% j1 A/ r4 P- bias tensor([0.0002]) tensor([0.0002])! }4 h$ {' V4 l7 H, V- A
S5 i5 U# B* M* [* ]. y' M- tensor(0.0017): o9 F& }7 {, R5 h
) b- \+ _4 s: \1 G t/ O- weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])& ]- \# \& ~3 U l8 Q! @
8 ]9 ^% I7 ~2 [3 k$ e4 k) F\" L! J- bias tensor([0.0002]) tensor([0.0002])5 {. ^: n6 p/ f/ v8 N3 s
/ w4 O) e0 {8 c2 a- tensor(0.0011)5 Y( g/ B+ B# }
E: z6 @4 L2 j; s- weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]])- P0 ~1 |* r1 s! B- g
: k* a! V7 j& L; z, H, \) d) R- bias tensor([0.0001]) tensor([0.0002]) V7 t8 ~/ N, E% m# }
. B( g C# o9 @6 f5 T+ s- tensor(0.0007)
4 ^0 D. [3 s( K6 I) X l
4 |) h- _/ T0 V- weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])# T# P3 Q* {; M3 I3 ]( Y& {! L S
- + } Q# c( ^+ C
- bias tensor([0.0001]) tensor([0.0002])/ b8 }( V4 ~& S0 }
- - g8 A4 j/ g* b+ k# z
- tensor(0.0005)
% K# n( G3 [1 ^6 i - # S- Q) T% u! |( Y8 I
- weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])& K4 w' d5 N/ o9 W
- ) D7 e* j5 A( b/ D9 k' c
- bias tensor([0.0001]) tensor([0.0001])9 p0 a, r9 d. |2 D\" p
- , ~7 ~$ ?% _0 {1 @# s9 b; F- C# l
- tensor(0.0003)
. n% f6 d8 c7 }( r
' {# {, {6 \\" B* j- V9 U( }6 z- weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])1 ~ l\" c' t7 S\" h6 T. O4 P
- 9 K0 t2 X, {. y& O
- bias tensor([9.7973e-05]) tensor([0.0001])* \7 |4 o$ B& o
$ ?8 _% |! v1 k- tensor(0.0002)1 J4 N1 @3 e$ g( `! Z. @; n
- : \8 E- b! J! B( D
- weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])6 c* a+ e: D4 `$ R\" m- R\" l% T
- ) c( W8 ] ~' ~+ ]( ?* H
- bias tensor([8.5674e-05]) tensor([0.0001])5 w. o( ?: L# D3 @$ s+ I
- * Q8 g/ h' Z7 c# V
- tensor(0.0001)
& k& e! J9 `! p+ w8 G
7 o( A% R g% w5 v* ~; j- weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])) U\" q% s R5 \) y+ N( N
* A: t2 r: _7 N8 \$ U( [. K- bias tensor([7.4933e-05]) tensor([9.4233e-05])
$ \0 |4 Z2 _# M. ^
3 K9 E; X! P( ?% E- tensor(7.6120e-05)
复制代码
( p0 h/ ~# Z6 |( b+ P |
zan
|