1 基本概念
过度拟合(overfit)
正则化(regularization)
L1正则化(L1 regularization)
L2正则化(L2 regularization)
删除正则化(dropout regularization)
提早停止(early stopping)
离群值
2 过拟合与欠拟合
安装工具
Higgs数据集
如上所示,从教育机构下载Higgs的实验数据,使用CsvDataset工具解压以及读取Csv格式的数据集。
如上所示,定义一个函数,处理Csv格式的数据集的每行数据样本,并且返回每行数据样本的特征与标签,其中,label是标签,features是特征。
如上所示,分批处理原始数据集ds,每批处理1000行记录,并使用函数pack_row处理每行的记录,输出所有特征集合以及对应的标签。读取第一行数据样本的特征数据,并显示其数据分布图,从图中可以体现出部分特征数据没有规范化,存在离群的特征值。
如上所示,从数据集packed_ds中提取1000个数据样本作为验证数据集,提取10000个数据样本作为训练数据集,其中,validate_ds是验证数据集,train_ds是训练数据集。
如上所示,设置训练数据的每次迭代处理的批量,其中,BATCH_SIZE等于500是表示训练数据每次处理500个数据样本。
演示过度拟合
最简单的方式去阻止过度拟合是从构建小模型开始,再逐渐增大构建的模型,而小模型是指只具备少量可学会的参数的模型,这些参数是由网络的层数以及每层包括的单元数确定,在深度学习中这些可学会的模型参数通常是指模型的容积能力。
直觉地一个拥有更多参数的模型具备更多可记忆的容积能力,因而,这个模型能够容易地从数据样本与模型的目标之间学到更好的字典式的映射关系,但是,这个映射关系还不具备概括泛化的能力,也就是,不具备从新数据集中预测的能力。
通常地一个深度学习模型的训练目标是擅长拟合训练数据,但是,对于深度学习模型来说,其真正的挑战是需要具备概括泛化能力,而不是拟合能力。
此外,假如一个网络可记忆的资源有限,则这个模型不能够容易地学习样本与目标之间的映射关系,模型为了让预测更加准确以及最小化损失值,其不得不学会使用压缩表示的方式去处理可记忆资源不足的问题,压缩处理会让模型具备更多预测能力。同时,如果构建的模型太小,则很难去拟合训练数据,因此,构建模型的时候需要把握容积能力太多以及容积能力不足之间的平衡。
理论上不存在通用的方程式用于确定模型的正确大小以及模型的架构(模型的层数以及每层的单元数)。需要用户自行地使用不同的模型架构进行试验,才能得出正确的结论。
实际上为了确定一个模型合适的大小,最好的实践方式是先构建一个层数与参数相对较少的模型,然后根据实际情况逐渐增加模型的层数以及增加每层的单元数,直到得出验证数据集的最小化的损失值,也就是,先构建只有一个全连接层的神经网络模型,再构建多个全连接层的神经网络模型,最后对比分析每个模型的损失值,得出损失值最小的模型,则这个模型是最优的模型。
训练过程
很多模型如果在训练过程中降低学习的速率,则会获得更好的训练效果,使用keras技术框架的函数tf.keras.optimizers.schedules可以降低学习过程中的学习速率。
如上所示,使用函数schedules调度类的函数InverseTimeDecay构建一个学习速率的函数,然后,定义一个Adam优化函数。其中,在1000次迭代的时候学习速率降低1/2,在2000次迭代的时候学习降低1/3。使用曲线显示速率变化的图形,使用平滑的曲线递减处理学习速率。
如上所示,函数get_callbacks是用于定义防止过度拟合,其使用的是EarlyStopping正则化的类型,使用TensorBoard记录训练日志,该记录日志的方式有利于减少对训练的噪声影响。定义compile_and_fit函数用于编译传入的模型、使用训练数据集以及验证数据集对传入的模型执行训练。
构建细模型(Tiny model)
如上所示,构建一个只有一个全连接层、每层包括16个处理单元的细小模型,然后,调用前面定义的compile_and_fit函数编译以及训练该模型。
如上所示,图形显示细模型的训练效果,其中,Tiny Train是训练数据集的效果,Tiny Val是验证数据集的效果,图形显示该次训练过程执行1200次的迭代。
构建小模型(Small model)
如上所示,构建了两个全连接层、每层包括16个处理单元的小模型,然后,调用前面定义的compile_and_fit函数编译以及训练该模型。
构建中模型(Medium model)
如上所示,构建三个全连接层、每层包括64个处理单元的中模型,然后,调用前面定义的compile_and_fit函数编译以及训练该模型。
构建大模型(Large model)
如上所示,构建四个全连接层、每层包括512个处理单元的大模型,然后,调用前面定义的compile_and_fit函数编译以及训练该模型。
(未完待续)