bert4keras icon indicating copy to clipboard operation
bert4keras copied to clipboard

多任务学习要如何固定输出层的参数

Open WMeng1 opened this issue 1 year ago • 2 comments

提问时请尽可能提供如下信息:

基本信息

  • 你使用的操作系统:
  • 你使用的Python版本:
  • 你使用的Tensorflow版本:
  • 你使用的Keras版本:
  • 你使用的bert4keras版本:
  • 你使用纯keras还是tf.keras:
  • 你加载的预训练模型:

核心代码

# 请在此处贴上你的核心代码。
# 请尽量只保留关键部分,不要无脑贴全部代码。

bert = build_transformer_model(config_path, checkpoint_path, model='albert', return_keras_model=False) output=bert.model.output

output1 = GlobalPointer(len(categories), 64, name='output_1')(output) output2 = GlobalPointer(len(categories), 64, name='output_2')(output)

model = Model(bert.input, outputs=[output1, output2]) model.summary()

model.compile( loss={'cls_output':'global_pointer_crossentropy', 'ner_output':global_pointer_crossentropy}, optimizer=Adam(learning_rate), loss_weights={'output_1':1, 'output_2':1} ) data_generator中yield [batch_token_ids,batch_token_ids],[batch_ner_labels1,batch_ner_labels2]

这是基于bert4keras改的一个简单的多任务学习demo,想实现的效果就是多个ner一起训练。想请教苏神一个问题就是,如果我现在有三组同领域下的样本数据,各自标签的定义有交叉有包含也有单独属于各自样本的标签,想做多任务学习的话,要怎么设置才能做到第一组数据训练时只更新它所对应的输出层参数,第二组数据训练时只更新其对应的输出层参数呢,需要对标签做什么处理?换言之,如果是这类问题,是否适合用多任务学习,还是说三组样本分别训练各自的模型更合适呢;希望苏神有时间帮忙解答一下,谢谢。

输出信息

# 请在此处贴上你的调试输出

自我尝试

不管什么问题,请先尝试自行解决,“万般努力”之下仍然无法解决再来提问。此处请贴上你的努力过程。

WMeng1 avatar Mar 01 '23 06:03 WMeng1

第一组指的是第一个batch,还是batch内的第一个样本?

bojone avatar Mar 24 '23 02:03 bojone

可能是我描述的有点歧义了,大概就是说,现在有n个相同领域内的数据集,但是每个数据集指定的输出有所不同,拿实体识别举例,比如第一个数据集共包含3类实体,实体1,实体2,实体3,第二个数据集包含5类实体,除了实体1,2,3之外还有实体4和实体5,第三个数据集中的实体又包含三类实体,实体2,实体3,实体4;也就是各自的输出不同但是同属一个领域,这种场景适合用多任务学习么? 第二个问题是:如果可以的话,bert4keras怎么处理这类问题呢,我尝试了一下 yield [batch_token_ids,batch_token_ids],[batch_ner_labels1,batch_ner_labels2] 也就是一条样本数据如果同时有两个任务的标签形式做多任务学习是可以的,但是如果每类数据集只包含自己任务的标签要怎么处理呢,也就是

[batch_token_ids1,batch_token_ids1],batch_ner_labels1,
[batch_token_ids2,batch_token_ids2],batch_ner_labels2

想要融合进一起学习要如何调整我的训练方式呢

第一组指的是第一个batch,还是batch内的第一个样本?

WMeng1 avatar Mar 25 '23 03:03 WMeng1