现在,尽管这是一个了不起的起点,但我们注意到每个词的维数将随着语料库的大小线性增加。如果我们有一个百万词(在 NLP 标准中并不是很多),我们将有一个一百万乘一百万尺寸的矩阵,它将会非常稀疏(大量的 0)。从存储效率上讲这绝对不是最好的。在寻找表示这些词向量的最优方法方面已经有许多进步。其中最著名的是 Word2Vec。 Word2Vec 词向量初始化技术背后的基本思想是,我们要在这种词向量中存储尽可能多的信息,同时仍然保持维度在可管理的规模(25 - 1000 维度是理想的)。Word2Vec 基于这样一个理念来运作,即我们想要预测每个单词周围可能的词。让我们以上一句话「I love NLP and I like dogs」为例。我们要看这句话的前 3 个词。3 因此将是我们的窗口大小 m 的值。
现在,我们的目标是找到中心词,「love」,并预测之前和之后的词。我们如何做到这一点?当然是通过最大化/优化某一函数!正式地表述是,我们的函数将寻求给定当前中心词的上下文词的最大对数概率。
让我们对这一点再深入地探究。上面的成本函数(cost function)基本上是说我们要添加'I'和'love'以及'NLP'和'love'的对数概率(其中「love」是两种情况下的中心词)。变量 T 表示训练句子的数量。让我们再仔细研究一下那个对数概率。
Vc 是中心词的词向量。每个词由两个向量表示(Uo 和 Uw),一个用于当该词用作中心词时,一个用于当它用作外部词(outer word)时。向量是用随机梯度下降(SGD)来训练的。这绝对是一个理解起来更让人困惑的方程之一,所以如果你仍然有疑问想了解到底发生了什么,你可以查看以下两个资源: How does word2vec work?:https://www.quora.com/How-does-word2vec-work Word Embedding Explained and Visualized - word2vec and wevi:https://www.youtube.com/watch?v=D-ekE-Wlcds 一句总结:Word2Vec 寻求通过最大化给定中心词的上下文词的对数概率并通过 SGD 修改向量来找到不同词的向量表示。 (可选:论文《Distributed Representations of Words and Phrases and their Compositionality》的作者接着详细介绍了如何使用频繁词的负采样(negative sampling)和下采样(subsampling)获得更精确的词向量。) 有人认为,Word2Vec 最有趣的贡献是使得不同词向量之间表现出线性关系。经过训练,词向量似乎能捕获不同的语法和语义概念。这些线性关系是如何能通过简单的对象函数和优化技术来形成的,这一点真是相当难以置信。
额外补充:另一种很酷的词向量初始化方法:GloVe(将共生矩阵与 Word2Vec 的思想结合在一起): 循环神经网络(RNN) 好吧,那么现在我们有了我们的词向量,让我们看看它们如何与循环神经网络结合在一起的。RNN 是当今大多数 NLP 任务的必选方法。RNN 的最大优点是它能够有效地使用来自先前时间步骤的数据。这是一小片 RNN 的大致样子。
因此,在底层,我们有我们的词向量(xt,xt-1,xt + 1)。每个向量在同一时间步骤(ht,ht-1,ht + 1)有一个隐藏状态向量。让我们称之为一个模块(module)。
RNN 的每个模块中的隐藏状态是在前一时间步骤的词向量和隐藏状态向量二者的函数。
如果你仔细看看上标,你会看到有一个权重矩阵 Whx,我们将它乘以我们的输入,并且在上一个时间步骤中,用一个循环出现的权重矩阵 Whh 乘以隐藏状态向量。请记住,这些循环出现的权重矩阵(recurrent weight matrix)在所有时间步骤上都是相同的。这是 RNN 的关键点。仔细考虑一下这一点,它与传统的(比如 2 层的神经网络)非常不同。在这种情况下,我们通常对于每个层(W1 和 W2)都有不同的 W 矩阵。这里,循环权重矩阵在网络中是相同的。 为了得到特定模块的输出(Yhat),将以 h 乘以 WS,这是另一个权重矩阵。 (责任编辑:本港台直播) |