对词嵌入的初步理解
之前再看《python深度学习》的时候,对于词嵌入的理解并不透彻,对于那些晦涩难懂的专业描述也是走马观花式的一瞅而过,最近在读关于推荐算法的论文时遇到了图嵌入相关的问题,看的是一头雾水,于是又回归到了初始问题,什么是词嵌入,word2wec又是什么,图嵌入又是什么。
在网上查了很多资料,发现大部分人的描述跟书本上一样晦涩,可能是我的理解能力并没有达到一定的标准,所以对他们的描述比较抵抗,现引用如下:
Embedding 在数学上表示一个映射关系, F: X -> Y, 也就是一个函数。函数具有两个性质:injective 和 structure-preserving。Injective,即我们所说的单射函数,对于每个 Y 只有唯一的 X 对应,反之亦然;structure-preserving,结构保存,比如在 X 所属的空间上 X1 < X2,那么映射后在 Y 所属空间上 Y1 < Y2。
简单点说,深度学习中,Embedding 特指用一个低维度向量表示一个实体,可以是一个词(Word2Vec),可以是一个物品(Item2Vec),亦或者网络关系中的节点(Graph Embedding)。
Embedding 所获得的低维度向量具有一些特殊的性质。如下图,我们使用 Word2Vec 将单词映射(word embedding)到新的向量空间,获得单词的新的表达(word representation)。我们能从图中很容易得出:Embedding(Moscow) - Embedding(Russia) ≈ Embedding(Tokyo) - Embedding(Japan),说明 Embedding 之后向量可以进行计算。并且,Embedding 之后,距离相近的向量对应的实体有相近的含义,比如 Embedding (Russia) 和 Embedding (Japan) 之间的距离就会很接近,但 Embedding (Russia) 和 Embedding (Tokyo) 的距离就会远一些。
看完之后我只想说,简单在哪……完全不懂这是在在说什么。
one-hot编码还可以简单理解,就是将语料库理解为一个多维向量,对于一个句子而言,哪个单词出现就将哪个位置置1,其他位置保持为0,这样便于神经网络进行处理。但是对于词嵌入的理解一直卡在一个奇怪的地方,就是我知道它主要是将一个多维的词向量映射到了一个低维的向量中,可是具体是怎么做到的呢?
在不断努力查找之后,终于找到了一个比较通俗易懂的回答。
什么是 word embedding? - 李韶华的回答 - 知乎
这个回答对于词嵌入的描述比较简单,但是又很容易明白。
就是将一个词映射到一个低维空间中,可以粗略理解为将这个词转换成低维的空间坐标。比如:
- cat:(-0.065, -0.035,0.019,-0.026,0.085,…)
- dog:(-0.019,-0.076,0.044,0.021,0.095,…)
- table:(0.027,0.013,0.006,-0.023,0.014,…)
注意:上面那个词的坐标和这个图并不匹配,那个词的坐标是多维,这个图是映射到了平面空间之中,但是这两部分都可以参考理解词嵌入。
简单理解词嵌入是干嘛的之后,我们需要知道其中具体的原理和步骤,但是一直没有能够透彻理解,网上大部分教程和博客都写得同样难以下咽,不过终于发现了两篇宝藏文章,讲的通俗易懂,逐字逐句读下去就会明白词嵌入是什么。
word2vec是如何得到词向量的? - crystalajj的回答 - 知乎
下面记录一下我的理解:
如上图所示,我们不管图上标注的字母是什么意思,我们已经知道了各个词可以用one-hot表示,那么对于一个句子中某个词的上下文我们就用one-hot表示出来(假设上下文有三个单词),就是上图中最左侧三列,这个组成了输入层(左边的input layer)。
输入层输入三个词的one-hot表示之后,进入一个全连接层进行学习(图中并没有画出来),其实就是与一个权重矩阵相乘,三个词的one-hot向量分别与这个权重矩阵相乘,得到三个向量(注意!!!!这就是他们各自对应的词向量),将这三个向量进行求和,我们得到了一个向量,这个向量就是中间的隐藏层(中间的hidden layer),也就是其他教程中他们所说的晦涩难懂的词嵌入表示。
得到上下文所对应的词嵌入表示之后,我们再将它送入一个全连接层(图中并没有画出来),同样道理也是与一个权重矩阵相乘,一个向量乘以权重矩阵之后得到一个向量,得到的这个最终的向量其中各部分的数值就是预测词的概率,其中最大的那个数对应的词就是我们预测出来的词,将它与输入中的正确label作比较,误差越小越好。
至此,整个流程就结束了。
对于图嵌入,类似于词嵌入,先通过随机游走法得到一些序列,就如同词嵌入中的句子,而每个节点就类似于词嵌入中的词,于是我们可以通过Skip-Gram来进行学习,根据一个句子中两个词的相互关系来获得一个词的词向量。
这篇文章对于DeepWalk讲得比较清楚:【论文笔记】DeepWalk
参考文章:
本文地址:https://blog.csdn.net/qq_39624083/article/details/108991996
上一篇: 曹操本姓夏侯是真的吗?曹操发达后为什么不恢复其本姓夏侯?
下一篇: 俏皮捣蛋爆笑一句话。