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
。