入门自然言语处理必看:图解词向量(二)

图灵汇官网

言语模型训练

相比于大多数其他机器学习模型,语言模型的一大优势在于其拥有丰富的训练文本资源。这些文本包括书籍、文章、维基百科等各类文本内容。相比之下,训练其他机器学习模型可能需要手工标注数据或专门采集数据。

通过收集大量的文本数据(例如维基百科内容),可以构建一个可以在文本上滑动的窗口(例如一个窗口包含三个单词)。这种滑动窗口技术可以为训练模型生成大量样本数据。

当窗口沿着文本滑动时,可以生成用于模型训练的数据集。为了更好地理解这一过程,我们可以观察滑动窗口如何处理特定短语:

在某一时刻,窗口锁定在句子的前三个单词上。前两个单词作为特征,第三个单词作为标签。这时就生成了数据集中的第一个样本,用于后续的语言模型训练。

接着,将窗口滑动到下一个位置,生成第二个样本。重复上述步骤,可以获得更多的样本,从而形成一个多样化样本的数据集。这些样本展示了在不同的单词组合后面可能出现的单词。

在实际应用中,模型往往在滑动窗口过程中就被训练,而非事先生成所有样本。为了便于理解,本文将生成数据集和训练模型分为两个阶段来讲解。除了使用神经网络建模训练词向量,还可以采用N-gram方法进行模型训练。

顾及中间

一种方法是根据后面的上下文信息进行填空。例如,给定“公交车”这一背景信息,大多数人会倾向于填入“公交车”。然而,如果增加额外信息,例如某个特定单词,答案可能会改变。这表明一个单词的前后词语都带有信息价值。实际上,训练模型时需要考虑目标单词的前后单词。

Skipgram模型

Skipgram模型不仅考虑目标单词的前两个单词,还考虑其后两个单词。具体做法是构建并训练模型,使其能够预测当前单词的前后单词。滑动窗口在训练数据时会生成多个独立样本。这种方式称为Skipgram架构。

在训练过程中,从现有的文本中获取Skipgram模型的训练数据集。接下来,使用这个数据集训练一个能够预测相邻词汇的自然语言模型。从数据集的第一个样本开始,将特征输入到未经训练的模型,让它预测一个可能的相邻单词。

模型会执行三个步骤并输出预测向量(对应于单词表中每个单词的概率)。在训练前,初始预测结果可能是错误的。通过训练,模型的输入单词概率应尽量符合训练集数据中的输入标签。

训练过程

训练的第一步是通过调整模型参数来减少误差。接下去,对数据集内的下一个样本重复同样的操作,直至遍历所有样本,即完成一轮(epoch)训练。经过多轮训练,可以得到训练好的模型,从中提取词嵌入矩阵用于后续应用。

负例采样

负例采样是一种提高训练效率的方法。将任务分为两步:生成高质量的词嵌入,再用这些词嵌入训练语言模型。要生成高质量词嵌入,可以改变预测相邻单词的任务,将其转换为输入与输入单词是否是邻居的分类问题。这样可以简化模型,使其计算速度更快。

在实际操作中,需要在数据集中引入负样本(非邻居单词),以避免模型陷入永远返回1的状态。对于每个样本,添加负面示例,其输入词与标签为0。

基于负例采样的Skipgram(SGNS)

基于负例采样的Skipgram(SGNS)结合了Skipgram和负例采样的核心思想。在训练过程中,使用随机值初始化Embedding矩阵和Context矩阵。在每个训练步骤中,选择一个相邻样本及其相关的非相邻样本。通过计算输入词嵌入与每个上下文词嵌入的点积,然后利用Sigmoid函数将这些分数转化为概率值。通过调整误差来优化词嵌入。

Word2vec训练流程

了解了Skipgram和负例采样的核心思想后,继续探讨Word2vec的实际训练过程。在训练前,需要预先处理训练文本,确定词典大小和包含的单词。在训练开始时,创建两个矩阵——Embedding矩阵和Context矩阵。这两个矩阵在词汇表中为每个单词生成词嵌入。

在每个训练步骤中,选取一个相邻样本及其相关的非相邻样本,计算输入词嵌入与每个上下文词嵌入的点积。通过Sigmoid函数将这些分数转化为概率值,并调整误差来优化词嵌入。通过多次迭代,词嵌入不断得到改进,最终可以停止训练,丢弃Context矩阵,使用Embedding矩阵作为训练好的词嵌入。

窗口大小和负样本数量

在Word2vec训练过程中,窗口大小和负样本数量是两个关键的超参数。较小的窗口大小(2-15)生成的词嵌入更注重局部相似性,而较大的窗口大小(15-50)生成的词嵌入更注重全局相关性。Gensim默认窗口大小为5。负样本数量影响训练效果,一般推荐5-20个负样本,数据集较大时2-5个即可。

欢迎关注全平台AI自媒体“AI新视野”,第一时间获取人工智能学术、产业前沿资讯。

本文来源: 图灵汇 文章作者: 137237205