目录
问题:Word2Vec是如何工作的? 它和LDA有什么区别与联系?
问题:在图像分类任务中, 训练数据不足会带来什么问题? 如何缓解数据量不足带来的问题?
特征归一化
问题:为什么需要对数值类型的特征做归一化?
- 对特征做归一化可以加速梯度下降的收敛速度。
假设有两个特征和,是房屋的大小,取值在 0~2000 平方米,是房间的数量,取值在 1~5 间。若以的参数为横轴,的参数为纵轴,绘制代价函数的等高线图,那么图像会呈椭圆形(如下图左),梯度下降算法需要迭代很多次才能收敛。若将和进行归一化,即将和的取值范围缩放至 0~1,绘制代价函数的等高线图,那么图像会呈正圆形(如下图右),梯度下降算法可以更快收敛。
- 并不是所有模型的输入都需要先进行归一化操作。
通常,使用梯度下降法求最优解的模型(线性回归、逻辑回归、支持向量机和神经网络等),是需要进行特征归一化的。而像决策树算法C4.5,在节点分裂时需要计算数据集 D 与特征 x 的信息增益比,但是无论特征归一化与否,信息增益比的计算结果都相同。
- 特征归一化的常用方法:
线性函数归一化
其中,是原始数据,和分别为数据的最大值和最小值。
零均值归一化
其中,是数据的均值,是数据的标准差。
类别型特征
问题:在对数据进行预处理时, 应该怎样处理类别型特征?
- 序号编码。序号编码通常用于处理具有大小关系的类别型特征。
例如:成绩由高到低可以分为“优”、“良”、“中”和“不及格”,使用序号编码后,“优”编码为3,“良”编码为2,“中”编码为1,“不及格”编码为0。
这样做既可以将类别型特征转换为数字型特征,方便模型输入,又不破坏类别间的大小关系。
但是,将成绩简单的编码为0、1、2、3,虽然保留了大小关系,可是它们之间的差值为1,并不一定能够很好的反映出特征之间的差异,需要具体数据具体分析。
- 独热编码。独热编码通常用于处理不具有大小关系的类别型特征。当类别数量较多时,容易使特征空间变大,从而得到一个高维稀疏向量(只有一维为1,其余均为0)。
例如:血型分为“A”、“B”、“AB”和“O”,它们之间并不存在大小关系,所以使用序号编码并不合适。独热编码:
血型 | 类别ID | 独热编码 | |||
---|---|---|---|---|---|
A | 1 | 1 | 0 | 0 | 0 |
B | 2 | 0 | 1 | 0 | 0 |
AB | 3 | 0 | 0 | 1 | 0 |
O | 4 | 0 | 0 | 0 | 1 |
注意:
1.使用稀疏向量可以节省存储空间。目前,常用的算法一般情况下都接受稀疏向量作为输入。
2.使用特征选择可以降低维度。首先要知道,并不是所有的特征对于分类或预测的结果都有影响,而且特征对结果的影响也有大小的区别,所以特征选择就显得尤为重要。高维特征往往不能提高模型的效果,而且还会增加计算复杂度。例如:K近邻算法中,高维度中两点之间的距离很难得到衡量;逻辑回归中,参数的数量与特征的维数成正比,特征维数越大,参数越多,过拟合的风险也就越大。
- 二进制编码。二进制编码的本质是使用二进制将数字 ID 进行哈希映射,优势是维数少于独热编码,可以节省存储空间。
血型 | 类别ID | 二进制编码 | ||
---|---|---|---|---|
A | 1 | 0 | 0 | 1 |
B | 2 | 0 | 1 | 0 |
AB | 3 | 0 | 1 | 1 |
O | 4 | 1 | 0 | 0 |
高维组合特征的处理
问题:什么是组合特征? 如何处理高维组合特征?
- 组合特征:将一阶离散特征两两组合,构成高阶组合特征。这使得一些复杂的关系较容易拟合。
例如:点击率预估任务中,我们有“语言”和“类型”两个特征,以及“是否点击”的目标值。
语言 | 类型 | 是否点击 |
---|---|---|
中文 | 电影 | 0 |
英文 | 电影 | 1 |
中文 | 电视剧 | 1 |
英文 | 电视剧 | 0 |
将其两两组合后,可以得到组合特征。
语言=中文;类型=电影 | 语言=英文;类型=电影 | 语言=中文;类型=电视剧 | 语言=英文;类型=电视剧 | 是否点击 |
---|---|---|---|---|
1 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 | 1 |
0 | 0 | 1 | 0 | 1 |
0 | 0 | 0 | 1 | 0 |
- 处理高维组合特征,以逻辑回归为例:
其中,表示和的组合特征。的维度为,和分别为特征的取值个数和特征的取值个数。在上述点击率预估任务中,“语言”和“类型”的组合特征对应的的维度为。
对于离散类型的特征而言,上述高维组合特征的处理过程没有任何问题,但是对于 ID 类型的特征,则会存在问题。
例如:物品推荐任务,我们有“用户id”和“物品id”两个特征,以及“是否点击”的目标值。
用户id | 物品id | 是否点击 |
---|---|---|
1 | 1 | 0 |
2 | 1 | 1 |
... | ... | ... |
m | 1 | 1 |
1 | 2 | 1 |
2 | 2 | 0 |
... | ... | ... |
m | n | 1 |
将其两两组合后,可以得到组合特征。
用户id=1;物品id=1 | 用户id=2;物品id=1 | ... | 用户id=m;物品id=1 | 用户id=1;物品id=2 | 用户id=2;物品id=2 | ... | 用户id=m;物品id=n | 是否点击 |
---|---|---|---|---|---|---|---|---|
1 | 0 | ... | 0 | 0 | 0 | ... | 0 | 0 |
0 | 1 | ... | 0 | 0 | 0 | ... | 0 | 1 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
0 | 0 | ... | 1 | 0 | 0 | ... | 0 | 1 |
0 | 0 | ... | 0 | 1 | 0 | ... | 0 | 1 |
0 | 0 | ... | 0 | 0 | 1 | ... | 0 | 0 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
0 | 0 | ... | 0 | 0 | 0 | ... | 1 | 1 |
当用户数量为 m,物品数量为 n 时,模型的需要学习的参数规模为,而一般情况下,用户数量和物品数量都很大,所以不能直接这样处理高维组合特征。此时,针对每一个用户和每一个物品,我们都可以使用 k 维的低维向量()来表示,然后:
其中表示和的组合特征,和分别表示和所对应的低维向量。的维度为。这其实也就是推荐算法中经典的矩阵分解思想。
组合特征
问题:怎样有效地找到组合特征?
- 借助决策树算法来找到有效的组合特征。
例如:点击率预估任务,我们有“性别”、“年龄”、“用户类型”和“物品类别”四个特征,以及“是否点击”的目标值。使用原始特征以及目标值可以构造出一棵决策树:
根据构造出的决策树,我们可以得到下面的特征组合:
- “用户类型 = 付费用户”且“年龄 <= 40”;
- “用户类型 = 付费用户”且“物品类型 = 食品”;
- “年龄 <= 35”且“物品类型 = 护肤”;
- “年龄 <= 35”且“性别 = 女”。
若我们有两个数据如下所示:
性别 | 年龄 | 用户类型 | 物品类型 | 是否点击 |
---|---|---|---|---|
女 | 28 | 免费 | 护肤 | 1 |
男 | 36 | 付费 | 食品 | 0 |
那么,根据上面得到的特征组合,我们可以得到编码后的向量:
用户类型=付费用户;年龄<=40 | 用户类型=付费用户;物品类型=食品 | 年龄<=35;物品类型=护肤 | 年龄<=35;性别=女 | 是否点击 |
---|---|---|---|---|
0 | 0 | 1 | 1 | 1 |
1 | 1 | 0 | 0 | 0 |
文本表示模型
问题:有哪些文本表示模型? 它们各有什么优缺点?
- 词袋子模型
词袋子模型简单理解就是将每篇文章看作一袋子词,并且忽略词的出现顺序。换句话说,就是将文章按照词进行切分,然后每篇文章对应一个向量,向量中的每一维表示一个词,每个词的权重代表该词在文章中的重要程度。计算权重常用的方法是TF-IDF,公式为:
其中是词 t 在文章 d 中出现的频率,是词 t 的逆文档频率,即用于衡量词 t 对表达语义所起到的重要性,公式为:
的本质其实就是对权重的惩罚,若词 t 在许多文章中都出现,那 t 就是一个很普遍的词,并不会对表示文章的语义有较大贡献。
词袋子模型的缺点:
- 将文章按照单个词进行划分。比如“自然语言处理”,词袋子模型会划分为“自然”、“语言”和“处理”,但是这样划分所表达的语义与“自然语言处理”同时出现表达的语义会有较大的差异。
- 忽略词之间的顺序。比如“我欠你钱”和“你欠我钱”都是由“我”、“欠”、“你”和“钱”组成,由于不考虑词序,两句明显不同的话,经过词袋子模型后,表达的含义相同。
- N-gram 模型
N-gram 模型与词袋子模型基本相同,区别仅在于 N-gram 模型会将连续出现的 N 个词组成的词组也作为单独的一个特征放到向量表示中去。
- 主题模型
主题模型是从文本库中找到具有代表性的主题(得到每个主题中词的分布特性),并且计算每篇文章中主题的分布。
- 词嵌入模型
词嵌入模型是一类将词向量化的模型的统称。词嵌入模型的核心思想是将每个词映射到低维空间(通常K=50~300维)中的稠密向量上。其中 K 维空间中的每一维可以视为一个隐含的主题,但是不像主题模型中的主题一样直观。
Word2Vec
问题:Word2Vec是如何工作的? 它和LDA有什么区别与联系?
- Word2Vec 是一种浅层的神经网络模型,主要分为两种网络结构:CBOW 和 Skip-gram。
CBOW 利用上下文中的词来预测当前词的出现概率;Skip-gram 利用当前词来预测上下文中词的出现概率。
上图中,是当前词,是上下文中的词,这里默认滑动窗口的大小为 2。
输入层是由每个词的 N 维独热编码向量构成,其中的 N 是词汇表中词的总数,每一维表示一个词。
映射层(隐含层)会将输入层中的 N 维独热编码向量与一个的权重矩阵(嵌入矩阵)相乘得到 K 维的嵌入向量。在 CBOW 中还需要将上下文中词的 K 维向量进行求和操作。
输出层会将映射层中的 K 维隐含向量与一个的权重矩阵相乘得到 N 维的输出向量,该向量中的每一维就对应词汇表中的每一个词。我们可以使用 Softmax 激活函数将 N 维的输出向量归一化,归一化后的向量中的每一维就表示每个词的生成概率。Softmax 激活函数的表达式为:
其中,是 N 维的输出向量,是输出向量中,词所对应维度的取值。
经过分析我们知道,目标是训练和的两个权重矩阵,使得语料库中所有词的生成概率最大化。使用神经网络中常用的反向传播算法即可实现。
CBOW
- 滑动窗口大小为 m 的输入上下文,其独热编码为,其中表示词的独热编码;
- 从嵌入矩阵中获取每个词对应的嵌入向量:,其中表示词的嵌入向量;
- 嵌入向量求和:;
- 通过矩阵得到输出向量:,其中;
- 归一化:,其中;
- 我们希望最后输出的概率分布逐渐趋向于真实分布,而也就是我们所期望的真实词语的独热编码。
Skip-gram
- 词的独热编码为;
- 从嵌入矩阵中获取对应的嵌入向量;
- 通过矩阵和公式得到输出向量:,其中;
- 通过归一化公式得到:,其中;
- 我们希望最后输出的概率分布逐渐趋向于真实分布,也就是我们真实输出结果的独热编码;
常见的优化手段:Hierarchical softmax 和 Negative sampling
在 Skip-gram 中,我们需要优化的损失函数(引入朴素贝叶斯假设将联合概率拆分成独立概率相乘):
从上式中可以看到,我们需要对整个词汇表进行求和操作,计算复杂度为,其中 N 为词汇表中词的数量。由于计算量太大,所以需要引入 Hierarchical softmax 或 Negative sampling 来降低计算复杂度。
Hierarchical softmax:分层 softmax,它并不是直接计算 softmax,而是通过构建一棵二叉树来将问题转换为次二分类问题。Spark 中的 word2vec 的实现;
Negative sampling:负采样,不使用 softmax,而是从词汇表中进行 neg 次随机采样构成负样本,训练数据构成正样本,将多分类问题转换为 neg 个二分类问题。
- Word2Vec 与 LDA 的区别:Word2Vec 是通过对“上下文-词”矩阵的学习来得到词向量的,而词向量更多的融入了上下文共现的特征。LDA 是利用文档中词的共现关系来对词按主题进行聚类,也就是对“文档-词”矩阵进行分解,得到“文档-主题”和“主题-词”两个概率分布。
- 词嵌入与主题模型的联系:词嵌入可以通过“文档-词”矩阵来学习词的隐含向量表示。主题模型通过一定的结构调整,也可以利用“上下文-词”矩阵进行主题推理。
- 词嵌入与主题模型的区别:词嵌入属于神经网络模型,其似然函数定义在网络的输出之上,需要通过学习网络权重来得到词的稠密向量表示。主题模型是基于概率图模型的生成式模型,其似然函数可以表示成若干条件概率的连乘,其中包含隐含变量(即主题)。
图像数据不足时的处理方法
问题:在图像分类任务中, 训练数据不足会带来什么问题? 如何缓解数据量不足带来的问题?
- 一般情况下,模型的信息来源有两个:一是数据本身蕴涵的信息;二是模型形成(如构造、学习、推理)的时候,人为引入的先验信息。训练数据不足,也就是数据所能提供的信息不足,那就需要增加先验信息。而先验信息既可以作用在模型上,如使用某种特定的结构、条件假设或其他一些约束条件;也可以直接作用在数据集上,如使用某种特定的先验假设去调整、变换或扩展训练数据,让数据展现出更多更有用的信息,从而提供给模型进行训练和学习。
- 对于图像分类任务,训练数据不足的主要表现为过拟合。过拟合就是模型在训练样本上的表现非常好,但是在测试数据上的表现却非常差。缓解过拟合现象可以从两方面入手:一是基于模型,采用一些降低过拟合现象的手段,如简化模型、Dropout、添加一些约束项来缩小假设空间(L1、L2正则化)或集成学习;二是基于数据,主要就是数据扩充(Data Augmentation),即使用一些先验知识,在保持特定信息的前提下,对原始数据进行适当变换以达到扩充数据的作用。
- 对于图像分类任务,数据(图像)扩充的手段如下:
- 一定程度的随机翻转、平移、缩放、裁剪、填充或水平翻转等,这些变换对应同一目标在不同角度的观察结果;
- 对图像中的像素添加随机扰动,如椒盐噪声、高斯白噪声等;
- 颜色变换。如在图像的RGB三个颜色通道上进行主成分分析,得到特征向量和对应的特征值,然后在每个像素的RGB值上添加增量,其中是均值为0,方差较小的高斯分布随机数;
- 改变图像的亮度、锐度、清晰度或对比度等;
- 不直接在图像空间上进行变换,而是对图像特征进行提取,然后在特征空间上进行变换,利用 SMOTE(Synthetic Minority Over-sampling Technique)算法进行数据扩充;
- 使用生成对抗网络来生成新图像;
- 使用一些开源的预训练模型来进行迁移学习。这些预训练模型都是利用大量数据训练而成,具有较强的特征提取能力,我们只需要使用自己的数据集在预训练模型上进行微调即可。