- 在线时间
- 482 小时
- 最后登录
- 2026-9-6
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7872 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2951
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1179
- 主题
- 1194
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
SGD是什么3 s2 Q+ x% [, V9 Y: E/ v% O
SGD是Stochastic Gradient Descent(随机梯度下降)的缩写,是深度学习中常用的优化算法之一。SGD是一种基于梯度的优化算法,用于更新深度神经网络的参数。它的基本思想是,在每一次迭代中,随机选择一个小批量的样本来计算损失函数的梯度,并用梯度来更新参数。这种随机性使得算法更具鲁棒性,能够避免陷入局部极小值,并且训练速度也会更快。# {) o* T, Q3 R
怎么理解梯度?9 N, m, Z8 u/ h$ K) m- Z
假设你在爬一座山,山顶是你的目标。你知道自己的位置和海拔高度,但是不知道山顶的具体位置和高度。你可以通过观察周围的地形来判断自己应该往哪个方向前进,并且你可以根据海拔高度的变化来判断自己是否接近山顶。
p' s$ `2 ]5 ~+ z: W( m6 s+ t$ o ~
在这个例子中,你就可以把自己看作是一个模型,而目标就是最小化海拔高度(损失函数)。你可以根据周围的地形(梯度)来判断自己应该往哪个方向前进,这就相当于使用梯度下降法来更新模型的参数(你的位置和海拔高度)。
* X' J' H+ D1 t4 {' a4 W4 I, F
1 [ I2 E2 h. h' w每次你前进一步,就相当于模型更新一次参数,然后重新计算海拔高度。如果你发现海拔高度变小了,就说明你走对了方向,可以继续往这个方向前进;如果海拔高度变大了,就说明你走错了方向,需要回到上一个位置重新计算梯度并选择一个新的方向前进。通过不断重复这个过程,最终你会到达山顶,也就是找到了最小化损失函数的参数。
0 \4 I- L8 E: J( T* X4 K6 `: r, V J: e0 T" j" u2 s H
为什么引入SGD
3 `# H, c4 \4 d8 C/ H深度神经网络通常有大量的参数需要学习,因此优化算法的效率和精度非常重要。传统的梯度下降算法需要计算全部样本的梯度,非常耗时,并且容易受到噪声的影响。随机梯度下降算法则可以使用一小部分样本来计算梯度,从而大大提高了训练速度和鲁棒性。此外,SGD还可以避免陷入局部极小值,使得训练结果更加准确。$ S0 L! i/ t$ C6 D8 j0 x: f
* j" Z5 h3 m3 N5 a
怎么用SGD- import torch* S8 M, Z' {) v- j\" n8 W, v
7 U3 ]4 Z0 m7 p- from torch import nn
6 _! n6 |0 H [$ e) s
# n& S& m2 {9 {& g8 [* b, a- from torch import optim
1 w! G+ l% b& w. {% X: q. R
1 u) \; j5 M6 a& P! x/ Z3 S
* {0 R8 b. Y: o7 _; o# \- 3 o: x, `& v7 M\" Z+ G/ P( Q
- data = torch.tensor([[0,0],[0,1],[1,0],[1,1.]], requires_grad=True)
\" B! M8 I4 Z3 w6 R* i$ ]# l2 h
, L' S; r/ c; D! g# n- target = torch.tensor([[0],[0],[1],[1.]], requires_grad=True)
\" _\" o! ?/ S) Y' H
( S7 i( ]0 w8 \3 b8 f. o
3 F, Q( K9 T( o4 M- + I& u2 s' {. |* t5 M1 ?
- model = nn.Linear(2, 1)4 ?$ e\" L- X* S4 R
/ k& X7 k# v: i s; J/ I( Z& l- + p' B# Z# U( k3 _
\" x U; W' e5 J1 g- def train():% m' Y0 N0 j% b- w
. S1 |2 o: _( W, y m( @6 j- opt = optim.SGD(params=model.parameters(), lr=0.1) u( J- m. {0 R0 ~' V
, n: |7 J j* | G. p- z- for iter in range(20):0 R- T\" I1 u V0 c( {2 ]7 [
- 9 F7 `0 U J/ k0 z' H5 v
- # 1) 消除之前的梯度(如果存在) d4 U$ K; m3 z
1 j\" Z6 q9 q0 W8 w7 l- opt.zero_grad()# N8 m\" @/ E- w
- : E4 W1 d\" d& ~! p9 k, H
+ y% z( t- Q5 I) m# m7 `, I ]' ^7 W
9 f: C$ \0 x. l8 K& q- # 2) 预测\" X; V) ~+ s0 |! K E
( q: T5 r/ W8 p( ~3 X- pred = model(data)
) d; k9 G\" J4 H. N - \" R9 d9 B6 T) [\" S3 j$ k3 R. a; s
- 3 v0 O- j\" F5 T: [
! u9 J3 F* d+ c- # 3) 计算损失
& @( I2 e& c0 ~8 j
# w& G P4 p) m- loss = ((pred - target)**2).sum()* b% k) Z% X; q2 y
+ V; ~( p+ X* k
2 b! E3 K! v5 ?
$ `2 C% J9 c\" V: e7 _- # 4) 指出那些导致损失的参数(损失回传)8 ]( E V+ t) T5 ^. T$ \+ |
$ N( v; @: D3 o) S6 |- loss.backward()
8 C8 r1 J8 \6 o8 c
\" J8 i# Z }; ^2 e9 |; S- for name, param in model.named_parameters():
9 d\" r1 H\" W\" n; e5 Y2 N$ f- s; j
. v; x2 C7 w' i( x. Z- print(name, param.data, param.grad)
! y: {! j7 d* n* c3 s - ' n2 i) d1 l# z4 e0 ?0 `
- # 5) 更新参数' Z9 h( l' s, m! a1 }! c
- * L: k' b/ g( ]4 J; G/ v2 i
- opt.step()
3 T$ T0 }# S7 |5 z
' c, ^3 i5 m3 ?$ f; c! g! h
$ ]# v) x) Z- q5 J3 p
% q# ?+ }1 K5 Q }, k0 G: V- # 6) 打印进程! ~+ Y, `+ g& p& z) e
7 h n* H8 }; w2 E- print(loss.data)4 g: U, `5 g; G) V( |' D
- 8 s! _- B' b6 \& D
- , k& Q7 ^4 R0 e1 n7 V\" d
- # S3 [- E5 @! J
- if __name__ == "__main__":6 r- ?% ?2 q2 g K4 q\" [
' k _, W q! X; _, N- train()8 q1 _. h, A, Q/ a
- ) [4 z4 S& T$ O5 H9 g( n
复制代码 param.data是参数的当前值,而param.grad是参数的梯度值。在进行反向传播计算时,每个参数都会被记录其梯度信息,以便在更新参数时使用。通过访问param.data和param.grad,可以查看参数当前的值和梯度信息。值得注意的是,param.grad在每次调用backward()后都会自动清空,因此如果需要保存梯度信息,应该在计算完梯度之后及时将其提取并保存到其他地方。% d0 g% {2 p+ w$ g
2 o; j2 y7 r- b4 q f
计算结果:- weight tensor([[0.4456, 0.3017]]) tensor([[-2.4574, -0.7452]])2 S$ }+ U. h+ r P; o9 ?; _
- : x+ {5 j1 J2 V D- \
- bias tensor([-0.2108]) tensor([-2.6971])
8 x, J\" t4 D+ F6 y& m
: B& f4 x2 D6 i- tensor(0.8531)& w8 `7 Z0 [1 E) Q
- \" `6 N- S: B2 c5 o( C+ a$ j0 P
- weight tensor([[0.6913, 0.3762]]) tensor([[-0.2466, 1.1232]])
! J+ N0 w7 N3 I L\" `) O
( C( ?/ B. J5 @( t4 \% f- bias tensor([0.0589]) tensor([0.7416])
, i# ~% p. s0 `& G( B- i: D - + T2 \, |% Y3 B, P% M) y
- tensor(0.2712)9 T& E. u! j5 f% c, W8 X5 V- X' `! ]( w
- 7 g4 D1 e, p3 `+ T% g# z
- weight tensor([[0.7160, 0.2639]]) tensor([[-0.6692, 0.4266]])
: h, `. \1 `9 U3 r( d/ I
- f# y* @0 C$ l7 B. M0 y( K- bias tensor([-0.0152]) tensor([-0.2023])
# [( `5 g: ?, c6 k+ h$ @' `
4 |4 B8 a/ p' T2 R# }3 j3 p% p- tensor(0.1529)& N, A& ]$ G/ V f( t
; o( U H) d. ]- p2 v2 G/ Y+ u- weight tensor([[0.7829, 0.2212]]) tensor([[-0.4059, 0.4707]])
7 F# O6 V$ o% g/ ^$ F6 X. b! u - ( R4 r! C6 r0 C `9 ?\" J* r
- bias tensor([0.0050]) tensor([0.0566])
& |+ u/ S5 a( i2 X, N
7 R\" w2 q: o6 z, b7 T Z- i- tensor(0.0963)# t8 p1 x& B9 i+ ^5 ^9 C( Y4 D
- ( x( g% ]\" V9 x# V) e( n' d3 P
- weight tensor([[0.8235, 0.1741]]) tensor([[-0.3603, 0.3410]])
\" G6 L7 x7 z2 H N7 Q j' g3 `8 g( j
1 Q% o6 X8 j& ~' i9 v& h$ j- bias tensor([-0.0006]) tensor([-0.0146])# O# E+ ^* m6 o2 T* u* t) F
- $ Y6 \0 l4 V# { S/ t4 B( F3 T
- tensor(0.0615). U x& a7 t! G( z& x _5 \
9 L7 ?; a; V3 \4 c3 N) X- weight tensor([[0.8595, 0.1400]]) tensor([[-0.2786, 0.2825]])- q% _& C! H5 v
- * e! l3 K/ S* E9 Y
- bias tensor([0.0008]) tensor([0.0048])6 C8 @; ? ` m, a1 Q( q8 D+ L
$ F8 c\" P7 z2 k! f6 m: \- tensor(0.0394)' Z! h1 @2 F+ q m1 N
- 5 T) P2 f: ^! i! p% }' D
- weight tensor([[0.8874, 0.1118]]) tensor([[-0.2256, 0.2233]])9 _( C, _7 d; i( `. _2 k: w5 O
* l- t+ n E+ g! w7 G0 @\" g- bias tensor([0.0003]) tensor([-0.0006]), u% y\" s$ U7 F7 K* f0 B b! B7 A. g/ ~
- . \5 I8 j: m8 [* X
- tensor(0.0252)8 U1 M- B G+ r( a
, f0 a6 C$ h& l+ ]$ a% G\" z* p\" [- weight tensor([[0.9099, 0.0895]]) tensor([[-0.1797, 0.1793]])- l+ D) G3 x1 A3 G6 \4 j: w
- u- z9 X7 n' j T# d: Y
- bias tensor([0.0004]) tensor([0.0008])
. k0 F/ x0 [' q\" p+ Q! `; q) D
7 S$ D, n4 {6 f' n7 v& g- tensor(0.0161)
+ y D+ B1 j7 M) { Z
2 T+ N% D) B6 e# ?- weight tensor([[0.9279, 0.0715]]) tensor([[-0.1440, 0.1432]])5 `7 m% w- ?/ s T' E$ C
$ _2 |( B z r- @5 y+ k% b- bias tensor([0.0003]) tensor([0.0003])
* }- r [\" q9 g ` - ; f$ s% Q3 q! y' [ l
- tensor(0.0103)% O! h4 L0 S4 c5 S# }3 m
* |. \ d$ _- _/ [- weight tensor([[0.9423, 0.0572]]) tensor([[-0.1152, 0.1146]])$ t& }. s, C# O\" n$ F/ r
- 5 B9 `* v4 T- g9 ?, p- c
- bias tensor([0.0003]) tensor([0.0004])% U- V. p8 i3 ]& }
0 f X3 D7 u1 c! ]- tensor(0.0066)
% V% u# H% a7 m h, l
, @* }3 A$ `9 C. |. b2 m0 m2 y! G- weight tensor([[0.9538, 0.0458]]) tensor([[-0.0922, 0.0917]])
5 w, p1 Z, K5 _% f/ f
. f0 D4 ?0 h& K3 Y- bias tensor([0.0003]) tensor([0.0003])8 v; h* A/ Y% J
- + n8 f3 C$ `4 i
- tensor(0.0042)
7 K7 E, c+ q: i2 `$ j! x
6 G- [$ C- ~! c\" m9 f' ~- weight tensor([[0.9630, 0.0366]]) tensor([[-0.0738, 0.0733]])% ?7 N/ _* `. s6 }
6 a( _1 Z: s+ e& z% z$ N {- bias tensor([0.0002]) tensor([0.0003])
6 h8 E [, z! [% B - . O* K, \9 O0 O- v7 i8 u
- tensor(0.0027)
+ k\" X1 K% a) Q
5 o' @! t8 x& g# e+ a- weight tensor([[0.9704, 0.0293]]) tensor([[-0.0590, 0.0586]])
$ ]( {\" d6 h0 w
% J9 i ?! k7 h\" D) b5 }+ L$ c- bias tensor([0.0002]) tensor([0.0002])& J$ @ v' M, W* ^8 f
- \. W% [% q& T4 ?& E: ?& A% v# z1 G- tensor(0.0017)' Y7 ^0 |$ M7 ?6 B* R2 _
- k! n5 k9 j3 f0 b% b/ c) p- weight tensor([[0.9763, 0.0234]]) tensor([[-0.0472, 0.0469]])
0 o* O\" ?- Y# R9 V - + @4 U' W8 A/ | Z5 ~
- bias tensor([0.0002]) tensor([0.0002])) x3 @' N! t2 N1 [' v3 j# G
- & a3 Z% Y\" t8 O0 r- E* t; F
- tensor(0.0011)! K7 b5 B4 E' P+ F6 z/ {
- % B8 C4 O* |$ a\" g3 X( S, W
- weight tensor([[0.9811, 0.0187]]) tensor([[-0.0378, 0.0375]]), j\" V- x1 m! ?. ]7 p X- j
w+ O% Y# ~- T2 E1 @% Q& n- bias tensor([0.0001]) tensor([0.0002]), R: T+ `9 ^% n8 I- O$ K
- \" U\" m1 _. ]: m! W2 N3 x
- tensor(0.0007)
0 M; T. g# S! I2 t% b+ b* G\" U - 3 D5 h( g: J! L
- weight tensor([[0.9848, 0.0150]]) tensor([[-0.0303, 0.0300]])- U Z; f4 ^, ]: D, L5 ~+ C
- 0 ?$ {* v% R* ~; q. x
- bias tensor([0.0001]) tensor([0.0002])
\" y! G8 N& Q4 ~/ P\" Q* P6 ?' w - : n9 W( |8 I( p6 p7 G# O
- tensor(0.0005)
: n7 H: K3 W; K+ M
; c4 g7 H2 T; T9 i1 M& n$ N- weight tensor([[0.9879, 0.0120]]) tensor([[-0.0242, 0.0240]])5 g, t. n* H1 [
- 5 c2 Z7 t9 k g+ J1 R\" X
- bias tensor([0.0001]) tensor([0.0001])
+ O' G( M; N5 n- n3 z\" q - 2 p8 S, y8 n1 I( o6 ?5 }
- tensor(0.0003)
4 J- |; D7 \& [$ @) W
2 o% c; S8 H9 }- weight tensor([[0.9903, 0.0096]]) tensor([[-0.0194, 0.0192]]). y# Y/ w3 R$ n3 x M M: [
- % z/ k( t. d8 I2 R% n
- bias tensor([9.7973e-05]) tensor([0.0001])\" [' @ ^- U7 }' v3 A
! f+ ?0 }2 X* w2 a- tensor(0.0002)9 O0 e# x# Z' C* d6 F% n
- ' \! m4 D8 r% u3 W x7 R3 ~! J4 w
- weight tensor([[0.9922, 0.0076]]) tensor([[-0.0155, 0.0153]])! ?, y% t2 N0 u
' [1 C) U9 e* H+ T: T+ v: a- bias tensor([8.5674e-05]) tensor([0.0001])+ {7 O# z. B) L& X4 y) `4 n
4 u) f% b8 ^0 Z, s# e9 Q6 A- tensor(0.0001)
$ K8 q- A6 y% [$ h- j$ ^4 {1 L
/ U3 g4 {9 a0 u8 G9 |& T4 L8 h- weight tensor([[0.9938, 0.0061]]) tensor([[-0.0124, 0.0123]])
7 T: m\" G; ?: h( D: ~% E\" W! w+ W - 9 @% }. e; E$ [& L. ^2 o, c( `/ D- m
- bias tensor([7.4933e-05]) tensor([9.4233e-05])
2 |9 k- B+ E. K# T: v- E8 j2 P$ h
( Z6 N8 H& B! x2 u `$ o; c- tensor(7.6120e-05)
复制代码
5 c4 A* [4 Z1 N8 ]0 c( r |
zan
|