【问题标题】:Feed Forward Neural Network Language Model前馈神经网络语言模型
【发布时间】:2021-02-05 09:14:17
【问题描述】:

我目前正在尝试使用 TensorFlow 2.0 开发前馈神经网络 n-gram 语言模型。为了清楚起见,我不希望通过循环神经网络来实现,我只是想使用一些 Dense 层和一个 Softmax 层来实现这一点。 这是我使用的参考;还概述了模型的架构, https://www.researchgate.net/publication/301875194_Authorship_Attribution_Using_a_Neural_Network_Language_Model

但是,当我尝试执行此操作时,我不断收到错误消息。下面给出的是我的模型,

tf.keras.optimizers.Adam(learning_rate=0.01)
model = tf.keras.Sequential([
                             tf.keras.layers.Embedding(total_words, 300, weights = [embeddings_matrix], input_length=inputs.shape[1], trainable = False),
                             tf.keras.layers.Dense(100, activation = 'relu'),
                             tf.keras.layers.Dense(total_words, activation = 'softmax')
])

model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

这段代码运行时,我得到的错误如下,

ValueError: Shapes (None, 7493) and (None, 116, 7493) are incompatible

谁能告诉我如何解决这个问题?我有点困惑。

【问题讨论】:

    标签: python tensorflow neural-network language-model


    【解决方案1】:

    在您链接的论文中,该小组的目标是在考虑源词的上下文的同时进行词对词的翻译。因此,网络的输入是一堆单词——上下文。您的小批量单词堆栈应该具有​​维度batch x input_length 并包含(整数)索引,因为嵌入层基本上是一个查找表(例如,在输入“5”上返回其权重的第五行)。 这与论文有些不同,论文的输入似乎是 one-hot 编码向量。

    由于嵌入层为输入中的每个整数返回一个矩阵行,因此它将输出大小为 (batch, input_length, 300) 的张量,其中 300 是您的嵌入大小。

    您的第二层(relu 激活的 Dense)现在会将其转换为大小为 (batch, input_length, 100) 的张量,保持 input_length 维度不变。 TF-Keras 中的密集层在输入的最后一个轴上变换,所以在你的第一个密集层中,一堆大小为 1 x 1 x 300 的子张量将被转换为大小为 1 x 1 x 100,然后沿着维度 0 和 1 连接。同样的事情也会发生在你的第二个 Dense 中。

    由于您不想预测上下文中的所有单词,因此您必须“摆脱”input_length 维度。在论文中,嵌入被堆叠以产生大小为batch x (input_length*embedding_size) 的张量,然后将其馈送到密集层。他们在第 1 页的最后一段中对此进行了描述。

    Embedding 和 Dense 之间的 Flatten()-layer 应该可以在您的实现中发挥作用,因为它会压缩所有维度(批量维度除外)。然后,第一个 Dense 会得到一个batch x (input_length*300) Tensor,第二个 Dense 会得到一个batch x 100 Tensor,模型会输出一个batch x total_words Tensor。

    在您的实现中,我猜这应该包含每个批处理条目的单词的单热编码。这就是他们在论文中使用的方法,也是分类交叉熵有意义的地方。

    顺便说一句,在嵌入层中设置权重已被弃用 - 您应该使用 embeddings_initializer=tf.keras.initializers.Constant(embeddings_matrix)

    编辑:进一步澄清尺寸,这不适合评论

    【讨论】:

    • 嗨蒂姆,谢谢你的回答。您能否提供更多信息,说明输入的大小在这些层之间如何变化,以及为什么需要连接嵌入?
    • 您好 Minura,请参阅我对原始答案所做的编辑。如果您还有其他问题,请告诉我。