关于embedding的理解,2020-7-30

Embedding是什么?

字面上的意思是“表征”,那么实际上它蕴含了什么呢?

从CNN开始回顾,CNN最开始处理的是图片信息。图片本身是由像素点构成的,每一个像素点,每个像素点代表了一种颜色,如果是灰度图,每个像素点是一个值;如果是rgb图,每一个点是一个三元向量(分别代表三原色);那么一张图的所有像素点构成的像素矩阵,我们就看为这张图的特征,是一种直观的表现,然后对图片的像素矩阵进行卷积,再通过激活函数输出,输出的是图像的类别,比如是猫、是狗、或是其他的什么物体。对于图片这类数据,原始特征和类别是显而易见的,为了能够对给定的图片输出类别,只需要训练好CNN中的参数即可,网络中任意一隐藏层都可以看作是该图片的一个embedding,因为通过这一embedding可以得到最终它所属的分类,也就是embedding蕴含了一个图片的类别信息。然而,有一些对于计算机而言抽象的特征是无法直接描述的,就比如自然语言处理领域,每一个单词,在高级语言中对应一个字符串,这种字符串本身对计算机来说是不具有任何信息的,在这种情况下,想去把握词与词之间甚至是上下文之间的关系是异常困难的,对照CNN处理图片,NLP中词语本身往往不具有一个明确的类,并且本身的字符串不能够作为很好的表示不同词各自所蕴含的信息,因此不能照搬CNN处理图像的方式去处理词语。NLP词与词之间的关系等往往是蕴含在上下文之中的,因此在word2vec的思想中,对每个词都给予一个完全不相同的随机向量,维度自定,目的是能够通过训练得到一个蕴含上下文关系的词向量,比如使用上下文中的10个词作为一组,并使用其中9个词的随机向量得到另一个词的实际编码,或者是使用一个词能够得到其他9个词的实际编码,并不断更新随机向量,最终得到的词向量就是我们需要的词embedding,蕴含了上下文的关系信息,但是embedding中的各个维度代表什么我们是无法说明的,是一种抽象含义。可能会想,不同单词在底层机器语言里肯定是0101这样子的代码,直接将其看成向量,不要随机给向量训练不可以吗,答案是当然可以,但是如果能以更低维度的向量训练出更好的词表示不是更好吗?其次就是训练目标是什么,每一步的训练目标都是希望能够得到目标词的表示,目标词的表示是唯一的,常见的表示方法有one-hot、Huffman等。还会想,既然目标词仍然是一个表示,并且是唯一的,那为什么不用底层的二进制编码作为标准呢?我认为要明确一点就是想要得到含有上下文信息的词embedding那么必须一个基准,训练中的初试embedding的维度可以是任意的,这个基准当然也可以是底层的二进制编码。那么提出one-hot、Huffman等方法的目的在于,使用这些方式作为训练目标,使得训练会更加的简单,比如one-hot,随机embedding经过映射后,只需要使用softmax方法激活,其中向量中最大的值,就表示为1,那么就很容易的表示出经过映射得到的是哪一个具体的单词,如果用其他的表示,映射过程不好设计,Huffman的目的则是在one-hot的基础上,缩减了需要训练的参数的数量。训练设计分为了skip-gram一到多的映射和cbow多到一的映射。

通过上面对词embedding的解释,我们可以很容易的将这种过程迁移到图上,图结构中的每一个节点,他们有连边,但是它们在邻接矩阵上只有1或者0,假如说每个节点还具有各自的特征,比如交通网络每个节点具有车流量、人流量等特征,它可以作为一个节点的特征向量,但是这一特征向量本身去做类似CNN处理图像的工作室毫无意义的,想要知道的是节点之间的相互影响,这就类似于词与词之间的上下文联系。那么想要得到节点的embedding可以参考词embedding的训练过程。当然对于图结构的训练远不止这一种方法,但是万变不离其本来的内涵,就是它们的embedding都不是一开始就有的,是需要通过其他的节点学习的,只是学习过程的设计会有不同

你可能感兴趣的:(GNN学习笔记)