基础理论
超参数
对于神经网络模型而言,决定最终神经网络模型性能的系数是w和b,其余可调的系数均为超参数。
训练集、测试集和开发集
在模型生成的过程中,根据样本数据起到的作用,进行集合类型的划分。
- 训练集(Train Set): 用于模型的训练。
- 开发集(Dev Set): 用于对训练中的模型进行测试。
- 测试集(Test Set): 用于对最终的模型进行测试。
注意:训练集和开发集的数据应当来自于同一组样本。
方差(Variance)和偏差(Bias)
模型在样本上,输入与输出之间的误差,即模型本身的精确度。反应在训练集上。
-
方差
模型预测结果与输出期望之间的误差,即模型的稳定性。反应在开发集与训练集上。
-
关系
- 低偏差|低方差:最想要的结果。
- 低偏差|高方差: 过拟合 (overfitting) ,对测试集和开发集拟合能力差。
- 高偏差: 欠拟合 (underfitting) ,模型拟合得很差。
过拟合与欠拟合解决方案
-
过拟合
- 简化模型复杂度
- L2正则化和Dropout
- 增加样本数量
-
欠拟合
- 使用更复杂的神经网络模型
- 更换优化方法
- 增加迭代训练次数
正则化(regularization)
作用:降低模型的复杂度,从而防止模型的过拟合问题。
L2正则化
在梯度下降法中,对于目标函数J添加一个正则项:
这就会导致更新每一层的w系数时:
增大系数$\lambda$便会使得$w^{[l]}$的值减小;当一个神经元节点的$w \approx 0$时,该神经元节点便在模型中失效。

Droput正则
减少一次训练样本中的节点,防止过拟合。不依赖一个特性,将权重值分散。

-
实现:将$a^{[l]}$中的某些元素置为0。(inverted dropout)
-
注意:
- 经过处理后的J无明确的意义
- 该方法主要用于图像识别
归一化(Normalize)
对于样本首先进行归一化处理,然后才能使用。
映射到[-1,1]
正向:
反向:
映射到[0,1]
正向:
反向:
系数初始化
梯度消失与梯度爆炸

假设一个深层的网络,其激活函数为线性的,且网络中的偏执系数 $b^{[l]} = 0$
则
进一步假设 $w^{[l]} = W$ 都相等
令上图网络中的 $W = \begin{bmatrix} 1.2 & 0 \ 0 & 1.2 \ \end{bmatrix}$ 则
随着网络的加深,就会导致 $a^{[l]}$ 指数爆炸。
令上图网络中的 $W = \begin{bmatrix} 0.9 & 0 \ 0 & 0.9 \ \end{bmatrix}$ 则
随着网络的加深,就会导致 $a^{[l]}$ 会趋近于 0。
根据梯度求导公式
综上可得
- 当前
l-1个的系数矩阵 $W$ 中的分量 $w_{ij} < 1$ ,会导致 $a^{[l-1]}$ 趋近于零,进而使得 $d w^{[l]} \approx 0$,即「梯度消失」 - 当前
l-1个的系数矩阵 $W$ 中的分量 $w_{ij} > 1$ ,会导致 $a^{[l-1]}$ 指数爆照,进而使得 $d w^{[l]}$ 指数爆炸 ,即「梯度爆炸」
初始值选取
对于深度的神经网络;
- 当w > 1时,从输入层到输出层,输出值将会很大
- 当w < 1时,从输入层到输出层,输出值将会很小
为了避免这些问题,需要对w值进行合理的初始化。即 $var(w^{[l]}) = \frac{2}{n^{[l]}},E(w^{[l]}) = 0$
其中$n$代表一个神经元节点输入的个数。
指数加权平均
对于$v_t$可以认为是前$\frac{1}{1 - \beta}$个v值的平均值。
在初始时刻,使用指数加权平均,会导致估计值偏差较大。在后期时刻,偏差就基本近似。所以可以对初期的估计值进行修正。
Mini Batch
模型
将样本数据中的训练集再划分为多个子集,再依次利用这些子集进行模型训练。
- 子集的样本量:$m \le 200$
- 子集的个数:$2^i$
- mini batch 训练过程中,J的变化是振荡。

梯度下降法
对于梯度下降法,Mini Batch的(w,b) 的变化如上图所示,是振荡的,向着最优解靠近。在这种情形下,使用梯度下降法时,学习率$\alpha$不能太大。
动量梯度下降法
对变量(w,b)使用 指数加权平均 降低振荡,使得收敛过程更加的平缓。这样就能加大学习率$\alpha$,减少迭代次数。

RMSprop法
在降低振荡振幅的基础上,还要缩短纵轴的波动,延长横轴的长度。
其中$\epsilon$是一个很小的值,防止$S$为0,造成运算异常。
ADAM法
对RMSprop法和动量法的整合,改进。
衰减学习率
在训练的前期使用较大的学习率,在快要收敛时,使用较小的学习率。
超参数取值
-
采用枚举法,在一个区间内随机试;
-
对数标尺随机数的实现 从[0.001,1]之间的对数标尺随机数的实现:
PYTHONr = -4 * np.randm.rand() a = 10 ** rr = -4 * np.randm.rand() a = 10 ** r
Batch Norm
原理
对一个batch样本在一个神经元节点中的所有$z^{[i]}_j$进行Z标准化处理,然后再带入激活函数,求解$a^{[i]}_j$。

注意:
- 由于对$z^{(i)}$进行了标准化处理,对于系数$b^{[i]}$将没有实质意义,可以从网络中去掉;
- 引入两个调节参数$\beta^{[i]},\gamma^{[i]}$。
$\mu ,\delta$的获取
- 测试集:将训练集中计算得到的 $\mu^{{i}},\delta^{{i}}$进行指数平均获取到的$\mu,\delta$用于测试计算。
covariate shift


对于第3,4层神经网络而言,它们以$a^{[2]}$作为样本输入(就认为是样本定值),从而实现结果向$\hat{y}$靠拢。但是从整体网络上来看$a^{[2]}$受到了第1,2层网络的影响,是变化的。因此,对于$a^{[2]}$就存在协变量偏移的情况。Batch Norm的作用就是将每一个神经元激活前的样本尽可能都保持在统一的一个分布内。
softmax回归
作用
可以对种数据类型的学习,实现多类型划分。
原理
-
激活函数

输出层的节点数量=类别的数量,并且输出层的激活函数为softmax激活函数。
$$ \left { \begin{aligned} z^{[L]} &= w^{[L]}a^{[L-1]} + b^{[L]} \ t &= e^{z^{[L]}} \ \hat{y} &= \left [ \frac{ t_i }{\sum t_i} \right ] \end{aligned} \right . \tag{10.1} $$
其中: $\hat{y}$各个输出量的总和为1。输出结果就是样本在各个分类所占的概率。
-
损失函数 $$ L(\hat{y},y) = - \sum ^C_i y_i \log{\hat{y}_i} \tag{10.2} $$
-
目标函数 $$ J = \frac{1}{m} \sum^m_i L(\hat{y}^{(i)},y^{(i)}) \tag{10.3} $$
输出($y$)编码
-
顺序编码 对于结果按照数字顺序分类。 $$ \begin{array}{c} \left [ A \quad B \quad C \quad D \right] \ \left [ 1 \quad 2 \quad 3 \quad 4 \right] \end{array} $$
-
one-hot 编码 $$ \begin{array}{c} A = \left [ 1 \quad 0 \quad 0 \quad 0 \right] \ B = \left [ 0 \quad 1 \quad 0 \quad 0 \right] \ C = \left [ 0 \quad 0 \quad 1 \quad 0 \right] \ D = \left [ 0 \quad 0 \quad 0 \quad 1 \right] \ \end{array} $$