基于numpy的实现代码传送门
预训练是最近几年机器学习邻域中比较火的研究方向,其通过预先在一个通用的训练集中学习到一个较为全面的先验知识(所以预训练基本都是无监督的),以提高后序针对具体的任务的模型的训练速度与准确率。其作用的本质其实就是将离散化(非结构化)的数据预先转化为连续(结构化)的向量,以便被正式模型使用。随着研究的深入,转化后的向量也被赋予了更丰富的含义,预训练模型的体积也变得越来越大,学习成本也越来越高。
特征编码是一种最简单的预训练,或者严格来说,这都算不上是一种训练,只能称其为一种预处理。
1. one-hot encoding
一般被翻译为独热编码,多用于NLP类型任务
one-hot编码的做法很简单,假设输入 \(x\) 一共用 \(n\) 种可能的取值,对于第\(k\)个可能的取值,则编码成一个长度为 \(n\) 、除第 \(k\) 个元素为 \(1\) 、其他元素都为 \(0\) 的向量,例如,假设 \(x\) 的所有可能输入集合为 ['apple', 'banana', 'pear']
,这则三个输入的编码为 ['100', '010', '001']
这种编码看似非常简单,但却出奇的有用。
- 这是一个训练成本低廉的离散数据连续化的手段,而实际上,one-hot其实就是一种添加索引的手段。例如,对于长度为 \(n\) 的经过one-hot编码后的输入向量 \(x_k\) ,与权值矩阵 \(W=[w_{ij}]_{n \times m}\) 相乘,其结果结果为 \(W\) 中第 \(k\) 行对应的向量。可以看出,\(W\) 矩阵存储的权值就是 \(x\) 所有可能取值对应的权值。如果想要取对应可能取值的权值,只要使两者相乘即可,非常的方便。
- 最后,one-hot也起到一定特征扩充的作用,使得分类器有了更多特征选择的空间。
但其依然存在一些问题:
- 编码后的矩阵存在大量无用的信息维度,整体非常稀疏的,会浪费大量的内存,极大的提高了计算复杂度。对于这一问题,可以将矩阵转化成字典的形式进行减轻。后面还会加上一个全连接层进行特征降维。
- 这种编码的实质是每一个可能的输入都当做是一个特征,而且使得每个输入都完全正交,即相互独立的,但事实上,大多数情况下,每个输入间不可能是相互独立的,例如,’粉红‘和’鲜红‘,语义上,两者是部分相交的关系,one-hot强行将两者独立开来了,这必然使得训练的效果不会太好。所以在NLP任务中,one-hot一般不会当做模型的直接输入,后序还得经过一些信息聚合处理,如word2vec
- one-hot虽然也可以用来表示句向量,具体做法是将句子中每个单词的one-hot向量求和得到句向量。这种做法本质上是词袋模型的思路,不包含文本顺序信息。
2. Target encoding
目标编码(Target encoding),由于该编码是将分类特征替换为对应目标值的后验概率(期望),所以也被称为均值编码。是有监督的训练。
这种编码并没有扩维的效果,计算公式为 \[ \hat{x} = \frac{\sum_i y_i \cdot I(x=x_i)}{\sum_i I(x=x_i)} \] 例如,假设训练集中,输入为 \(x_k\) 的出现次数为5次,而这5次 \(x_k\) 对应的标签分别为 \(\{1,1,1,0,1\}\),则 \(x_k\) 的编码为 \(0.8\)
这种编码可以直接地表示分类变量和目标变量之间的关系,但却有一个致命的问题:非常容易导致过拟合。
这个问题理解起来可能有点绕。不妨假设每个特征输入 \(x_i\) 出现的频数都为1,此时,编码后的值即为其对应的标签值,也就是说,如果是二分类任务,其编码后的输入也是二值的,这必然会导致过拟合。
可以通过如下改进减轻上述问题: \[ \hat{x} = \frac{\sum_i y_i \cdot I(x=x_i) + \alpha p}{\sum_i I(x=x_i) + \alpha} \] 其中,\(p\) 为所有标签的均值,\(\alpha\) 是先验标签的贡献程度
3. Leave-one-out encoding
留一法(Leave-one-out)编码是一种有监督的编码,是对目标编码的进一步改进。其通过用除自身外的标签的均值作为自身的编码,具体的用公式表示为 \[ \hat{x} = \frac{\sum_i y_i - y}{n - 1} \] 其中, \(n\) 为样本数。
这种改进可以减轻编码对标签值的依赖且丰富了编码值的多样性,但事实上,减轻效果很多时候并不是太明显。
不妨假设现在有一个二分类任务,所有的输入都是统一值 \(x_i=A\) ,所有标签值之和为 \(N\),则每个样本的编码为 \[ \hat{x} = \frac{N-y}{n-1} \] 而这一编码可以用以下阈值进行完美分类 \[ \hat{x} = \frac{N-y-0.5}{n-1} \] 可见,过拟合情况依然存在。
4. WOE encoding
证据权重(weight of evidence, WOE)编码是一种有监督的编码,用公式表示为 \[ \hat{x} = \ln \frac{p_{y_i}}{p_{n_i}} \\ = \ln (\frac{\sum_iI(x=x_i,y=y_i)}{\sum_iI(y=y_i)}/\frac{\sum_iI(x=x_i,y \neq y_i)}{\sum_iI(y \neq y_i)}) \] \(p_{y_i}, p_{n_i}\) 分别代表 对应分组的所在标签占该类标签的比例 和 对应分组的不在标签占其他标签的比例
这种编码表示正负标签对样本的数量的差异,与样本具体的取值无关,所以可以弱化极值影响,增加模型鲁棒性。
这种编码在短文本类型的任务中应用效果比one-hot要好。