Ограниченный диапазон для встраиваний универсального кодировщика предложений TensorFlow Lite?

Начиная с универсального кодировщика предложений в TensorFlow. .js, я заметил, что диапазон чисел во вложениях был не таким, как я ожидал. Я ожидал некоторого распределения между [0-1] или [-1,1], но не увидел ни одного из них.

За предложение «кошки молодцы!» вот визуализация, где каждое измерение проецируется на шкалу от [-0,5, 0,5]:

введите здесь описание изображения

Вот такая же визуализация для «мне интересно, каково будет вложение этого предложения» (шаблон аналогичен для первых ~ 10 предложений, которые я пробовал):

введите здесь описание изображения

Для отладки я посмотрел, появляется ли то же самое в демонстрационный блокнот Colab, и похоже, что это так. Вот что я увижу, если увижу диапазон вложений для этих двух предложений:

# NEW: added this, with different messages
messages = ["cats are great!", "sometimes models are confusing"]
values, indices, dense_shape = process_to_IDs_in_sparse_format(sp, messages)

with tf.Session() as session:
  session.run([tf.global_variables_initializer(), tf.tables_initializer()])
  message_embeddings = session.run(
      encodings,
      feed_dict={input_placeholder.values: values,
                input_placeholder.indices: indices,
                input_placeholder.dense_shape: dense_shape})

  for i, message_embedding in enumerate(np.array(message_embeddings).tolist()):
    print("Message: {}".format(messages[i]))
    print("Embedding size: {}".format(len(message_embedding)))
    message_embedding_snippet = ", ".join(
        (str(x) for x in message_embedding[:3]))
    print("Embedding: [{}, ...]\n".format(message_embedding_snippet))
    # NEW: added this, to show the range of the embedding output
    print("Embedding range: [{}, {}]".format(min(message_embedding), max(message_embedding)))

И вывод показывает:

Message: cats are great!
Embedding range: [-0.05904272198677063, 0.05903803929686546]

Message: sometimes models are confusing
Embedding range: [-0.060731519013643265, 0.06075377017259598]

Так что это опять не то, что я ожидал - диапазон более узкий, чем я ожидал. Я подумал, что это может быть соглашение о переходе, которое я пропустил, но не смог увидеть его в Страницу TFHub или руководство по встраиванию текста или в paper, поэтому я не знаю, где еще искать, не копаясь в обучающем коде.

В коде примера записной книжки colab есть примерное предложение, в котором говорится:

Встраивание универсального кодировщика предложений также поддерживает короткие абзацы. Жестких ограничений на длину абзаца нет. Грубо говоря, чем дольше, тем более «разбавленным» будет заливка.

Но диапазон встраивания примерно такой же для всех других примеров в колабе, даже для однословных примеров.

Я предполагаю, что этот диапазон не просто произвольный, и для меня имеет смысл, что диапазон центрирован по нулю и мал, но я пытаюсь понять, как появился этот масштаб.


person Kevin Robinson    schedule 28.03.2019    source источник


Ответы (1)


Результатом универсального кодировщика предложений является вектор длиной 512 с нормой L2 (приблизительно) 1,0. Вы можете проверить это, посчитав внутренний продукт

ip = 0
for i in range(512):
  ip +=  message_embeddings[0][i] * message_embeddings[0][i]

print(ip)

> 1.0000000807544893

Последствия таковы:

  • Большинство значений, вероятно, будут в узком диапазоне с центром около нуля.
  • Максимально возможное единичное значение в векторе - 1.0 - и это может произойти только в том случае, если все остальные значения равны точно 0.
  • Точно так же наименьшее возможное значение -1.
  • Если мы возьмем случайный вектор длиной 512, со значениями, распределенными равномерно, а затем нормализуем его до единичной величины, мы ожидаем увидеть значения в диапазоне, аналогичном тому, который вы видите.
rand_uniform = np.random.uniform(-1, 1, 512)
l2 = np.linalg.norm(rand_uniform)
plt.plot(rand_uniform / l2, 'b.')
axes = plt.gca()
axes.set_ylim([-0.5, 0.5])

введите описание изображения здесь

Визуально распределение возбуждений не выглядит равномерным, а скорее смещено в сторону крайностей.

person BlessedKey    schedule 28.03.2019
comment
Это очень полезно, спасибо! :) Мне все еще интересно, почему это так. Я могу видеть общие вещи о способах нормирования векторов, и некоторые вещи, такие как L2, в вычислительном отношении проще, но мне интересно узнать более конкретно, почему это важно для встраивания текста. Насколько я понимаю, это потому, что существуют дополнительные операции или свойства, которые доказуемо верны только в пространствах, нормированных определенным образом. В частности, кажется, что это может быть связано с гарантиями вывода косинусного подобия в нормированном пространстве L2? - person Kevin Robinson; 29.03.2019
comment
Я не уверен, что есть краткий и закрытый ответ на вопрос почему разработчики алгоритмов выбрали нормализацию L2. Некоторые возможные точки зрения, которые помогли сделать выбор, вероятно, включают: 1. Наличие вывода с постоянной нормой L2 позволяет наложить ограничения на внутренний продукт между любыми двумя встраиваниями, так что можно сказать что-то вроде: эти два входа похожи, потому что их встраивания закрыть в смысле скалярного произведения 2. Легко рассчитать и применить - person BlessedKey; 29.03.2019
comment
Понятно, спасибо за помощь в изучении дополнительной информации! Связанный с этим вопрос для других людей, которые обнаруживают это: stackoverflow.com/questions/32276391/ - person Kevin Robinson; 29.03.2019