Tensorflow实现各种学习率衰减

Tensorflow实现各种学习率衰减Tensorflow实现学习率衰减觉得有用的话,欢迎一起讨论相互学习~FollowMe参考文献DeeplearningAIAndrewNgTensorflow1.2API学习率衰减(learningratedecay)加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减(learningratedecay)…

大家好,又见面了,我是你们的朋友全栈君。

Tensorflow实现各种学习率衰减

觉得有用的话,欢迎一起讨论相互学习~

Tensorflow实现各种学习率衰减我的微博我的github我的B站

参考文献
Deeplearning AI Andrew Ng
Tensorflow1.2 API

学习率衰减(learning rate decay)

  • 加快学习算法的一个办法就是随时间慢慢减少学习率,我们将之称为学习率衰减(learning rate decay)

概括

  • 假设你要使用mini-batch梯度下降法,mini-batch数量不大,大概64或者128个样本,但是在迭代过程中会有噪音,下降朝向这里的最小值,但是不会精确的收敛,所以你的算法最后在附近摆动.,并不会真正的收敛.因为你使用的是固定的 α \alpha α,在不同的mini-batch中有杂音,致使其不能精确的收敛.

Tensorflow实现各种学习率衰减

  • 但如果能慢慢减少学习率 α \alpha α 的话,在初期的时候,你的学习率还比较大,能够学习的很快,但是随着 α \alpha α 变小,你的步伐也会变慢变小.所以最后的曲线在最小值附近的一小块区域里摆动.所以慢慢减少 α \alpha α 的本质在于在学习初期,你能承受较大的步伐, 但当开始收敛的时候,小一些的学习率能让你的步伐小一些.

Tensorflow实现各种学习率衰减

细节

  • 一个epoch表示要遍历一次数据,即就算有多个mini-batch,但是一定要遍历所有数据一次,才叫做一个epoch.
  • 学习率 α , 其 中 α 0 表 示 初 始 学 习 率 , d e c a y − r a t e 是 一 个 新 引 入 的 超 参 数 \alpha ,其中 \alpha_{0}表示初始学习率, decay-rate是一个新引入的超参数 α,α0,decayrate :
    α = 1 1 + d e c a y − r a t e ∗ e p o c h − n u m ∗ α 0 \alpha = \frac{1}{1+decay-rate*epoch-num}*\alpha_{0} α=1+decayrateepochnum1α0

Tensorflow实现各种学习率衰减

其他学习率是衰减公式

指数衰减

α = d e c a y − r a t e e p o c h − n u m ∗ α 0 \alpha = decay-rate^{epoch-num}*\alpha_{0} α=decayrateepochnumα0
α = k e p o c h − n u m ∗ α 0 其 中 k 是 超 参 数 \alpha = \frac{k}{\sqrt{epoch-num}}*\alpha_{0}其中k是超参数 α=epochnum
k
α0k

α = k t ∗ α 0 其 中 k 是 超 参 数 , t 表 示 m i n i − b a t c h 的 标 记 数 字 \alpha = \frac{k}{\sqrt{t}}*\alpha_{0}其中k是超参数,t表示mini-batch的标记数字 α=t
k
α0k,tminibatch

Tensorflow实现学习率衰减

自适应学习率衰减

tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None)
退化学习率,衰减学习率,将指数衰减应用于学习速率。
计算公式:
decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)

# 初始的学习速率是0.1,总的迭代次数是1000次,如果staircase=True,那就表明每decay_steps次计算学习速率变化,更新原始学习速率,
# 如果是False,那就是每一步都更新学习速率。红色表示False,蓝色表示True。
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

learning_rate = 0.1  # 初始学习速率时0.1
decay_rate = 0.96  # 衰减率
global_steps = 1000  # 总的迭代次数
decay_steps = 100  # 衰减次数

global_ = tf.Variable(tf.constant(0))
c = tf.train.exponential_decay(learning_rate, global_, decay_steps, decay_rate, staircase=True)
d = tf.train.exponential_decay(learning_rate, global_, decay_steps, decay_rate, staircase=False)

T_C = []
F_D = []

with tf.Session() as sess:
   for i in range(global_steps):
       T_c = sess.run(c, feed_dict={ 
   global_: i})
       T_C.append(T_c)
       F_d = sess.run(d, feed_dict={ 
   global_: i})
       F_D.append(F_d)

plt.figure(1)
plt.plot(range(global_steps), F_D, 'r-')# "-"表示折线图,r表示红色,b表示蓝色
plt.plot(range(global_steps), T_C, 'b-')
# 关于函数的值的计算0.96^(3/1000)=0.998
plt.show()

Tensorflow实现各种学习率衰减

反时限学习率衰减

inverse_time_decay(learning_rate, global_step, decay_steps, decay_rate,staircase=False,name=None)
将反时限衰减应用到初始学习率。
计算公式:
decayed_learning_rate = learning_rate / (1 + decay_rate * t)

import tensorflow as tf
import matplotlib.pyplot as plt

global_ = tf.Variable(tf.constant(0), trainable=False)
globalstep = 10000  # 全局下降步数
learning_rate = 0.1  # 初始学习率
decaystep = 1000  # 实现衰减的频率
decay_rate = 0.5  # 衰减率

t = tf.train.inverse_time_decay(learning_rate, global_, decaystep, decay_rate, staircase=True)
f = tf.train.inverse_time_decay(learning_rate, global_, decaystep, decay_rate, staircase=False)

T = []
F = []

with tf.Session() as sess:
    for i in range(globalstep):
        t_ = sess.run(t, feed_dict={ 
   global_: i})
        T.append(t_)
        f_ = sess.run(f, feed_dict={ 
   global_: i})
        F.append(f_)

plt.figure(1)
plt.plot(range(globalstep), T, 'r-')
plt.plot(range(globalstep), F, 'b-')
plt.show()

Tensorflow实现各种学习率衰减

学习率自然指数衰减

def natural_exp_decay(learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None)
将自然指数衰减应用于初始学习速率。
计算公式:
decayed_learning_rate = learning_rate * exp(-decay_rate * global_step)

import tensorflow as tf
import matplotlib.pyplot as plt

global_ = tf.Variable(tf.constant(0), trainable=False)
globalstep = 10000  # 全局下降步数
learning_rate = 0.1  # 初始学习率
decaystep = 1000  # 实现衰减的频率
decay_rate = 0.5  # 衰减率

t = tf.train.natural_exp_decay(learning_rate, global_, decaystep, decay_rate, staircase=True)
f = tf.train.natural_exp_decay(learning_rate, global_, decaystep, decay_rate, staircase=False)

T = []
F = []

with tf.Session() as sess:
    for i in range(globalstep):
        t_ = sess.run(t, feed_dict={ 
   global_: i})
        T.append(t_)
        f_ = sess.run(f, feed_dict={ 
   global_: i})
        F.append(f_)

plt.figure(1)
plt.plot(range(globalstep), T, 'r-')
plt.plot(range(globalstep), F, 'b-')
plt.show()

Tensorflow实现各种学习率衰减

常数分片学习率衰减

piecewise_constant(x, boundaries, values, name=None)
例如前1W轮迭代使用1.0作为学习率,1W轮到1.1W轮使用0.5作为学习率,以后使用0.1作为学习率。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# 当global_取不同的值时learning_rate的变化,所以我们把global_
global_ = tf.Variable(tf.constant(0), trainable=False)
boundaries = [10000, 12000]
values = [1.0, 0.5, 0.1]
learning_rate = tf.train.piecewise_constant(global_, boundaries, values)
global_steps = 20000

T_L = []
with tf.Session() as sess:
    for i in range(global_steps):
        T_l = sess.run(learning_rate, feed_dict={ 
   global_: i})
        T_L.append(T_l)

plt.figure(1)
plt.plot(range(global_steps), T_L, 'r-')
plt.show()

Tensorflow实现各种学习率衰减

多项式学习率衰减

特点是确定结束的学习率。
polynomial_decay(learning_rate, global_step, decay_steps,end_learning_rate=0.0001, power=1.0,cycle=False, name=None):
通常观察到,通过仔细选择的变化程度的单调递减的学习率会产生更好的表现模型。此函数将多项式衰减应用于学习率的初始值。
使学习率learning_rate在给定的decay_steps中达到end_learning_rate。它需要一个global_step值来计算衰减的学习速率。你可以传递一个TensorFlow变量,在每个训练步骤中增加global_step = min(global_step, decay_steps)
计算公式:
decayed_learning_rate = (learning_rate – end_learning_rate) *(1 – global_step / decay_steps) ^ (power) + end_learning_rate
如果cycle为True,则使用decay_steps的倍数,第一个大于’global_steps`.ceil表示向上取整.
decay_steps = decay_steps * ceil(global_step / decay_steps)
decayed_learning_rate = (learning_rate – end_learning_rate) *(1 – global_step / decay_steps) ^ (power) + end_learning_rate

Example: decay from 0.1 to 0.01 in 10000 steps using sqrt (i.e. power=0.5):'''
import tensorflow as tf
import matplotlib.pyplot as plt

global_ = tf.Variable(tf.constant(0), trainable=False)
starter_learning_rate = 0.1  # 初始学习率
end_learning_rate = 0.01  # 结束学习率
decay_steps = 1000
globalstep = 10000
f = tf.train.polynomial_decay(starter_learning_rate, global_, decay_steps, end_learning_rate, power=0.5, cycle=False)
t = tf.train.polynomial_decay(starter_learning_rate, global_, decay_steps, end_learning_rate, power=0.5, cycle=True)
F = []
T = []
with tf.Session() as sess:
    for i in range(globalstep):
        f_ = sess.run(f, feed_dict={ 
   global_: i})
        F.append(f_)
        t_ = sess.run(t, feed_dict={ 
   global_: i})
        T.append(t_)

plt.figure(1)
plt.plot(range(globalstep), F, 'r-')
plt.plot(range(globalstep), T, 'b-')
plt.show()

Tensorflow实现各种学习率衰减

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136712.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pmp证书(职称证书丢失补办流程)

    前言OpenSSL中的概念很多,网上的文档也非常的多,在这里做一下总结,首先明确以下内容。Https访问完整流程1)客户端发起一个https请求,连接到服务器的443端口。2)服务端把自己的信息以数字证书的形式返回给客户端(证书内容有密钥公钥,网站地址,证书颁发机构,失效日期等)。证书中有一个公钥来加密信息,私钥由服务器持有。3)验证证书的合法性客户端收到服务器的响应后会先验证证书的合法性(证书中包含的地址与正在访问的地址是否一致,证书是否过期)。4)生成随机密码(RSA签名)如果验

    2022年4月18日
    126
  • eclipse安装android_安卓studio怎么打包apk

    eclipse安装android_安卓studio怎么打包apkEclipseandroid开发更改apk名字有以下几步:第一步,修改工程包名在eclipse里,找到项目包和java包(原则上都一样),就可以按”F2″修改名字,随之,源.java也会得到相应的修改;然而每个.java文件都需要把如下图内容,再额外修改一下第二步,修改AndroidManifest.xml文件AndroidManifest.xml里的内容是android工程的相关配置文件。工程文件的解析具体可参考:某鸟教程.第三步,修改Strings.xml文件然后是…

    2022年10月5日
    4
  • python基础教程 入门教程_python基础入门教程

    python基础教程 入门教程_python基础入门教程首先,我已经假定你已经看了无数遍的垃圾文章,然后依然搞不懂类和对象,但是呢起码知道有类和对象这么两个玩意儿。由于你没有编程经验,所以无法从学过的编程语言里通过类比去理解Python的‘类和对象’。咱们用生活中的例子来说说,建房子。类(class):相当于施工图纸(blueprint)对象(object):房子(已经建造好的)假设你手上有施工图纸(Blueprint),里面有房子的所有信…

    2022年8月29日
    2
  • 2018怎样发英文外链才能提升谷歌排名

    2018怎样发英文外链才能提升谷歌排名自从搜索引擎诞生以来,外链一直都是占比较重要的位置,但是谷歌一直在完善算法,让搜索引擎显示更好的搜索结果,2014年以前,通过软件群发外链,会收到不错的效果,但是现在谷歌搜索引擎已经可以识别这些不自然的外链,一旦你的网站再这些群发外链,就会被惩罚,严重的话,被K。我们一直坚守手工做高质量相关性外链,无论谷歌算法如何变,我们的网站一直迄立不倒!那么2018年,我们如何做高质量的相关性英文外链呢?1,…

    2022年5月13日
    52
  • Ubuntu 12.04 下安装RabbitVCS

    Ubuntu 12.04 下安装RabbitVCSWindows下常用的SVN管理工具是TortoiseSVN,而它不支持Linux。如果你想在linux下也使用同样的图形化界面来管理SVN,那么RabbitVCS是一个不错的选择。它支持和TortoiseSVN同样的操作。Ubuntu 12.04下安装方法如下:官方的wiki上指出了安装方法:http://wiki.rabbitvcs.org/wiki/install/ubuntu…

    2022年7月18日
    16
  • 编码 ansi_ansi编码和utf-8

    编码 ansi_ansi编码和utf-81、ANSI编码不是一个具体的字符集,而是对一些多字节字符集类型的字符集的一个总体的称呼,总称。(Windows)ANSI编码中的每一个代码页值就是对一个具体的多字节字符集类型的字符集的别名。例如,代码页936就是Windows系统对简体中文GBK这个字符集的别名。如果ANSI编码是一个具体的字符集,由于汉字和韩文字符都是它能表示的字符,那么里面写有韩文字符的以(Windo

    2025年11月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号