Keras实现AdamW、SGDW、NadamW、热重启和学习速率乘数
keras-adamw的Python项目详细描述
卡拉斯阿达姆
AdamW,AdamW,NadamW,NadamW和Warm Restarts,基于论文Decoupled Weight Decay Regularization-加学习率乘数
特点
- Weight decay fix:将L2惩罚与渐变分离。为什么要使用?
- 通过L2惩罚的权重衰减产生更差的泛化,这是因为衰变不能正常工作
- 通过L2惩罚的权重衰减导致超参数与
lr
耦合,使搜索复杂化
- Warm restarts(WR):余弦退火学习速率调度。为什么要使用?
- Better generalization和{em1}$更快的收敛性由作者针对不同的数据和模型大小给出
- LR乘数:每层学习率乘数。为什么要使用?
- Pretraining;如果向预训练层添加新层,使用全局
lr
很容易过度拟合
- Pretraining;如果向预训练层添加新层,使用全局
安装
pip install keras-adamw
或克隆存储库
使用
如果使用tensorflow.keras公司导入,设置import os; os.environ["TF_KERAS"]='1'
。在
重量衰减
AdamW(model=model)
设置weight_decays = {<weight matrix name>:<weight decay value>,}
的三种方法:
# 1. AutomaticallyJustpassin`model`(`AdamW(model=model)`),anddecayswillbeautomaticallyextracted.Loss-basedpenalties(l1,l2,l1_l2)willbezeroedbydefault,butcanbekeptvia`zero_penalties=False`(NOTrecommended,seeUseguidelines).^{pr2}$
# 3. Fill manuallymodel.layers[1].kernel.name# get name of kernel weight matrix of layer indexed 1weight_decays.update({'conv1d_0/kernel:0':(1e-4,0)})# example
热重启
{EMCDM使用指南
LR乘数
AdamW(.., lr_multipliers=lr_multipliers)
-要得到,{<layer name>:<multiplier value>,}
:
- (a) 命名每个要修改的层(推荐),例如
Dense(.., name='dense_1')
-或 (b) 获取每个层的名称,注意要修改的名称:[print(idx,layer.name) for idx,layer in enumerate(model.layers)]
- (a)
lr_multipliers = {'conv1d_0':0.1} # target layer by full name
-或 (b)lr_multipliers = {'conv1d':0.1} # target all layers w/ name substring 'conv1d'
示例
importnumpyasnpfromkeras.layersimportInput,Dense,LSTMfromkeras.modelsimportModelfromkeras.regularizersimportl1,l2,l1_l2fromkeras_adamwimportAdamWipt=Input(shape=(120,4))x=LSTM(60,activation='relu',name='lstm_1',kernel_regularizer=l1(1e-4),recurrent_regularizer=l2(2e-4))(ipt)out=Dense(1,activation='sigmoid',kernel_regularizer=l1_l2(1e-4,2e-4))(x)model=Model(ipt,out)
lr_multipliers={'lstm_1':0.5}optimizer=AdamW(lr=1e-4,model=model,lr_multipliers=lr_multipliers,use_cosine_annealing=True,total_iterations=24)model.compile(optimizer,loss='binary_crossentropy')
forepochinrange(3):foriterationinrange(24):x=np.random.rand(10,120,4)# dummy datay=np.random.randint(0,2,(10,1))# dummy labelsloss=model.train_on_batch(x,y)print("Iter {} loss: {}".format(iteration+1,"%.3f"%loss))print("EPOCH {} COMPLETED\n".format(epoch+1))
(完整示例+绘图代码,以及lr_t
与lr
:example.py的说明)
使用指南
重量衰减
- 如果通过
weight_decays
正则化权重,则将L2惩罚设置为零,否则“修复”的目的将大大失败,权重将过度衰减My recommendation lambda = lambda_norm * sqrt(1/total_iterations)
-->。--Authors(附录,第1页)(A-1)total_iterations_wd
-->;设置为在all epoch(或其他间隔!= total_iterations
)上规范化,而不是按WR;使用WR时,有时可能会产生更好的结果--My note
热重启
- 使用
autorestart=True
自动完成,如果use_cosine_annealing=True
;在total_iterations
迭代后,这是默认值。在 - 手动:设置
t_cur = -1
以重新启动调度乘数(请参见Example)。可以在编译或培训期间完成。非-1
也是有效的,它将从余弦曲线上的另一个点开始eta_t
。详情见A-2、3 t_cur
应设置为iter == total_iterations - 2
;解释here- 将
total_iterations
设置为给定重新启动的预期权重更新的值{em1}$Authors(A-1,2) eta_min=0, eta_max=1
是可调超参数;例如,指数调度可用于eta_max
。如果不确定的话,在本文中,默认值可以很好地工作。--Authors- Save/load优化器状态;WR依赖于使用优化器的更新历史来进行有效转换Authors(A-2)
# 'total_iterations' general purpose exampledefget_total_iterations(restart_idx,num_epochs,iterations_per_epoch):returnnum_epochs[restart_idx]*iterations_per_epoch[restart_idx]get_total_iterations(0,num_epochs=[1,3,5,8],iterations_per_epoch=[240,120,60,30])
学习率乘数
- 最适用于预训练层-例如贪婪层预训练,或对分类器网络的特征提取程序进行预训练。可以作为冻结层权重的更好的替代方案。--我的建议
- 通常最好不要对层进行完全预处理(直到收敛,甚至是最好的方法)e验证分数)-因为这可能会抑制它们适应新添加层的能力。--我的建议
- 预训练的层越多,新层的
lr
所占比例就越低。--我的建议
- 项目
标签: