当前位置: 首页 > news >正文

你认为什么是网络营销/谷歌seo和百度seo

你认为什么是网络营销,谷歌seo和百度seo,wordpress中文别名分类目录,政府网站建设及建议keras学习率余弦退火CosineAnnealing1.引言2.余弦退火的原理3.keras实现1.引言 当我们使用梯度下降算法来优化目标函数的时候,当越来越接近Loss值的全局最小值时,学习率应该变得更小来使得模型不会超调且尽可能接近这一点,而余弦退火&#x…

keras学习率余弦退火CosineAnnealing

    • 1.引言
    • 2.余弦退火的原理
    • 3.keras实现

1.引言

当我们使用梯度下降算法来优化目标函数的时候,当越来越接近Loss值的全局最小值时,学习率应该变得更小来使得模型不会超调且尽可能接近这一点,而余弦退火(Cosine annealing)可以通过余弦函数来降低学习率。余弦函数中随着x的增加余弦值首先缓慢下降,然后加速下降,再次缓慢下降。这种下降模式能和学习率配合,以一种十分有效的计算方式来产生很好的效果。
在这里插入图片描述

在论文Stochastic Gradient Descent with Warm Restarts中介绍主要介绍了带重启的随机梯度下降算法(SGDR),其中就引入了余弦退火的学习率下降方式,本文主要介绍余弦退火的原理以及实现。并且因为我们的目标优化函数可能是多峰的(如下图所示),除了全局最优解之外还有多个局部最优解,在训练时梯度下降算法可能陷入局部最小值,此时可以通过突然提高学习率,来“跳出”局部最小值并找到通向全局最小值的路径。这种方式称为带重启的随机梯度下降方法。
在这里插入图片描述

2.余弦退火的原理

论文介绍最简单的热重启的方法。当执行完TiT_iTi个epoch之后就会开始热重启(warm restart),而下标iii就是指的第几次restart,其中重启并不是重头开始,而是通过增加学习率来模拟,并且重启之后使用旧的xtx_txt作为初始解,这里的xtx_txt就是通过梯度下降求解loss函数的解,也就是神经网络中的权重,因为重启就是为了通过增大学习率来跳过局部最优,所以需要将xtx_txt置为旧值。

本文并不涉及重启部分的内容,所以只考虑在每一次run(包含重启就是restart)中,学习率是如何减小的。余弦退火( cosine annealing )的原理如下:
ηt=ηmini+12(ηmaxi−ηmini)(1+cos(TcurTiπ))\eta_t=\eta_{min}^{i}+\frac{1}{2}(\eta_{max}^{i}-\eta_{min}^{i})(1+cos(\frac{T_{cur}}{T_i}\pi))ηt=ηmini+21(ηmaxiηmini)(1+cos(TiTcurπ))
表达式中的字符含义:

  • iii就是第几次run(索引值);
  • ηmaxi\eta_{max}^{i}ηmaxiηmini\eta_{min}^{i}ηmini分别表示学习率的最大值和最小值,定义了学习率的范围。论文中提到在每次restart之后,减少ηmaxi\eta_{max}^{i}ηmaxiηmini\eta_{min}^{i}ηmini的值会是有趣的,但是为了简单,论文中也保持ηmaxi\eta_{max}^{i}ηmaxiηmini\eta_{min}^{i}ηmini在每次restart之后仍然保持不变。
  • TcurT_{cur}Tcur则表示当前执行了多少个epoch,但是TcurT_{cur}Tcur是在每个batch运行之后就会更新,而此时一个epoch还没有执行完,所以TcurT_{cur}Tcur的值可以为小数。例如总样本为80,每个batch的大小是16,那么在一个epoch中就会循环5次读入batch,那么在第一个epoch中执行完第一个batch后,TcurT_{cur}Tcur的值就更新为1/5=0.2,以此类推。
  • TiT_iTi表示第i次run中总的epoch数。当涉及到重启时,论文中提到为了提高性能表现,开始会初始化一个比较小的TiT_iTi,在每次restart后,TiT_iTi会以乘以一个TmultT_{mult}Tmult的方式增加,但是本文不涉及重启也就不需要考虑,即把TiT_iTi固定为我们训练模型的epoch数。

3.keras实现

为了简单,这里稍微修改一下TcurT_{cur}TcurTiT_{i}Ti的定义,原本表示的是epoch的数量,但是因为TcurT_{cur}Tcur是在每个batch之后都会更新,所以将TiT_{i}Ti定义为总的batch需要执行的步数,而TcurT_{cur}Tcur定义为当前对当前已经执行的batch的计数,即每执行一个batch,TcurT_{cur}Tcur就加一。举个例子,样本总数为80,每个batch的大小为16,那么一共有5个batch,再令训练模型总的epoch为30,假设当前执行到第二个epoch的第二个batch结束,那么此时Tcur/Ti=(1∗5+2)/(30∗5)T_{cur}/T_i=(1*5+2)/(30*5)Tcur/Ti=(15+2)/(305),按照之前的定义Tcur/Ti=(1+2/5)/30T_{cur}/T_i=(1+2/5)/30Tcur/Ti=(1+2/5)/30,两者是等价的,但是因为之前的定义存在小数,如果1除以batch的总数除不尽,就会存在精度损失的情况。

这里除了实现余弦退火之外,还加入了warm up预热阶段,在warm up阶段学习率线性增长,当达到我们设置的学习率之后,再通过余弦退火的方式降低学习率。

为什么使用Warmup?
由于刚开始训练时,模型的权重(weights)是随机初始化的,此时若选择一个较大的学习率,可能带来模型的不稳定(振荡),选择Warmup预热学习率的方式,可以使得开始训练的几个epoches或者一些steps内学习率较小,在预热的小学习率下,模型可以慢慢趋于稳定,等模型相对稳定后再选择预先设置的学习率进行训练,使得模型收敛速度变得更快,模型效果更佳。

keras通过继承Callback实现余弦退火。通过继承Callback,当我们训练的时候传入我们的就函数,就可以在每个batch开始训练前以及结束后回调我们重写的on_batch_end和on_batch_begin函数。

完整代码(源自github):

import numpy as np
from tensorflow import keras
from keras import backend as Kdef cosine_decay_with_warmup(global_step,learning_rate_base,total_steps,warmup_learning_rate=0.0,warmup_steps=0,hold_base_rate_steps=0):"""参数:global_step: 上面定义的Tcur,记录当前执行的步数。learning_rate_base:预先设置的学习率,当warm_up阶段学习率增加到learning_rate_base,就开始学习率下降。total_steps: 是总的训练的步数,等于epoch*sample_count/batch_size,(sample_count是样本总数,epoch是总的循环次数)warmup_learning_rate: 这是warm up阶段线性增长的初始值warmup_steps: warm_up总的需要持续的步数hold_base_rate_steps: 这是可选的参数,即当warm up阶段结束后保持学习率不变,知道hold_base_rate_steps结束后才开始学习率下降"""if total_steps < warmup_steps:raise ValueError('total_steps must be larger or equal to ''warmup_steps.')#这里实现了余弦退火的原理,设置学习率的最小值为0,所以简化了表达式learning_rate = 0.5 * learning_rate_base * (1 + np.cos(np.pi *(global_step - warmup_steps - hold_base_rate_steps) / float(total_steps - warmup_steps - hold_base_rate_steps)))#如果hold_base_rate_steps大于0,表明在warm up结束后学习率在一定步数内保持不变if hold_base_rate_steps > 0:learning_rate = np.where(global_step > warmup_steps + hold_base_rate_steps,learning_rate, learning_rate_base)if warmup_steps > 0:if learning_rate_base < warmup_learning_rate:raise ValueError('learning_rate_base must be larger or equal to ''warmup_learning_rate.')#线性增长的实现slope = (learning_rate_base - warmup_learning_rate) / warmup_stepswarmup_rate = slope * global_step + warmup_learning_rate#只有当global_step 仍然处于warm up阶段才会使用线性增长的学习率warmup_rate,否则使用余弦退火的学习率learning_ratelearning_rate = np.where(global_step < warmup_steps, warmup_rate,learning_rate)return np.where(global_step > total_steps, 0.0, learning_rate)class WarmUpCosineDecayScheduler(keras.callbacks.Callback):"""继承Callback,实现对学习率的调度"""def __init__(self,learning_rate_base,total_steps,global_step_init=0,warmup_learning_rate=0.0,warmup_steps=0,hold_base_rate_steps=0,verbose=0):super(WarmUpCosineDecayScheduler, self).__init__()self.learning_rate_base = learning_rate_baseself.total_steps = total_stepsself.global_step = global_step_initself.warmup_learning_rate = warmup_learning_rateself.warmup_steps = warmup_stepsself.hold_base_rate_steps = hold_base_rate_stepsself.verbose = verbose#learning_rates用于记录每次更新后的学习率,方便图形化观察self.learning_rates = []#更新global_step,并记录当前学习率def on_batch_end(self, batch, logs=None):self.global_step = self.global_step + 1lr = K.get_value(self.model.optimizer.lr)self.learning_rates.append(lr)#更新学习率def on_batch_begin(self, batch, logs=None):lr = cosine_decay_with_warmup(global_step=self.global_step,learning_rate_base=self.learning_rate_base,total_steps=self.total_steps,warmup_learning_rate=self.warmup_learning_rate,warmup_steps=self.warmup_steps,hold_base_rate_steps=self.hold_base_rate_steps)K.set_value(self.model.optimizer.lr, lr)if self.verbose > 0:print('\nBatch %05d: setting learning ''rate to %s.' % (self.global_step + 1, lr))

下面的代码构建了一个简单的模型,并使用了warm up和余弦退火的方式来规划学习率。

from keras.models import Sequential
from keras.layers import Dense
# Create a model.
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(10, activation='softmax'))
model.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])#样本总数
sample_count = 12608
# Total epochs to train.
epochs = 50
# Number of warmup epochs.
warmup_epoch = 10
# Training batch size, set small value here for demonstration purpose.
batch_size = 16
# Base learning rate after warmup.
learning_rate_base = 0.0001total_steps = int(epochs * sample_count / batch_size)# Compute the number of warmup batches.
warmup_steps = int(warmup_epoch * sample_count / batch_size)# Generate dummy data.
data = np.random.random((sample_count, 100))
labels = np.random.randint(10, size=(sample_count, 1))# Convert labels to categorical one-hot encoding.
one_hot_labels = keras.utils.to_categorical(labels, num_classes=10)# Compute the number of warmup batches.
warmup_batches = warmup_epoch * sample_count / batch_size# Create the Learning rate scheduler.
warm_up_lr = WarmUpCosineDecayScheduler(learning_rate_base=learning_rate_base,total_steps=total_steps,warmup_learning_rate=4e-06,warmup_steps=warmup_steps,hold_base_rate_steps=5,)# Train the model, iterating on the data in batches of 32 samples
model.fit(data, one_hot_labels, epochs=epochs, batch_size=batch_size,verbose=0, callbacks=[warm_up_lr])import matplotlib.pyplot as plt
plt.plot(warm_up_lr.learning_rates)
plt.xlabel('Step', fontsize=20)
plt.ylabel('lr', fontsize=20)
plt.axis([0, total_steps, 0, learning_rate_base*1.1])
plt.xticks(np.arange(0, epochs, 1))
plt.grid()
plt.title('Cosine decay with warmup', fontsize=20)
plt.show()

运行结果:
在这里插入图片描述

参考博客:
称霸Kaggle的十大深度学习技巧
学习率规划-余弦退火CosineAnnealing和WarmRestart原理及实现
Warmup预热学习率
参考论文:
https://arxiv.org/abs/1608.03983

http://www.lbrq.cn/news/1101673.html

相关文章:

  • 怎么做自己的淘宝客推广网站/公司想建个网站怎么弄
  • 真人做的免费视频网站/济南百度竞价
  • 超级工程网站建设上海中心大厦/百度会员登录入口
  • 我做的网站在手机里滑动怎么这里卡/免费的关键词挖掘工具
  • 如何识别网站建设/深圳网站seo外包公司哪家好
  • 网上注册公司需要上传哪些资料/seo 优化案例
  • 建新建设集团有限公司网站/专业的网站建设公司
  • 科技公司网站制作模板/最新新闻事件今天疫情
  • 厦门公司做网站/数据分析师资格证书怎么考
  • wordpress国人cms/网页搜索优化
  • 网站与数据库的联系/网络推广是干什么的
  • 网页游戏网站排行/2023第二波疫情已经到来了吗
  • 成都青羊网站建设/淘宝宝贝排名查询
  • 网站标签怎么做/网页宣传
  • 襄阳做网站找哪家公司/seo搜狗排名点击
  • 手机网站设计建设/企业网站排名优化公司
  • 帮做论文网站吗/北京网站建设公司
  • 网站分享的功能怎么做/百度浏览器广告怎么投放
  • 杭州网站维护/引流推广怎么做
  • 国家建设材料检测网站/百度指数功能模块有哪些
  • 响应式网站设计企业/google chrome浏览器
  • 国际交流中心网站建设与管理制度/新业务在线软件下载
  • 餐饮团购网站建设/百度推广seo怎么学
  • 企信网查询/西安seo网站优化
  • 网站建设网页设计培训学校/全球热搜榜排名今日
  • 商城app免费制作/天津百度seo排名优化软件
  • 做金融培训的网站/刷关键词排名
  • 企业服务平台网站建设/舆情分析报告范文
  • 济南企业营销型网站建设/如何搭建个人网站
  • 上海网站建设沪icp备/seo系统培训课程
  • Ubuntu 22.04 使用 Docker 安装 Redis 5 (安装包形式)
  • Vue 脚手架——render函数
  • 零基础 “入坑” Java--- 十三、再谈类和接口
  • 去中心化协作智能生态系统
  • 【RK3576】【Android14】显示屏MIPI开发调试
  • Qwen3-8B 与 ChatGPT-4o Mini 的 TTFT 性能对比与底层原理详解