避免模型过拟合最简单的方法是简化模型,减少模型的尺寸:模型中可学习的参数数目(网络数目和每层网络神经元数目)。在深度学习中,网络模型可学习参数的数目可以看做模型的容量。所以,更多的参数模型意味着有更大的记忆容量,因此能容易地学到一个类似于字典类型的映射关系---训练样本到对应标签。深度学习模型趋向于适应训练数据,但真正的挑战是模型的泛化能力,而不是适应性。
另一方面,如果网络模型被限制可记忆的容量,映射关系的学习变得困难;因此为了最小化损失函数,模型将会学习数据的压缩性表示方法。我们应该使用多参数且不欠拟合的网络模型。容量太多和容量太少之间的折中。
不幸的是并没有行之有效的规则或方法来确定模型参数的规模。必须不断在验证集上尝试寻找最佳的参数规模。确定模型规模的一般性方法:从相对简单的模型开始,逐渐增减神经元数目或增加网络层数,直到验证集上的损失值不在减小为止。
在复杂模型上添加约束条件,强制让权重系数取小值有助于缓和过拟合现象---权重正则化:在模型的损失函数中添加关于权重的cost函数。比如:
L1正则化:添加权重系数的L1范数;
L2正则化:添加权重系数的L2范数。
Keras中,通过向网络层声明参数传递权重正则化实例来进行权重正则化。如,添加L2正则化:
from keras import regularizers model = models.Sequential() model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),activation=\'relu\', input_shape=(10000,))) model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001),activation=\'relu\')) model.add(layers.Dense(1, activation=\'sigmoid\')) Dropout层Dropout是神经网络中最有效和最常用的正则化方法。Dropout应用于网络层,随机"扔掉"训练过程的网络层的一部分输出特征(设置为0).Dropout rate指特征设置为0的比率,通常在0.2~0.5之间。在测试过程中,没有神经元被“扔掉”;正相反,网络层的输出值需要用和Dropout rate相等数进行缩放,平衡掉与训练过程相比更多的神经元处于激活状态。(另一种平衡方法是训练过程中对输出进行和Dropout rate相同的放大,而测试过程中不做变换。)
Keras中,有Dropout网络层---对上一层的输出结果做Dropout。 model.add(layers.Dropout(0.25))
实际应用:
model = models.Sequential() model.add(layers.Dense(16, activation=\'relu\', input_shape=(10000,))) model.add(layers.Dropout(0.5)) model.add(layers.Dense(16, activation=\'relu\')) model.add(layers.Dropout(0.5)) model.add(layers.Dense(1, activation=\'sigmoid\')) 机器学习一般性流程 问题定义和数据获取问题定义:
输入数据是什么?预测结果是什么?只有在有训练数据的情况下,才能进行预测。
面临的问题是什么?二分类?多分类?标量回归?向量回归等等。
上面问题回答完以后,明白当前阶段做的假设:
数据标签可以有输入数据预测得到;
当前数据量足以学习到输入数据和标签之间的对应关系。
机器学习只能学习到训练数据的特征信息,只能辨别看见过的数据。使用在过去收集的数据上训练的模型预测将来数据的结果,意味着假设将来的表现行为和过去类似,但也有例外。
准确率,查准率和查全率等等。评估的指标也有助于损失函数的选择。
决定评估方法留出法、K折交叉验证、迭代K折验证。
数据准备输出处理,处理完成送到模型进行学习。
数据表示为张量形式;
张量数值取值范围尽可能小,比如在[0,1]或[-1,1]之间;
如果不同特征的取值范围不同,需要进行归一化处理;
特征工程,特别是针对小数据集。
模型训练--好于基准模型基准模型:随机猜。比如MNIST为0.1.
在搭建第一个模型之前需要明确:
最后一层激活函数:限制网络模型的输出;sigmoid,relu等;
损失函数:和解决问题类型相匹配;回归问题mse、二分类binary_crossentropy