[python] Что делает функция tf.nn.embedding_lookup?


Answers

Да, эту функцию трудно понять, пока не получите смысл.

В простейшей форме он похож на tf.gather . Он возвращает элементы params соответствии с индексами, указанными ids .

Например (если вы находитесь внутри 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] , потому что первый элемент (индекс 0) параметров равен 10 , второй элемент параметров (индекс 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 соответствует первому элементу третьего тензора и т. Д. Просто индекс i соответствует первому элементу тензора (i + 1) th для всех индексов 0..(n-1) , считая params - список n тензоров.

Теперь индекс n не может соответствовать тензору n + 1, поскольку параметры списка содержат только 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]
Question
tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None)

Я не могу понять обязанности этой функции. Это похоже на таблицу поиска? Что означает возврат параметров, соответствующих каждому id (в ids)?

Например, в модели skip-gram если мы используем tf.nn.embedding_lookup(embeddings, train_inputs) , то для каждого train_input он находит соответствующее вложение?




Поскольку я был также заинтригован этой функцией, я дам свои два цента.

То, как я вижу это в 2D-случае, - это как матричное умножение (его легко обобщить на другие измерения).

Рассмотрим словарь с N символами. Затем вы можете представить символ x в виде вектора размеров Nx1, с одним горячим кодированием.

Но вы хотите, чтобы представление этого символа не было вектором Nx1, а как одно с размерами Mx1, называемое y .

Итак, чтобы преобразовать x в y , вы можете использовать и внедрить матрицу E с размерами MxN:

y = E x .

Это по существу то, что делает tf.nn.embedding_lookup (params, ids, ...), с нюансом, что ids - это только одно число, которое представляет положение 1 в векторе x с горячим кодированием.




Когда тензор параметров находится в высоких размерах, идентификаторы относятся только к верхнему размеру. Возможно, это очевидно для большинства людей, но я должен запустить следующий код, чтобы понять это:

embeddings = tf.constant([[[1,1],[2,2],[3,3],[4,4]],[[11,11],[12,12],[13,13],[14,14]],
                          [[21,21],[22,22],[23,23],[24,24]]])
ids=tf.constant([0,2,1])
embed = tf.nn.embedding_lookup(embeddings, ids, partition_strategy='div')

with tf.Session() as session:
    result = session.run(embed)
    print (result)

Просто попробовав стратегию «div» и для одного тензора, это не имеет никакого значения.

Вот результат:

[[[ 1  1]
  [ 2  2]
  [ 3  3]
  [ 4  4]]

 [[21 21]
  [22 22]
  [23 23]
  [24 24]]

 [[11 11]
  [12 12]
  [13 13]
  [14 14]]]



Links