Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 如何实现Poincaré;使用tfa.layers.PoincareNormalize的嵌入?_Tensorflow_Embedding_Hyperbolic Function - Fatal编程技术网

Tensorflow 如何实现Poincaré;使用tfa.layers.PoincareNormalize的嵌入?

Tensorflow 如何实现Poincaré;使用tfa.layers.PoincareNormalize的嵌入?,tensorflow,embedding,hyperbolic-function,Tensorflow,Embedding,Hyperbolic Function,我正试图实现Poincaré嵌入,正如Facebook()在一篇论文中针对我的分层数据所讨论的那样。您可能会找到一个更容易理解的庞加莱嵌入解释 基于本文,我发现了Tensorflow和Tensorflow插件的一些实现。后者甚至与上面提到的论文有一个链接,这让我相信这对我来说是一个很好的起点。但是,到目前为止,我还没有实现tfa.layers.PoincareNormalize,除了我链接的API页面上的一些通用信息之外,我也找不到任何文档 有人知道该层应该如何实现,以提供本文讨论的双曲空间中的

我正试图实现Poincaré嵌入,正如Facebook()在一篇论文中针对我的分层数据所讨论的那样。您可能会找到一个更容易理解的庞加莱嵌入解释

基于本文,我发现了Tensorflow和Tensorflow插件的一些实现。后者甚至与上面提到的论文有一个链接,这让我相信这对我来说是一个很好的起点。但是,到目前为止,我还没有实现tfa.layers.PoincareNormalize,除了我链接的API页面上的一些通用信息之外,我也找不到任何文档

有人知道该层应该如何实现,以提供本文讨论的双曲空间中的嵌入吗?我的出发点是一个具有如下所示的标准嵌入层的实现(它实际上是一个类别变量的实体嵌入)

由于输入不同,仅用tfa.layers.PoincareNormalize替换嵌入层不起作用。我假设可以将其放置在嵌入层之后的某个位置,这样对于反向传播步骤,“值”在每次迭代时都会投影到双曲空间中,但到目前为止也没有运气。

Poincaré嵌入 然而,虽然复杂的符号数据集通常表现出潜在的层次结构,但最先进的方法通常学习欧几里德向量空间中的嵌入,而欧几里德向量空间不考虑这一特性。为此,我们引入了一种新方法,通过将符号数据嵌入到双曲空间,或者更准确地说嵌入到n维庞加莱球中,来学习符号数据的层次表示

Poincaré嵌入允许您在非欧几里德空间中创建分层嵌入。庞加莱球外侧的向量在层次结构上低于中心的向量

将欧几里德度量张量映射为黎曼度量张量的变换是一个开放的d维单位球

该非欧几里德空间中2个向量之间的距离计算如下:

这本书写得非常好,您也会在流行的库中找到一些非常好的实现。不用说,它们被低估了

在中可以找到两个可以使用的实现-

  • tensorflow\u addons.PoincareNormalize
  • gensim.models.poincare
Tensorflow插件的实现 根据文档,对于一维张量,
tfa.layers.PoincareNormalize
沿轴=0计算以下输出

          (x * (1 - epsilon)) / ||x||     if ||x|| > 1 - epsilon
output =
           x                              otherwise
对于高维张量,它沿着维轴独立地归一化每个一维切片

这种变换可以简单地应用于n-DIM的嵌入。让我们为时间序列的每个元素创建一个5维的嵌入。在这种情况下,尺寸轴=-1,从欧几里德空间映射到非欧几里德空间

from tensorflow.keras import layers, Model, utils
import tensorflow_addons as tfa

X = np.random.random((100,10))
y = np.random.random((100,))


inp = layers.Input((10,))
x = layers.Embedding(500, 5)(inp)
x = tfa.layers.PoincareNormalize(axis=-1)(x)  #<-------
x = layers.Flatten()(x)
out = layers.Dense(1)(x)

model = Model(inp, out)
model.compile(optimizer='adam', loss='binary_crossentropy')
utils.plot_model(model, show_shapes=True, show_layer_names=False)

model.fit(X, y, epochs=3)
可以找到有关培训和保存庞加莱嵌入的更多详细信息

from tensorflow.keras import layers, Model, utils
import tensorflow_addons as tfa

X = np.random.random((100,10))
y = np.random.random((100,))


inp = layers.Input((10,))
x = layers.Embedding(500, 5)(inp)
x = tfa.layers.PoincareNormalize(axis=-1)(x)  #<-------
x = layers.Flatten()(x)
out = layers.Dense(1)(x)

model = Model(inp, out)
model.compile(optimizer='adam', loss='binary_crossentropy')
utils.plot_model(model, show_shapes=True, show_layer_names=False)

model.fit(X, y, epochs=3)
Epoch 1/3
4/4 [==============================] - 0s 2ms/step - loss: 7.9455
Epoch 2/3
4/4 [==============================] - 0s 2ms/step - loss: 7.5753
Epoch 3/3
4/4 [==============================] - 0s 2ms/step - loss: 7.2429
<tensorflow.python.keras.callbacks.History at 0x7fbb14595310>
from gensim.models.poincare import PoincareModel

relations = [('kangaroo', 'marsupial'), ('kangaroo', 'mammal'), ('gib', 'cat'), ('cow', 'mammal'), ('cat','pet')]

model = PoincareModel(relations, size = 2, negative = 2)  #Change size for higher dims
model.train(epochs=10)

print('kangroo vs marsupial:',model.kv.similarity('kangaroo','marsupial'))
print('gib vs mammal:', model.kv.similarity('gib','mammal'))

print('Embedding for Cat: ', model.kv['cat'])
kangroo vs marsupial: 0.9481239343527523
gib vs mammal: 0.5325816385250299

Embedding for Cat:  [0.22193988 0.0776986 ]