从TensorFlow.js中的universal-sentence-encoder开始,我注意到嵌入中数字的范围不是我所期望的。我原本以为[0-1]或[-1,1]之间会有一些分布,但都看不到。
句子“猫很棒!”这是一个可视化效果,其中每个维度都投影到[-0.5,0.5]的比例上:
这是“我不知道该句子的嵌入方式将是什么样”的可视化形式(我尝试的前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或guide to text embeddings或paper中看不到它,因此不确定是否要深入研究进入培训代码。
colab笔记本示例代码中有一个示例语句:
通用句子编码器嵌入也支持简短的段落。 该段的长度没有严格限制。大概, 时间越长,嵌入就会越“稀释”。
但是对于colab中的所有其他示例,甚至一个单词示例,嵌入的范围都大致相同。
我假设这个范围不仅是任意的,而且对我来说,该范围以0和0为中心确实很有意义,但是我试图理解这个比例是如何实现的。
答案 0 :(得分:2)
通用语句编码器的输出是长度为512的向量,L2范数为(大约)1.0。您可以通过计算内积
进行检查ip = 0
for i in range(512):
ip += message_embeddings[0][i] * message_embeddings[0][i]
print(ip)
> 1.0000000807544893
含义是:
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])
从视觉上看,激发的分布看起来并不均匀,而是偏向极端。