Tensorflow 在tf.keras.layers.Embedding中,为什么知道字典的大小很重要?

Tensorflow 在tf.keras.layers.Embedding中,为什么知道字典的大小很重要?,tensorflow,word-embedding,Tensorflow,Word Embedding,与标题相同,在tf.keras.layers.Embedding中,为什么知道字典的大小作为输入维度很重要?在这种设置中,张量的维度/形状如下: 输入张量具有大小[批处理大小,最大时间步长],这样该张量的每个元素都可以有一个介于0到vocab\u大小-1之间的值 然后,来自输入张量的每个值通过一个嵌入层,该嵌入层具有一个形状[vocab\u size,embedding\u size]。嵌入层的输出形状为[批大小、最大时间步数、嵌入大小] 然后,在典型的seq2seq场景中,该3D张量是递归神

与标题相同,在tf.keras.layers.Embedding中,为什么知道字典的大小作为输入维度很重要?

在这种设置中,张量的维度/形状如下:

  • 输入张量具有大小
    [批处理大小,最大时间步长]
    ,这样该张量的每个元素都可以有一个介于
    0到vocab\u大小-1之间的值
  • 然后,来自输入张量的每个值通过一个嵌入层,该嵌入层具有一个形状
    [vocab\u size,embedding\u size]
    。嵌入层的输出形状为
    [批大小、最大时间步数、嵌入大小]
  • 然后,在典型的seq2seq场景中,该
    3D
    张量是递归神经网络的输入
以下是如何在Tensorflow中实现这一点,以便您能够更好地了解:

inputs = tf.placeholder(shape=(batch_size, max_time_steps), ...)
embeddings = tf.Variable(shape=(vocab_size, embedding_size], ...)
inputs_embedded = tf.nn.embedding_lookup(embeddings, encoder_inputs)

现在,嵌入查找表的输出具有
[batch\u size,max\u time\u steps,embedding\u size]
形状。

因为在内部,嵌入层只是一个大小为
的矩阵vocab\u size x embedding\u size
。这是一个简单的查找表:该矩阵的行
n
存储单词
n
的向量

因此,如果你有1000个不同的单词,你的嵌入层需要知道这个数字才能存储1000个向量(作为矩阵)

不要将层的内部存储与其输入或输出形状混淆。
输入形状为
(批处理大小、序列长度)
,其中每个条目都是
[0,vocab\u大小[
范围内的整数。对于这些整数中的每一个,层将返回内部矩阵的对应行(这是大小
嵌入大小
的向量),以便输出形状成为
(批大小,序列长度,嵌入大小)

我认为嵌入层的大小(批大小,序列,嵌入大小)现在应该更好。好的,那么,如果我们输入大小张量[批大小,最大时间步数]和嵌入层的大小[声音大小,嵌入大小],矩阵乘法是如何工作的?因为没有,在嵌入层的顶部有一个简单的查找表,它只检索正确的嵌入。我将发布如何在Tensorflow中实现这个想法。我想我现在明白了,我没有考虑你说的内部存储
embedding()
层只不过是一个嵌入查找表,这对我来说很有意义。DL之外的嵌入来自培训
word2vec
Glove
。TF/Keras'
Embedding()
层的嵌入来自何处(你又说它是一个查找表)??@SergeyBushmanov不确定我是否完全理解你的问题。嵌入可以来自任何你想要的地方。只要它们是以正确形状的矩阵给出的,你就可以用它初始化层。你也可以选择在训练过程中随机初始化和训练它们,就像任何其他层一样。你做对了,谢谢!!!在第一种情况下——作为矩阵给出——我是否正确理解嵌入作为
embeddings\u初始值设定项
param传递,其形状等于
[vocab\u size x embedding\u size]
?我是否也应该将它们设置为“不可训练”?你能用这两种情况的一些代码更新你的答案吗,或者至少用一些详细说明这两种情况的链接(我认为培训嵌入至少需要一些损失函数)。这篇文章用一些有用的链接解释了
Embedding()
层的所有机制。