1.性能度量
除上述损失函数之外,分类任务还有很多其他有用的性能度量。
混淆矩阵、ROC、AUC
2.损失函数
3.优化器(Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
4. 特征缩放:
瘦长的椭圆,会导致趋向最值时梯度下降的震荡;所以需要缩放特征值,使得其取值范围相近。按经验,特征缩放到3倍或1/3是比较可以接受的。
标准化 (standardization):每个维度的特征减去该特征均值,除以该维度的标准差。
规范化 (normalization):每个维度的特征减去该特征最小值,除以该特征的最大值与最小值之差。
5.学习率
α的取值要合适,太小太慢,太大震荡。
选取α的经验,从……0.001—>0.01—>0.1—>1…
参数的更新公式为:
指数衰减学习率:
学习率随着训练轮数变化而动态更新
学习率计算公式如下:
用 Tensorflow 的函数表示为:
global_step = tf.Variable(0, trainable=False)
learning_rate = tf.train.exponential_decay(LEARNING_RATE_BASE, global_step, decay_steps, decay_rate, staircase=True/False)
(学习率初始值。 当前训练轮数为不可训练型参数。完整使用一遍数据集所需迭代次数。学习率衰减率。
学习率 learning_rate 更新频率为输入数据集总样本数除以每次喂入样本数。若 staircase 设置为 True 时,表示 global_step/learning rate step 取整数,学习率阶梯型衰减;若 staircase 设置为 false 时,学习率会是一条平滑下降的曲线。使用指数衰减的学习率,在迭代初期得到较高的下降速度,可以在较小的训练轮数下取得不错的收敛程度。
6. 激活函数
常用的激活函数有 relu、sigmoid、tanh 等。
需要激活函数来引入非线性因素,使得神经网络可以任意逼近任何非线性函数。
sigmod 函数
导数 :
其输出是在(0,1)这个开区间,它能够把输入的连续实值变换为0和1之间的输出,如果是非常大的负数,那么输出就是0;如果是非常大的正数输出就是1,起到了抑制的作用。
tanh 函数
导数:
tanh是双曲正切函数,输出区间是在(-1,1)之间,而且整个函数是以0为中心的
ReLU 函数
Relu(Rectified Linear Units)修正线性单元
导数大于0时1,小于0时0。
也就是说:
z>0时,梯度始终为1,从而提高神经网络基于梯度算法的运算速度。然而当z<0时,梯度一直为0。
ReLU函数只有线性关系(只需要判断输入是否大于0)不管是前向传播还是反向传播,都比sigmod和tanh要快很多
Leaky Relu 函数
为了解决relu函数z<0时的问题出现了 Leaky ReLU函数,该函数保证在z<0的时候,梯度仍然不为0。
ReLU的前半段设为αz而非0,通常α=0.01
7.正则化
改善过拟合
向你的模型加入某些规则,加入先验,缩小解空间,减小求出错误解的可能性。你要把你的知识数学化告诉这个模型,对代价函数来说,就是加入对模型“长相”的惩罚
在损失函数中给每个参数 w 加上权重,引入模型复杂度指标,从而抑制模型噪声,减小过拟合。
使用正则化后,损失函数 loss 变为两项之和:
其中,第一项是预测结果与标准答案之间的差距,如之前讲过的交叉熵、均方误差等;第二项是正则化计算结果。
正则化计算方法:
① L1 正则化:
用 Tesnsorflow 函数表示:loss(w) = tf.contrib.layers.l1_regularizer(REGULARIZER)(w)
② L2 正则化:
用 Tesnsorflow 函数表示:loss(w) = tf.contrib.layers.l2_regularizer(REGULARIZER)(w)
正规方程
范数
numpy.linalg.norm求矩阵的范数
滑动平均:
记录了一段时间内模型中所有参数 w 和 b 各自的平均值。利用滑动平均值可以增强模型的泛化能力。
用 Tesnsorflow 函数表示为:
ema=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
其中,MOVING_AVERAGE_DECAY 表示滑动平均衰减率,一般会赋接近 1 的值,global_step 表示当前训练了多少轮。
ema_op = ema.apply(tf.trainable_variables())
实现对括号内参数求滑动平均,tf.trainable_variables()
函数实现把所有待训练参数汇总为列表。
ema.average()
查看模型中参数的平均值
反向传播训练方法:
以减小 loss 值为优化目标,有梯度下降、momentum 优化器、adam 优化器等优化方法。
train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
使用随机梯度下降算法,使参数沿着梯度的反方向,即总损失减小的方向移动,实现更新参数
train_step=tf.train.MomentumOptimizer(learning_rate,momentum).minimize(loss)
在更新参数时,利用了超参数
train_step=tf.train.AdamOptimizer(learning_rate).minimize(loss)
是利用自适应学习率的优化算法,Adam 算法和随机梯度下降算法不同。随机梯度下降算法保持单一的学习率更新所有的参数,学习率在训练过程中并不会改变。而 Adam 算法通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。
交叉熵(Cross Entropy):
表示两个概率分布之间的距离。交叉熵越大,两个概率分布距离越远,两个概率分布越相异;交叉熵越小,两个概率分布距离越近,两个概率分布越相似。
交叉熵计算公式:
softmax 函数:
把每个类别的分数转换为概率
将 n 分类的 n 个输出(y1,y2…yn)变为满足以下概率分布要求的函数。
Batch_normalization
随着网络的深度增加,每层特征值分布会逐渐的向激活函数的输出区间的上下两端(激活函数饱和区间)靠近,这样继续下去就会导致梯度消失。BN就是通过方法将该层特征值分布重新拉回标准正态分布,特征值将落在激活函数对于输入较为敏感的区间,输入的小变化可导致损失函数较大的变化,使得梯度变大,避免梯度消失,同时也可加快收敛。
过程:input={x1,x2,x3…xn}
1 计算 x1-xn的均值u
2 计算x1-xn的方差v
3 每个x_i = (x_i – u) / (sqrt(v^2)+ e) e是一个小小偏置,防止分母趋向于0.
4 在对结果进行scale于shift操作 x_i = scale*x_i + shift
第四步存在的原因是batch_normal后,数据趋向标准正态,会导致网络表达能力变差,这里加入后标准正态分布有些偏移,变得不那么标准了。这两个参数时学习而来。
减少梯度消失,加快了收敛过程。
起到类似dropout一样的正则化能力,一定程度上防止过拟合。
放宽了一定的调参要求。
可以替代LRN。
但是需要计算均值与方差,不适合动态网络或者RNN。计算均值方差依赖每批次,因此数据最好足够打乱。
数据集的划分
按一定比例划分为训练集和测试集
这种方法也称为保留法。我们通常取8-2、7-3、6-4、5-5比例切分,直接将数据随机划分为训练集和测试集,然后使用训练集来生成模型,再用测试集来测试模型的正确率和误差,以验证模型的有效性。
交叉验证法
交叉验证一般采用k折交叉验证,即k-fold cross validation,往往k取为10。在这种数据集划分法中,我们将数据集划分为k个子集,每个子集均做一次测试集,每次将其余的作为训练集。在交叉验证时,我们重复训练k次,每次选择一个子集作为测试集,并将k次的平均交叉验证的正确率作为最终的结果。
训练集、验证集、测试集法
我们首先将数据集划分为训练集和测试集,由于模型的构建过程中也需要检验模型,检验模型的配置,以及训练程度,过拟合还是欠拟合,所以会将训练数据再划分为两个部分,一部分是用于训练的训练集,另一部分是进行检验的验证集。验证集可以重复使用,主要是用来辅助我们构建模型的。