(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 个插件就可以配出来。
我们人类如果也可以插件式学习,以及处理问题是不是很牛?
在哪些场景我们就是怎么干的?
回老家马上切换方言模型,回城里就普通话?
还有啥?见人说人话,见鬼说鬼话?
版权声明: 本文为 InfoQ 作者【mtfelix】的原创文章。
原文链接:【http://xie.infoq.cn/article/d1f21a97d46bf32fd1d322c69】。文章转载请联系作者。
评论