精华内容
下载资源
问答
  • 系统学习Pytorch笔记七:优化器和学习调整策略

    千次阅读 多人点赞 2020-04-26 10:05:29
    大纲如下: 优化器(什么是优化器,优化器运行机制、属性和方法,常用的优化器介绍) 学习调整策略(为什么调整学习, 六种学习调整策略) 梳理总结 Ok, let’s go! 2. 优化器 进行优化器的具体概念之前,我们...

    Pytorch官方英文文档:https://pytorch.org/docs/stable/torch.html?
    Pytorch中文文档:https://pytorch-cn.readthedocs.io/zh/latest/

    1. 写在前面

    疫情在家的这段时间,想系统的学习一遍Pytorch基础知识,因为我发现虽然直接Pytorch实战上手比较快,但是关于一些内部的原理知识其实并不是太懂,这样学习起来感觉很不踏实, 对Pytorch的使用依然是模模糊糊, 跟着人家的代码用Pytorch玩神经网络还行,也能读懂,但自己亲手做的时候,直接无从下手,啥也想不起来, 我觉得我这种情况就不是对于某个程序练得不熟了,而是对Pytorch本身在自己的脑海根本没有形成一个概念框架,不知道它内部运行原理和逻辑,所以自己写的时候没法形成一个代码逻辑,就无从下手。 这种情况即使背过人家这个程序,那也只是某个程序而已,不能说会Pytorch, 并且这种背程序的思想本身就很可怕, 所以我还是习惯学习知识先有框架(至少先知道有啥东西)然后再通过实战(各个东西具体咋用)来填充这个框架。 而这个系列的目的就是在脑海中先建一个Pytorch的基本框架出来, 学习知识,知其然,知其所以然才更有意思 😉

    今天是该系列的第七篇文章,依然是基于上次的模型的权值初始化和损失函数介绍进行整理, 上一次已经把损失函数模块整理完毕,我们知道损失函数的作用是衡量模型输出与真实标签的差异,当我们有了这个loss之后,我们就可以通过反向传播机制得到参数的梯度,那么我们如何利用这个梯度进行更新参数使得模型的loss逐渐的降低呢?这个就是优化器干的活了,所以今天开始进入优化器模块,首先学习优化器的概念,然后学习优化器的属性和方法,介绍常用的优化器的原理。 关于优化器,最重要的一个参数就是学习率,这个控制着参数更新的一个步伐, 在模型训练中,对于学习率的调整也是非常关键的,所以最后整理一些关于学习率调整的六种策略。

    注意,本系列都默认已经安装了Cuda,搭建好了Pytorch环境,如果你电脑是Windows,并且没有装Pytorch,那么巧了, 我之前写过一篇怎么搭建环境,可以先看看 Pytorch入门+实战系列一:Windows下的Pytorch环境手把手搭建 😉

    大纲如下:

    • 优化器(什么是优化器,优化器运行机制、属性和方法,常用的优化器介绍)
    • 学习率调整策略(为什么调整学习率, 六种学习率调整策略)
    • 梳理总结

    Ok, let’s go!

    2. 优化器

    进行优化器的具体概念之前,我们得看看优化器要干一个什么样的事情, 我们知道了机器学习的五个步骤: 数据 -> 模型 -> 损失 -> 优化器 -> 迭代训练。 我们通过前向传播的过程,得到了模型输出与真实标签的差异,我们称之为损失, 有了损失,我们会进入反向传播过程得到参数的梯度,那么接下来就是优化器干活了,优化器要根据我们的这个梯度去更新参数,使得损失不断的减低。 那么优化器是怎么做到的呢? 下面我们从三部分进行展开,首先是优化器的概念,然后是优化器的属性和方法,最后是常用的优化器。

    2.1 什么是优化器

    Pytorch的优化器: 管理更新模型中可学习参数的值, 使得模型输出更接近真实标签。

    我们在更新参数的时候一般使用梯度下降的方式去更新, 那么什么是梯度下降呢? 说这个问题之前得先区分几个概念:

    • 导数: 函数在指定坐标轴上的变化率
    • 方向导数: 指定方向上的变化率
    • 梯度: 一个向量, 方向为方向导数取得最大值的方向

    我们知道梯度是一个向量,它的方向是导数取得最大值的方向,也就是增长最快的方向,而梯度下降就是沿着梯度的负方向去变化,这样函数的下降也是最快的。所以我们往往采用梯度下降的方式去更新权值,使得函数的下降尽量的快。

    2.2 Optimizer的基本属性和方法

    下面我们学习Pytorch里面优化器的基本属性:
    在这里插入图片描述

    • defaults: 优化器超参数,里面会存储一些学习了, momentum的值,衰减系数等
    • state: 参数的缓存, 如momentum的缓存(使用前几次梯度进行平均)
    • param_groups: 管理的参数组, 这是个列表,每一个元素是一个字典,在字典中有key,key里面的值才是我们真正的参数(这个很重要, 进行参数管理
    • _step_count: 记录更新次数, 学习率调整中使用, 比如迭代100次之后更新学习率的时候,就得记录这里的100.

    优化器里面的基本方法:
    在这里插入图片描述

    • zero_grad(): 清空所管理参数的梯度, 这里注意Pytorch有一个特性就是张量梯度不自动清零
    • step(): 执行一步更新
    • add_param_group(): 添加参数组, 我们知道优化器管理很多参数,这些参数是可以分组的,我们对不同组的参数可以设置不同的超参数, 比如模型finetune中,我们希望前面特征提取的那些层学习率小一些,而后面我们新加的层学习率大一些更新快一点,就可以用这个方法。
      在这里插入图片描述
    • state_dict(): 获取优化器当前状态信息字典
    • load_state_dict(): 加载状态信息字典,这两个方法用于模型断点的一个续训练, 所以我们在模型训练的时候,一般多少个epoch之后就要保存当前的状态信息。
      在这里插入图片描述

    了解了优化器的基本属性和方法之后,我们去代码中看看优化器的运行机制了, 依然是代码调试的方法, 还记得我们的人民币二分类任务吗? 我们进行优化器部分的调试:我们在优化器的定义那打上断点,然后debug

    在这里插入图片描述
    点击步入,进入sgd.py的SGD类:
    在这里插入图片描述
    SGD类是继承于optimizer的,所以我们将代码运行到父类初始化的这一行,点击步入,看看是如何初始化的:
    在这里插入图片描述
    这里就是optimizer的__init__初始化部分了,可以看到上面介绍的那几个属性和它们的初始化方法,当然这里有个最重要的就是参数组的添加,我们看看是怎么添加的:
    在这里插入图片描述
    这里重点说一下这个,我们还记得初始化SGD的时候传入了一个形参:optim.SGD(net.parameters(), lr=LR, momentum=0.9),这里的net.parameters() 就是神经网络的每层的参数, SGD在初始化的时候, 会把这些参数以参数组的方式再存起来, 上图中的params就是神经网络每一层的参数。

    下面我们跳回去, 看看执行完这个初始化参数变成了什么样子:

    在这里插入图片描述
    这就是优化器的初始化工作了, 初始化完了之后, 我们就可以进行梯度清空,然后更新梯度即可:
    在这里插入图片描述
    这就是优化器的使用了。

    下面我们学习优化器具体的方法:

    1. step(): 一次梯度下降更新参数
      在这里插入图片描述

    2. zero_grad(): 将梯度清零
      在这里插入图片描述

    3. add_param_group(): 添加参数组
      这个是在模型的迁移学习中非常实用的一个方法,我们看看怎么用:
      在这里插入图片描述

    4. state_dict()和load_state_dict()
      这两个方法用于保存和加载优化器的一个状态信息,通常用在断点的续训练, 比如我们训练一个模型,训练了10次停电了, 那么再来电的时候我们就得需要从头开始训练,但是如果有了这两个方法,我们就可以再训练的时候接着上次的次数继续, 所以这两个也非常实用。

      首先是state_dict()
      在这里插入图片描述
      我们可以看到,state_dict()方法里面保存了我们优化器的各种状态信息,我们通过torch.save就可以保存这些状态到文件(.pkl), 这样假设此时停电了。 好,我们就可以通过load_state_dict()来导入这个状态信息,让优化器在这个基础上进行训练,看看是怎么做的?
      在这里插入图片描述

    好了,这就是优化器的初始化和优化器的5个方法的使用了。了解了这些知识之后,我们就知道了优化器的运行机制,管理和更新模型的可学习参数(管理是通过各种属性,尤其是param_groups这个重要的属性,而更新是通过各种方法,主要是step()方法进行更新)。 那么究竟有哪些常用的优化器呢? 它们又用于什么场景呢? 下面我们就来看看:

    2.3 常用的优化器

    这次我们会学习Pytorch中的10种优化器,但是在介绍这些优化器之前,得先学习两个非常重要的概念, 那就是学习率和动量。 我们先从学习率开始:

    2.3.1 学习率

    在梯度下降过程中,学习率起到了控制参数更新的一个步伐的作用, 参数更新公式我们都知道:
    w i + 1 = w i − L R × g r a d ( w i ) w_{i+1} = w_i - LR \times grad(w_i) wi+1=wiLR×grad(wi)
    如果没有这个学习率LR的话,往往有可能由于梯度过大而错过我们的最优值,就是下面这种感觉:
    在这里插入图片描述
    随着迭代次数的增加,反而越增越大, 就是因为这个步子太大了,跳过了我们的最优值。所以这时候我们想让他这个跨度小一些,就得需要一个参数来控制我们的这个跨度,这个就是学习率。 这样说起来,有点抽象,我们还是从代码中看看吧:
    在这里插入图片描述
    我们可以看一下上面的图像,loss是不断上升的,这说明这个跨度是有问题的,所以下面我们尝试改小一点学习率,我们就可以发现区别了:
    在这里插入图片描述
    我们发现,当loss上升不降的时候,有可能是学习率的问题,所以我们一般会尝试一个小的学习率。 慢慢的去进行优化。

    学习率一般是我们需要调的一个非常重要的超参数, 我们一般是给定一个范围,然后画出loss的变化曲线,看看哪学习率比较好,当然下面也会重点学习学习率的调整策略。
    在这里插入图片描述

    2.3.2 动量

    Momentum:结合当前梯度与上一次更新信息, 用于当前更新。这么说可能有点抽象, 那么我们可以举个比较形象的例子:
    在这里插入图片描述
    那么这个动量是怎么作用于我们的更新的呢? 在这之前,我们得先学习一个概念叫做指数加权平均, 指数加权平均在时间序列中经常用于求取平均值的一个方法,它的思想是这样,我们要求取当前时刻的平均值,距离当前时刻越近的那些参数值,它的参考性越大,所占的权重就越大,这个权重是随时间间隔的增大呈指数下降,所以叫做指数滑动平均。公式如下:
    v t = β ∗ v t − 1 + ( 1 − β ) ∗ θ t v_{t}=\beta * v_{t-1}+(1-\beta) * \theta_{t} vt=βvt1+(1β)θt
    v t v_{t} vt是当前时刻的一个平均值,这个平均值有两项构成,一项是当前时刻的参数值 θ t \theta_{t} θt, 所占的权重是 1 − β 1-\beta 1β, 这个 β \beta β是个参数。 另一项是上一时刻的一个平均值, 权重是 β \beta β

    当然这个公式看起来还是很抽象,丝毫没有看出点指数滑动的意思, 那么还是用吴恩达老师PPT里的一个例子解释一下吧:

    在这里插入图片描述
    看上面这个温度图像,横轴是第几天,然后纵轴是温度, 假设我想求第100天温度的一个平均值,那么根据上面的公式:
    v 100 = β ∗ v 99 + ( 1 − β ) ∗ θ 100 = ( 1 − β ) ∗ θ 100 + β ∗ ( β ∗ v 98 + ( 1 − β ) ∗ θ 99 ) = ( 1 − β ) ∗ θ 100 + ( 1 − β ) ∗ β ∗ θ 99 + ( β 2 ∗ v 98 ) = ( 1 − β ) ∗ θ 100 + ( 1 − β ) ∗ β ∗ θ 99 + ( 1 − β ) ∗ β 2 ∗ θ 98 + ( β 3 ∗ v 97 ) = ( 1 − β ) ∗ β 0 ∗ θ 100 + ( 1 − β ) ∗ β 1 ∗ θ 99 + ( 1 − β ) ∗ β 2 ∗ θ 98 + ( β 3 ∗ v 97 ) = ∑ i N ( 1 − β ) ∗ β i ∗ θ N − i \begin{array}{l} v_{100}=\beta * v_{99}+(1-\beta) * \theta_{100} \\ =(1-\beta) * \theta_{100}+\beta *\left(\beta * v_{98}+(1-\beta) * \theta_{99}\right) \\ =(1-\beta) * \theta_{100}+(1-\beta) * \beta * \theta_{99}+\left(\beta^{2} * v_{98}\right) \\ = (1-\beta) * \theta_{100}+(1-\beta) * \beta * \theta_{99}+(1-\beta) * \beta^{2} * \theta_{98}+\left(\beta^{3} * v_{97}\right) \\ = (1-\beta) * \beta^{0} * \theta_{100}+(1-\beta) * \beta^{1} * \theta_{99}+(1-\beta) * \beta^{2} * \theta_{98}+\left(\beta^{3} * v_{97}\right) \\ = \sum_{i}^{N}(\mathbf{1}-\boldsymbol{\beta}) * \boldsymbol{\beta}^{i} * \boldsymbol{\theta}_{N-i} \end{array} v100=βv99+(1β)θ100=(1β)θ100+β(βv98+(1β)θ99)=(1β)θ100+(1β)βθ99+(β2v98)=(1β)θ100+(1β)βθ99+(1β)β2θ98+(β3v97)=(1β)β0θ100+(1β)β1θ99+(1β)β2θ98+(β3v97)=iN(1β)βiθNi
    最下面这一行就是通式了,我们发现,距离当前时刻越远的那些 θ \theta θ值,它的权重是越来越小的,因为 β \beta β小于1, 所以间隔越远,小于1的这些数连乘,权重越来越小,而且是呈指数下降,因为这里是 β i \beta ^i βi。 下面通过代码看一下这个权重,也就是 ( 1 − β ) ∗ β i (1-\beta)*\beta^i (1β)βi是怎么变化的,亲身感受一下这里的指数下降:
    在这里插入图片描述
    距离当前时刻越远,对当前时刻的一个平均值影响就越小。距离当前时刻越近,对当前时刻的一个平均值影响越大,这就是指数加权平均的思想了。 这里我们发现,有个超参数 β \beta β, 这个到底是干嘛的? 我们先来观察一个图, 还是上面的代码,我们设置不同的 β \beta β来观察一下这个权重的变化曲线:
    在这里插入图片描述
    我们可以发现,beta越小,就会发现它关注前面一段时刻的距离就越短,比如这个0.8, 会发现往前关注20天基本上后面的权重都是0了,意思就是说这时候是平均的过去20天的温度, 而0.98这个,会发现,关注过去的天数会非常长,也就是说这时候平均的过去50天的温度。所以beta在这里控制着记忆周期的长短,或者平均过去多少天的数据,这个天数就是 1 1 − β \frac{1}{1-\beta} 1β1, 通常beta设置为0.9, 物理意义就是关注过去10天左右的一个温度。 这个参数也是比较重要的, 还是拿吴恩达老师PPT的一张图片:
    在这里插入图片描述
    看上图,是不同beta下得到的一个温度变化曲线

    • 红色的那条,是beta=0.9, 也就是过去10天温度的平均值
    • 绿色的那条,是beta=0.98, 也就是过去50天温度的平均值
    • 黄色的那条,beta=0.5, 也就是过去2天的温度的平均

    可以发现,如果这个 β \beta β很高, 比如0.98, 最终得到的温度变化曲线就会平缓一些,因为多平均了几天的温度, 缺点就是曲线进一步右移, 因为现在平均的温度值更多, 要平均更多的值, 指数加权平均公式,在温度变化时,适应的更缓慢一些,所以会出现一些延迟,因为如果 β \beta β=0.98,这就相当于给前一天加了太多的权重,只有0.02当日温度的权重,所以温度变化时,温度上下起伏,当 β \beta β变大时,指数加权平均值适应的更缓慢一些, 换了0.5之后,由于只平均两天的温度值,平均的数据太少,曲线会有很大的噪声,更有可能出现异常值,但这个曲线能够快速适应温度的变化。 所以这个 β \beta β过大过小,都会带来问题。 一般取0.9.

    在这里插入图片描述
    好了,理解了指数滑动平均之后,就来看看我们的Momentum了,其实所谓的Momentum梯度下降, 基本的想法是计算梯度的指数加权平均数,并利用该梯度更新权重, 我们看看在Pytorch中是怎么实现的:

    • 普通的梯度下降: w i + 1 = w i − l r ∗ g ( w i ) {w}_{i+1}={w}_{i}-{l} {r} * {g}\left({w}_{i}\right) wi+1=wilrg(wi)
    • Momentum梯度下降:
      v i = m ∗ v i − 1 + g ( w i ) w i + 1 = w i − l r ∗ v i v_i = m * v_{i-1} + g(w_i) \\ w_{i+1} = w_{i} - lr * v_i vi=mvi1+g(wi)wi+1=wilrvi

    这里的 m m m就是momentum系数, v i v_i vi表示更新量, g ( w i ) g(w_i) g(wi) w i w_i wi的梯度。 这里的 v i v_i vi就是既考虑了当前的梯度,也考虑了上一次梯度的更新信息, 如果还是很抽象,那么再推导一下就可以:
    v 100 = m ∗ v 99 + g ( w 100 ) = g ( w 100 ) + m ∗ ( m ∗ v 98 + g ( w 99 ) ) = g ( w 100 ) + m ∗ g ( w 99 ) + m 2 ∗ v 98 = g ( w 100 ) + m ∗ g ( w 99 ) + m 2 ∗ g ( w 98 ) + m 3 ∗ v 97 \begin{aligned} v_{100} &=m * v_{99}+g\left(w_{100}\right) \\ &=g\left(w_{100}\right)+m *\left(m * v_{98}+g\left(w_{99}\right)\right) \\ &=g\left(w_{100}\right)+m * g\left(w_{99}\right)+m^{2} * v_{98} \\ &=g\left(w_{100}\right)+m * g\left(w_{99}\right)+m^{2} * g\left(w_{98}\right)+m^{3} * v_{97} \end{aligned} v100=mv99+g(w100)=g(w100)+m(mv98+g(w99))=g(w100)+mg(w99)+m2v98=g(w100)+mg(w99)+m2g(w98)+m3v97
    这样,就可以发现,当前梯度的更新量会考虑到当前梯度, 上一时刻的梯度,前一时刻的梯度,这样一直往前,只不过越往前权重越小而已。下面再通过代码看一下momentum的作用:
    我们有0.01和0.03两个学习率,训练模型,我们看看loss的变化曲线:
    在这里插入图片描述
    现在,我们给学习率0.01的这个加一个动量momentum, 再看看效果:
    在这里插入图片描述
    可以看到加上动量的0.01收敛的速度快了,但是前面会有震荡, 这是因为这里的m太大了,当日温度的权重太小,所以前面梯度一旦大小变化,这里就会震荡,当然会发现震荡会越来越小最后趋于平缓,这是因为不断平均的梯度越来越多。 这时候假设我们减少动量m, 效果会好一些,比如0.63:
    在这里插入图片描述
    好了,学习率和动量解释清楚了,下面就看看常用的优化器了。

    2.3.3 常用优化器介绍

    1. optim.SGD
      在这里插入图片描述
    • param: 管理的参数组
    • lr: 初识学习率
    • momentum:动量系数, beta
    • weight_decay: L2正则化系数
    • nesterov: 是否采用NAG

    这个优化器是非常常用的。 然后下面列出10款优化器,具体的不去介绍, 可以大体了解有哪些优化器可用:

    • optim.SGD: 随机梯度下降法
    • optim.Adagrad: 自适应学习率梯度下降法
    • optim.RMSprop: Adagrad的改进
    • optim.Adadelta: Adagrad的改进
    • optim.Adam: RMSprop结合Momentum
    • optim.Adamax: Adam增加学习率上限
    • optim.SparseAdam: 稀疏版的Adam
    • optim.ASGD: 随机平均梯度下降
    • optim.Rprop: 弹性反向传播
    • optim.LBFGS: BFGS的改进

    这里面比较常用的就是optim.SGDoptim.Adam, 其他优化器的详细使用方法移步官方文档。

    3. 学习率调整策略

    上面我们已经学习了优化器,在优化器当中有很多超参数,例如学习率,动量系数等,这里面最重要的一个参数就是学习率。它直接控制了参数更新步伐的大小,整个训练当中,学习率也不是一成不变的,也可以调整和变化。 所以下面整理学习率的调整策略,首先是为什么要调整学习率,然后是Pytorch的六种学习率调整策略,最后是小结一下:

    3.1 为什么要调整学习率

    学习率是可以控制更新的步伐的。 我们在训练模型的时候,一般开始的时候学习率会比较大,这样可以以一个比较快的速度到达最优点的附近,然后再把学习率降下来, 缓慢的去收敛到最优值。 这样说可能比较抽象,玩过高尔夫球吗? 我们可以看一个例子:
    在这里插入图片描述
    我们开始的时候,一般是大力把球打到洞口的旁边,然后再把力度降下来,一步步的把球打到洞口,这里的学习率调整也差不多是这个感觉。

    当然,再看一个函数的例子也行:

    在这里插入图片描述所以,在模型的训练过程中,调整学习率也是非常重要的,学习率前期要大,后期要小。Pytorch中提供了一个很好的学习率的调整方法,下面我们就来具体学习,学习率该如何进行调整。

    3.2 Pytorch的学习率调整策略

    在学习学习率调整策略之前,得先学习一个基类, 因为后面的六种学习率调整策略都是继承于这个类的,所以得先明白这个类的原理:
    在这里插入图片描述
    主要属性:

    • optimizer: 关联的优化器, 得需要先关联一个优化器,然后再去改动学习率
    • last_epoch: 记录epoch数, 学习率调整以epoch为周期
    • base_lrs: 记录初始学习率

    主要方法:

    • step(): 更新下一个epoch的学习率, 这个是和用户对接
    • get_lr(): 虚函数, 计算下一个epoch的学习率, 这是更新过程中的一个步骤

    下面依然是人民币二分类的例子,看看LRScheduler的构建和使用:
    在这里插入图片描述
    老规矩,打断点,debug,然后步入这个lr_scheduler.StepLR这个类。这个类就是继承_LRScheduler的。我们运行到初始化的父类初始化那一行,然后再次步入。
    在这里插入图片描述
    看看父类的这个__init__怎么去构建一个最基本的Scheduler的。
    在这里插入图片描述
    这样我们就构建好了一个Scheduler。下面就看看这个Scheduler是如何使用的, 当然是调用step()方法更新学习率了, 那么这个step()方法是怎么工作的呢? 继续调试: 打断点,debug,步入:
    在这里插入图片描述
    步入之后,我们进入了_LRSchedulerstep函数,
    在这里插入图片描述
    我们发现,这个跳到了我们的StepLR这个类里面,因为我们说过,这个get_lr在基类里面是个虚函数,我们后面编写的Scheduler要继承这个基类,并且要覆盖这个get_lr函数,要不然程序不知道你想怎么个衰减学习率法啊。 所以我们得把怎么减学习率通过这个函数告诉程序:
    在这里插入图片描述
    可以看到这里面就用到了初始化时候的base_lr属性。

    下面关于优化器的定义和使用的内部运行原理就可以稍微总结了,首先我们在定义优化器的时候,这时候会完成优化器的初始化工作, 主要有关联优化器(self.optimizer属性), 然后初始化last_epochbase_lrs(记录原始的学习率,后面get_lr方法会用到)。 然后就是用Scheduler,我们是直接用的step()方法进行更新下一个epoch的学习率(这个千万要注意放到epoch的for循环里面而不要放到batch的循环里面 ),而这个内部是在_Scheduler类的step()方法里面调用了get_lr()方法, 而这个方法需要我们写Scheduler的时候自己覆盖,告诉程序按照什么样的方式去更新学习率,这样程序根据方式去计算出下一个epoch的学习率,然后直接更新进优化器的_param_groups()里面去。

    好了,下面就可以学习Pytorch提供的六种学习率调整策略:

    1. StepLR
      功能: 等间隔调整学习率
      在这里插入图片描述
      step_size表示调整间隔数, gamma表示调整系数, 调整方式就是 l r = l r ∗ g a m m a lr = lr * gamma lr=lrgamma, 这里的gamma一般是0.1-0.5。 用的时候就是我们指定step_size,比如50, 那么就是50个epoch调整一次学习率,调整的方式就是 l r = l r ∗ g a m m a lr = lr * gamma lr=lrgamma。 下面从代码里面直观感受一下这种调整策略:
      在这里插入图片描述

    2. MultiStepLR
      功能: 按给定间隔调整学习率
      在这里插入图片描述
      这里的milestones表示设定调整时刻数, gamma也是调整系数,调整方式依然是 l r = l r ∗ g a m m a lr = lr * gamma lr=lrgamma, 只不过和上面不同的是,这里的间隔我们可以自己调,构建一个list,比如[50, 125, 150], 放入到milestones中,那么就是50个epoch,125个epoch,150个epoch调整一次学习率。依然是从代码里面感受一下:
      在这里插入图片描述

    3. ExponentialLR
      功能:按指数衰减调整学习率
      在这里插入图片描述
      gamma表示指数的底了。 调整方式: l r = l r ∗ g a m m a e p o c h lr = lr * gamma^{epoch} lr=lrgammaepoch, 这个观察一下代码:
      在这里插入图片描述

    4. CosineAnnealingLR
      功能:余弦周期调整学习率
      在这里插入图片描述
      T_max表示下降周期,只是往下的那一块。 eta_min表示学习率下限, 调整方式:
      η t = η min ⁡ + 1 2 ( η max ⁡ − η min ⁡ ) ( 1 + cos ⁡ ( T c u r T max ⁡ π ) ) \eta_{t}=\eta_{\min }+\frac{1}{2}\left(\eta_{\max }-\eta_{\min }\right)\left(1+\cos \left(\frac{T_{c u r}}{T_{\max }} \pi\right)\right) ηt=ηmin+21(ηmaxηmin)(1+cos(TmaxTcurπ))
      下面直接从代码中感受:
      在这里插入图片描述

    5. ReduceLRonPlateau
      功能: 监控指标, 当指标不再变化则调整, 这个非常实用。可以监控loss或者准确率,当不在变化的时候,我们再去调整。
      在这里插入图片描述
      主要参数:

      • mode: min/max两种模式(min就是监控指标不下降就调整,比如loss,max是监控指标不上升就调整, 比如acc)
      • factor: 调整系数,类似上面的gamma
      • patience: “耐心”, 接受几次不变化, 这一定要是连续多少次不发生变化
      • cooldown: “冷却时间”, 停止监控一段时间
      • verbose: 是否打印日志, 也就是什么时候更新了我们的学习率
      • min_lr: 学习率下限
      • eps: 学习率衰减最小值


      下面我们直接从代码中学习这个学习率调整策略的使用:
      在这里插入图片描述
      上面是学习率一直保持不变,如果我们在第5个epoch更新一下子,那么这个更新策略会成什么样呢?
      在这里插入图片描述

    6. LambdaLR
      功能: 自定义调整策略,这个也比较实用,可以自定义我们的学习率更新策略,这个就是真的告诉程序我们想怎么改变学习率了。并且还可以对不同的参数组设置不同的学习率调整方法,所以在模型的finetune中非常实用
      在这里插入图片描述
      这里的lr_lambda表示function或者是list。 这个我们从代码中进行学习:
      在这里插入图片描述
      但这个过程到底是怎么实现的呢? 我们依然可以debug看一下过程,依然是调用get_lr()函数,但是我们这里看看这里面到底是怎么实现自定义的:
      在这里插入图片描述
      我们再这里再次stepinto ,就会发现跳到了我们自定义的两个更新策略上来:
      在这里插入图片描述

    好了,六种学习率调整策略已经整理完毕,下面小结一下:

    1. 有序调整: Step、MultiStep、 Exponential和CosineAnnealing, 这些得事先知道学习率大体需要在多少个epoch之后调整的时候用
    2. 自适应调整: ReduceLROnPleateau, 这个非常实用,可以监控某个参数,根据参数的变化情况自适应调整
    3. 自定义调整:Lambda, 这个在模型的迁移中或者多个参数组不同学习策略的时候实用

    调整策略就基本完了,那么我们得先有个初始的学习率啊, 下面介绍两种学习率初始化的方式:

    • 设置较小数:0.01, 0.001, 0.0001
    • 搜索最大学习率: 看论文《Cyclical Learning Rates for Training Neural Networks》, 这个就是先让学习率从0开始慢慢的增大,然后观察acc, 看看啥时候训练准确率开始下降了,就把初始学习率定为那个数。
      在这里插入图片描述

    4. 总结

    今天的内容就是这些了,还是有点多的,依然是快速梳理一遍,我们今天开始的优化器模块,优化器管理更新参数,不断降低损失。 首先从优化器本身开始学习,学习了优化器的基本属性和方法,并通过代码调试的方式了解了优化器的初始化和使用原理。 然后学习了常用的优化器,介绍了两个非常关键的概念学习率和动量, 学习了SGD优化器。 优化器中非常重要的一个参数就是学习率,在模型的训练过程中,对学习率调整非常关键,所以最后又学习了学习率的6种调整策略,从三个维度进行总结。

    下面依然是一张导图把这次的知识拎起来,方便以后查阅:
    在这里插入图片描述
    好了, 优化器模块介绍完毕, 我们再回忆一下机器模型训练的五个步骤, 数据模块 -> 模型模块 -> 损失函数模块 -> 优化器模块 -> 迭代训练。 前四个模块我们都一一介绍完毕,下面我们进入最后一个模块的学习,这里面首先就是迭代训练过程中的可视化模块TensorBoard, 我们继续Rush 😉

    PS: 本次学习视频来自B站https://www.bilibili.com/video/BV1EE41177ot?from=search&seid=13894259699897815176, 时间长了有可能被和谐了。 所有代码链接:

    链接:https://pan.baidu.com/s/1YPmOtLCjsfu8KDGGgJ09Ug
    提取码:u8ti

    展开全文
  • 什么是MIMO-OFDM技术

    千次阅读 2019-04-08 12:55:47
    什么是MIMO-OFDM技术 摘要 第四代移动通信提供高的数据传输速率,而MIMO和OFDM提高了频谱效率,从而提供高传输速率和系统容量的技术。两者的结合已经成为第四代移动通信技术研究中的热点。通过这两种技术的优势互补...

    什么是MIMO-OFDM技术
    摘要
    第四代移动通信提供高的数据传输速率,而MIMO和OFDM提高了频谱效率,从而提供高传输速率和系统容量的技术。两者的结合已经成为第四代移动通信技术研究中的热点。通过这两种技术的优势互补,可以为系统提供高传输速率,同时也能提高系统容量,降低成本。文中详细介绍了这两种技术及信道估计。

    图1. 采用MIMO-OFDM技术的新标准。
    一、引言
    目前没有第四代移动通信的确切定义,但比较认同的解释是:“第四代移动通信的概念可称为宽带接入和分布网络,具有非对称的和超过2Mbit/s的数据传输能力。它包括宽带无线固定接入、宽带无线局域网、移动宽带系统、互操作的广播网络和卫星系统等。此外,第四代移动通信系统将是多功能集成的宽带移动通信系统,可以提供的数据传输速率高达100Mbit/s甚至更高,也是宽带接入IP系统”。简单而言,4G是一种超高速无线网络,一种不需要电缆的信息超级高速公路。这样在有限的频谱资源上实现高速率和大容量,需要频谱效率极高的技术。MIMO技术充分开发空间资源,利用多个天线实现多发多收,在不需要增加频谱资源和天线发送功率的情况下,可以成倍地提高信道容量。OFDM技术是多载波传输的一种,其多载波之间相互正交,可以高效地利用频谱资源,另外,OFDM将总带宽分割为若干个窄带子载波可以有效地抵抗频率选择性衰落。因此充分开发这两种技术的潜力,将二者结合起来可以成为新一代移动通信核心技术的解决方案,下面详细介绍这两种技术及其二者的结合方案。
    二、MIMO技术
    MIMO(Multiple-InputMultiple-Output)系统示意图如图1所示,该技术最早是由Marconi于1908年提出的,它利用多天线来抑制信道衰落。MIMO技术是指在发射端和接收端分别设置多副发射天线和接收天线,其出发点是将多发送天线与多接收天线相结合以改善每个用户的通信质量(如差错率)或提高通信效率(如数据速率)。MIMO技术实质上是为系统提供空间复用增益和空间分集增益,空间复用技术可以大大提高信道容量,而空间分集则可以提高信道的可靠性,降低信道误码率。通常,多径要引起衰落,因而被视为有害因素,然而对于MIMO来说,多径可以作为一个有利因素加以利用,MIMO技术的关键是能够将传统通信系统中存在的多径衰落影响因素变成对用户通信性能有利的增强因素,MIMO技术有效地利用随机衰落和可能存在的多径传播来成倍地提高业务传输速率,因此它能够在不增加所占用的信号带宽的前提下使无线通信的性能改善几个数量级。假定发送端有N个发送天线,有M个接收天线,在收发天线之间形成M×N信道矩阵H,在某一时刻t,信道矩阵为:

    其中H的元素是任意一对收发天线之间的增益。对于信道矩阵参数确定的MIMO信道,假定发送端不知道信道信息,总的发送功率为 ,与发送天线的数量M无关;接收端的噪声用N×1向量n表示,是独立零均值高斯复变量,各个接收天线的噪声功率均为 ;发送功率平均分配到每一个发送天线上,则容量公式为:
    
    令M不变,增大N,使得 ,这时可以得到容量的近似表达式:
    
    从上式可以看出,此时的信道容量随着天线数量的增大而线性增大。也就是说可以利用MIMO信道成倍地提高无线信道容量,在不增加带宽和天线发送功率的情况下,频谱利用率可以成倍地提高。利用MIMO技术可以成倍提高信道的容量,同时也可以提高信道的可靠性,降低误码率。前者是利用MIMO信道提供的空间复用增益,后者是利用MIMO信道提供的空间分集增益。目前MIMO技术领域另一个研究热点就是空时编码。常见的空时码有空时块码、空时格码。空时码的主要思想是利用空间和时间上的编码实现一定的空间分集和时间分集,从而降低信道误码率。
    
    图1 MIMO系统框图
    三、OFDM技术
    根据多径信道在频域中表现出来的频率选择性衰落特性,提出正交频分复用的调制技术。如图2所示,正交频分复用的基本原理是把高速的数据流通过串并变换,分配到传输速率相对较低的若干子信道中进行传输,在频域内将信道划分为若干互相正交的子信道,每个子信道均拥有自己的载波分别进行调制,信号通过各个子信道独立传输。如果每个子信道的带宽被划分得足够窄,每个子信道的频率特性就可近似看作是平坦的,即每个子信道都可看作无符号间干扰(ISI)的理想信道,这样在接收端不需要使用复杂的信道均衡技术即可对接收信号可靠地解调。在OFDM系统中,在OFDM符号之间插入保护间隔来保证频域子信道之间的正交性,消除OFDM符号之间的干扰。
    但是要注意,在发送端实际发送1个OFDM时域序列的长度为Nd+Nc,Nd是一个OFDM符号能够传送的频域符号数,加在前面长度为Nc的序列称为循环前缀(CyclicPrefix)或防护间隔(GuardInterval),利用它使得前—OFDM符号对当前OFDM符号的干扰只影响到循环前缀部分,不会对当前OFDM符号造成影响,这就有效地消除了OFDM符号之间的干扰(ISI)。引入循环前缀会使系统的传输效率有所下降,但这是为保证OFDM子载波之间的正交性和消除OFDM符号间干扰所必须付出的代价。OFDM技术之所以越来越受关注,是因为OFDM有很多独特的优点:
    (1)频谱利用率很高,频谱效率比串行系统高近一倍。这一点在频谱资源有限的无线环境中很重要。OFDM信号的相邻子载波相互重叠,从理论上讲其频谱利用率可以接近Nyquist极限。
    (2)抗多径干扰与频率选择性衰落能力强,由于OFDM系统把数据分散到许多个子载波上,大大降低了各子载波的符号速率,从而减弱多径传播的影响,若再通过采用加循环前缀作为保护间隔的方法,甚至可以完全消除符号间干扰。
    (3)采用动态子载波分配技术能使系统达到最大比特率。通过选取各子信道,每个符号的比特数以及分配给各子信道的功率使总比特率最大。即要求各子信道信息分配应遵循信息论中的“注水定理”,亦即优质信道多传送,较差信道少传送,劣质信道不传送的原则。
    (4)通过各子载波的联合编码,可具有很强的抗衰落能力。OFDM技术本身已经利用了信道的频率分集,如果衰落不是特别严重,就没有必要再加时域均衡器。但通过将各个信道联合编码,可以使系统性能得到提高。
    (5)基于离散傅立叶变换(DFT)的OFDM有快速算法,OFDM采用IFFT和FFT来实现调制和解调,易用DSP实现。
    
    图2 OFDM系统框图
    四、MIMO与OFDM的结合
    MIMO系统在一定程度上可以利用传播中多径分量,也就是说MIMO可以抗多径衰落,但是对于频率选择性深衰落,MIMO系统依然是无能为力。目前解决MIMO系统中的频率选择性衰落的方案一般是利用均衡技术,还有一种是利用OFDM。大多数研究人员认为OFDM技术是4G的核心技术,4G需要极高频谱利用率的技术,而OFDM提高频谱利用率的作用毕竟是有限的,在OFDM的基础上合理开发空间资源,也就是MIMO-OFDM,可以提供更高的数据传输速率。另外ODFM由于码率低和加入了时间保护间隔而具有极强的抗多径干扰能力。由于多径时延小于保护间隔,所以系统不受码间干扰的困扰,这就允许单频网络(SFN)可以用于宽带OFDM系统,依靠多天线来实现,即采用由大量低功率发射机组成的发射机阵列消除阴影效应,来实现完全覆盖。下面给出MIMO-OFDM的结合方案。
    

    点击查看大图

    图3 MIMO-OFDM系统框图
    在本方案中的数据进行两次串并转换,首先将数据分成N个并行数据流,将这N个数据流中的第n(n∈[1,N])个数据流进行第二次串并转换成L个并行数据流,分别对应L个子载波,将这L个并行数据流进行IFFT变换,将信号从频域转换到时域,然后从第n(n∈[1,N])个天线上发送出去。这样共有NL个M-QAM符号被发送。整个MIMO系统假定具有N个发送天线,M个接收天线。在接收端第m(m∈[1,M])个天线接收到的第l个子载波的接收信号为:
    
    其中Hm,n,l是第l个子载波频率上的从第n个发送天线到第m个接收天线之间的信道矩阵,并且假定该信道矩阵在接收端是已知的,Cn,l是第个子载波频率上的从第n个发送天线发送的符号,ηm,l是第l个子载波频率上的从第m个接收天线接收到的高斯白噪声。这样在接收端接收到的第l个子载波频率上的N个符号可以通过V-BLAST算法进行解译码,重复进行L次以后,NL个M-QAM符号可以被恢复。
    4.1MIMO-OFDM的信道估计
    在一个传输分集的OFDM系统中,只有在收端有很好的信道信息时,空时码才能进行有效的解码。估计信道参数的难度在于,对于每一个天线每一个子载波都对应多个信道参数。但好在对于不同的子载波,同一空分信道的参数是相关的。根据这一相关性,可以得到参数的估计方法。MIMO-OFDM系统信道估计方法一般有三种:非盲信道估计、盲信道估计和半盲信道估计。下面分别对这三种信道估计方法进行简单介绍。
    4.1.1非盲信道估计
    非盲信道估计是通过在发送端发送导频信号或训练序列,接收端根据所接收的信号估计出导频处或训练序列处的信道参数,然后根据导频或训练序列处的信道参数得到数据信号处的信道参数。当信道为时变信道时,即使是慢时变信道,也必须周期性的发射训练序列,以便及时更新信道估计。这类方法的好处是估计误差小,收敛速度快,不足是由于发送导频或训练序列而浪费了一定的系统资源。
    4.1.2盲信道估计
    盲信道估计是利用信道的输出以及与输入有关的统计信息,在无需知道导频或训练序列的情况下估计信道参数。其好处是传输效率高,不足是鲁棒性相对较差、收敛速度慢,而且运算量较大。
    4.1.3半盲信道估计
    半盲信道估计是在盲信道估计的基础上发展起来的,它利用尽量少的导频信号或训练序列来确定盲信道估计算法所需的初始值,然后利用盲信道估计算法进行跟踪、优化,获得信道参数。由于盲信道算法运算复杂度较高,目前还存在很多问题,难以实用化。而半盲信道估计算法有望在非盲算法和盲算法的基础上进行折衷处理,从而降低运算复杂度。可以预计,对盲及半盲信道估计的研究将成为MIMO-OFDM信道估计研究的热点。
    五、结束语
    在未来的宽带无线通信系统中存在两个最严峻的挑战:多径衰落信道和带宽效率。OFDM将频率选择性多径衰落信道在频域内转换为平坦信道,减小了多径衰落的影响,而MIMO技术能够在空间中产生独立的并行信道同时传输多路数据流,这样就有效地提高了系统的传输速率,即在不增加系统带宽的情况下增加频谱效率。这样,将OFDM和MIMO两种技术相结合就能达到两种效果:一种是实现很高的传输速率,另一种是通过分集实现很强的可靠性,同时,在MIMO-OFDM中加入合适的数字信号处理的算法能更好地增强系统的稳定性。MIMO-FDM技术是OFDM与MIMO技术结合形成的新技术,通过在OFDM传输系统中采用阵列天线实现空间分集,提高了信号质量,充分利用了时间、频率和空间3种分集技术,大大增加了无线系统对噪声、干扰、多径的容限。因此,基于OFDM的MIMO系统具有逼近极限的系统容量和良好的抗衰落特性,可以预见,它将是下一代网络采用的核心技术。
    
    展开全文
  • 一、什么是百度指数 百度指数指的是以使用百度搜索引擎的用户为数据基础的数据分享平台,是当前互联网乃至整个数据时代最重要的统计分析平台之一。 百度指数能够反映出用户搜索的某个关键词在百度的搜索规模有多大,...

    百度指数是什么意思ne ?其中的数值又代表什么?简单说百度指数是站长们开始做网站优化之前最先用到的工具,可以说如果没有百度指数,站长们就无法确定要优化哪些关键词。既然百度指数对我们做SEO优化如此重要,那我们又应该如何利用好百度指数呢?下面,北京SEO培训崔鹏瀚SEO就为大家讲一下这个问题。


    一、什么是百度指数


    百度指数指的是以使用百度搜索引擎的用户为数据基础的数据分享平台,是当前互联网乃至整个数据时代最重要的统计分析平台之一。


    百度指数能够反映出用户搜索的某个关键词在百度的搜索规模有多大,一段时间内的涨跌态势以及相关的新闻舆论变化,关注这些词的网民是什么样的,分布在哪里,同时还搜了哪些相关的词等等,利用好百度指数将有助于我们做好网站关键词排名,下面,北京SEO培训崔鹏瀚SEO将以【SEO】这个关键词作为案例来分析。


    百度指数登陆网址:index.baidu.com


    二、百度指数使用方法


    1. 关键词搜索指数





    关键词搜索指数是以网民在百度的搜索量为数据基础,以关键词为统计对象,科学分析并计算出各个关键词在百度网页搜索中搜索频次的加权和。根据使用百度搜索来源的不同,搜索指数分为PC搜索指数和移动搜索指数。


    当然,这些指数只能作为我们预选关键词的参考,并不能作为唯一标准,因为百度指数中有些关键词指数是人为

    展开全文
  • 学习率优化(一)

    千次阅读 2018-07-17 22:24:09
    上节介绍了反向传播时权值更新方法...如果采用固定学习:,初始值取,学习使用0.01:   分析:经过200次迭代,;经过1000次迭代,; 效果还可以,但这个学习只使用于,如果改变函数还可以这个效果吗?还...

    上节介绍了反向传播时权值更新方法,更新隐含层:\omega _{ho}^{N+1}=\omega _{ho}^{N}-\eta\frac{\partial e}{\partial \omega _{ho}^{N+1}};更新输出层:\omega _{ih}^{N+1}=\omega _{ih}^{N}-\eta\frac{\partial e}{\partial \omega _{ih}^{N+1}}。看似已经完美的解决了问题,但是\eta怎么取值呢?

    我们把问题转化到求二次函数极值问题,例如f(x)=x^{2},如果用梯度下降法求函数极值,每一次x的取值为x^{n+1}=x^{n}-\eta \frac{\partial f(x)}{\partial x},一步步趋近极小值。

    如果采用固定学习率:f(x)=x^{2},初始值取x=1.5,学习率使用0.01:

     

    分析:经过200次迭代,x=0.0258543;经过1000次迭代,x=2.52445\times 10^{-9}

    效果还可以,但这个学习率只使用于f(x)=x^{2},如果改变函数还可以这个效果吗?还采用学习率0.01,f(x)=x^{4},初始值取:x=1.5

     

    分析:经过200次迭代,x=0.24436;经过1000次迭代,x=0.111275;效果不好,学习率不再适用。附上固定学习率的python代码:

    import matplotlib.pyplot as plt
    
    def g(x): 
    	return 4.0*x**3
    def f(x):
    	return x**4
    
    if __name__ == '__main__':
    	x =1.5
    	a = 0.01
    	# 固定学习率
    	for i in range(1000):
    		d = g(x)
    		x -= d * a
    		if i == 200:
    			print(x)
    		plt.scatter(i,x)
    	print(x)
    	plt.show()
    	

    回溯线性搜索

    基于Armijo准则计算搜素方向上的最大步长,其基本思想是沿着搜索方向移动一个较大的步长估计值,然后以迭代形式不断缩减步长,直到该步长使得函数值f(x_{k}+\alpha d_{k})相对与当前函数值f(x_{k})的减小程度大于预设的期望值(即满足Armijo准则)为止。

    f(x_{k}+\alpha d_{k})< f(x_{k})+c_{1}\alpha \triangledown f(x_{k})^{T}d_{k}

    意思就是说,f(x_{k})按学习率缩小一次后得到新值f(x_{k+1})=f(x_{k}+\alpha d_{k}),如果f(x_{k+1})设定为我们的期望值,如果经过学习\eta后可以达到f(x_{k+1}),那么这个学习率就是符合要求的学习率;f(x_{k+1})<=f(x_{k})+c_{1}\alpha \triangledown f(x_{k})^{T}d_{k}

    分析:经过12次迭代后,x=0.0001035,经过1000次迭代后x=3.4222\times 10^{-6},效果不错。

    import matplotlib.pyplot as plt
    
    def g(x): 
    	return 4.0*x**3
    def f(x):
    	return x**4
    
    def armijo(x,d,a):
    	c1 = 0.3
    	now = f(x)
    	next = f(x - a*d)
    
    	count =30
    	while next < now:
    		a *= 2
    		next = f(x - a*d)
    		count-=1
    		if count == 0:
    			break
    	count = 50
    	while next > now-c1*a*d*d:
    		a /=2
    		next = f(x - a*d)
    		count -=1
    		if count == 0:
    			break
    	return a
    
    if __name__ == '__main__':
    	x =1.5
    	a = 0.01
    
    	#回溯线性搜索
    	for i in range(1000):
    		d = g(x)
    		a1 = armijo(x,d,a)
    		x -= d * a1
    		if i == 12:
    			print(x,a1)
    		plt.scatter(i,x)
    	print(x,a1)
    	plt.show()
    
    
    

    二次插值法

    如上述代码,第一个循环,如果沿负梯度方向下降微小的值,f(x_{k+1})<f(x_{k}))会恒成立,但我们每一次都增大学习率,当某一次步子迈的太大,就会不满足,Armijo准则则是再减小学习率,那么二次插值法则是构造一个二次近似函数:h_{q}(\alpha )=\frac{h(\alpha _{0})-h^{'}(0)\alpha _{0}-h(0) }{\alpha _{0}^{2}}\alpha ^{2}+h^{'}(0)\alpha _{0}+h(0);那么导数为0的最优值为:\alpha_{1} =\frac{h^{'}(0)\alpha _{0}^{2} }{2[h^{'}(0)\alpha_{0}+h(0)-h(\alpha _{0})]},若\alpha _{1}满足Armijo准则,则输出该学习率,否则继续迭代。

    分析,经过12次迭代x=0.0003169,,经过1000次迭代,x=3.426001\times 10^{-6},效果和回溯法差不多,么有提升。

    import matplotlib.pyplot as plt
    
    def g(x): 
    	return 4.0*x**3
    def f(x):
    	return x**4
    
    def getA_quad(x,d,a):
    	c1 = 0.3
    	now = f(x)
    	next = f(x - a*d)
    
    	count =30
    	while next < now:
    		a *= 2
    		next = f(x - a*d)
    		count-=1
    		if count == 0:
    			break
    	count = 50
    	while next > now-c1*a*d*d:
    		b=d*a*a/(now+d*a-next)
    		b /=2
    		if b<0:
    			a /=2
    		else:
    			a = b
    		next = f(x - a*d)
    		count -=1
    		if count == 0:
    			break
    	return a
    if __name__ == '__main__':
    	x =1.5
    	a = 0.01
    	
    	#插值法
    	for i in range(1000):
    		d = g(x)
    		a1 = getA_quad(x, d, a)
    		x -= d * a1
    		if i == 12:
    			print(x)
    		plt.scatter(i, x)
    	print(x)
    	plt.show()
    
    

    总结

    [一阶方法] 随机梯度

    SGD(Stochastic Gradient Descent)是相对于BGD(Batch Gradient Descent)而生的。BGD要求每次正反向传播,计算所有Examples的Error,这在大数据情况下是不现实的。最初的使用的SGD,每次正反向传播,只计算一个Example,串行太明显,硬件利用率不高。后续SGD衍生出Mini-Batch Gradient Descent,每次大概推进100个Example,介于BGD和SGD之间。现在,SGD通常是指Mini-Batch方法,而不是早期单Example的方法。

    一次梯度更新,可视为:x_{t+1}=x_{t}+\triangle x_{t} \, \, where \, \, \triangle x_{t}=-\eta g_{t}

    x为参数,t为时序,\triangle为更新量,\eta为学习率,g为梯度。

    以上介绍的回溯法和插值法都属于基于一阶随机梯度的方法,还有基于二阶随机梯度的方法;后续章节再介绍几种常规优化方法。

    [二阶方法] 牛顿法

    二阶牛顿法替换梯度更新量:\triangle x_{t}=H_{t}^{-1} \cdot g_{t}

    H为参数的二阶导矩阵,称为Hessian矩阵。

    牛顿法,用Hessian矩阵替代人工设置的学习率,在梯度下降的时候,可以完美的找出下降方向,不会陷入局部最小值当中,是理想的方法。但是,求逆矩阵的时间复杂度近似O(n^{3}),计算代价太高,不适合大数据。

    展开全文
  • 阿里巴巴国际站询盘是什么意思? 目录 阿里巴巴国际站询盘是什么意思? 询盘一般分为两种: 阿里巴巴国际站询盘有什么技巧吗? 阿里巴巴国际站询盘是什么意思? 询盘(inquiry)也叫询价,是指交易的一方...
  • 神经网络优化 -- 学习

    千次阅读 2020-02-09 22:20:15
    **学习过大,会导致待优化的参数在最小值附近波动,不收敛;学习过小,会导致待优化的参数收敛缓慢。 在训练过程中,参数的更新向着损失函数梯度下降的方向。 参数的更新公式为: 假设损失函数为 梯度是损失...
  • 在目前的工作中,我们旨在证明选择Adam作为优化器,其本身会强烈影响任何批次大小的最小化器的集合,并解释为什么自适应优化器无法找到泛化特别好的解决方案。 3、自适应方法的缺点 本节的目的是为了说明以下观点:...
  • 文章取自goodfellow deep learning书,位置如下: II Deep Networks: Modern Practices 8 Optimization for Training Deep Models —– 8.5 Algorithms with ...研究表明,学习是非常重要的一个超参数,甚...
  • 优化算法-4:学习衰减

    千次阅读 2018-03-29 17:21:33
    慢慢减少学习的原因在于,在训练的初期,你可以承受较大的步伐,但是开始收敛的时候,小的学习能让你的步伐变小一些。 如何减少学习呢? 我们称一次迭代为1poch,那么让 α=11+decay−rate∗epoch−num∗α...
  • 优化理论与凸优化到底是干嘛的?

    万次阅读 多人点赞 2017-12-15 20:47:53
    优化的定义 1.1 凸优化 ...1.1 凸优化优化问题目前在机器学习,数据挖掘等领域应用非常广泛,因为机器学习简单来说,主要做的就是优化问题,先初始化一下权重参数,然后利用优化方法来优化这个
  • 点击和曝光的区别是什么

    千次阅读 2021-03-19 11:08:05
    点击是见到这个网站的链接(可能是从广告...微信流量主点击量与曝光量是什么意思? 微信流量中点击量与曝光量知的情况如下: 1、微信的点击量是指在微信上发布的推广信息或者文字链接,让道用户点击的次数,就是一共
  • SEO搜索引擎优化什么意思

    千次阅读 2013-12-24 15:32:10
    周口seo:SEO(Search Engine Optimization),汉译为搜索引擎优化,是较为流行的网络营销方式,主要目的是增加特定关键字的曝光以增加网站的能见度,进而增加销售的机会。分为站外SEO和站内SEO两种。SEO的主要工作...
  • 性能优化之CPU占用高(一)

    千次阅读 2020-07-30 12:04:24
    当我们cpu使用高的情况下会出现什么情况? 我们访问程序的速度比较慢,运行时间长。 系统崩溃,无法访问程序。 什么情况会导致Java应用程序的CPU使用飙升? 解决这个问题之前我们先了解几个知识点: 1.如何...
  • 1 永磁同步电机MTPA的控制原理 1.1 MTPA控制方式与id=0...这会导致电流的利用不高,系统的效率降低。所以id=0的控制比较适用于隐极式电机(Ld=Lq),而对于凸极式电机并不最优,所以需要重新考虑控制策略。 1.2...
  • PV是什么意思

    万次阅读 2019-04-29 16:16:44
    网站PV值是什么意思? PV是什么意思? – PV,翻译过来就是page view,也就是用户到你网站访问页面数。 在网站数据分析时,经常出现PV这个概念。和PV对应的是IP,IP是独立访问次数。通常PV值是大于IP值的。 那么,PV有...
  • 什么是SEO? seo是搜索引擎优化。是一种利用搜索引擎的规律提高网站在有关搜索引擎的排名,是一种网络营销方式。 seo包括哪些:站内优化和站外优化 站内优化: META标签的优化:例如:title,keywords,description...
  • 计算机网络谢希仁第七版 课后答案

    万次阅读 多人点赞 2019-09-03 23:13:25
    (3)草案标准(Draft Standard)(4) 因特网标准(Internet Standard) 1-07小写和大写开头的英文名internet 和Internet在意思上有何重要区别? 答:(1) internet(互联网或互连网):通用名词,它泛指由多个计算机...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    这些浏览器的内核分别是什么? 21 每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗? 21 Quirks模式是什么?它和Standards模式有什么区别 21 div+css的布局较table布局有什么优点? 22 img的alt...
  • 一、Adagrad //这个优化器,带有自适应的学习 点击此处返回总目录 二、RMSProp //Adagrad的进阶版,带有更好的自适应学习 三、Momentum //动量。 四、Adam ...
  • 常用优化算法介绍

    万次阅读 多人点赞 2018-07-10 19:59:16
    我们把解决此类优化问题的方法叫做优化算法,优化算法本质上是一种数学方法,常见的优化算法包括梯度下降法、牛顿法、Momentum、Nesterov Momentum、Adagrad、Adam等。其实大部分机器学习算法...
  • 平时我们在工作在把网站做好后,往往喜欢把404页面忘记在服务器里面...一、404是什么意思呢? 404意思就是在点击网站某个页面的时候出现显示的是404错误,意思就是这个页面没有正常的打开这个页面,是一个死链接,专
  • 测试开发需要学习的知识结构

    万次阅读 多人点赞 2018-04-12 10:40:58
    努力成为一个优秀的测试开发从业者,加油!... - 假装在测试的回答 - 知乎白盒与黑盒测试什么区分1、黑盒测试 黑盒测试也称功能测试或数据驱动测试,它是在已知产品所应具有的功能,通过测试来检...
  • 卷积神经网络性能优化(提高准确

    万次阅读 多人点赞 2020-05-17 19:12:48
    神经网络是一种在很多用例中能够提供最优准确的机器学习算法。但是,很多时候我们构建的神经网络的准确可能无法令人满意,或者无法让我们在数据科学竞赛中拿到领先名次。所以,我们总是在寻求更好的方式来改善...
  • ITIL是什么意思?ITIL是什么

    千次阅读 2020-09-24 17:25:53
    ITIL是什么? ITIL是Information Technology Infrastructure Library的缩写,即:信息技术基础架构库。 ITIL是由英国政府部门CCTA(Central Computing and Telecommunications Agency)在20世纪80年代末开发的一套IT...
  • 其实最常见的还是 CPM、CPC、CPA,以及包月广告位的方式,因为这集中方式网站主/流量主才能够保障自己的利益收益,因为我们都知道现在的广告转化都明显的较低,大家对广告也都产生了非常明确的排斥感,而且广告都...
  • 一、title是什么意思 title的意思就是网站的一个标题。在网站优化当中title标题是至关重要的,无论是网站首页、栏目页、专题页、详情页中都必须要写的,标题当中匹配的关键词直接影响到了网站首页等能不能出关键词...
  • 人工智能时代,所需要了解人工智能的基本常识

    万次阅读 多人点赞 2018-12-10 22:49:44
    用“水果(fruit)”替代了“时间(time)”,并用“香蕉(banana)”替代“箭(arrow)”,就改变了“飞逝/飞着的(like)”与“像/喜欢(like)”这两个单词的意思。  自然语言处理,像计算机视觉技术一样,...
  • seo和sem是什么意思

    千次阅读 2019-03-30 14:11:55
    如果排除人工非正常操作,这个词语的出现很大程度上归功于网民的搜索习惯,既然有大量的自然用户在搜索seosem就什么意思,在此做进一步说明。 此前,seo教程自学网有写过类似的文章:seo与sem的区别?已经阐明...
  • pytorch中优化器与学习衰减方法总结

    万次阅读 多人点赞 2019-06-30 16:25:53
    torch.optim是一个实现了各种优化算法的库。大部分常用的方法得到支持,并且接口具备足够的通用性,使得未来能够集成更加复杂的方法。 如何使用optimizer 为了使用torch.optim,你需要构建一个optimizer对象。这个...
  • 史上最强Tomcat8性能优化

    万次阅读 多人点赞 2019-10-25 15:33:32
    文章目录授人以鱼不如授人以渔目的服务器资源Tomcat配置优化Linux环境安装运行Tomcat8AJP连接执行器(线程池)3种运行模式部署测试用的web项目查看服务器信息部署web应用使用Apache JMeter进行性能测试下载安装修改...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,683
精华内容 33,473
关键字:

优化率是什么意思