allennlp 为什么不在初始短语中添加转换器标记到词汇表?

pgky5nke  于 2个月前  发布在  其他
关注(0)|答案(2)|浏览(30)

昨天我在获取词汇命名空间transformer_tagsvocab_size值时遇到了一个问题。当我在Model初始化短语中使用它时,我发现这个命名空间没有定义。为了解决这个问题,我阅读了源代码的一部分。我发现操作_add_encoding_to_vocabulary_if_neededtokens_to_indices中被调用,直到_train_epoch开始。
这意味着我在词汇中定义的transformer_tags命名空间只能在forward过程中和之后使用。这导致了一个问题,即我无法定义一个线性层,将模型输出转换为vocab_sizelogits。当然,我可以使用from_pretrained_transformer构造函数来获取一个可以在初始化短语中使用的相同命名空间。如果这是计划好的,我想知道在PretrainedTransformerIndexer_add_encoding_to_vocabulary_if_needed的用途是什么。为什么不在PretrainedTransformerIndexer的初始化方法中调用_add_encoding_to_vocabulary_if_needed,这样我们就可以从Model的初始化短语中使用指定的命名空间?
期待您的回复~~ 谢谢

o2gm4chl

o2gm4chl1#

@AkshitaB 这只是一种友好的提醒,确保你没有忘记这个问题😜。

x6h2sr28

x6h2sr282#

PretrainedTransformerIndexer 在其 __init__ 方法中无法看到词汇表。因此我们不能在那里添加它。
原则上,它应该自动发现词汇表。这是在标准化词汇表成为标准做法之前的做法。但是在大数据集上发现词汇表需要很长时间,而且大多数时候已经不再有必要了,所以我们加入了这个技巧来简化词汇表发现的过程。
您是对的,由于这个技巧,您在 Model.__init__() 中看不到整个词汇表。通常,我们将转换器模型的名称传递给 Model.__init__() ,以便它从那里获取所需的内容。但这并不是那么优雅。
如果您有更好的方法,请随时提交 PR。我很乐意审阅!

相关问题