【问题标题】:Size of input and output layers in Keras implementation of an RNN Language ModelRNN 语言模型的 Keras 实现中输入和输出层的大小
【发布时间】:2020-08-19 05:19:16
【问题描述】:

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

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

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

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

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

编辑:

这篇Keras embedding layer masking. Why does input_dim need to be |vocabulary| + 2? 的帖子让我觉得 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 并保持词汇大小与 词汇量有多少?

【问题讨论】:

    标签: tensorflow keras neural-network word-embedding language-model


    【解决方案1】:

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

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

    【讨论】:

    • 实际上,使用 Keras 的分词器,如果我想支持 OOV 单词,它会为它们分配一个索引(>=1,特别是 1 索引)。所以,我不认为在 Jason 的模型中,额外的输出和输入神经元对应于 OOV 词,除非我们(非正式地)将 0 索引视为 OOV 词的索引。这意味着应该手动为训练和推理期间的未知单词赋予零索引(我认为 Jason 不会这样做)。
    • 这是可行的。我只需要自己实现标记器的 text_to_sequences() ,这并不复杂。想我会尝试这个,以便索引从 0 开始,并且不会令人困惑。谢谢!也是非常有用的链接。
    • 是的,tokenizer text to sequence 和 sequence to text 真的很方便。
    • 好吧,如果我们的训练数据中有 OOV 词,这是有道理的。但是我的一个想法是这样的。如果我不使用 OOV 标记进行训练,那么我们为什么要(并且永远)我们的模型将 OOV 词预测为下一个词?
    • 另一个令人不安的想法是 Keras 的文档指出嵌入层将正整数作为输入。这是否意味着它不接受零?现在我又困惑了。编辑:没关系,可能是一个糟糕的措辞“不是负整数”,我可以从 mask_zero 的描述中推断出......
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2016-11-09
    • 1970-01-01
    • 2018-08-08
    相关资源
    最近更新 更多