参数更新方法
梯度下降数学推导(手动推导)
训练方法
当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个 epoch。
- 例如:对于一个有 2000 个训练样本的数据集。将 2000 个样本分成大小为 500 的 batch,那么完成一个 epoch 需要 4 个 iteration。
批量训练
- 以所有样本为训练为一个batch,对所有样本的loss求和后反向传播更新参数
随机梯度下降
- 随机挑一个样本训练为一个batch,算出一个样本的loss后反向传播更新参数
mini batch(一般现在采用的训练方法)
- 随机选十几个样本(打比方)训练为一个batch,算出这十几个样本求和后的loos反向传播更新参数
梯度消失
- 网络反向传播时到达靠近输入层的网络时梯度更新的值非常的小
激活函数
网络输入到激活函数之前通过批量归一化(BN)层,进行数据分布的调整
- Sigmod函数 (两头过于平坦,输出值域不对称,相当于没有梯度)
- $Sigmod(x) = \frac{1}{1+e^{-x}}, Sigmod(x) \in (0,1)$
- 导数最大值为0.25
- 双曲正切(tanh)(两头过于平坦,输出值域对称,相当于没有梯度)
- $tanh(x) = \frac{e^{x}-e^{-x}}{e^{-x}+e^{x}}, tanh(x) \in (-1,1)$
- ReLU函数(常用,收敛速度比前两种快,计算高效)
- $Relu(x) = \max{0,x} $
- Leaky ReLU(解决死亡神经元问题)
- $$f(x) = \begin{cases}
\alpha \ast x & x < 0 \
x &x \geq 0
\end{cases}$$
- $$f(x) = \begin{cases}
- Softmax($z_i$为$wx+b$)
- $y_i = \frac{e^{z_i}}{\displaystyle\sum^{n}_{i=1}e^{z_i}}$
损失函数
- 最小平方误差(MSE)
- $MSE = \frac{1}{2n}\displaystyle \sum^{n}_{i=1}{(\hat y_i-y_i)^2}$
- 交叉熵(二分类问题,也可以用于[0,1]区间的回归问题)
- $$J(w) = -\frac{1}{N}\displaystyle \sum^{N}_{n=1}{y_nlog{\hat{y_n}}+(1-y_n)log(1-\hat y_n)}$$
- ($y_n$为第n个样本的真值,$\hat y_n$为第n个样本的预测值)
- $$J(w) = -\frac{1}{N}\displaystyle \sum^{N}_{n=1}{y_nlog{\hat{y_n}}+(1-y_n)log(1-\hat y_n)}$$
学习率
- 基于经验手动调
- 固定学习率
- 动量法动态调整
- 随机梯度下降
- Adam自动调整
评估方法
- 使用测试集(尽可能与训练集互斥进行泛化误差的估计)
- 留出法:将数据姐划分一部分做测试集一部分做训练集,测试集与训练集正负样本分布尽可能均匀。常见将$\frac{2}{3}-\frac{4}{5}$的数据集作为训练集。可多次留出,对测试集结果取平均。
- 交叉验证法:如十折交叉验证,分10份,9训练1测试,进行10次测试,每次测试集合两两不同,对测试集的结果取平均。
- 自助法:
过拟合
- 直观感受,在某个批次中,训练的损失函数在减少,测试集的损失函数不减反增
- 原因
- 模型过于复杂(拟合函数过于复杂,即学习能力很强,把训练样本一些特性当作了一般特性,导致泛化能力降低)
- 参数范数惩罚:惩罚性成本函数,正则化(回归,分类问题都可用)
- $L2$正则化($W_i$为平方,一次时为L1正则化)
- $J = \frac{1}{2n}\displaystyle \sum^{n}{i=1}{(\hat y_i-y_i)^2}+\lambda \displaystyle \sum^{m}{j=1}{W_i^2}$
- 解释:当$\lambda$取很大时要使得$J$很小则只能使某些权重$W_i$为0,从而降低模型的复杂度,防止过拟合。
- $J = \frac{1}{2n}\displaystyle \sum^{n}{i=1}{(\hat y_i-y_i)^2}+\lambda \displaystyle \sum^{m}{j=1}{W_i^2}$
- $L2$正则化($W_i$为平方,一次时为L1正则化)
- 数据增强
- 提前终止
- (对检验样本)测试时过了10个epoche(例如),损失函数不减反增则终止检验。
- Bagging等集成方法
- Dropout(把网络变简单)
- 在每个训练的epoche(一个minibatch)时随机删除一部分神经元(这部分被删除的神经元保存初始参数,训练过程不修正参数)
- 在测试网络时将删除的神经元连上
- 动量(Momentum)
- $$
- 可以防止直接在梯度方向上进行权重的调整,迂回前进,防止提前或者步子太大迈出了局部最小值
- 减少训练速度
权重初始化
超参调节
- 隐层个数
- 激活函数
- 学习率
- 隐层神经元个数
- 正则项
归一化
- 为了后面数据处理的方便,归一化的确可以避免一些不必要的数值问题。
- 为了程序运行时收敛加快。
- 同一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准。这算是应用层面的需求。
- 避免神经元饱和。啥意思?就是当神经元的激活在接近0或者1时会饱和,在这些区域,梯度几乎为0,这样,在反向传播过程中,局部梯度就会接近0。
- 保证输出数据中数值小的不被吞食。
训练网络
步骤
- 调整epoch?
- 增加网络层数?
- loss不下降,有时候还上升?(过拟合)