Embedding工作方式
在处理序列化数据时,非常常用的一种方法就是通过向量编码的方式将序列中的每一个项目,映射为一个定长的向量。通过模型训练,不断地调整向量的值,使得所有的向量最终收敛在一个固定的值,这个时候的向量值就可以用来准确的反映项目间的关系了。
假设我们现在有一个图,这个图中有v1-v6一共6个节点。并且有这些节点通过随机游走组成的序列数据:
v1, v2, v3, v1, v6, v4
v2, v1, v3, v5, v4, v6
v3, v1, v2, v3, v1, v2
v4, v5, v3, v1, v6, v4
v5, v3, v5, v4, v3, v5
v6, v4, v3, v2, v3, v5
我们需要利用这些数据将v1-v6这6个节点之间的相似关系挖掘出来。
初始化向量
第一步是为每一个节点分配一个向量。对于这6个节点,我们可以根据一种规则先随机为它们初始化一个向量值。比如,我们将向量的长度设定为3,每一维的初始化大小设定在[-1, 1]的区间里,为随机生成的向量在这个区间里服从均匀分布。则初始化的结果可能为:
v1 = [0.5, 0.2, -0.1]
v2 = [0.3, 0.9, 0.8]
v3 = [-0.2, -0.8, 0.1]
v4 = [-0.2, 0.9, 0.8]
v5 = [0.8, 0.7, 0.8]
v6 = [-0.9, -1.0, 0.2]
训练向量模型
有了序列化数据和初始化的向量后,可以选择一个为序列化数据进行向量编码的模型学习这些序列化数据。最常见的模型是word2vec,它的工作原理是,选择一个中心节点,仅获取该节点两侧一个固定窗口大小内的序列数据,这些相邻较近的节点具有将强的相关性,因此可以通过中心节点的向量预测两侧节点的向量,或者通过两侧节点的向量预测中心节点的向量。
这里选择窗口大小为1,通过两侧节点预测中心节点。
对于第一个序列v1, v2, v3, v1, v6, v4而言,起始的中心节点为v1,仅右侧有节点v2,则训练数据就是用v2的向量预测v1。
目标值 = v1 = [0.5, 0.2, -0.1]
预测值 = v2 = [0.3, 0.9, 0.8]
残差为目标值 - 预测值 = [0.2, -0.7, -0.9]
残差代表着使用当前向量进行预测产生的误差,因此应当根据残差调整v2,假设学习率为0.5,则此时v2应该进行如下调整:
v2 = v2 + 残差 * 学习率 = [0.3, 0.9, 0.8] + [0.2, -0.7, -0.9] * 0.5 = [0.4, 0.55, 0.35]
这样就完成了一次向量的调整。接下来继续选择下个中心节点,也就是序列中的v2,此时左侧为v1,右侧为v3。
目标值 = v2 = [0.4, 0.55, 0.35]
预测值 = v1 + v3 = [0.5, 0.2, -0.1] + [-0.2, -0.8, 0.1] = [0.3, -0.6, 0]
残差 = 目标值 - 预测值 = [0.4, 0.55, 0.35] - [0.3, -0.6, 0] = [0.1, 1.15, 0.35]
更新v1和v3的向量:
v1 = v1 + 残差 * 学习率 = [0.5, 0.2, -0.1] + [0.1, 1.15, 0.35] * 0.5 = [0.55, 0.775, 0.075]
v3 = v3 + 残差 * 学习率 = [-0.2, -0.8, 0.1] + [0.1, 1.15, 0.35] * 0.5 = [-0.15, -0.225, 0.275]
通过这种方式更新完第一条序列v1, v2, v3, v1, v6, v4之后,继续更新后面的五条序列。当所有序列全部训练完之后,用同样的方式再从第一条序列开始继续学习,直到所有向量收敛,或达到最大训练次数为止。
寻找相关节点
假设根据上面的方式最终得到了6个节点的向量,则该向量可以表示节点间的相关性,越相关的节点向量间的欧式距离越近,余弦距离越大。假设我们采用余弦距离作为距离计算方式,当输入v1的向量时,从其他5个向量中寻找余弦距离最大的两个节点,假设是v2和v3,那么这两个节点就是v1最相关的两个节点。