我正在尝试为我的层次数据实现Facebook(Link)文章中讨论的庞加莱嵌入,你可能会找到一个更容易理解的庞加莱嵌入here的解释。
基于这篇论文,我在Tensorflow Addons中找到了一些Tensorflow here和here以及tfa.layers.PoincareNormalize的实现,后者甚至有一个指向上面提到的论文的链接,这让我相信这对我来说是一个很好的起点。我没有运气实现tfa.layers。PoincareNormalize到目前为止,也找不到任何文档,除了我链接的API页面上的一些通用信息。
有人知道这层应该如何实现来提供本文中讨论的双曲空间中的嵌入吗?我的出发点是一个标准嵌入层的实现,如下所示(它实际上是一个分类变量的实体嵌入)?
input = Input(shape=(1, ))
model = Embedding(input_dim=my_input_dim,
output_dim=embed_dim, name="my_feature")(input)
model = Reshape(target_shape=(embed_dim, ))(model)
model = Dense(1)(model)
model = Activation('sigmoid')(model)
简单地用tfa.layers替换嵌入层。Poincare Normalize由于不同的输入而不起作用。我假设它可以放在嵌入层之后的某个地方,这样对于反向传播步骤,“值”在每次迭代时都被投影到双曲空间中,但到目前为止也没有运气。
1条答案
按热度按时间blmhpbnm1#
庞加莱嵌入
然而,复杂的符号数据集通常表现出潜在的层次结构,最先进的方法通常学习嵌入在欧氏向量空间,这并没有考虑到这一性质。为此,我们引入了一种新的方法来学习符号数据的层次表示嵌入到双曲空间-或更准确地说,到一个n维庞加莱球。
庞加莱嵌入允许你在非欧几里德空间中创建层次嵌入。庞加莱球外部的向量与中心的向量相比层次较低。
欧氏度量Tensor到黎曼度量Tensor的Map是一个开d维单位球。
该非欧几里德空间中2个向量之间的距离计算如下
research paper for Poincaré embeddings写得很好,你也会在流行的库中找到一些很好的实现,不用说,它们被低估了。
您可以使用的两个实现位于-
tensorflow_addons.PoincareNormalize
gensim.models.poincare
Tensorflow插件实现
根据文档,对于1DTensor,
tfa.layers.PoincareNormalize
沿轴= 0计算以下输出。对于更高维度的Tensor,它独立地沿维度轴归一化每个1-D切片。
这种变换可以简单地应用于n维嵌入,让我们为时间序列的每个元素创建一个5维嵌入,在这种情况下,维轴= -1,这是从欧氏空间Map到非欧氏空间。
x一个一个一个一个x一个一个二个x
Gensim实现
庞加莱嵌入的另一个实现可以在Gensim中找到。它非常类似于您在Gensim中使用Word2Vec时所使用的。
整个过程是-
1.训练Gensim嵌入(word2vec或poincare)
1.使用嵌入初始化Keras中的嵌入图层
1.将嵌入图层设置为不可训练
1.下游任务的培训模型
一个三个三个一个
关于训练和保存庞加莱嵌入的更多细节可以在here中找到。