tf.nn.embedding_lookup函数做什么?

tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None) 

我不明白这个function的责任。 这就像查询表吗? 这意味着返回对应于每个id(在ID中)的参数?

例如,在skip-gram模型中,如果我们使用tf.nn.embedding_lookup(embeddings, train_inputs) ,那么对于每个train_input它find相应的embedded?

embedding_lookup函数检索params张量的行。 行为类似于在numpy中使用数组索引。 例如

 matrix = np.random.random([1024, 64]) # 64-dimensional embeddings ids = np.array([0, 5, 17, 33]) print matrix[ids] # prints a matrix of shape [4, 64] 

params论证也可以是张量表,在这种情况下,ID将在张量中分布。 例如给定3 [2,64]张量的列表,默认行为是它们将表示ids:[0,3],[1,4],[2,5]。 partition_strategy控制如何在列表中分配ID。 当matrix可能太大而不能保持一块时,分区对于较大规模的问题是有用的。

是的,这个function很难理解,直到你明白了。

最简单的forms就是类似于tf.gather 。 它根据ids指定的索引返回params的元素。

例如(假设你在tf.InteractiveSession()

 params = tf.constant([10,20,30,40]) ids = tf.constant([0,1,2,3]) print tf.nn.embedding_lookup(params,ids).eval() 

会返回[10 20 30 40] ,因为params的第一个元素(索引0)是10 ,params(索引1)的第二个元素是20等等

同样的,

 params = tf.constant([10,20,30,40]) ids = tf.constant([1,1,3]) print tf.nn.embedding_lookup(params,ids).eval() 

会返回[20 20 40]

embedding_lookup不止这些。 params论证可以是张量的列表 ,而不是单个张量。

 params1 = tf.constant([1,2]) params2 = tf.constant([10,20]) ids = tf.constant([2,0,2,1,2,3]) result = tf.nn.embedding_lookup([params1, params2], ids) 

在这种情况下,在ids指定的索引根据分区策略对应于张量元素,其中默认分区策略是“mod”。

在“mod”策略中,索引0对应于列表中第一个张量的第一个元素。 索引1对应于第二张量的第一个元素。 索引2对应于第三张量的第一个元素,依此类推。 对于所有索引0..(n-1) ,简单地索引i对应于第(i + 1)张量的第一个元素,假定params是n张量的列表。

现在,索引n不能对应于张量n + 1,因为列表params只包含n张量。 因此,索引n对应于第一张量的第二个元素。 类似地,索引n+1对应于第二张量的第二元素等

所以,在代码中

 params1 = tf.constant([1,2]) params2 = tf.constant([10,20]) ids = tf.constant([2,0,2,1,2,3]) result = tf.nn.embedding_lookup([params1, params2], ids) 

索引0对应于第一张量的第一个元素:1

索引1对应于第二张量的第一个元素:10

索引2对应于第一张量的第二个元素:2

索引3对应于第二张量的第二元素:20

因此,结果将是:

 [ 2 1 2 10 2 20] 

另一种看待它的方法是,假设你将张量展平成一维数组,然后你正在执行查找

(例如)Tensor0 = [1,2,3],Tensor1 = [4,5,6],Tensor2 = [7,8,9]

平展张量如下[1,4,7,2,5,8,3,6,9]

现在当你做一个[0,3,4,1,7]的查找,它会发生[1,2,5,4,6]

(例如,如果查找值为7,那么我们有3个张量(或3行张量),那么,

7/3 :(提醒1,商数是2)因此Tensor1的第二个元素将被显示,即6

加上Asher Stern的答案, params被解释为一个大的embedded张量的分割 。 它可以是代表完整embedded张量的单张量,也可以是除第一维以外所有形状相同的X张量列表,代表分片embedded张量。

函数tf.nn.embedding_lookup考虑到embedded(params)会很大的事实。 所以我们需要partition_strategy