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

Kev*_*son 2 tensorflow word-embedding tensorflow.js tensorflowjs-converter

从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)))
Run Code Online (Sandbox Code Playgroud)

输出显示:

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

Message: sometimes models are confusing
Embedding range: [-0.060731519013643265, 0.06075377017259598]
Run Code Online (Sandbox Code Playgroud)

所以这又不是我期望的-范围比我期望的更窄。我想这可能是一个TF约定,我错过了,但不能看到它的TFHub页面指南,文本的嵌入所以我不知道还有什么地方看不挖入训练码。

colab笔记本示例代码的示例语句显示:

通用语句编码器嵌入也支持短段落。该段的长度没有严格限制。粗略地说,时间越长,嵌入将越“稀释”。

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

我假设这个范围不仅是任意的,而且对我来说范围在零和很小的中心确实很有意义,但是我试图理解这个范围是如何实现的。

Ble*_*Key 5

通用语句编码器的输出是长度为512的矢量,L2范数为(大约)1.0。您可以通过计算内积来检查

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

print(ip)

> 1.0000000807544893
Run Code Online (Sandbox Code Playgroud)

其含义是:

  • 大多数值可能在以零为中心的狭窄范围内
  • 向量中最大的单个值是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])
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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