【论文解析】Google Brain新作 基于遗传编程自动发现神经 ...
论文名称:《Symbolic Discovery of Optimization Algorithms》论文作者:Xiangning Chen, Chen Liang, Da Huang, Esteban Real, Kaiyuan Wang, Yao Liu, Hieu Pham, Xuanyi Dong, Thang Luong, Cho-Jui Hsieh, Yifeng Lu, Quoc V. Le
作者单位:Google,UCLA什么是基于进化算法自动发现神经网络优化器?
基于进化算法自动发现神经网络优化器是一种使用进化算法来搜索和生成新的神经网络优化器的方法。这种方法通过对神经网络优化器的组成部分进行随机变异,以及对它们的性能进行评估和选择,来逐步改进优化器的性能。在这个过程中,优化器的性能被用作适应度函数,用于指导进化算法的搜索方向。通过这种方法,可以发现具有更好性能和更高效的神经网络优化器,以及用于特定任务和数据集的优化器。与传统的手工设计优化器相比,这种方法可以提供更高的性能和更好的泛化能力。
基于上述想法,Google的研究者于最近发表了论文《Symbolic Discovery of Optimization Algorithms》,探究基于演化算法(Linear Genetic Programming,LGP)自动发现神经网络优化器的可行性。
进化算法
搜索空间
Lion算法主要基于进化算法搜索优化器。根据给定的参数w,统计信息v1,v2,学习率lr,梯度g,搜索到的优化器应当能给出最优的更新权重update。
适应度评估
例如,作者使用了State-of-the-art的AdamW优化器作为初始个体,程序如下所示。
AdamW
变异算子
在论文中,作者只使用了变异算子。在变异过程中,可能包含三种操作:
[*]随机增加一条程序语句
[*]随机修改一条程序语句
[*]随机删除一条程序语句
选择算子
在论文中,作者采用了Tournament Size为2的Tournament Selection作为选择算子。
进化策略
在论文中,作者遵循原始的Linear Genetic Programming实现,采用了Steady-State EA作为进化策略,也就是每评估完一个个体之后,就将个体加入到种群中。
加速策略
随机重启
随机重启包含两个重启策略:
[*]随机重启为初始个体,即AdamW,以促进重新探索。
[*]随机重启为当前最优个体,以促进利用。
作者额外尝试了程序随机搜索和基于AdamW的超参数搜索,使用了相比进化算法四倍的计算资源消耗。从最终结果来看,两种策略都无法达到进化算法最终达到的效果。而随机重启策略则可以有效在后期进一步提升结果。
搜索进度
程序优化
作者对进化算法生成的程序进行了初步分析,并进行了三个优化操作:
[*]存在语法错误的程序:不断变异,直到不出现错误。
[*]与已评估程序Hash完全相同的程序:通过语义分析,直接跳过评估
[*]程序中的冗余代码:通过语法分析进行去除
从下图展示的结果来看,跳过与已评估程序Hash完全相同的程序,可以节省10倍的计算资源,而删除程序中的冗余代码,则可以节省3倍的计算资源。
程序优化效果
代理任务
作者使用了代理任务,即在较小的模型,较少的训练数据上评估每个优化器程序。这样一来,每个代理任务只需要20分钟的TPU评估时间。最终,作者使用了3000 TPU Days完成了所有实验。
泛化性能提升
过拟合现象
在论文中,作者定义Meta-Overfitting现象为优化器可以在代理任务上继续提升适应度,但是在更复杂的任务上适应度反而逐渐变差,也就是说搜索到的优化器不能泛化到其他任务上这种现象。下图展示了两次运行出现Meta-Overfitting的示例。可以看到,随着演化的进行,验证集任务的适应度反而变差了。有时候会在演化早期就发生Overfitting,也有时候会在晚期才发生Overfitting。
Meta-Overfitting
下图展示了,Meta-Overfitting在不同演化阶段的出现频率和平均验证误差。从图中可以看出,Meta-Overfitting发生的越晚,验证集性能越好。
搜索进度
漏斗选择
如果评估一直在代理任务上进行的话,有可能会过拟合代理任务(Meta-Overfitting)。因此作者提出使用漏斗选择策略,当优化器表现优于Baseline时,则使用10倍规模的新任务进行评估。据此不断增大评估任务规模,从而避免在代理任务上过拟合。
程序精简
最终的程序精简包括三个部分:
[*]冗余语句删除
[*]自动演化:自动演化部分通过只允许删除语句变异和修改语句变异,不需要新增语句变异,尝试演化出更精简的个体
[*]人工精简
结果分析
下图展示了自动发现的优化器Lion。
Lion优化器
精简转换成伪代码的话,是下面这种形式。
Lion优化器伪代码
简单来说,Lion优化器有以下几个特性:
[*]Sign Update:Sign Update是Lion优化器最大的特性。Lion优化器使用了Sign函数忽略了梯度的长度,只保留的梯度的方向。从而在优化过程中在一定程度上起到了正则化的效果。
[*]动量维护:Lion在权重更新和动量维护中的历史梯度权重是由两个超参数\beta_1和\beta_2分别控制的。分别控制非常关键,这允许Lion以更大的\beta_1更新模型,并以更小的\beta_2保留更多历史梯度信息。
[*]超参数设置:由于Lion采用Sign函数结果进行更新,因此Lion的梯度更新尺度会比一般的优化器要更大。因此,Lion需要配合比较小的学习率使用。而与此同时,由于学习率比较小,Weight Decay的权重则需要相应适当增大。
[*]低内存:由于Lion仅仅维护了一个动量信息,因此Lion的内存消耗比AdamW更少。
实验结果
图像分类任务
下图展示了在不同模型架构和不同图像分类数据集(ImageNet,ImageNet-Real)上使用Lion的效果。从结果来看,在不使用数据增强时,Lion显著优于AdamW优化器。而当使用了数据增强技术之后,Lion优势变小,但是相比AdamW依然具有优势。
测试准确率
从训练时间上来看,Lion达到了五倍的加速效果。
ImageNet上的加速效果
对比学习
下图展示了基于Locked-image text Tuning(LiT)算法进行对比学习的结果。从实验结果来看,Lion相比AdamW也具有明显的优势。
对比学习
扩散模型
下图展示了Text-to-Image超分辨率实验的结果。从实验结果来看,Lion也具有良好的效果。
Text-to-Image超分辨率实验
自然语言处理
下表展示了GLUE数据集在T5模型上进行微调的实验结果。从图中可以看出,Lion具有普遍的优势。
GLUE数据集结果
下图展示了大语言模型的训练结果。从表中可以看出,Lion在大语言模型上依然有效。
大语言模型实验结果
优化器对比
下表展示了不同优化器的对比,从图表可以看出Lion在不同场景下优于其他所有优化器。
优化器对比
消融实验:动量维护
在Lion中,作者使用了\beta_1=0.95,\beta_2=0.98两组超参数控制动量维护。作者首先对使用两组超参数进行动量维护进行了消融。从下图结果来看,使用两组超参数进行动量维护是非常有必要的,也是Lion算法取得良好效果的关键。
动量维护策略
消融实验:Batch Size
由于Lion中使用了Sign运算符,因此Lion需要更大的Batch Size以降低噪声带来的影响。从下图展示的实验结果来看,更大的Batch Size确实可以更显现Lion的优势。不过,Lion在小Batch Size下依然具有鲁棒的表现。
Batch Size对最终结果的影响
超参数调优
由于Lion的更新步幅比较大,作者在论文中建议为Lion设置更小的学习率,即比AdamW小3到10倍,同时相应比例增加权重衰减的权重。从下图展示的超参数调优结果来看,可以看出Lion相比AdamW在不同参数设定下更加鲁棒。
超参数调优 还可以设计优化器且性能良好。那可以设计网络的拓扑结构,又比如不同神经元后面连接的激活函数不同,又或者设计新的激活函数? 确实可以,激活函数设计在Genetic Programming领域已经被广泛研究了,只是没有做到Google Brain这样的水准[笑哭] 原来如此,GP真的很强[拜托] Google之前做过激活函数的搜索,Evolving Normalization-Activation Layers,而且是更进一步,把norm layer跟activation layer一起搜的,大概就是觉得单纯搜一个activation没意思吧[捂脸]所以两个放一起搜了。
但是没用GP,用的随机图生成个体,然后用EA来搜索 20年的nips 像之前搜activation layer应该Google更早的时候也有做过,记得Swish应该就是搜出来的~
页:
[1]