bert多任务

目录

 

前言

方案

encoder完全共享

Conditional Layer Normalization

训练方式


前言

bert多任务可以应用在多种场景。(1)主辅任务:比如我们当前进行任务A,但是我们可以构造一个辅助任务B一起参与训练,来达到提高任务A性能的目的,笔者之前做过阅读理解任务,通过构建一个mlm辅助任务可以提高任务A,(2)还有的场景是:本身就需要进行多个任务,比如ABC,一样重要,但任务类型相似,如果分开训练,那么就需要3个模型,可不可以共享一个模型呢?即共享大部分参数,差异化小部分参数。本篇就来探讨一些可能需要注意的事情和尝试的方法。供打开思路。

方案

encoder完全共享

就想finetune一样,encoder层完全共享,只在最后一层根据不同任务设计不同层,通过不同任务id,使得数据流向不同的层,整个在实现的时候可能面临一些如下问题:

对于一些动态图框架比如pytorch,这个逻辑可以通过if-else实现。

但对于静态图是没有if-else的,可以通过每次都是一个总loss,但是其实每次只有当前任务的loss有意义,别的任务的loss都是假的,当然现在很多静态图其实也有根据if-else逻辑了,tf/paddle都有即switch_case api可以参考使用。

Conditional Layer Normalization

这个不是完全共享encoder, 而是将Normalization对应的β和γ变成输入条件的函数,根据id来控制,这块代码实现,可以参考苏神的:

https://kexue.fm/archives/7124

同时还介绍了一些其他条件控制方法

bert多任务_第1张图片

而且苏神给出了一些例子:

https://kexue.fm/archives/8337

训练方式

在具体的训练的时候,也可能需要一些情况如下:

(1)各个任务之间混合的比例,到底是多少?

在混合训练的时候,可以采用交替进行即当前batch是任务A,那么下一个batch就是B,依次类推,还可以采用随机抽样,还可以采用有权重抽样等等,到底采用哪种,哪种比较好,还要具体看实际场景。

(2)什么时候停止?

比如主辅任务,当我们的主任务没有停止之前,辅任务就要不停的循环,直到主任务进行完。

当各个任务一样时,就要给所有任务一个flag,只有所有任务的数据集都被遍历过才择机停止,否则其他任务都要陪跑。

(3) 数据集大小不一

各个任务的数据量可能不一样,相差较大,这个其实和(1)(2)应该联合考虑,在不考虑任务重要度的情况下,可以通过抽样来平衡数据集之间的差异,也可以通过增强数据集等手段来平衡。

总之这里很灵活,没有一个定论,看情况。

 

 

 

你可能感兴趣的:(算法)