词嵌入
one-hot词向量构造起来很容易,但并不是一个含选择,因为其并不能准确地表达不同词之间的相似度,word2vec工具提出解决了上述问题,将每个词表示成一个定长的向量,并使这些向量能较好地表达不同词之间的相似和类比关系,包括跳字模型和连续词袋模型。
跳字模型
跳字模型假设:基于某个词来生成它在文本序列周围的词。
在该模型中,每个词被分为2个d维向量,用来计算条件概率,假设该词在词典索引为i,当它为中心词时向量表示为Vi,而它为背景词时向量表示为Ui。
设中心词Wc在词典中索引为c,背景词Wo在词典中索引为o,故给定中心词生成背景词的条件概率可以通过对向量内积做softmax运算而得到:
跳字模型的参数是每个词所对应的中心词向量和背景词向量,训练中一般使用最大似然函数来学习模型参数
连续词袋模型
与跳字模型不同的是,连续词袋模型假设:基于某中心词在文本序列前后的背景词来生成该中心词。因为连续词袋模型的背景词有很多个,因此将这些取平均,然后使用和跳字模型一样的方法来计算条件概率。
同样,连续词袋模型的最大似然估计等价于最小化损失函数。
近似训练
跳字模型的核心在于,使用softmax运算得到给定中间词Wc生成背景词Wo的条件概率,,该条件概率对应的对数损失;
由于softmax运算考虑背景词可能是词典中任一词,以上损失包含了词典大小数目的项的累加。因此每次梯度计算可能开销过大,有下面两种方法来进行近似训练。
负采样:修改了原来的目标函数,使用相互独立事件来构造损失函数,其训练中每一步梯度计算开销与采样的噪声词的个数线性相关。
层序softmax:使用了二叉树这一个数据结构,树的每个叶结点代表词典中的每个词,并根据根节点到叶节点的路径来构造损失函数,每一步的梯度计算开销与词典大小的对数相关。
word2vec的实现
预处理数据集
PTB是常用的语料库
1、建立词语索引:将词映射到整数索引
2、二次采样::文本中一般会出现一些高频词,而在背景窗口中,与高频词一起出现会更有益。故训练词嵌入模型时可以对词进行二次采样,即每个索引词都有一定概率被丢弃。
3、提取中心词与背景词:我们将与中心词距离不超过背景窗口大小的词作为背景词,定义函数提取出所有中心词和它们的背景词。它每次在整数1与max_window_size之间随机均匀采样一个整数作为背景窗口大小。
负采样
读取数据集
使用随机小批量来读取数据集,小批量读取函数batchify,其输入data是一个长度为批量大小的列表,其中每个元素分别包含中心词center、背景词context、噪声词negativ,其返回的小批量数据符合我们需要的格式。
跳字模型
嵌入层:获取词嵌入的层称为嵌入层,在Gluon中可以通过创建nn.Embedding实例得到。其权重为一个矩阵,行数为词典大小、列数为每个词向量的维度。嵌入层输入为词的索引,返回为权重矩阵的第i行作为它的词向量。
小批量乘法:batch_dot对两个小批量中的矩阵一一做乘法。
跳字模型前向计算:输入包含中心词索引center以及连结的背景词与噪声词索引contexts_and_negatives。
定义损失函数:使用Gluon的二元交叉熵函数
子词嵌入fastText
英语单词通常由其内部结构和形成方式,而在word2vec中,我们并没有直接利用构词学中信息,而在fastText中,每个中心词被表示为子词的集合,利用
全局向量的词嵌入GloVe
文本分类情感分析:使用循环神经网络
文本分类是自然语言处理的一个常见任务,将一段不定长的文本序列变换成文本的类别。
子问题:使用文本情感分析来分析文本作者的情绪,即情感分析。
文本情感分析:使用卷积神经网络textCNN
其实,我们也可以将文本看作一维图像,从而可以使用一维卷积神经网络来捕捉临近词之间的关联,
编码器-解码器Seq2seq
前面都是表征并变换了不定长的输入序列,但在自然语言处理的很多应用中,输入、输出都可以是不定长序列,此时可用编码、解码器或Seq2seq模型。两个模型的本质都用到了两个循环神经网络,分别为编码器、解码器。+