[笔记]飞浆PaddlePaddle-百度架构师手把手带你零基础实践深度学习-21日学习打卡(Day 2)
(Credit: https://gitee.com/paddlepaddle/Paddle/raw/develop/doc/imgs/logo.png)
接着昨天的内容。
今天介绍了梯度下降的代码实现,以及随机梯度下降(SGD)的原理与实现。
有N个样本,m个特征,以均方误差损失函数为例:
L
=
1
2
N
∑
i
=
1
N
(
y
i
−
z
i
)
²
L = \frac{1}{2N}\sum_{i=1}^{N}{(y_i - z_i)²}
L=2N1i=1∑N(yi − zi)²其中
z
i
z_i
zi是网络对第
i
i
i个样本的预测
z
i
=
∑
j
x
i
j
⋅
w
j
+
b
z_i = \sum_{j}{x_i^j \cdot w_j + b}
zi=j∑xij⋅wj+b
梯度定义如下:
g
r
a
d
i
e
n
t
=
(
∂
L
∂
w
0
,
∂
L
∂
w
1
,
…
,
∂
L
∂
w
m
,
∂
L
∂
b
)
gradient = (\frac{\partial{L}}{\partial{w_0}}, \frac{\partial{L}}{\partial{w_1}}, \dots, \frac{\partial{L}}{\partial{w_m}},\frac{\partial{L}}{\partial{b}})
gradient=(∂w0∂L,∂w1∂L,…,∂wm∂L,∂b∂L)
数学计算如下:
∂
L
∂
w
j
=
1
N
∑
i
=
1
N
(
z
i
−
y
i
)
∂
z
i
∂
w
j
=
1
N
∑
i
=
1
N
(
z
i
−
y
i
)
x
i
j
∂
L
∂
b
=
1
N
∑
i
=
1
N
(
z
i
−
y
i
)
∂
z
i
∂
b
=
1
N
∑
i
=
1
N
(
z
i
−
y
i
)
\begin{aligned} \frac{\partial{L}}{\partial{w_j}} &= \frac{1}{N} \sum_{i=1}^{N}{(z_i - y_i) \frac{\partial{z_i}}{\partial{w_j}}}\\ &= \frac{1}{N} \sum_{i=1}^{N}{(z_i-y_i)x_i^j}\\ \frac{\partial{L}}{\partial{b}} &= \frac{1}{N} \sum_{i=1}^{N}{(z_i - y_i) \frac{\partial{z_i}}{\partial{b}}}\\ &= \frac{1}{N} \sum_{i=1}^{N}{(z_i - y_i)} \end{aligned}
∂wj∂L∂b∂L=N1i=1∑N(zi − yi)∂wj∂zi=N1i=1∑N(zi−yi)xij=N1i=1∑N(zi − yi)∂b∂zi=N1i=1∑N(zi − yi)
对于参数的更新,则使用
w
j
←
w
j
−
η
∂
L
∂
w
j
w_j \leftarrow w_j - \eta \frac{\partial{L}}{\partial{w_j}}
wj←wj − η∂wj∂L
梯度下降法是将所有样本梯度的贡献取平均,根据梯度更新参数。但是在面对海量样本时,每次都计算全部样本的梯度开销很大。而随机梯度下降法(SGD)则提供另一个思路,每次选取一部分数据代替争取,基于这部分数据来更新参数。
在SGD中,有如下概念
min_batch
: 每次迭代时抽取出来的一批数据batch_size
: 一个min_batch
所包含的样本数目epoch
: 按min_batch
逐次抽取样本,当将整个样本集遍历后,即完成了一轮的训练,称为一个epoch
第二部分介绍了飞桨平台
深度学习框架的优势:
- 节省编写大连底层代码的精力
- 省去了部署和适配环境的烦恼
飞桨支持动态图,也支持静态图
- 静态图模式:先编译后执行的方式。用户需预先定义完整的网络结构,在对网络结构进行编译优化后,才能执行或者计算结果。
- 动态图模式:解析式的执行方式。用户无需预先定义完整的网络结构,每写一行网络代码,即可同时获得计算结果。
# 定义飞桨动态图的工作环境 with fluid.dygraph.guard(): pass