JayYip / m3tl

BERT for Multitask Learning
https://jayyip.github.io/m3tl/
Apache License 2.0
545 stars 125 forks source link

想了解一下更具体的训练过程 #42

Closed nefujiangping closed 4 years ago

nefujiangping commented 4 years ago

非常感谢你的repo给我提供了一个学习multi-task的材料。 最近打算使用预训练的bert做文本分类和NER的多任务学习(两个任务输入不同)。我了解到Hard parameter sharing多任务学习有两种训练方式:

我想研究上述两个任务使用联合训练/交替训练时的效果。我看到你文档中写的不同输入时problem参数必须使用 | 。我有两个疑问:

  1. 输入不同时,只能交替训练(使用|,随机采样一个任务)是吗?
  2. 输入相同时,使用&完成的是联合训练;使用|完成的是交替训练?
JayYip commented 4 years ago

你的理解大致上是正确的, 但是这里的交替训练的采样粒度是instance而不是batch

nefujiangping commented 4 years ago

嗯。阅读了一下源码,明白了。

我现在理解是这样的: 假设problem = ‘A|B|C’,训练时,每一个instance (example)会从ABC任务中采样一个,但是ABC三个任务的loss都会计算一下(没被采样到的任务使用的dummy labels),最后对于每一个instance,将没有被采样到的任务的loss置为0。针对一个任务,置为0的实现方式是乘了一个loss_multiplier(shape为(batch_size, ))。

如果我上面的理解是正确的,那么针对某一个任务(比如A),计算一个batch的平均loss时,除以这个batch中A被采样到的次数是否更合理一些呢?而不是除以batch_size。源码中这里使用的reduce_mean。

JayYip commented 4 years ago

我在这里做了一些处理. 假设A在batch中被采样到k次, 那么A的batch loss形状为[k]. 这么处理的话就可以直接做mean, 并且计算效率也会更高.

nefujiangping commented 4 years ago

原来是这样啊,学习了,谢谢你的回复。