当前位置:首页|资讯|ChatGPT

【花师小哲】鉴定网络热门(?)AI(13)——从旧网络到新网络

作者:花师小哲-中二发布时间:2023-07-27

好久没更新了,最近一些项目处理的差不多了,所以来写一篇专栏,讲讲从一个神经网络到另一个神经网络的一些做法

1.为什么人们追求从一个(旧)网络到另一个(新)网络

说到神经网络,一个很让人头大的问题是,我们想要获得具有某种能力的神经网络,似乎都需要从头设计网络、找数据集、训练。即使是在一些自监督预训练方法出来之后,情况似乎也没有太多好转,无非是大公司先预训练得到模型A,然后模型A在不同数据集上微调得到模型A1、A2等等,A1和A2应对的场合又是不同的。到了ChatGPT为代表的大模型时代,虽然我们似乎可以通过prompt的方式来让大模型输出我们想要的东西,但很多具体问题依然离不开微调。多任务微调虽然很大程度上提升了泛化性能,但依然很难做到面面俱到。

这里存在的很大的问题就是,一个网络的知识是很难完全被另一个网络(特别是架构不同的网络)所继承的,没错,就像我们每个人学知识都要从头开始一样,目前也没办法把别人脑袋中的知识复制给我

如果能做到把一个网络的能力复制给另一个网络,短期来看,能够大量节省训练资源(毕竟新网络是不需要再训练的);长期来看,能够实现一个愿景——机器终身学习。

所以我们下面就来介绍一些探索吧

2.剪枝、量化

剪枝量化的目的实际上都是在让模型变“小”,但是不改变大的网络框架。

关于剪枝可以看这篇专栏:

【花师小哲】当代炼金术(神经网络)前沿(28)——给1750亿参数模型剪枝吧

简单来说,我们一般的神经网络是密集连接的,但这不意味着每个连接实际上都是有用的,所以剪枝的目的就是把不重要或没用的连接给取消掉,从而形成一个稀疏一些的模型,推理速度就上去了。

量化我个人并不是特别熟悉,但基本就是改变数据存储的精度,例如从32位浮点数改到16位浮点数。据说量化是最有效的神经网络加速优化。


但是,大家可以看到,这两种方法基本上是先训练出一个大模型,然后再对这个大模型做优化操作(瘦身)

3.蒸馏、自蒸馏

剪枝和量化基本上只是在给网络瘦身,相对来说不够灵活,也很难在两个结构差别很大的网络架构见传播知识,于是就有了知识蒸馏(后简称蒸馏)

蒸馏有两个网络,一个网络是训练好的,称为教师网络;另一个网络是没训练的或没有充分训练的(或者说待训练的),称为生网络。就像老师教学生一样,学生网络的所有数据都是来自教师网络。

具体来说,就是给定一个输入X,先送给教师网络得到输出Y,然后我们用Y作为X的标签,就可以对学生网络做有监督微调了。

虽说蒸馏一般来讲是大的教师网络蒸馏小的学生网络,但实际上可以非常灵活。对于大模型,也可以专注于蒸馏某一方面的能力,取自己所需。

虽然有时候蒸馏出来的学生网络也会有分布跑偏的问题,但大部分情况下学生网络都能很好地继承教师的性能,并且推理更快。

蒸馏实际上有大量很神奇的玩法,例如我们可以调转方向,让Y作为输入,X作为输出,就可以做到类似反向蒸馏的东西。


当然,蒸馏最神奇的玩法可能就是自蒸馏了。想一想,如果我们让一个网络既作为教师网络、又作为学生网络,会发生什么。如果套用人类的情况,我自己教授自己,那肯定不会产生新的知识嘛,似乎是没什么意义的行为。然而,自蒸馏实际上是能够提升自身性能的,也许可以类比到人类在复习时巩固了知识或“温故而知新”吧。不过至今自蒸馏依然充满了谜团。

4.集成、MoE

不管是量化、剪枝还是蒸馏,实际上性能往往会有所下降(也有上升的情况)。很好理解,毕竟是从一个大网络瘦身或从一个大网络到一个小网络。那有没有反过来的情况呢?有的,那就是“我们联合”——集成

简单来说,就是我们训练N个弱模型,然后集合这N个模型的输出(例如投票、赢者通吃等策略)得到一个总输出。很多情况下,集成可以很大程度上提高性能。

虽然很早就有人用数学方法严格证明了“一些比随机分类器好一点的分类器在集成后都可以成为强分类器”,但集成依然是充满了谜团的方法。

与集成相关的方法就是MoE了,可以参考这篇专栏:

【花师小哲】当代炼金术(神经网络)前沿(16)——语言模型的其他出路

简单来说,就是我们有N个专家网络,每个专家都有擅长的工作,所以我们每次就挑选一些专家“开会”,得到一个结果。从思想上来说和集成差不多,更像是把几个小网络的聚合直接写成了网络架构(MoE可以做到每一层都是集成的形式)


最近很多“小道消息”都在说GPT-4可能是集成模型或MoE架构,这个确实有可能的。但是,有一点需要记住,不是说8个模型的集成就有一个模型的8倍性能,集成虽然很有效,但提升依然是有上限的,并且受到每个被集成模型的性能影响。所以MoE的代价一般来说就是超大的参数量。

5.Net2Net、参数共享

然后我们来介绍一下Net2Net吧。

Net2Net的想法是,我们何必通过从一个训练好的网络中获得输出的形式来传递知识,直接传递网络参数不就好了吗?

做法也很简单,关键思想就是等价,或者说,用一个同样作用的更大的结构取代之间已经训练好的结构(就比如a+2b=a+b+b,这样就从2个节点扩展到3个节点了),然后在此基础上训练,就不需要从头开始训练了。事实证明这种方法极大地节省了训练成本且效果往往比随机初始化更好。

当然,Net2Net也存在很多问题,例如为了打破对称性实际上新权值是需要加干扰的、不是所有的网络架构都是很好找等价网络的方法的等。

Net2Net方法的极致可能是谷歌提出的GradMAX,然而GradMAX依然只能适用于MLPCNN。然而,现在神经网络基本上是Transformer的天下啊。

对于Transformer也不是没人想过办法,一个简单的方法就是StackBERTStackBERT发现不同层的attention矩阵都长得差不多,不同架构的attention矩阵也都长得差不多,基本上注意力都是在周围和开头(说动这里,补充两点吧:1.什么是注意力attention。对于一句话,例如“旺财是一只白色的可爱的小狗”,“旺财”和“狗”的关系明显更紧密,对我们理解句子也最有用,所以Transformer显示计算一个句子中两两词之间关系的密切程度,称为attention;2.最近有一条消息是说Transformer使用softmax可能是一个大bug,建议换成softmax_1,即一个词可能不会和其他单词有任何的关系[可能是写错的词或干扰词],不过考虑到有FT-Transfromer这样的架构,我认为用哪个函数仁者见仁智者见智吧,甚至这波可能还是为了RetNet炒热度,毕竟RetNet声称能代替Transformer并且放弃了softmax),所以我们就简单粗暴地直接复制现有层来进行加深(反正Transformer结构一般都像豆腐一样整齐,操作起来也容易),反正实验做出来有用就好了。

不过在大模型上的尝试实际上并不多。在Deepmind设计的2800亿参数的Gopher(这个模型明明比GPT-3要大,但存在感真的很低)的附录G(这玩意竟然有论文能找到)中提到了Net2Net,并尝试从一个45亿参数模型初始化了一个90亿参数的模型,据说效果比其他方法都好,然而就没有后文了。

另一个做法相似的是一个中文大模型M6-10T,这是我目前见过的最大的模型了,有10T,也就是10万亿参数(GPT-3是1750亿,高了两个数量级),M6-10T采用了MoE架构、Deepspeed加速、512个GPU和类似于StackBERT的方法进行训练,而且这个模型甚至是多模态模型,可以说是buff叠满了(虽然没什么存在感)。不过说是类似于StackBERT,是因为实际上这种方法是用了在《Attention is all you need》中就说过的共享参数,和先训练小模型再用小模型初始化大模型有一些不同。

其他在自回归语言模型上的尝试就没再找到了(毕竟Net2Net本身也不是那么主流的方法,线索到MSG方法的一篇论文就断掉了)

6.模块化

另一个想法就是模块化。之前已经有论文表明神经网络在训练过程中会自己构建一些函数,见:

【花师小哲】当代炼金术(神经网络)前沿(23)——transformer涌现了傅里叶变换

所以我们可以设想,大模型实际上在内部模拟了很多函数,例如做加法的函数、做傅里叶变换的函数、做翻译的函数等等。如果我们能精准识别这些函数,就可以做很多事情,例如做移植、用更高效的部件替换原有结构(用什么结构模拟加法啊,我直接给你做加法的代码)。当然,现在是做不到的,不然就没有蒸馏什么事情了。

但还是有一些论文在模块化的路上做了探索的,例如:

这里不展开太多,基本思路是,我们先训练一个小模型,然后把它切分成N份,每份都用一个大网络取代,得到N个“部分膨胀”的模型,然后我们就可以并行训练这N个“畸形”模型,然后把膨胀后的部分组成一个新的网络。感觉有点像昆虫的变态发育,成虫盘称为各个部分的营养了(比喻不是很准确)

7.总结

总的来说,人们还是想方设法地利用上老模型为新模型做些事情的,但是目前都存在很多问题,大模型训练各自为营的情况可能还要持续很久。


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1