嵌入矩阵(Embedding Matrix)
接下来我们要将学习词嵌入这一问题具体化,当你应用算法来学习词嵌入时,实际上是学习一个嵌入矩阵,我们来看一下这是什么意思。
和之前一样,假设我们的词汇表含有10,000个单词,词汇表里有a,aaron,orange,zulu,可能还有一个未知词标记
假设这个嵌入矩阵叫做矩阵E,注意如果用E去乘以右边的one-hot向量(上图编号3所示),也就是O_6527,那么就会得到一个300维的向量,E是300×10,000的,O_6527是10,000×1的,所以它们的积是300×1的,即300维的向量。
要计算这个向量的第一个元素,你需要做的是把E的第一行(上图编号4所示)和O_6527的整列相乘,不过O_6527的所有元素都是0,只有6257位置上是1,最后你得到的这个向量的第一个元素(上图编号5所示)就是orange这一列下的数字(上图编号6所示)。然后我们要计算这个向量的第二个元素,就是把E的第二行(上图编号7所示)和这个O_6527相乘,和之前一样,然后得到第二个元素(上图编号8所示),以此类推,直到你得到这个向量剩下的所有元素(上图编号9所示)。
这就是为什么把矩阵E和这个one-hot向量相乘,最后得到的其实就是这个300维的列,就是单词orange下的这一列,它等于e_6257,这个符号是我们用来表示这个300×1的嵌入向量的符号,它表示的单词是orange。
更广泛来说,假如说有某个单词w,那么e_w就代表单词w的嵌入向量。同样,EO_j,O_j就是只有第j个位置是1的one-hot向量,得到的结果就是e_j,它表示的是字典中单词j的嵌入向量。
在这一小节中,要记住的一件事就是我们的目标是学习一个嵌入矩阵E。
在下节笔记中你将会随机地初始化矩阵E,然后使用梯度下降法来学习这个300×10,000的矩阵中的各个参数,E乘以这个one-hot向量(上图编号1所示)会得到嵌入向量。再多说一点,当我们写这个等式(上图编号2所示)的时候,写出这些符号是很方便的,代表用矩阵E乘以one-hot向量O_j。
但当你动手实现时,用大量的矩阵和向量相乘来计算它,效率是很低下的,因为one-hot向量是一个维度非常高的向量,并且几乎所有元素都是0,所以矩阵向量相乘效率太低,因为我们要乘以一大堆的0。
所以在实践中你会使用一个专门的函数来单独查找矩阵E的某列,而不是用通常的矩阵乘法来做,但是在画示意图时(上图所示,即矩阵E乘以one-hot向量示意图),这样写比较方便。但是例如在Keras中就有一个嵌入层,然后我们用这个嵌入层更有效地从嵌入矩阵中提取出你需要的列,而不是对矩阵进行很慢很复杂的乘法运算。
在本笔记中你见到了在学习嵌入向量的过程中用来描述这些算法的符号以及关键术语,矩阵E它包含了词汇表中所有单词的嵌入向量。
在下节笔记中,我们将讨论学习矩阵E的具体算法。
閱讀更多 極客Array 的文章