RNN
卷积神经网络(CNN)主要应用计算机视觉,而递归神经网络(RNN)主要应用于自然语言处理。
递归神经网络会涉及处理之前所有的数据,但并非所有数据特征都需要,所以RNN处理结果与我们所需要的存在误差,数据处理不精。
而LSTM网络中会适当过滤一些不必要的特征。
词向量模型
考虑:如何能将文本向量化?文本向量化需考虑到的因素有很多,比如不同文本位置不同所表达意思不同、同一个词不同语境下意义不同、不同的词同一语境下意义相同等。
因此。文本的词向量维度比不可能少,一般为50-300。通常情况下,维度越高,向量能提供的信息越多。
提取数据特征是构建模型中非常重要的一步。而如何描述词的特征?通常都是在词的层面上来构建特征。Word2Vec就是要把词转化为向量。
假设现在已经拿到了一份训练好的词向量,其中每一个词都表示为50维的向量:
将其在热度图中显示:
观察以下三个词的热度图可发现:man和boy这两个词有很多部分热度值相近,但与water这词的极少相近热度值。从中可以发现,相似的词在特征表达中比较相似,也就是说明词的特征是有实际意义的
模型整体框架
词向量模型是为了学习文本词语之间的关系。
举例:下面所示的,输入是 Thou 和 shalt,模型的任务是预测它们的下一个词是什么。
具体流程:
输入数据 -> 初始化词向量 -> 通过多次前向传播反向传播训练更新词向量(不光更新权重参数W,也会更新输入数据) -> 计算机通过最终的词向量预测下一个词 -> SoftMax后得到概率最高的词输出
训练数据构建
问:我们的训练数据应该从哪找呢?
答:一切具有正常逻辑的语句都可以作为训练数据。如小说、论文等。
构建训练数据:
如果我们有一个句子,我们可以选出其中连续三个词,用前两个作为词模型的输入,最后一个词作为词模型输出的目标值,这样就成功构建一条训练数据。
故而具体构建训练数据方法:在文本数据集中设置一滑动窗口,并规定好滑动窗口中哪些位置是输入数据,哪些位置是输出数据,哪些是标签;再通过滑动窗口一次次向后滑动可获得不同的训练数据。
CBOW与Skip-gram模型
- CBOW
输入:上下文,输出:预测词。通过文本上下文预测词
例如
- Skip-gram模型
输入:单个词,输出:词对应上下文。通过当前的词预测上下文。
例如:
负采样
如果一个语料库稍微大一点,可能的结果就太多了,最后一层 SoftMax 的计算就会很耗时,有什么办法来解决吗?
初始方案:输入两个单词,看他们是不是前后对应的输入输出,也相当于一个二分类任务。
传统模型中,我们输入 not ,希望输出是 thou,但是由于语料库庞大,最后一层 SoftMax 太过耗时,所以我们可以改为:将 not 和 thou 同时作为输入,做一个二分类问题,类别 1 表示 not 和 thou 是邻居,类别 0 表示它们不是邻居。
但是由于训练集本来就是用上下文构建出来的,所以训练集构建出来的标签全为 1 ,无法较好的进行训练。
故而需要人工手动添加一些标签为0的数据,通常情况下添加5个负样本。
改进方案:加入一些负样本(负采样模型)。