写点什么

(28DW-S8-Day18) 可插拔式知识

用户头像
mtfelix
关注
发布于: 2021 年 03 月 10 日
(28DW-S8-Day18) 可插拔式知识

最近的工作中用到了一个算法机制: 基础模型+插件,还挺有效,细想对人的学习模式也有借鉴之处。

基础模型: 基础知识

在机器学习里面,现在都流行基于预训练模型来启动。

简单理解,就是先用巨量的通用领域数据(比如全互联网的网页)训练一个基础模型,作为启动的基础。

对应到我们人类,就是从胎教到 K12,整整 18 年,再加上大学本科的很多学习,都是属于基础知识的学习。

基础预训练模型的几个特点

参数多:目前的预训练模型,其参数量动辄就上亿级、甚至到 100 亿级。 分层:很多层,一般认为下面层学的是比较通用/基础的知识,上面层学的会比较具象/任务专门化些。

下游微调:领域适应

下游任务使用时,会用具体任务的标注数据再训练一下,称为微调(finetune)。

但这个时候有个问题,预训练模型的参数量巨大,下游任务可能只有千条、万条数据,finetune 这亿级的参数,不相当于是杯水车薪吗?

于是乎,在刚开始,机器学习研发人员(炼丹师、调参师)们就各显神通:

  • 冻结预训练模型的下面 N 层,留下最上面 M 层动态调整

  • 全部冻结预训练模型,上面加个特殊设计的层,参数少点,动态调这个

  • 甚至可能更精妙些,比如一开始冻结/调整某些层,后续到某个阶段调换,然后学习率还要控制好

这一系列的工作,特别繁琐耗时。

这个过程还真没想到如何类比到我们人的学习过程!(大家赐教)

可插拔式模块

这个问题有没有什么优雅的解决方案?

还真有,就是插件化设计

基本思路就是,在预训练模型的每个层之间插入一个新设计的层(类似一个插件),参数量一般只有每个层的百分之几。这个很好办到,就是用一个瓶颈网络就能做到:

正常的前馈网:e.g. 100->100: 一万个参数 瓶颈网络: e.g. 100->10->100: 2k 的参数

然后呢,在下游任务训练时,就可以只训练这些插件层,效率贼高。

关键是,还可以插拔式替换,就是 ti 任务就用 pi 插件,基础模型都一样。

如果要搞 1000 个 saas 服务,每个服务对应一个识别任务,那这种方式就用一个基础模型加 1000 个插件就可以配出来。

我们人类如果也可以插件式学习,以及处理问题是不是很牛?

在哪些场景我们就是怎么干的?

  • 回老家马上切换方言模型,回城里就普通话?

  • 还有啥?见人说人话,见鬼说鬼话?


发布于: 2021 年 03 月 10 日阅读数: 29
用户头像

mtfelix

关注

内心平静是一生的追求 2018.01.17 加入

简单的技术人

评论

发布
暂无评论
(28DW-S8-Day18) 可插拔式知识