文/菜鸟技术部 - 一灏
前言
众所周知,机器学习深度学习需要大量的数据来训练以提高模型的 generalization,这些数据动辄几十万几百万甚至更大的数量级。那为什么一定要这么多样本数据呢?先看一个例子:
对于深度学习或机器学习模型而言,我们不仅要求它对训练数据集有很好的拟合(训练误差),同时也希望它可以对未知数据集(测试集)有很好的拟合结果(泛化能力),所产生的测试误差被称为泛化误差。度量泛化能力的好坏,最直观的表现就是模型的过拟合(overfitting)和欠拟合(underfitting)。
过拟合和欠拟合是用于描述模型在训练过程中的两种状态。一般来说,训练过程会是如下所示的一个曲线图:
训练刚开始的时候,模型还在学习过程中,处于欠拟合区域。随着训练的进行,训练误差和测试误差都下降。在到达一个临界点之后,训练集的误差下降,测试集的误差上升了,这个时候就进入了过拟合区域——由于训练出来的网络过度拟合了训练集,对训练集以外的数据表现却不佳。由于无法从训练误差估计泛化误差,一味地降低训练误差并不意味着泛化误差一定会降低。
因此,机器学习深度学习的模型应更关注降低泛化误差才能真正体现出预测的本领。
造成泛化误差的原因主要有:
- 数据训练集样本大小。一般来说,如果训练数据集中样本数过少,更容易导致过拟合
- 数据训练集样本单一。如果样本数据类型不全面,会影响预测的效果
- 样本噪声大。样本中干扰项太多同样会影响预测的表现
- 模型复杂度。寻找一个合适的F(X,Y)函数来表现数据集。如果模型的复杂度过低,很容易出现欠拟合;但是复杂度过高,很容易出现过拟合
本文的重点将从样本的角度出发,分享我们在自己业务中是如何制造出符合期望的高质量样本。
常用样本制造方案
-
人工标注。收集大量的页面图片,对图片上的区块、基础组件、业务组件进行标注(是什么组件、组件的位置),对于不同输入参数下的组件也要收集,整个样本的生成过程人力成本非常高
-
定制化生成样本。通过代码的方式模拟生成页面。初期,我们也是采用的这种方式,根据自身业务的特点引入大量组件,灵活性确实很高但是制造的周期很长且带来了很高的维护成本。
样本制造机
经过前期的摸索采坑,我们的样本制造方案如下图,接下来会依次展开来讲:
物料中心
样本生成的基础是依靠组件,技术栈主要有React、Vue体系;业务划分上主要是基础组件、业务组件。创建样本组件可以从物料库中选取也可以自定义引入NPM组件包
参数
深度学习模型通常复杂度比较高,以高阶多项式函数为例,可以把多项式记为P(x):
P(x)由以下多项式决定:
其中,
不难看出高阶多项式函数模型参数非常多。如果训练数据集中样本数过少,特别是比模型参数数量(按元素计)更少时,过拟合更容易发生。 基于理论之上,我们在组件配置上支持不同的组件形态、属性、规则...的传入
DSL描述
我们定义了一套样本制造过程中的中间态DSL描述,对传入的物料、参数的表达。目前支持组件名称【会自动当作标注名】、属性、包名、版本、导入类型【析构、解构】、样式;初始化时依赖的主题、脚手架等其它包、初始化脚本;全局样式设置
、
Scheduler
Scheduler作为任务控制中心,首先会对输入的DSL进行解析,遍历components把组件、属性等import进来。调度相应的插件执行不同的任务,比如我们业务中RF页面,使用的是Vue组件,那Scheduler经过解析出vue技术栈后会调用Adaptor对vue组件进行包裹适配。最后通过调度模拟器来完成页面样本的生成。
插件中心
负责对子任务的执行。目前主要有Adaptor【适配】、Generator【生成】、Filter【过滤去噪】、Installer【安装】四类插件
模拟器
Scheduler对输入的DSL完成了任务处理后,模拟器会收集参数配置的结果进行页面图片的渲染、同时会自动生成一份标注信息。大致流程如下: