在线时间 482 小时 最后登录 2026-9-6 注册时间 2023-7-11 听众数 4 收听数 0 能力 0 分 体力 7872 点 威望 0 点 阅读权限 255 积分 2951 相册 0 日志 0 记录 0 帖子 1179 主题 1194 精华 0 分享 0 好友 1
该用户从未签到
SGD是什么
6 p; L1 W5 p$ w$ Z SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。
" x, B$ v5 c7 r 怎么理解梯度?; Q! |( p( F& i8 b, s
假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。
9 C b, w `1 _0 a
7 e; Y( c R# P/ v7 G& G; a 在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。
; b# b% {6 t% |; H% U4 X $ Y3 r2 z8 z; q9 Y: E+ R( C
每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。
; \7 b- l( W# b' \0 e+ P
+ y- ^( I& q; {. E. k$ \2 Z 为什么引入SGD3 A a$ B7 c) U6 S
深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。+ l' Q! y1 k; x8 ]8 {
% P& H8 ]# Y6 [# O V 怎么用SGDimport torch+ A* ?6 `2 a: F
7 O; m1 e! j+ b+ F1 M9 n0 j from torch import nn
8 Y4 G0 h! _\" @* K4 p+ p ! x% ]6 Y& N; r8 H
from torch import optim
5 ~: x* T! J7 s5 L$ ]; j
3 s. O7 L: L! N1 D : X4 Q: K. n2 t& A& e
5 ~! G- i* ]* R' U+ ~& P
data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
2 @. n$ @4 q' t+ u\" K3 W& y: Z |
; [* m- V0 \; q\" G target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)
; `! |, M5 p2 D
4 L6 @2 V1 \0 t% x2 F ' q, E) r0 m5 J( c; I' t* t
% {9 p9 ^3 {. D; g- V% v9 [# N* i model = nn.Linear(2, 1)
U T+ G( ~ z9 f) { 6 g$ ~- Q9 u/ C \: z; t
6 h3 P9 _( K, i1 j8 s
- B! K6 ?0 A* u& |. f def train():
_% j' D2 h z' r7 O* {
6 L) ]+ }& t6 S8 l& t E: o opt = optim.SGD(params=model.parameters(), lr=0.1)1 ]9 `5 I% E7 V. d
4 A. m. R/ D5 l; u2 w0 I2 q6 r
for iter in range(20):
% E! q+ I; z5 u% F0 B, w\" [
) s/ e3 O% z: P/ s) d2 ? # 1) 消除之前的梯度(如果存在)
U6 g& ]& O+ @# ~2 Q3 Y/ H2 L; l, R6 ] # | b+ Q+ F1 j. M! R
opt.zero_grad(), D$ v- h; b) M. `9 J
- g# B9 X- n, \$ `( {& a
# k3 v' N2 i; U( _2 j : `( x5 i* @' z$ A9 ]6 s
# 2) 预测
3 v E\" f) n) Z. _! M2 @/ I
, I) l. [$ h% d8 K pred = model(data)5 D! M\" h9 m# q2 O2 t6 O1 X
0 b( i o8 z+ o\" g7 w
3 c# m& J& h- I, |# Q3 ~/ |% B2 w
$ d) N) i/ q, ^# G # 3) 计算损失; e\" W1 r; d) P- T
: D, n, Q6 a8 W3 W9 S4 I loss = ((pred - target)**2).sum()
* t2 X4 X\" T, _$ j5 m# ? ; O2 j1 j0 s: \5 h
) m6 h1 |% y Q( T1 {# @/ Q
/ E5 P; E, J, S3 ^% r( [: w' J$ _$ K& t # 4) 指出那些导致损失的参数(损失回传)8 k) m- A' u, N; h
8 L2 @3 Q3 I, I\" I
loss.backward()
1 F9 @, m; J& l* Z/ I8 W
& ?; ~8 q. O$ ` for name, param in model.named_parameters():
6 {; r5 h& h9 k( v; S . |2 Q, I1 g! T
print(name, param.data, param.grad)4 N$ a0 `- W8 t
4 b/ H$ T- G% ]
# 5) 更新参数
- @\" m8 n e2 D- p- }* h 8 }5 n2 q9 x- W$ k8 X+ k1 F0 O I
opt.step()
/ \( ?) L7 x9 x
\" e) W( X5 z7 r( }3 s
% [ R. X4 a) ?: Y% B9 J: l6 m
9 H1 r6 L1 S: a0 q9 F } # 6) 打印进程9 H( k+ q* u4 o! i4 w# R
\" F |7 h6 Q j% e
print(loss.data); d0 u# _2 z7 F! j3 ^# d9 \
& j& q1 I/ S! `9 P
; B& G. u0 `\" R1 }5 ~
/ @1 n1 \3 L3 x+ j, l9 b9 _/ K# o if __name__ == "__main__":3 j- d. j6 s; ~: m
\" M\" [- y; m\" N; U k) O
train()
5 h. i' x; K( t- y6 ~ 8 q% f6 D- p3 {1 Z5 g
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
, v9 a( V/ L0 z2 F+ T. a, C & b5 X/ d. {1 ` n% q6 A
计算结果:weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])
; V3 M+ ?; a/ h/ t. I
+ Q9 W) w/ W7 r5 p9 m. I! \' L bias tensor([-0.2108]) tensor([-2.6971])
7 K t% I A/ `* B, e# a
0 s2 l& D% p, n# {, O* [ tensor(0.8531)' |, \8 J, z' X) f+ T) h
\" b! ^! a# Q0 W3 W8 ?% X3 i$ k
weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])/ a. t, @: |) k7 _9 t! e
4 E9 A/ W* v1 M7 s! J3 J2 ^! s
bias tensor([0.0589]) tensor([0.7416])- R; K1 Z* }4 S
9 k; P s! y9 T\" l! _0 H4 q
tensor(0.2712)
* S' Z4 j) x) y0 U( F8 \ s$ e
; { I# z% _4 W. }, Q weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])
0 q/ e; A% q0 a# a\" t, \6 { - I3 j6 R+ O7 @+ D
bias tensor([-0.0152]) tensor([-0.2023])0 P/ p- E\" d& ~# ~7 v
# I$ I& ~# Z2 k+ w. h* p, @ tensor(0.1529)3 O: X\" ^; N' b# p* ?; k7 l
% Z) n& r: U7 L6 R2 z2 g7 {$ ? weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])2 g4 F9 \. o2 o0 b. ?
% b' ^1 Y& X6 d7 t+ I
bias tensor([0.0050]) tensor([0.0566])& X( {/ v0 T' t0 G
; [\" S: t5 _! l& _ l
tensor(0.0963)
9 k5 f i9 {4 Y + Z# r0 i& S$ H C$ Y! q$ V* Q% H
weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])
. z# D* L6 q0 V/ N8 j J1 F+ G
% j. K3 T8 I+ A$ ~; G G- j( t bias tensor([-0.0006]) tensor([-0.0146])9 O! D\" G l3 z$ H! g, U5 ]; g& @
0 Q! y& |# b; U! ^0 m- D
tensor(0.0615)
$ B9 a5 E1 j; T7 q1 A8 G) d2 Y/ @
: V: d. p O; c) n) a* j! j weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])/ N, f1 Q* e, h6 p! j
) ]5 D8 _/ q1 w. \ bias tensor([0.0008]) tensor([0.0048])
/ Y! ?+ ]8 k6 u 2 k$ ~/ y8 x2 M; l
tensor(0.0394)' u! _ Y/ i2 J& c
, l! J- u9 z. n+ L1 l weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])
7 ?& b t; r4 Y$ J9 A, B* R
. v; g+ }* a: Y1 _2 Q* i- h bias tensor([0.0003]) tensor([-0.0006])
& W6 r) C8 R* J% @
7 {3 z/ F& u& S tensor(0.0252)
, S. m- j8 b% q% j% Y ) g# Q4 ]; I6 q/ Z% M5 r
weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]]); N$ ^! ?. ~2 Y! D
- N+ N5 ^! G+ u: w0 F1 P. u7 ^' P3 i
bias tensor([0.0004]) tensor([0.0008])6 `) e. j: U8 W# {9 a H
$ s! s- o2 s1 X' x1 l Z tensor(0.0161)
; F/ B0 P: z) l# H ! Q1 e\" T; d- O' ^\" L
weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])
' O: m$ Q' i; I/ i5 U% @ : H8 J# ~/ J0 C) u+ J
bias tensor([0.0003]) tensor([0.0003])
& Z* `0 r5 {) r8 x) e1 A. ]7 a $ A$ c& Y& Z$ S
tensor(0.0103)! C6 s2 ~\" h\" K i& H U7 \
# g- G7 u5 P& t- J
weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])
8 [( }: X& P\" i' L# ^2 U9 t7 j : Q' l$ Y2 T9 V
bias tensor([0.0003]) tensor([0.0004]): Y8 }& G; J1 Q$ s) o5 K; k
s2 V% W* m& @& F: O1 S7 d
tensor(0.0066)* W, ^\" G\" \' C: S
7 v9 Z% S, p3 @/ A8 F q, F+ c1 V( e
weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]])
- `$ Z) {* @1 [; o3 |' Y
7 R, G2 `, ]: p2 W/ X bias tensor([0.0003]) tensor([0.0003]). s; P& ]0 @\" g' ?, V) Y- J8 p# J0 B
( a& F% r* ]5 R- ^0 I: c0 V2 X tensor(0.0042)
/ @% O3 a7 y\" F, h9 u& I# i : l. `# \/ D: J) r- M
weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])8 S; t# c3 M9 Q5 t
, I/ M! {& Q6 T9 m l bias tensor([0.0002]) tensor([0.0003])
5 P9 R\" V4 T h' h( g- Z& R 5 I; L% f6 r& @! {; f: u7 ^$ n
tensor(0.0027)2 E; W5 {0 l0 F5 k$ d9 ?\" {
$ n: ~6 `/ P& V( F g: ?- y
weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]])
! `: P% Z5 F' } E; f [+ ` 7 y( j8 q; u# c- e
bias tensor([0.0002]) tensor([0.0002])& {4 j5 l4 I3 b! k\" k2 m# c2 m
' a- Z! a4 \/ W( R tensor(0.0017)7 d\" A2 ^8 A! u* @/ z% i1 A
. x& I5 D/ P+ V( P
weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])# ]. G. `. d$ G5 [2 o( @3 Y* _
2 G\" R0 {3 v- {, v' T bias tensor([0.0002]) tensor([0.0002])8 i\" G0 J; D9 |; A, s
9 U. T! v) Q& v2 p/ L
tensor(0.0011)
, V! h5 O: _% \* n- _& E/ K ( d% t U5 O4 e\" E V# A. X
weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]])
% G: u% J( ^3 B
1 b2 @ H V( \/ i ? bias tensor([0.0001]) tensor([0.0002])
& D% C: d( Q& H\" Q3 @0 e' B! n 6 r) N( z7 t$ `: ]& _$ _, I! p$ K
tensor(0.0007)
$ _8 i$ _* _ h6 F. I 6 L\" G\" o& @0 E' f0 |
weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])\" c( \$ D& {3 Z/ Z* t$ G
4 J0 p& b3 k- i) \+ h9 [$ N bias tensor([0.0001]) tensor([0.0002])
3 p\" [/ A6 ?7 T/ G( y , k1 @4 A& ?, Z4 U$ V
tensor(0.0005) A7 ]\" Y2 o# Y, k5 K/ [
9 U1 T! `) r2 {$ k& }
weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])7 j8 B2 o: c9 \' Y* W( P1 D1 {& @
7 P4 J' p6 _4 N$ C1 q. ?
bias tensor([0.0001]) tensor([0.0001])% j1 E1 j7 {) i4 v% K9 g1 j
* X' V, `, V6 u7 B6 O3 f$ O
tensor(0.0003)
3 M2 ]' t0 \/ U8 L' |/ k: s
' k0 V4 P) q6 `' v\" R4 v weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])/ G) ~! J1 k& ^' Y# d
6 S* z* K% `. G bias tensor([9.7973e-05]) tensor([0.0001])
# T7 l7 j7 Z5 S0 y N& e) [ - ~/ s4 r8 i* ~\" N: Q3 S
tensor(0.0002)
) Q6 v- R1 F5 r* F% K! s * _* b& [# } U7 \5 W8 M
weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])
! g, g8 C# {; ?3 D: a0 _+ a
; v+ y; C6 P, E2 w bias tensor([8.5674e-05]) tensor([0.0001])
4 C- A8 `6 g* D: o0 P8 }# `3 A \" w\" x1 k) r\" \9 V: } }/ e) ]6 H
tensor(0.0001)6 t6 y9 I9 G5 o8 e
- R' A( F3 y. | weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])3 k) E9 q% R3 O8 a h* ~6 v1 \# d
1 t8 ~8 d4 F; g; d- F2 s5 r. }\" i bias tensor([7.4933e-05]) tensor([9.4233e-05])
2 U N: A$ Z2 d& `7 c
, ?1 A, ]; ^5 ]% M; o/ g: U! ~0 Q tensor(7.6120e-05) 复制代码
' Z; |$ ~8 z E+ N
zan