RNN 语言模型的 Keras 实现中输入和输出层的大小

Size of input and output layers in Keras implementation of an RNN Language Model

作为我论文的一部分,我正在尝试构建一个循环神经网络语言模型。

从理论上讲,我知道输入层应该是一个单热向量层,其神经元数量等于我们词汇表的单词数量,然后是一个嵌入层,在 Keras 中,显然转换为顺序模型中的单个嵌入层。我也知道输出层也应该是我们词汇表的大小,让每个输出值1-1映射到每个词汇表单词。

但是,在嵌入层的 Keras 文档中 (https://keras.io/layers/embeddings/) and in this article (https://machinelearningmastery.com/how-to-develop-a-word-level-neural-language-model-in-keras/#comment-533252),输入层和输出层的词汇表大小都任意增加了一个! Jason 给出了一个解释,这是由于 Keras 中嵌入层的实现,但这并不能解释为什么我们还要在输出层中使用 +1 神经元。我正想根据概率对下一个可能的词进行排序,但我有一个概率太多,以至于我也不知道将其映射到哪个词。

有谁知道达到预期结果的正确方法是什么? Jason 是不是忘了从输出层中提取一个,而嵌入层出于实现原因只需要 +1(我的意思是官方 API 中有说明)?

任何有关该主题的帮助将不胜感激(为什么 Keras API 文档如此简洁?)。

编辑:

这个 post 让我觉得 Jason 实际上确实错了,当我们的单词索引是:0, 1, ..., n-1.

然而,当使用 Keras 的 Tokenizer 时,我们的单词索引是:1, 2, ..., n。在这种情况下,正确的做法是:

  1. 设置 mask_zero=True,以区别对待 0,因为从来没有 Embedding层中的0(整数)索引输入并保持 词汇量与词汇量相同 (n)?

  2. 设置 mask_zero=True 但将词汇量增加一个?

  3. 未设置mask_zero=True并保持词汇量与 词汇量?

我们添加 +1 的原因是我们有可能在测试或生产过程中遇到一个看不见的词(在我们的词汇表中),通常会考虑那些未知的通用术语这就是为什么我们在前面添加一个 OOV 单词,它类似于所有词汇表中的单词。 在 github 上检查此问题,其中详细解释了它:

https://github.com/keras-team/keras/issues/3110#issuecomment-345153450