本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1u64y1i75ap=2&vd_source=c7bfc6ce0ea0cbe43aa288ba2713e56d
文档教程 https://zh-v2.d2l.ai/
本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录,内容不会特别严谨仅供参考。
1. 模型初始化
1.1 让训练更加稳定
- 目标:让梯度值在合理的范围内
例如[1e-6, 1e3]
- 将乘法变为加载:ResNet, LSTM
- 归一化:梯度归一化,梯度剪裁
- 合理的权重初始化和激活函数
1.2 让每层的方差是一个常数
- 将每层的输出和梯度都看做随机变量
- 让它们的均值和方差都保持一致
正向:
E [ h i t ] = 0 E[h_i^t]=0 E[hit]=0
V a r [ h i t ] = a Var[h_i^t]=a Var[hit]=a
反向
E [ d l d h i t ] = 0 E[\frac{\mathrm{d}l}{\mathrm{d}h_i^t}]=0 E[dhitdl]=0
V a r [ d l d h i t ] = b Var[\frac{\mathrm{d}l}{\mathrm{d}h_i^t}]=b Var[dhitdl]=b
a 和 b 均为常数 a和b均为常数 a和b均为常数
1.3 Xavier初始化
Xavier 初始化的基本思想是保持神经网络的输入和输出的方差相同,从而使每一层的输出在训练开始时具有相同的尺度。这样可以有效地防止梯度消失或爆炸问题,使得网络更容易训练。
Xavier使得
r
t
(
n
t
−
1
+
n
t
)
/
2
=
1
−
>
r
t
=
2
n
t
−
1
+
n
t
r_t(n_{t-1}+n_t)/2=1->r_t=\frac{2}{n_{t-1}+n_t}
rt(nt−1+nt)/2=1−>rt=nt−1+nt2
权重可以从均匀分布或正态分布中抽取:
- 如果权重从均匀分布中抽取:
w i j − u ( − 6 n t + n t − 1 , 6 n t + n t − 1 ) w_{ij}-u(-{\frac{\sqrt6}{\sqrt{n_t+n_{t-1}}}, \frac{\sqrt6}{\sqrt{n_t+n_{t-1}}}}) wij−u(−nt+nt−16,nt+nt−16) - 如果权重从正态分布中抽取
w i j − u ( 0 , 2 n t + n t − 1 ) w_{ij}-u(0, \frac {2}{n_t+n_{t-1}}) wij−u(0,nt+nt−12)
2 概率的基础知识
2.1 期望和方差
2.1.1 期望(均值)
定义:期望值(均值)是指一组数据的平均值,表示随机变量可能取值的中心位置。
数学定义:
对于离散随机变量
E
(
X
)
=
∑
i
x
i
P
(
X
=
x
i
)
E(X) = \sum_{i} x_i P(X = x_i)
E(X)=i∑xiP(X=xi)
2.1.2 方差
定义:方差是描述随机变量的离散程度的参数,表示数据点与均值之间的平均偏离程度的平方。
数学定义
对于随机变量X及其期望值
E
[
X
]
=
μ
E[X]=\mu
E[X]=μ方差
V
a
r
(
X
)
Var(X)
Var(X)定义为:
Var
(
X
)
=
E
[
(
X
−
μ
)
2
]
=
E
[
X
2
]
−
μ
2
\text{Var}(X) = E[(X - \mu)^2]=E[X^2]-\mu^2
Var(X)=E[(X−μ)2]=E[X2]−μ2
对于离散随机变量 X:
V
a
r
(
X
)
=
∑
i
(
x
i
−
μ
)
2
P
(
X
=
x
i
)
Var(X)=\sum_i(x_i-\mu)^2P(X=x_i)
Var(X)=i∑(xi−μ)2P(X=xi)
示例:
假设我们有一个离散随机变量 𝑋,它可以取以下三个值:1、2 和 3,并且它们的概率分别是0.2、0.5 和 0.3。我们想要计算这个随机变量的方差。
步骤1:计算期望
μ
=
1
∗
0.2
+
2
∗
0.5
+
3
∗
0.3
=
2.1
\mu=1*0.2+2*0.5+3*0.3=2.1
μ=1∗0.2+2∗0.5+3∗0.3=2.1
步骤2:计算每个取值与均值的差的平方
(
x
1
−
μ
)
2
=
(
1
−
2.1
)
2
=
1.21
(x_1-\mu)^2=(1-2.1)^2=1.21
(x1−μ)2=(1−2.1)2=1.21
(
x
2
−
μ
)
2
=
(
2
−
2.1
)
2
=
0.01
(x_2-\mu)^2=(2-2.1)^2=0.01
(x2−μ)2=(2−2.1)2=0.01
(
x
3
−
μ
)
2
=
(
3
−
2.1
)
2
=
0.81
(x_3-\mu)^2=(3-2.1)^2=0.81
(x3−μ)2=(3−2.1)2=0.81
步骤3:计算每个差的平方乘以相应的概率
(
x
1
−
μ
)
2
P
(
X
=
x
1
)
=
1.21
∗
0.2
=
0.242
(x_1-\mu)^2P(X=x_1)=1.21*0.2=0.242
(x1−μ)2P(X=x1)=1.21∗0.2=0.242
(
x
2
−
μ
)
2
P
(
X
=
x
2
)
=
0.01
∗
0.5
=
0.005
(x_2-\mu)^2P(X=x_2)=0.01*0.5=0.005
(x2−μ)2P(X=x2)=0.01∗0.5=0.005
(
x
3
−
μ
)
2
P
(
X
=
x
3
)
=
0.81
∗
0.3
=
0.243
(x_3-\mu)^2P(X=x_3)=0.81*0.3=0.243
(x3−μ)2P(X=x3)=0.81∗0.3=0.243
步骤 4:计算方差 Var(X)
V
a
r
(
X
)
=
0.242
+
0.005
+
0.243
=
0.49
Var(X)=0.242+0.005+0.243=0.49
Var(X)=0.242+0.005+0.243=0.49
2.2 正态分布
正态分布(Normal Distribution),也称为高斯分布(Gaussian Distribution),是概率论和统计学中最重要的连续分布之一。它描述了许多自然现象和社会现象的分布情况。
正态分布的定义
正态分布的概率密度函数(PDF)定义为:
f
(
x
)
=
1
2
π
μ
2
e
−
(
x
−
μ
)
2
2
σ
2
f(x)=\frac{1}{\sqrt{2\pi\mu^2}}e^-\frac{(x-\mu)^2}{2\sigma^2}
f(x)=2πμ21e−2σ2(x−μ)2
其中:
- μ 是均值,表示分布的中心位置。
- σ 是标准差,表示分布的宽度。标准差的平方 σ 2 \sigma^2 σ2为方差。
- x 是随机变量的取值。
正态分布的性质
- 对称性:正态分布关于均值 𝜇
- 钟形曲线:其概率密度函数呈钟形曲线。
- 均值、众数和中位数相等:对于正态分布,这三个统计量是相等的。
- 68-95-99.7 规则:在正态分布中,大约68%的数据位于均值 𝜇加减一个标准差 𝜎之间,大约95%的数据位于均值 𝜇加减两个标准差 𝜎之间,大约99.7%的数据位于均值 𝜇加减三个标准差 𝜎之间。
2.3 均匀分布
均匀分布(Uniform Distribution)是一种简单但重要的概率分布,描述了在某个范围内每个值出现的概率相等的情况。
均匀分布的定义
均匀分布分为离散均匀分布和连续均匀分布两种。
连续均匀分布
对于连续均匀分布,若随机变量 𝑋在区间 [𝑎,𝑏]上均匀分布,其概率密度函数(PDF)定义为:
{
1
b
−
a
i
f
a
≤
x
≤
b
0
o
t
h
e
r
w
i
s
e
\left\{ \begin{aligned} \frac{1}{b-a}\ if\ a≤x≤b \\ 0\ otherwise \end{aligned} \right.
⎩
⎨
⎧b−a1 if a≤x≤b0 otherwise
其中:
- 𝑎和 𝑏是区间的下限和上限。
- 1 b − a \frac{1}{b-a} b−a1是在区间 [𝑎,𝑏]上每个值出现的概率密度。
离散均匀分布
对于离散均匀分布,若随机变量 𝑋只能取有限个值 {
x
1
x_1
x1,
x
2
x_2
x2,…
x
n
x_n
xn},且这些值出现的概率相等,则每个值的概率为:
P
(
X
=
X
i
)
=
1
n
P(X=X_i)=\frac 1n
P(X=Xi)=n1
其中:
- 𝑛是可能取值的总个数。
均匀分布的性质
对称性:均匀分布关于区间的中点对称。
均值和方差:
对于连续均匀分布 [𝑎,𝑏]均值和方差分别为:
μ
=
a
+
b
2
\mu=\frac {a+b}{2}
μ=2a+b
σ
2
=
(
b
−
a
)
2
12
\sigma^2=\frac{(b-a)^2}{12}
σ2=12(b−a)2
对于离散均匀分布{
x
1
x_1
x1,
x
2
x_2
x2,…
x
n
x_n
xn},均值和方差分别为:
μ
=
1
n
∑
i
=
1
n
(
x
i
−
μ
)
2
\mu=\frac 1n\sum_{i=1}^n(x_i-\mu)^2
μ=n1i=1∑n(xi−μ)2
import numpy as np
import matplotlib.pyplot as plt
# 参数
a = 2
b = 8
# 创建数据点
x = np.linspace(0, 10, 1000)
y = np.where((x >= a) & (x <= b), 1/(b - a), 0)
# 绘制均匀分布曲线
plt.plot(x, y, label='Uniform Distribution', color='blue')
plt.fill_between(x, y, where=(x >= a) & (x <= b), color='blue', alpha=0.3)
plt.xlabel('x')
plt.ylabel('Probability Density')
plt.title('Uniform Distribution on [2, 8]')
plt.grid(True)
plt.show()