Keras实现AdamW、SGDW、NadamW、热重启和学习速率乘数

keras-adamw的Python项目详细描述


卡拉斯阿达姆

Build StatusCoverage StatusCodacy BadgePyPI versionLicense: MIT

AdamWAdamWNadamWNadamWWarm Restarts,基于论文Decoupled Weight Decay Regularization-加学习率乘数

特点

  • Weight decay fix:将L2惩罚与渐变分离。为什么要使用?
    • 通过L2惩罚的权重衰减产生更差的泛化,这是因为衰变不能正常工作
    • 通过L2惩罚的权重衰减导致超参数与lr耦合,使搜索复杂化
  • Warm restarts(WR):余弦退火学习速率调度。为什么要使用?
    • Better generalization和{em1}$更快的收敛性由作者针对不同的数据和模型大小给出
  • LR乘数每层学习率乘数。为什么要使用?
    • Pretraining;如果向预训练层添加新层,使用全局lr很容易过度拟合

安装

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>,}

  1. (a) 命名每个要修改的层(推荐),例如Dense(.., name='dense_1')-或 (b) 获取每个层的名称,注意要修改的名称:[print(idx,layer.name) for idx,layer in enumerate(model.layers)]
  2. (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_tlr: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所占比例就越低。--我的建议

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java收回EhCache中的所有元素   java创建带有箭头的组合框,以在其中增加值   在Java中使用JsonPath解析JSON中的数组   java如何在应用程序类不可见的模块中获取上下文?   exoplayer中的java Recyclerview不起作用   java MS Access无法打开更多表   从xmlschema到java的unicode拉丁脚本子集的正则表达式   在spring sts模型中,java时间戳格式必须为yyyymmdd hh:mm:ss   java将XPath转换为Jsoup的CssSelector   java Solr运算符类似于SQL中的类反向运算符   java使第三方类不可变   java跳过自定义卡片堆栈视图的动画   java如何修复“使用Spring AOP,我想更改返回值,但返回类不是我的返回方法”   java使用正则表达式解析字符串   java泛型与遗留代码的兼容性为什么foreach在运行时失败,而迭代器工作正常   hibernate如何使用java持久性重试锁定等待超时?