- 在线时间
- 477 小时
- 最后登录
- 2025-12-17
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7772 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2916
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1169
- 主题
- 1184
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
SGD是什么
d |: H4 E- R# [# e) v2 }SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。3 O8 i- w& B _* g; }- w
怎么理解梯度?
& r; l+ }' u N# e- }+ B假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。
0 _' o6 N0 O+ }0 t" e1 t
6 S6 `6 u0 n* H& D2 ~/ V4 d在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。7 {4 ~2 x& W+ ?7 B: v
/ G1 d% M: D$ y9 ~( x p- p9 t每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。) X& |7 b3 Z' _% i4 T6 S
( `$ ^) l$ z7 N9 Z8 w5 ~" l( V/ J+ q, |
为什么引入SGD
7 F- j' x0 M! |% {深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。1 a N+ {- p( J7 g4 n7 J6 i' C( u
, X& m' p$ D, V" E怎么用SGD- import torch
' N, z9 s7 ]2 u8 O' n5 _+ R - ! U4 Z% g) V% V# w/ v
- from torch import nn
7 e0 m\" n. p. S% h/ U9 Y\" O - 6 G! p- l8 O. z\" ^0 m% G/ `- |
- from torch import optim' v$ W; M+ G2 [- N: x
* I. O* j$ ~9 O
- Y& Y k% V& U
) G- W% W: H2 g- data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
j9 ~8 I# G9 t5 d; @/ D+ G2 M5 W
/ d7 R: ^/ k& m2 U; Z) F% B0 @- target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)3 E5 J/ Z6 D& K6 d* L7 q; A
% S @3 `, x' u
$ T+ @' ~+ q2 ]. p1 d! ]; U
+ \0 ~# c9 x. `; S- model = nn.Linear(2, 1)
+ I) g4 q: t) A5 n) Q' B - & g7 `8 p! J% `- R, ?/ S @
- u9 n! W% h2 G7 e\" n$ w
c! A: e/ f- b. s R' o- def train():% X6 _ a/ K1 m- D7 G$ G
- 7 F! O! W- j& l7 y\" ~9 J
- opt = optim.SGD(params=model.parameters(), lr=0.1)
8 f/ d/ p( f6 @+ ^9 d
. p! p* |% W/ ~3 ?2 Z4 q3 f5 T/ m3 J- for iter in range(20):9 E3 e( m. x5 H. F' S$ x1 V) n1 x
- : e+ r4 l! p9 m2 m6 ^3 ~
- # 1) 消除之前的梯度(如果存在)
: c% j0 v; p& a7 }
. j0 x: K, B* ]- E- opt.zero_grad()
u ^+ V( h+ i |: i
3 [1 \1 {1 A& _( h
0 U X% m3 X; y8 i2 [
. s: F3 g: {2 E2 B8 s- # 2) 预测
9 J' H5 p9 ~/ j8 n- G9 _+ S
* j& t, Y' P$ l: I- pred = model(data): ^! r C# _# \# e+ D
, f; Z5 J) o% g0 q3 U( L
/ h; p( f0 d! p! ^. R
& r8 ^) C$ h: L2 I% y9 f- # 3) 计算损失$ D0 X5 R! r/ U/ i* k1 D' J! J
- 6 B3 B& k\" [( N$ @
- loss = ((pred - target)**2).sum()
- h; E4 ^0 g2 S( y' o9 E6 q# u - + Y5 p6 C) M. d# S* }& ^$ O, t
- 2 |9 Q! S5 ?) }4 E& v) x0 Y
- 1 k* S: I8 o& U; h6 W, g
- # 4) 指出那些导致损失的参数(损失回传)) b7 c7 a\" D; J, T\" r6 W! R
- % [' N7 k6 T/ R p, m
- loss.backward()
$ O' W\" X! `% t% b# C6 Y. B. x - $ o$ T; g0 F7 o. i# _- G
- for name, param in model.named_parameters():
- s* h9 m5 O7 f3 l2 ~ - 1 |\" p7 J: L$ V# T% g
- print(name, param.data, param.grad)2 e, i3 d+ o7 Y d- ~
' O* g7 U$ u, c/ A- # 5) 更新参数
& }3 ]2 ~8 L! J* h& a4 } N: ^' } - # P' @1 }0 x5 z r
- opt.step()
$ l1 a/ f1 O) y# P8 k8 G3 w - - A+ e; |/ z/ c k! Y* |
; @4 L, t) Y6 ]0 V
9 \: I( D$ t# x7 O9 T- # 6) 打印进程( _8 Y; \3 Z* b
- $ ^ `: V N' V1 n\" z
- print(loss.data)
\" V0 \6 f$ ]! ^. I4 X - 7 ?: L0 g7 z5 h! a, ?* J
- 0 v2 ]3 M2 D/ ]8 Z1 y; V
2 a) j3 w' l9 r. l- if __name__ == "__main__":
) v$ w9 ?9 r6 D( x% I
\" s% I! q+ g9 t& y\" O- train()
& C' r B' ?* @* d
9 Y% {2 Q, C2 @& x2 L\" q7 K
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。
) P1 U7 O y5 Y( u( U q# O2 I) S
9 s6 V6 t% Y2 }$ {计算结果:- weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])1 H: Q% [, ?; N2 d: A- A6 N+ Y; l7 [
* x1 `1 H$ P7 i* \$ x2 ]/ H) N- bias tensor([-0.2108]) tensor([-2.6971])
3 k$ O( y m X
! g6 i! `+ q3 j8 \( z# d- tensor(0.8531)
. ]1 x8 C8 t\" W\" }5 i - . C% l. ?! B) `) V) m, x
- weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])
, g* \9 b X' W - ' v+ \# s) H9 M: l4 F
- bias tensor([0.0589]) tensor([0.7416]): l+ S5 @ U: Y% M, S. e9 n
, {3 n i; m% v$ _- tensor(0.2712)
7 L\" c. X# d/ K0 ^. E1 ^$ g - ~2 i+ B4 p2 J; U
- weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])
4 R1 j- ~# r# `9 ~, P; ^ m+ X - % M2 C! x7 @/ s8 B+ D8 z m\" G
- bias tensor([-0.0152]) tensor([-0.2023])2 f& G4 G* X, A7 n. l `' C& E; H
) C+ e# v' w! F. O- tensor(0.1529)2 k* V% M* R8 N# `* X/ c- m9 k' _
- 5 ?9 f( c; T* d- ^' W: n4 R+ w2 @
- weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])3 M( H( E. Z, N, R( `
- : G9 q) [1 g3 [) m* R
- bias tensor([0.0050]) tensor([0.0566])
) s. l3 M. b/ T/ k - ) D4 U* z* W0 K
- tensor(0.0963)) b' a4 m# ?. q, V! Y4 R8 G1 d
8 N- T3 [ P; A) v/ G& K\" T- weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])
9 T K# g\" S\" V0 n8 M - - q$ z' e& | w
- bias tensor([-0.0006]) tensor([-0.0146])
~6 y, H4 L2 y: j# m& o* Y - & G0 p2 ~ ~4 S6 @
- tensor(0.0615)
/ _# t M\" E6 [# i1 a( F
- k, y; @) Q+ A\" B- weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])- N! g x2 m0 I% Z3 t! C1 I
- / \( V. a6 @/ E3 I) Y5 d1 K. I
- bias tensor([0.0008]) tensor([0.0048])
* K7 `4 Y) Y: m - ' c+ c0 c( x% X/ R- g
- tensor(0.0394)( T8 g7 Z. G6 B' g/ m1 d
- + p, n. O- [: g2 p; y
- weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])
l8 B2 k) u4 p S - 7 ~2 }\" g0 ^6 ~
- bias tensor([0.0003]) tensor([-0.0006])
3 ~& z1 n1 w( n; K\" `) T
2 q% q- x) O* K5 H- tensor(0.0252)7 |1 D, {$ u2 c! U+ ], W# ?8 r) h
- 1 V3 Y; K/ [, Y1 m0 o, D
- weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]]). {' ^9 \% A1 K) Z/ w
; x& [1 N* ?' n9 _& w% o {# y- bias tensor([0.0004]) tensor([0.0008])$ n' S D6 f8 c2 }7 A0 u6 i
\" O7 b; s1 N; J\" f- tensor(0.0161); @1 o! A) n) J3 N
& x+ Z4 j) i! f8 d: g: ~3 |- weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])
$ P0 a T) l) h+ L2 e% X$ V C - . @( ]7 w1 |; @$ Y: m- B- h
- bias tensor([0.0003]) tensor([0.0003]). y6 B( z+ h5 x# G' w2 H4 y2 q
0 H3 \8 X0 T; U: s7 L\" M* S5 W5 {- tensor(0.0103)( i. m% E* z2 W
/ d O\" j& v/ ^5 \) X* h+ q- weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])6 z; c& c4 G5 a; s( \
+ a1 d# v2 l+ h$ h0 v' U\" U- bias tensor([0.0003]) tensor([0.0004])
% ]$ l& {2 P\" u& \, w) s- h8 g
. O4 z' R% n+ d# {- tensor(0.0066)% [8 c- Q L6 K( o- t0 V) A$ g9 b
- ! i0 w4 h, @# g: C\" z. j
- weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]])+ A9 E, \3 ~3 N, j- B/ r\" e$ o
8 R; U w0 m4 o; \; X' }2 Z- bias tensor([0.0003]) tensor([0.0003])\" v @% M/ a Y! H* }8 o
3 X$ T0 N2 U& k\" G I g' U# y- tensor(0.0042)
1 F; Q/ q( w+ J h$ w6 p
9 z' n3 U+ U% S5 M- weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])
: F* W5 G* H. {
# r v4 C' M9 s9 n8 _2 Q% r% S5 s6 L- bias tensor([0.0002]) tensor([0.0003])
& n! J9 S2 I+ S7 m& L- O% Z
& _) m6 z v- x5 \6 o( m5 z- tensor(0.0027)
4 j\" n/ Y/ X5 G9 u4 Z4 _; W# h - u9 E+ g' B% C# K* v8 u' |
- weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]]): {* b$ F6 t! S5 ~\" v/ ?4 Z; z
- 3 s- q+ l- ?% ]
- bias tensor([0.0002]) tensor([0.0002])
7 g- U* {1 Y% f: n8 V5 _- ^
& Z$ H; I\" X# s* z- tensor(0.0017)2 f8 G6 t7 W$ r) B: d# \
& g$ h( }1 e& G; a\" a. H3 i- weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])
+ Y. a7 T* ~, S2 V* } - - t$ u4 }7 O8 I l6 {- x/ J
- bias tensor([0.0002]) tensor([0.0002])/ L) @6 Y W- Q# [
- / x2 D' I+ |* H& F
- tensor(0.0011)
: s X\" P% Y' g: b' d! n, M - 2 j/ p/ P: I3 n, l5 b5 q6 U: D
- weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]])
0 A0 k7 W% Y2 Z6 `& K! _! C - 7 d\" d\" m9 J3 f2 }* G+ j* w
- bias tensor([0.0001]) tensor([0.0002])2 z t/ n- K5 C9 I
- ' S, |' d, D- s# B% ?. v1 D
- tensor(0.0007)! e* p% ~4 a; L3 q
- $ J p8 H+ M; Y# c3 f
- weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])
/ ]0 k4 \. o9 X1 Y
* I0 l/ S7 y3 P* l3 X# h- bias tensor([0.0001]) tensor([0.0002]); }& z8 i4 A3 p' ~! @. B! n2 t
+ N+ D/ m4 r/ Q4 ]+ z- tensor(0.0005)
+ f# X, g* E5 F% { - ! K9 H; W, k$ S( N6 t
- weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])4 y4 G O% U, v7 [: H
) S r7 b$ l8 H( ~- k- bias tensor([0.0001]) tensor([0.0001])
2 i# j, N6 k' T2 t0 f& A0 c/ T
, N1 M% K( }% Y$ U0 s% n! g- tensor(0.0003)
3 H. d9 L% ~$ }1 u2 w3 l - 4 ?) \( S6 N( i4 g
- weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]])\" N8 |$ i+ I9 D- _) w3 m$ N) K0 x
. C5 b8 {5 d1 k* `- bias tensor([9.7973e-05]) tensor([0.0001])3 @2 E2 }; i# O- X+ d1 w. b
- 0 b' F% s2 }7 f7 A9 I' D
- tensor(0.0002)
7 F, u- x\" ^8 C* k9 \
' M: I9 j9 @' f4 r. T- weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])/ s/ ?0 E# v; H* T& u* R P0 T
4 n, B2 h( N9 S2 K2 ]' n& ?9 }8 f. G- bias tensor([8.5674e-05]) tensor([0.0001])
8 i0 o& L% |6 O3 l7 b
- C2 U( J1 ~# n- v4 @* F! d8 U- ~- tensor(0.0001): D- m2 f- A+ {4 @
- - r0 g+ S8 u! L8 ` ]/ Z
- weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])' ?! h( s: W A- P+ p7 Q* k
: h$ Q# U$ s6 r) e- bias tensor([7.4933e-05]) tensor([9.4233e-05])
/ e' T& [8 Y6 H
0 Y5 X$ B7 Z: d$ Q& @4 {- tensor(7.6120e-05)
复制代码
9 E" ]& B' c; q+ m1 {; G |
zan
|