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

标签 tensorflow word-embedding tensorflow.js tensorflowjs-converter

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

对于“猫真棒!”这句话这是一个可视化,其中每个维度都投影到 [-0.5, 0.5] 的比例上:

enter image description here

这是“我想知道这句话的嵌入是什么”的同一种可视化(我尝试的前 10 个句子的模式相似):

enter image description here

为了调试,我查看了 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 中看不到它或 guide to text embeddings或在 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])

enter image description here

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

关于tensorflow - TensorFlow Universal Sentence Encoder Lite 嵌入的范围有限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55389456/

相关文章:

python - 联合 Tensorflow 内存使单个 GPU 过载

keras - 文本特征多于1个时如何使用Keras Embedding层

nlp - Word2Vec 中的维度从何而来?

tensorflow - 如何从 Tensorflow.js (.json) 模型转换为 Tensorflow (SavedModel) 或 Tensorflow Lite (.tflite) 模型?

angular - 使用 tensorflowjs 项目运行 yarn watch 时出错

javascript - 如何使用 csv 文件训练 tensorflow.js 模型?

python - 在量化之前将值反量化为原始值

python - 创建临时 keras session ?

python - tensorflow : how to get a list of checkpoints

machine-learning - Caffe 嵌入层输入