tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None)
Я не могу понять обязанность этой функции. Это как справочная таблица? Что означает вернуть параметры, соответствующие каждому идентификатору (в идентификаторах)?
Например, в skip-gram
модели, если мы используем tf.nn.embedding_lookup(embeddings, train_inputs)
, то для каждого train_input
она находит соответствующее вложение?
Ответы:
embedding_lookup
Функция извлекает строкиparams
тензора. Поведение аналогично использованию индексации с массивами в numpy. Напримерparams
Аргументом может быть также список тензоров, в этом случаеids
он будет распределен среди тензоров. Например, если список 3 тензоров[2, 64]
, поведение по умолчанию является то , что они будут представлятьids
:[0, 3]
,[1, 4]
,[2, 5]
.partition_strategy
управляет тем, какids
распределены среди списка. Разделение полезно для более масштабных задач, когда матрица может быть слишком большой, чтобы ее можно было сохранить в одной части.источник
select_rows
?embedding_lookup
просто предоставляет удобный (и параллельный) способ получения вложений, соответствующих id вids
.params
Тензор, как правило , переменная тс , что узнали как часть процесса обучения - переменная тс , чьи компоненты используются, прямо или косвенно, в функции потерь (например , какtf.l2_loss
) , который оптимизирован с помощью оптимизатора (например , какtf.train.AdamOptimizer
).Да, эту функцию трудно понять, пока вы не поймете смысл.
В простейшем виде он похож на
tf.gather
. Возвращает элементы вparams
соответствии с указанными индексамиids
.Например (если вы внутри
tf.InteractiveSession()
)будет возвращаться
[10 20 30 40]
, потому что первый элемент (индекс 0) params10
, второй элемент params (индекс 1)20
и т. д.Так же,
вернется
[20 20 40]
.Но
embedding_lookup
это больше, чем это.params
Аргумент может быть список тензоров, а не один тензор.В таком случае индексы, указанные в
ids
, соответствуют элементам тензоров в соответствии со стратегией секционирования , где стратегией секционирования по умолчанию является 'mod'.В стратегии «mod» индекс 0 соответствует первому элементу первого тензора в списке. Индекс 1 соответствует первому элементу второго тензора. Индекс 2 соответствует первому элементу третьего тензора и т. Д. Просто индекс
i
соответствует первому элементу (i + 1) -го тензора, для всех индексов0..(n-1)
предполагается, что params является спискомn
тензоров.Теперь индекс
n
не может соответствовать тензору n + 1, потому что списокparams
содержит толькоn
тензоры. Итак индексn
соответствует второму элементу первого тензора. Аналогично, индексn+1
соответствует второму элементу второго тензора и т. Д.Итак, в коде
Индекс 0 соответствует первому элементу первого тензора: 1
Индекс 1 соответствует первому элементу второго тензора: 10
индекс 2 соответствует второму элементу первого тензора: 2
Индекс 3 соответствует второму элементу второго тензора: 20
Таким образом, результатом будет:
источник
partition_strategy='div'
, и получите[10, 1, 10, 2, 10, 20]
, т.е.id=1
это второй элемент первого параметра. В основном:partition_strategy=mod
(по умолчанию)id%len(params)
: индекс параметра в paramsid//len(params)
: индекс элемента в вышеприведенном параметре,partition_strategy=*div*
наоборотДа, цель
tf.nn.embedding_lookup()
функции - выполнить поиск в матрице вложения и вернуть вложения (или, проще говоря, векторное представление) слов.Простая встраиваемая матрица (из shape:)
vocabulary_size x embedding_dimension
будет выглядеть следующим образом. (т.е. каждое слово будет представлено вектором чисел; отсюда и название word2vec )Матрица встраивания
Я разбил вышеупомянутую матрицу встраивания и загрузил только слова, в
vocab
которых будет наш словарь и соответствующие векторы вemb
массиве.Встраивание поиска в TensorFlow
Теперь мы увидим, как мы можем выполнить поиск вложения для произвольного входного предложения.
Посмотрите, как мы получили вложения из нашей исходной матрицы вложения (со словами), используя индексы слов в нашем словаре.
Обычно такой поиск встраивания выполняется первым слоем (называемым уровнем внедрения ), который затем передает эти внедрения уровням RNN / LSTM / GRU для дальнейшей обработки.
Примечание : как правило, словарь также имеет специальный
unk
токен. Таким образом, если токен из нашего входного предложения отсутствует в нашем словаре, то вunk
матрице внедрения будет найден соответствующий индекс .PS Обратите внимание, что
embedding_dimension
это гиперпараметр, который нужно настроить для своего приложения, но популярные модели, такие как Word2Vec и GloVe, используют300
вектор измерения для представления каждого слова.Бонус Чтение word2vec модель скип-грамм
источник
Вот изображение, изображающее процесс встраивания поиска.
Вкратце, он получает соответствующие строки уровня внедрения, заданные списком идентификаторов, и предоставляет его в качестве тензора. Это достигается с помощью следующего процесса.
lookup_ids = tf.placeholder([10])
embeddings = tf.Variable([100,10],...)
embed_lookup = tf.embedding_lookup(embeddings, lookup_ids)
lookup = session.run(embed_lookup, feed_dict={lookup_ids:[95,4,14]})
источник
Когда тензор параметров имеет большие размеры, идентификаторы относятся только к верхнему размеру. Может быть, это очевидно для большинства людей, но я должен запустить следующий код, чтобы понять это:
Просто пробуя стратегию div и для одного тензора, это не имеет значения.
Вот вывод:
источник
Другой способ взглянуть на это - предположить, что выровняли тензоры в одномерном массиве, а затем выполняете поиск
(например, 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]
(i, e) если значение поиска равно 7, например, и у нас есть 3 тензора (или тензор с 3 строками), тогда,
7/3: (Напоминание 1, Коэффициент 2) Так что будет показан 2-й элемент Tensor1, который равен 6
источник
Поскольку эта функция меня тоже заинтриговала, я дам свои два цента.
То, как я это вижу в двумерном случае, является просто умножением матрицы (его легко обобщить в другие измерения).
Рассмотрим словарь с N символов. Затем вы можете представить символ x в виде вектора измерений Nx1 с горячим кодированием.
Но вы хотите представить этот символ не как вектор Nx1, а как вектор с размерами Mx1, который называется y .
Итак, чтобы преобразовать x в y , вы можете использовать и встраивать матрицу E с размерами MxN:
y = E x .
По сути, это то, что делает tf.nn.embedding_lookup (params, ids, ...), с нюансом, что ids - это просто одно число, представляющее позицию 1 в векторе с горячим кодированием x .
источник
Добавление к ответу Ашера Стерна
params
интерпретируется как разбиение большого тензора вложения. Это может быть один тензор, представляющий полный тензор вложения, или список X тензоров, имеющих одинаковую форму, за исключением первого измерения, представляющего тензор вложения с осколками.Функция
tf.nn.embedding_lookup
написана с учетом того, что вложение (params) будет большим. Поэтому нам нужноpartition_strategy
.источник