TensorFlow Universal Sentence Encoder Lite 嵌入的范围有限?

Limited range for TensorFlow Universal Sentence Encoder Lite embeddings?

从 TensorFlow.js 中的 universal-sentence-encoder 开始,我注意到嵌入中数字的范围不是我所期望的。我期待 [0-1] 或 [-1,1] 之间的一些分布,但没有看到其中任何一个。

对于句子 "cats are great!" 这是一个可视化,其中每个维度都投影到从 [-0.5, 0.5]:

的尺度上

这是 "i wonder what this sentence's embedding will be" 的同一种可视化(模式与我尝试的前 ~10 个句子相似):

为了调试,我查看了demo Colab notebook中是否出现了同样的事情,似乎是这样。这是我看到的这两个句子的嵌入范围:

# 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]

所以这又不是我所期待的 - 范围比我预期的要窄。我认为这可能是我错过的 TF 约定,但在 TFHub page or the guide to text embeddings or in the paper 中看不到它,所以我不确定在不深入研究训练代码的情况下还能去哪里查看。

colab notebook 示例代码有一个例句说:

Universal Sentence Encoder embeddings also support short paragraphs. There is no hard limit on how long the paragraph is. Roughly, the longer the more 'diluted' the embedding will be.

但是嵌入的范围对于 colab 中的所有其他示例大致相同,即使是一个单词示例。

我假设这个范围不仅仅是任意的,而且我觉得这个范围以零和小为中心确实有意义,但我试图理解这个比例是如何形成的。

通用句子编码器的输出是一个长度为 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])

从视觉上看,激发的分布看起来并不均匀,而是偏向极端。