- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
SGD是什么4 I0 L+ E7 a3 x- l. J4 S
SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。
# F0 X& n* \+ ^2 ^8 L/ y; ` Q. Z7 r怎么理解梯度?
* ~/ o8 e1 e: k ^2 Y" u1 k7 L假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。
1 J; R7 ?; L0 p+ q& q! P2 {7 B5 ^9 b+ G1 t' g3 a x
在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。" x* U( m# Z9 V5 u/ `
( s' U; D: p8 S: |) f/ P/ H/ Q每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。
1 R2 y/ V9 ]- J, j; \2 t& C& H) k; F3 L' M6 S2 i
为什么引入SGD
, U6 P; ~- Q: G0 s. d& _4 }深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。 W' i# V; U A8 O; v" W, E
/ A1 v8 z) g' x" k怎么用SGD- import torch, B# A3 H& X8 ~4 z6 b' {
; ` W8 D. x/ a$ h- l, d: k8 k- from torch import nn
s$ z1 J/ @& D3 l+ a. u$ q
; p$ L3 [7 h- X' D* c3 e9 C+ F# S' j- from torch import optim
8 j! r) E, k; |\" v; W - 9 U6 Q: r; T# g# u& W
- 6 m1 K4 d( i& k* X- \9 g$ A
' u% x4 ?% t2 t: H1 q- data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
7 P. C/ `3 L- z, t, W: H- J - + Q$ ^5 r, S/ Z. W* C/ \
- target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)/ l4 y4 v. M6 V- h% u# y% C3 V3 K
- 7 q6 s) ?* m! m( @* B\" e6 z& k
- Z5 f0 d% ]$ e
# E3 M b/ _5 `) ~: J! c* _) ]- model = nn.Linear(2, 1)' N& S9 W2 Z. N) I: @9 M
- ) F j% f\" \# F8 }6 T9 u
- # B# G7 `: J; l# d7 V3 ~0 E3 I
- ' C' A) w& S% D/ R
- def train():' B9 w5 D6 |7 n6 a% x1 K7 i
: M: e) R/ n' A7 h\" I- opt = optim.SGD(params=model.parameters(), lr=0.1)
5 g; a9 z( @5 _- S* L+ p/ E. c! b
# b! ^; }1 H! r ~2 d- for iter in range(20):: Q: R q5 P% i r
, r: q& e4 t! V: w. Z- # 1) 消除之前的梯度(如果存在)
' z G3 P: q% B8 [
* |8 K) m. O\" H! a- opt.zero_grad()+ M$ p+ x# x ]8 ?0 U, `
7 R, d; u d8 {# S
+ k, d7 j# N- M! {
3 z$ s) u; o9 q Q& D- # 2) 预测
: N\" s k o1 e: ]3 c( M - 6 q! B! E2 l6 |% T0 L
- pred = model(data)
) [ h/ h3 s5 q% \# g - * c! C1 i$ P+ C
- ! Q c# Q% T+ E
# r1 J; a& Y- w! f6 G8 t- # 3) 计算损失
; a% u6 P }) s+ h1 A - , Z) r, v& w# [' a
- loss = ((pred - target)**2).sum()$ J) ]& F* G, H0 c
- + K Q' @9 ~! A, }
- # k/ f9 I4 E2 o' }! Q5 [
/ L( \; e$ h6 {- # 4) 指出那些导致损失的参数(损失回传)$ ?% f8 l* X8 ^; {3 I
- ' c, z& W1 N) X1 |. J( I( v: Z# V
- loss.backward() f. ]# U& b9 Y* v+ q- j6 s
# B! r+ R* n% ^2 h5 Q- for name, param in model.named_parameters():
: t' S% o X+ n. U; E - / P* E; J# o$ S$ r/ z4 }) e
- print(name, param.data, param.grad)
* H: a- p/ c0 c) ^/ a- N - - Z }4 ?5 v6 A# z; U$ |
- # 5) 更新参数
: i; I3 f& T4 @0 O
! G: w! B, s) M4 z1 B0 `2 H- opt.step()
! Y. I6 A+ f4 G& R: Z0 R7 `
% @2 n6 W/ d6 W9 Y
! o' b0 n! z: ?. m2 R! d Q- # I1 M. k+ S/ B6 ]/ @
- # 6) 打印进程4 L! m+ U$ n% f$ I9 @2 J
5 _! H# G3 ~8 M' d8 q k- print(loss.data)
: V, {, ^5 V; c4 K0 ^8 x - w c( h% j\" ~; K6 n2 j( @, w
% z! U! b; D) ~; u, N3 I- 0 P1 m% S* @! K: w0 J1 U4 k
- if __name__ == "__main__":
9 ]* |. {( b* q/ N. q
' p! A1 A3 W7 K- train()! c/ p3 U. h/ X6 o\" U- M( h! ]7 D
3 y; O9 A5 ^. s+ C7 Y m
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
1 ?. O3 z9 Z3 y: w: @
( }1 I9 P) j6 u: q. z/ V* x1 ?: V计算结果:- weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])\" _, z# |9 _2 w% r0 K+ T\" Q
- 1 ]7 f1 C+ Q0 M
- bias tensor([-0.2108]) tensor([-2.6971]) s# [9 K. D7 g& Q; l
- 3 ^) a9 | q& J. i\" g. {* X
- tensor(0.8531)) u5 p! h0 ^! I( d! l& f6 Z5 d
- ! A9 L. f1 O, |4 ]; f. J' F
- weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]]), m! q' L; h9 l, k$ L
( G& L3 f& r- {9 _: D& K: z- bias tensor([0.0589]) tensor([0.7416])
' d9 Z) I4 \8 W% O - 5 m, s: Z\" g, y+ r* r7 f
- tensor(0.2712)
2 R6 I0 M/ Q) Y; r - ) k1 J$ p- |/ b I! V+ f
- weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])
+ |! |% c8 K+ l1 f7 I
0 ^- Y3 f7 T5 Q) g- bias tensor([-0.0152]) tensor([-0.2023])
- e5 [6 p A; l2 v, t - # k& N. Q# k$ u6 S( n) K
- tensor(0.1529)
. @9 V+ S$ l5 }* w o: I
- @0 F2 h: d% i- weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])
: c$ n. q G# j8 B: y9 F3 ~1 o; i - $ C5 E4 @6 W9 b1 C\" X
- bias tensor([0.0050]) tensor([0.0566])) M. f& ~) c% T: ]
1 m; C6 N; T6 \0 Q- tensor(0.0963)
: z$ q/ Z) K) i0 ]% T
8 [' h4 s+ r' H T& L. r( i# j0 W' }- weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])
3 {* l8 m9 P' o) V9 u, m - \" m) M- h. W8 l2 i% P
- bias tensor([-0.0006]) tensor([-0.0146])
/ G% [8 u\" V1 m! ^. m9 E - ( O\" u2 G8 y' Q
- tensor(0.0615); x% W. A' ~4 C+ K
/ O3 R; ~# z3 y; w; M$ D9 @$ N- weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])
( z: m5 G1 o, F# S
, e6 U9 \# _! U; Y) {- bias tensor([0.0008]) tensor([0.0048])
2 m& C: X' g$ V# O. B! K+ X
% A |2 ?) ~4 l1 H. K/ x& r, l- tensor(0.0394)
6 G6 `\" H {+ i b* a2 b
9 K% H7 A2 W$ F; n- weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])
) ]6 [3 w0 h- c- J/ f; a
; H3 A. o9 s. J# Z- bias tensor([0.0003]) tensor([-0.0006])0 n2 e- S b1 o& w
- \" u+ v: o* j: v- T. i5 w+ u/ w
- tensor(0.0252)& O D$ |* U/ x* f( Q/ ]
- {, G\" x3 F2 t3 m5 y7 m: V- weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]])5 J0 f. j5 ]% V* l
- 4 x# e0 j, m; C\" ]0 b
- bias tensor([0.0004]) tensor([0.0008])
: { Y, s* M* v' g; @
6 v& \3 s, q8 U4 l+ L- tensor(0.0161)
3 }\" |5 u% j& H% V\" _& I5 N
3 q\" [( v, Z: E; J0 S- weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])+ z4 V, L; `* |! V
- $ n$ b% o4 x9 S# d0 T+ a9 B
- bias tensor([0.0003]) tensor([0.0003])
5 a\" ]. x [) `! i4 \ - 5 ^: b8 w W9 P/ ^
- tensor(0.0103)4 O6 u2 N( ~- K
9 k) E& C% z3 R: |$ I8 ?- weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])9 t! e+ X: z% y Q4 C3 i u3 Z5 c2 B
0 C! r5 _* G8 r( P c- bias tensor([0.0003]) tensor([0.0004])
* L1 x3 w; r8 W( T\" r - ! t. o$ z% G! [- K2 B/ L
- tensor(0.0066)
. u: l/ J0 ^* H# j6 X# q+ }
, ~# t: U' X$ D$ z1 O7 o- weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]])4 w, w) B. B% F- p
- ) B+ j# ]1 X3 q9 h\" T( C
- bias tensor([0.0003]) tensor([0.0003])
6 k9 j' o2 _0 X( `& y( ^\" r, q0 Y
0 r0 U. [3 `\" h: |8 Z; P! m: E- tensor(0.0042)
) M6 v+ t0 ?3 i
/ U* D, ` _9 F: n: m3 e# R( r- weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])4 c! ?& p) `' |6 I) O
- & n5 [$ P( \2 D2 t* P- z6 R4 y
- bias tensor([0.0002]) tensor([0.0003])
2 y% i5 [9 Y5 B# W - & S4 x+ L( T\" `! d
- tensor(0.0027)
, ~2 U6 }# z V q9 ^. x4 j - ' f( b2 f( g4 `% D& V
- weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]])+ D8 E l0 h* {; D6 f% o2 ?% B O
- + ?0 ^& @# V4 F+ s8 X
- bias tensor([0.0002]) tensor([0.0002])
e# l! G3 H1 g, C6 t
: P4 t5 `3 Q% N3 s8 x1 y! E- tensor(0.0017)1 [! `2 N. [ x& i1 b3 J5 o
& n9 K0 A! G, }) x& Z0 _- weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])
\" a1 n% ^\" H h2 b
5 [0 q- ]8 `7 }1 B+ n! e& S- bias tensor([0.0002]) tensor([0.0002])
# w2 H: M7 u' H* Z
8 w: t; L/ u- S: x& i- tensor(0.0011)
+ D7 M+ _/ P: j+ p& D7 H - * [7 h1 \$ _; Z4 a
- weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]])
, `3 A; r. F2 D- ~: G$ o: g - 5 {& _: y6 J& c2 k. j! t& \$ u$ M! J
- bias tensor([0.0001]) tensor([0.0002])( q) O; c5 D5 L2 H\" ^
! g6 l0 W3 v. s) T2 @- tensor(0.0007)3 O/ w' q' @7 q
/ [4 r5 m\" o! r8 W- weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])& `( A2 k# l# C3 \2 b
. R7 g0 L3 B$ F- v: J5 S) d, X- bias tensor([0.0001]) tensor([0.0002])1 R9 u( n; ?1 G\" @. B& y v
- ; A- D5 f1 p! Y! X5 e
- tensor(0.0005). W$ T( X( D: m- f8 ]4 a. E
t, `) C' \; y3 h! g- weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]]) Z8 V7 M( f n7 Q$ ~- U
- 8 ]2 u) a G( p% t2 H
- bias tensor([0.0001]) tensor([0.0001])
# z4 L2 X; y( }+ H, z8 E+ _
+ K/ I0 I. Z% z: [0 V\" {- tensor(0.0003)
% x6 F* N! P( i* T* N: V - , T: i) T6 u1 P& z7 @
- weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])
6 k2 \8 X/ b+ ?: I# y# }' @$ [
# y% p* w: ^# q) h- bias tensor([9.7973e-05]) tensor([0.0001])0 J) d- R0 I, b4 }5 z( k8 D0 O. _
, G5 N( e5 l' D& w/ L& {5 u- tensor(0.0002)
# d; g& w7 O( n% s
\" W; k/ ]7 ?3 _$ y% B0 @7 }- weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])# j9 ^6 S2 F% H5 y' \. a
8 V\" S9 I; w) R* B3 N- bias tensor([8.5674e-05]) tensor([0.0001])' e3 _% Z/ I2 _# v/ i1 f' K
- : Z# D2 L( c7 N }2 z5 j
- tensor(0.0001)
1 }8 G0 C4 M, a6 d - ; w8 P- x% x\" d0 r7 n, ^% R
- weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])' S/ ]) c! p* C4 t
8 G: k* G% ^% Z$ O L t6 v) {- bias tensor([7.4933e-05]) tensor([9.4233e-05])# E3 U n2 o9 T8 ]1 H: S
2 a* u( f8 y: _6 z2 q4 x' W) R- tensor(7.6120e-05)
复制代码 0 p& y* V& a* Q2 i/ u2 V+ z, f
|
zan
|