激活函数
sigmoid : σ ( x ) = 1 / ( 1 + e − x ) \sigma(x)=1/(1+e^{-x}) σ(x)=1/(1+e−x)
特点:
- 将输入的值压缩到 [ 0 , 1 ] [0,1] [0,1]之间
- 通常很流行,因为它有一个很好的解释,可以表示一个神经元的饱和“放电率”
存在的问题:
-
会使梯度消失,当输入 x x x为很大的正数或很小的负数时,他们位于sigmoid函数的平滑区域中,梯度接近于0,只有当输入 x x x在0附近的时候,梯度反向传播效果才会好。
-
输出不是零中心函数。
由此带来的问题是当前梯度要么全是正数,要么全是负数。假如KaTeX parse error: Expected group after '_' at position 7: f(\sum_̲\limits{i}\omeg…对 ω \omega ω的梯度是 x x x,如果输入的 x x x全为正,则梯度都是正的,如下图,梯度更新方向只能是绿色部分的两个方向,假设真实下降方向是蓝色箭头方向,而实际是以红色箭头所形成的锯齿形状进行更新,速度会很慢。
tanh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=ex+e−xex−e−x
特点:
- 将输入的值压缩到 [ − 1 , 1 ] [-1,1] [−1,1]之间
- 是以零为中心的函数
- 仍然会出现梯度消失的情况
ReLU:
f
(
x
)
=
max
(
0
,
x
)
f(x)=\max(0,x)
f(x)=max(0,x)![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/04e93988d495d146dae35ab0f486c406.png)
特点:
- 计算更高效,在实际中比sigmoid和tanh更快
- 在正的区域是不饱和的
- 输出不是零中心
Leaky ReLU: f ( x ) = max ( 0.01 x , x ) f(x)=\max(0.01x,x) f(x)=max(0.01x,x)
特点:
- 计算依然高效,在实际中比sigmoid和tanh快
- 无论在正的区域还是负区域都是不饱和的
Parametric Rectifier (PReLU): f ( x ) = max ( α x , x ) f(x)=\max(\alpha x,x) f(x)=max(αx,x), α \alpha α可通过学习得到。
Exponential Linear Units (ELU,指数线性单元):
f
(
x
)
=
{
x
,
x
>
0
α
(
exp
(
x
)
−
1
)
,
x
≤
0.
f(x)=\left\{ \begin{aligned} &x , & x > 0\\ &\alpha (\exp(x)-1) , & x \leq 0. \end{aligned} \right.
f(x)={x,α(exp(x)−1),x>0x≤0.
特点:
- 有ReLU的所有优点
- 输出均值和0比较接近
- 负空间的饱和状态可于Leaky ReLU相比,对噪声具有一定的鲁棒性
Maxout : max ( ω 1 T x + b 1 , ω 2 T x + b 2 ) \max(\omega_1^Tx+b_1,\omega_2^Tx+b_2) max(ω1Tx+b1,ω2Tx+b2)
特点:
- 是ReLU和Leaky ReLU的泛化
- 不会饱和,也就是梯度不会消失
- 参数数量会加倍
数据预处理
- 零均值化:对数据中每个特征,用原始数据减去平均值。图像处理时可以对不同通道进行零均值化。
- 归一化:对数据维进行归一化,使它们具有近似相同的尺度。只有当你有理由相信不同的输入特征有不同的尺度(或单位)时,应用这种预处理才有意义。对于图像,像素的相对比例已经近似相等(范围从0到255),因此没有必要执行这个额外的预处理步骤。
- 在上述两个处理之后,可以用PCA进行降维。
- 白化:白化操作以特征基中的数据为基础,将每个维数除以特征值对尺度进行归一化。这种转换的几何解释是,如果输入数据是一个多变量的高斯函数,那么白的数据将是一个具有零均值和单位协方差矩阵的高斯函数。
卷积网络中,一般只进行零均值化和归一化。任何预处理统计数据(例如数据平均值)必须仅对训练数据进行计算,然后应用于验证或测试数据。例如,计算平均值并从整个数据集的每个图像中减去它,然后将数据分割成训练/val/测试分割将是一个错误。相反,平均值必须只对训练数据进行计算,然后从所有分割(训练/验证/测试)中减去。
权重初始化
-
一个听起来合理的想法是将所有初始权重设置为零,这是一个错误,因为如果网络中的每个神经元都计算相同的输出,那么它们在反向传播时也会计算相同的梯度,并进行完全相同的参数更新。换句话说,如果神经元的权值被初始化为相同,那么神经元之间就不存在不对称性。
-
将每个神经元的权向量初始化为多维高斯分布的随机采样向量,使神经元在输入空间中指向随机方向。也可以使用来自均匀分布的小数值,但在实践中这对最终性能的影响似乎相对较小。
- 会有的问题:数字越小效果越好并不一定。例如,一个权值非常小的神经网络层在反向传播时会使其数据计算的梯度非常小(因为该梯度与权值成比例)。这将极大地减少通过网络向后流动的“梯度信号”,因此深度网络中,所有激活元趋于0,梯度也会都是0,因此网络就饱和了,不会进行学习。
-
**Xavier Initialization:**一个随机初始化的神经元的输出分布有随输入数量增加而增加的方差。结果表明,我们可以通过将每个神经元的权向量乘以其输入数量的平方根,将其输出的方差标准化为1。
W = np.random.randn(n)/np.sqrt(n)
-
推导:
Var ( s ) = Var ( ∑ i n w i x i ) = ∑ i n Var ( w i x i ) = ∑ i n E ( x i 2 ) E ( w i 2 ) − E ( x i ) 2 E ( w i ) 2 = ∑ i n ( E ( x i 2 ) − E ( x i ) 2 ) ( E ( w i 2 ) − E ( w i ) 2 ) = ∑ i n Var ( x i ) Var ( w i ) = ( n Var ( w ) ) Var ( x ) \begin{aligned} \operatorname{Var}(s) &=\operatorname{Var}\left(\sum_{i}^{n} w_{i} x_{i}\right) \\ &=\sum_{i}^{n} \operatorname{Var}\left(w_{i} x_{i}\right) =\sum_{i}^{n}E(x_i^{2}) E\left(w_i^{2}\right)-E\left(x_i\right)^{2}E\left(w_i\right)^{2} \\ &=\sum_{i}^{n}(E(x_i^{2})-E\left(x_i\right)^{2})(E(w_i^{2})-E\left(w_i\right)^{2})\\ &=\sum_{i}^{n} \operatorname{Var}\left(x_{i}\right) \operatorname{Var}\left(w_{i}\right) =(n \operatorname{Var}(w)) \operatorname{Var}(x) \end{aligned} Var(s)=Var(i∑nwixi)=i∑nVar(wixi)=i∑nE(xi2)E(wi2)−E(xi)2E(wi)2=i∑n(E(xi2)−E(xi)2)(E(wi2)−E(wi)2)=i∑nVar(xi)Var(wi)=(nVar(w))Var(x)
因为 E ( x i ) = 0 , E ( w i ) = 0 E(x_i)=0,E(w_i)=0 E(xi)=0,E(wi)=0, w i , x i w_i,x_i wi,xi独立同分布。若 Var ( w ) = 1 / n \operatorname{Var}(w)=1/n Var(w)=1/n,则 Var ( s ) = Var ( x ) \operatorname{Var}(s)=\operatorname{Var}(x) Var(s)=Var(x)
缺点:当使用ReLU时,输入方差和输出方差相等的条件会遭到破坏
-
-
He Initialization:
W = np.random.randn(n)/np.sqrt(2/n)
,解决了上面使用ReLU会出现的问题
实际中一般使用ReLU和He初始化。
偏差初始化
初始化偏差为零是可能的,也是常见的,因为不对称的中断是由权值中的小随机数提供的。对于非线性的ReLU,有些人喜欢对所有偏差使用0.01这样的小的恒定值,因为这确保了所有ReLU单元在一开始就被触发,因此获得并传播一些梯度。然而,目前还不清楚这是否提供了一致的改进(事实上,一些结果似乎表明这一性能更差),更常见的是简单地使用0偏差初始化。
批量归一化
在训练开始时显式地强制整个网络的激活采用单位高斯分布来适当初始化神经网络。在实现中,应用这项技术通常相当于在完全连接层(或卷积层,我们很快就会看到)之后和非线性之前插入BatchNorm层。在实践中,使用批处理归一化的网络对糟糕的初始化具有更强的鲁棒性。此外,批处理归一化可以解释为在网络的每一层进行预处理,但是以可微分的方式集成到网络本身。
目的:在高斯范围内保持激活,让每一个维度都是单位高斯分布。
训练阶段步骤:
- 输入batch数据
- 计算均值和方差,归一化数据
- 乘以缩放因子 α \alpha α,加上平移因子 β \beta β
最终可能学习出的是恒等映射,网络会根据需求学习分布。
**好处:**改善网络梯度流,可以让网络在更广的学习率和不同的初始化工作,允许使用更多的激活函数,网络训练更容易,加速训练收敛速度,有正则化效果。
测试阶段 μ i \mu_i μi和 σ j 2 \sigma_j^2 σj2使用的是训练阶段求出的值。
卷积网络的批量归一化:
-
全连接层的归一化:输入 x : N × D x:N\times D x:N×D
μ , σ : 1 × D \mu,\sigma:1\times D μ,σ:1×D
γ , β : 1 × D \gamma,\beta:1\times D γ,β:1×D
y = γ ( x − μ ) / σ + β y=\gamma(x-\mu)/\sigma+\beta y=γ(x−μ)/σ+β
-
卷积层的归一化:输入 x : N × C × H × W x:N\times C\times H\times W x:N×C×H×W
μ , σ : 1 × C × 1 × 1 \mu,\sigma:1\times C\times 1\times 1 μ,σ:1×C×1×1
γ , β : 1 × C × 1 × 1 \gamma,\beta:1\times C\times 1\times 1 γ,β:1×C×1×1
y = γ ( x − μ ) / σ + β y=\gamma(x-\mu)/\sigma+\beta y=γ(x−μ)/σ+β
网络学习步骤
- 数据处理
- 选择网络结构
- 进行前向传播检查loss是否合理(不包含正则项),在CIFAR-10中10类的时候损失大概2.3左右。
- 加上正则项损失上升
- 不加正则损失,使用小的数据集测试,看损失能否为0
- 使用全部数据,小的正则化,尝试不同学习速率,若损失不下降或下降很慢是因为学习速率设置太小,若损失为Nan说明网络发生了爆炸,学习速率设置过大,学习速率范围大概在 0.001 − 0.00001 0.001-0.00001 0.001−0.00001之间
超参数优化
通常使用交叉验证,在训练集上训练,然后在验证集上验证这些超参数的效果