使用tfhub模块时冻结BERT层

时间:2020-05-15 11:22:38

标签: tensorflow tensorflow-hub bert-language-model tf-hub

作者在此链接click here中说:

import tensorflow_hub as hub
module = hub.Module(<<Module URL as string>>, trainable=True)

如果用户希望微调/修改模型的权重,则必须将此参数设置为True。 因此,我的疑问是,如果将其设置为false,是否意味着我冻结了BERT的所有层,这也是我的意图。我想知道我的方法是否正确。

1 个答案:

答案 0 :(得分:1)

我为您提供了一个多部分的答案。

如何冻结模块

所有这些都取决于优化器的设置方式。 TF1的常用方法是使用TRAINABLE_VARIABLES collection中找到的所有变量将其初始化。 doc for hub.Module关于trainable说:“如果为False,则不会将任何变量添加到TRAINABLE_VARIABLES集合中,...”。因此,,设置trainable=False(显式或默认情况下)会将模块冻结为TF1的标准用法。

为什么不冻结BERT

也就是说,BERT应该进行微调。 paper讨论了基于功能的(即冻结)与微调方法的比较笼统的说法,但是module doc拼写明确指出:“建议对所有参数进行微调。” 这使计算合并输出的最后部分可以更好地适应当前任务中最重要的功能。< / p>

如果您打算遵循此建议,还请注意tensorflow.org/hub/tf1_hub_module#fine-tuning并选择正确的图形版本:BERT在训练期间使用dropout正则化,并且您需要设置hub.Module(..., tags={"train"})来获得。但是对于推断(在评估和预测中),辍学什么也不做,您可以忽略tags=参数(或将其设置为空的set()None)。

Outlook:TF2

您询问了hub.Module(),它是TF1的API,因此我在这种情况下回答了。相同的注意事项适用于TF2 SavedModel格式的BERT。在那里,关于是否设置hub.KerasLayer(..., trainable=True)的一切,但是选择图形版本的需求就消失了(该层拾取了Keras的training状态,并在内部应用了此样式)。

培训愉快!