如何把词转换为向量

自然语言单词是离散信号,比如“我”、“ 爱”、“人工智能”。如何把每个离散的单词转换为一个向量?通常情况下,我们可以维护一个如 图2 所示的查询表。表中每一行都存储了一个特定词语的向量值,每一列的第一个元素都代表着这个词本身,以便于我们进行词和向量的映射(如“我”对应的向量值为 [0.3,0.5,0.7,0.9,-0.2,0.03] )。给定任何一个或者一组单词,我们都可以通过查询这个excel,实现把单词转换为向量的目的,这个查询和替换过程称之为Embedding Lookup。

如何把词转换为向量 - 图1

图2:词向量查询表

上述过程也可以使用一个字典数据结构实现。事实上如果不考虑计算效率,使用字典实现上述功能是个不错的选择。然而在进行神经网络计算的过程中,需要大量的算力,常常要借助特定硬件(如GPU)满足训练速度的需求。但是GPU仅支持以张量(tensor)为单位计算,因此在实际场景中,我们需要把Embedding Lookup的过程转换为张量计算,如 图3 所示。

如何把词转换为向量 - 图2

图3:张量计算示意图

假设对于句子"我,爱,人工,智能",把Embedding Lookup的过程转换为张量计算的流程如下:

  • 通过查询字典,先把句子中的单词转换成一个ID(通常是一个大于等于0的整数),这个单词到ID的映射关系可以根据需求自定义(如图3中,我=>1, 人工=>2,智能=>3,…)。

  • 得到ID后,再把每个ID转换成一个固定长度的向量。假设字典的词表中有50000个词,那么,对于单词“我”,就可以用一个50000维的向量来表示。由于“我”的ID是1,因此这个向量的第一个元素是1,其他元素都是0([1,0,0,…,0]);同样对于单词“人工”,第二个元素是1,其他元素都是0。用这种方式就实现了用一个张量表示一个单词。由于每个单词的向量表示都只有一个元素为1,而其他元素为0,因此我们称上述过程为One-Hot Encoding。

  • 经过One-Hot Encoding后,句子“我,爱,人工,智能”就被转换成为了一个形状为 4 * 50000 的张量,记为

如何把词转换为向量 - 图3 。在这个张量里共有4行、50000列,从上到下,每一行分别代表了“我”、“爱”、“人工”、“智能”四个单词的One-Hot Encoding。最后,我们把这个张量 如何把词转换为向量 - 图4 和另外一个稠密张量 如何把词转换为向量 - 图5 相乘,其中 如何把词转换为向量 - 图6 张量的形状为50000 128(50000表示词表大小,128表示每个词的向量大小)。经过张量乘法,我们就得到了一个4128的张量,从而完成了把单词表示成向量的目的。