最近要开始使用Transformer去做一些事情了,特地把与此相关的知识点记录下来,构建相关的、完整的知识结构体系,
以下是要写的文章,本文是这个系列的第十七篇:
本文是参考文献[1]的阅读笔记。
因为Transformer模型在序列式问题上表现最优,因而论文以Transformer为蓝本进行结构的搜索。这就有几个挑战:
论文采用的方法跟遗传算法与网络结构搜索类似,但是算法中没有age信息。算法流程如下:
对于任何搜索问题来说,搜索空间是必不可少的,对于论文中的任务来说,搜索空间需要保证一点,即当前的Transformer模型在搜索空间中。
搜索空间的结构如图:
这个结构单元跟CV下的NAS类似,都是任选输入,经过操作去合并。但是这里只有一次这样的操作,而CV上的操作则进行五次组成一个block。但在这里跟CV里不一样的是,CV中block学完后重复几次就成了整个网络,而这里则是每个Block都不一样,因而需要学习14个block。其中6个是Encoder的,8个是Decoder的。所以论文的搜索空间是:
[left input, left normalization, left layer, left relative output dimension, left activation, right input, right normalization, right layer, right relative output dimention, right activation] x 14 + [num of cells] x 2。
考虑到每个项的扩展,搜索空间大概有7.3x10^115大小。
关于layer项,本文可以用的层次类型如下图,其他项的空间大家可以去看原始论文的附录。
如此大的空间,显然会有很多没有用的网络结构,因而,论文做了进一步的空间约束:
为了使得搜索算法运行的更快,论文的一个trick就是用已有的Transformer作为起点。即Transformer在最开始的集合中,这样,保证了初始集合中肯定有一个比较好的模型。
之前说过,Transformer训练时间很长,比cifar10长很多,为了使得模型更快的训练和评估,采用了很多手段:
而对于提前结束训练,采用了一种渐进式动态阈值的方法,这种方法使得没有希望的模型被尽早停掉。算法如下:
有一张图可以很直观的解释这个流程:
还有两段伪代码来说明这个过程:
为什么这个方法有效?这是因为在这里是做了一个假设:那就是所有的模型不会过拟合,同时效果随着训练步数的增长而变好。这样,两个模型最终结果的比较才能被替换为两个模型在某个训练步数上的比较。虽然不严格,但是因为阈值只是均值,其实很松,所以潜在的好模型还是大概率会被留下。因而方法很实用。
这样的好处也很明显,大量的没有希望的模型的计算资源被节省了出来。
论文的方法跟Random启动方法和没有渐进式动态阈值的方法相比,效果如下:
在最后四行中,可以看到,训练步数越大,模型数目越小,这是因为比较的条件是消耗的资源不变。
可以看到,random启动方法非常差。而没有动态阈值的方法,得到的模型方差比较大,且最终的模型效果也不如渐进式动态阈值的方法好。
对于把训练步数平均分的方法,虽然没有动态阈值那样的把好模型丢掉的风险,但是因为训练步数少,所以最优模型的断定会有风险,这也是为什么第三行比第四行差的原因。
最后搜索得到的模型结构如下:
可以看到,最后的模型跟transformer的区别则是在encoder和decoder的底部,会倾向于使用depth-wise separable convolutions。
如果尝试通过调整embedding和hidden state的大小把模型参数量调整到同一水平,那么效果如何呢?见下图:
可以看到,在同等效果下,evolved transformer的参数量要少很多(37%)。