现在,虽然我们的起点很好,但是我们也注意到每一个词的维度都会随着语料库的扩大直线上升。如果我们有100万个词(在自然语言处理的标准中不算多),我们就会有100万乘以100万大小的矩阵,而且这一矩阵会非常的稀疏(有很多的0)。从存储效率来看这一定不是最好的。在寻找表征这些词向量的最优方法中也存在着很多的先进技术。其中最著名的就是Word2Vec。 Word2Vec 词向量初始化技术的基本思路就是要在词向量中储存尽可能多的信息,同时也要将维度控制在一个可以管理的范围之内(25 – 1000维是理想的)。Word2Vec让我们可以预测每一个单词周围的单词。还是以我们之前提到的句子「I love NLP and I like dogs.」为例。我们首先来看一看这句话的前三个单词,因此我们就要把我们的窗口大小m设置为3.
现在,我们的目标是提取中心词「love」,然后预测可能在这个词之前或之后出现的词。我们应该怎么做呢?通过将一个函数最大化/最优化!一般来说,我们的函数都会将现有中心词的上下文单词的对数概率最大化。
让我们再做一些更深入的了解。上文中的成本函数基本上是在说我们要增加「I」和「love」以及「NLP」和「love」的对数概率(love在两种情形当中都是中心词)。变量T代表的是训练句子的数量。让我们再来了解一下对数概率。
Vc是中心词的词向量。每一个单词都有两次向量表征(Uo 和 Uw),其中一个是当单词作为中心词时,另一个是当单词用作外部词语时。这些向量都经过随机梯度下降法的训练。这一定是令人困惑的方程式之一,也是我们需要理解的,所以如果你还是难以想象正在发生的事情,你可以查看更多的资源加以了解。 一言以蔽之:在给定一个中心词的情况下,Word2Vec 通过最大化上下文单词的对数概率并通过随机梯度下降(SGD)来修改向量,试图找到不同词的向量表征。 注:论文《Distributed Representations of Words and Phrases and their Compositionality》谈到了更多细节:常见词的负采样和子采样能如何被用于获取更精确的词向量。) Word2Vec 的最有趣的贡献在于展现出不同词向量之间的线性关系。训练后,词向量似乎捕捉到了不同语法和语义概念。
难以置信的是,这些线性关联可以如何通过一个简单的目标函数和优化技巧得以形成。 福利:另一个很酷的词向量初始化方式:GloVe(将共生矩阵与Word2Vec结合起来): 循环神经网络(RNN) 现在我们已经拥有词向量了,然后看看它们是如何拟合循环神经网络的。循环神经网络现在已是大多数自然语言处理(NLP)的必需品。循环神经网络最大的优点是它能有效地使用先前时间步骤的数据。这就是一小块循环神经网络大概的样子。
在底部我们有词向量(xt,xt-1,xt+1)。每一个向量在同一时间步骤(ht, ht-1,ht+1)有一个隐藏状态向量(hidden state vector)。我们称这些为一个模块。
循环神经网络每个模块中的隐藏状态是前一时间步骤(previous time step)的隐藏状态向量和词向量的函数:
如果仔细看看上标,你会发现有一个权重矩阵Whx,我们会将Whx矩阵与输入相乘,并且会有一个循环权重的矩阵(recurrent weight matrix)Whh乘以在前一时间步骤的隐藏状态向量。切记这些循环权重矩阵在所有时间步骤都是相同的,这也是循环神经网络的关键点。仔细想想,这和传统两层神经网络有很大的不同。传统情况下,我们每一层(W1和W2)通常会有不同的权重矩阵W,而这里的循环权重矩阵在整个网络中都是相同的。 要得到特定模块的输出(Yhat),就需要将h乘以WS,这是另外一个权重矩阵。 (责任编辑:本港台直播) |