精华内容
下载资源
问答
  • 系统学习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

    展开全文
  • 目录The Marginal Value of Adaptive Gradient Methods in Machine Learning(机器学习中自适应梯度方法的边缘值)摘要1、引言2、背景2.1相关...导致过拟合问题4 、深度学习实验4.1 调整超参数4.2 卷积神经网络的选择...

    The Marginal Value of Adaptive Gradient Methods in Machine Learning(机器学习中自适应梯度方法的边缘值)

    摘要

    自适应优化方法通过从迭代历史中构建的度量来执行局部优化,在训练深度神经网络时越来越受欢迎。例子包括AdaGrad、RMSProp和Adam。我们表明,对于简单的超参数化问题,自适应方法往往能找到与梯度下降(GD)或随机梯度下降(SGD)截然不同的解。我们构建了一个说明性的二元分类问题,在这个问题中,数据是线性可分的,GD和SGD实现了零测试误差,而AdaGrad、Adam和RMSProp任意一个则实现了接近一半的测试误差。此外,我们还研究了自适应方法在几个先进的深度学习模型上的经验泛化能力。我们观察到,自适应方法发现的解决方案的泛化能力比SGD更差(通常是显著差),即使这些解决方案具有更好的训练性能。这些结果表明,从业者应该重新考虑使用自适应方法来训练神经网络的问题。

    1、引言

    越来越多的深度学习研究者使用自适应梯度方法[3,12]来训练他们的模型,因为它们的训练时间很快[6]。尤其是Adam[8]已经成为许多深度学习框架中使用的默认算法。然而,这种自适应梯度方法的泛化和超出样本外的表现仍然不够好。考虑到需要多次传递数据来最小化训练目标,典型的后悔保证并不一定能确保找到的解决方案是通用的。

    值得注意的是,当参数的数量超过数据点的数量时,算法的选择有可能会极大地影响到学习哪个模型[15]。给定某个优化问题的两个不同的最小化器,我们可以说它们的相对泛化能力如何?在本文中,我们表明,自适应和非自适应优化方法确实能找到具有非常不同泛化特性的解。我们为二元分类提供了一个简单的生成模型,在这个模型中,种群是可线性分离的(即存在一个大余量的解),但是AdaGrad[3]、RMSProp[21]和Adam收敛到一个解,这个解对新数据的错误分类概率任意接近一半。在这个相同的例子上,SGD在新数据上找到了一个错误率为零的解。我们的构造表明,自适应方法倾向于给虚假特征以不适当的影响,这些特征对样本之外的泛化没有作用。

    此外,我们还提出了数值实验,证明自适应方法的泛化能力比非自适应方法差。我们的实验揭示了三个主要发现。
    第一,在超参数调整量相同的情况下,SGD和带动量的SGD在所有评估的模型和任务的验证/测试集上的表现都优于自适应方法。即使自适应方法实现了相同的训练损失或低于非自适应方法,也是如此。
    第二,自适应方法通常在训练集上表现出更快的初始进展,但在验证/测试集上其性能很快就会趋于平缓。
    第三,包括自适应方法在内的所有方法都需要相同数量的调整。这对自适应方法需要较少调整的传统认知提出了挑战。
    此外,作为对未来实践的有益指导,我们提出了一个简单的调优学习率和衰减的方案,该方案在我们研究的所有深度学习任务上都表现良好。

    2、背景

    用于最小化损失的典型优化算法是随机梯度方法或随机动量方法。
    随机梯度法一般可以写成:
    在这里插入图片描述
    随机动量法是用于加速训练的第二类技术。这些方法通常可以写成:
    在这里插入图片描述
    迭代公式(2.2)包括Polyak的重球法(HB)以及Nesterov的加速梯度法(NAG)。
    公式(2.1)和(2.2)需要分别额外注意的另一个扩展方法是自适应梯度和自适应动量方法,它们选择使用整个迭代序列( w1 , . . . , wk )构造的局部距离度量。这些方法(包括AdaGrad,RMSProp和Adam)自适应梯度算法通常可以写成:
    在这里插入图片描述
    在这种情况下,泛化是指一个解决方案w在更广泛的人群上的性能。性能通常用不同于训练中使用的函数f的损失函数来定义。例如,在分类任务中,我们通常用分类误差而不是交叉熵来定义泛化。

    2.1相关工作

    理解优化与泛化的关系是当前机器学习研究中一个非常活跃的领域。这个领域的大部分开创性工作都集中在理解早期停止如何作为隐式正则化[22]。类似的,Ma和Belkin[10]已经表明,梯度方法可能根本无法在任何合理的时间内找到复杂的解。Hardt等人[17]表明,SGD是均匀稳定的,因此快速找到的训练误差较小的解会有很好的泛化效果。同样,利用稳定性论证,Raginsky等人[16]也证明了Langevin动力学在非凸环境下可以比普通SGD找到比泛化更好的解。Neyshabur、Srebro和Tomioka[15]讨论了算法选择如何作为隐式正则化器。与此类似,Neyshabur、Salakhutdinov和Srebro[14]表明,一种不同的算法,即使用对参数重缩放不变的度量来执行下降,可以导致有时比SGD更好的泛化解决方案。我们的工作支持[14]的工作,在用于执行局部优化的度量和训练算法寻找泛化解的能力之间建立了联系。然而,我们主要关注自适应和非自适应方法的不同泛化特性。

    Keskar等人[7]也进行了类似的探索。Hochreiter和Schmidhuber[4]表明,"锐利 "最小化器的泛化能力很差,而 "平坦 "最小化器的泛化能力很好。Keskar等人实证表明,当批量大小增加时,Adam收敛到更锐利的最小化器。然而,他们观察到,即使在小批量的情况下,Adam也不能找到性能与最先进的解决方案匹配的解决方案。在目前的工作中,我们旨在证明选择Adam作为优化器,其本身会强烈影响任何批次大小的最小化器的集合,并解释为什么自适应优化器无法找到泛化特别好的解决方案。

    3、自适应方法的缺点

    本节的目的是为了说明以下观点:当一个问题有多个全局最小值时,当从同一个点初始化时,不同的算法可以找到完全不同的解。此外,我们构造了一个例子,自适应梯度方法找到的解比SGD的样本外误差更严重。

    为了简化表达,让我们把注意力集中在二元最小二乘分类问题上,在这个问题上,我们可以很容易地计算出用不同方法得到的闭合形式解。在最小二乘分类中,我们的目标是解决
    在这里插入图片描述
    这里X 是一个n × d 的特征矩阵,y是{-1,1}中的标签的n维矢量,n是数据数目。我们的目标是找到最好的线性分类器w。注意,当d> n时((即数据数目大于参数数目),如果存在具有损失0的最小化器,则存在无限数量的全局最小化器。问题仍然存在:算法找到了什么解决方案以及它对未知数据的执行情况如何?

    3.1非自适应方法

    对于最小二乘目标的优化,各种非自适应方法都能找到相同的解,并且解的margin边界值非常的大。

    3.2自适应方法

    证明自适应方法通用解的表示。并在后续继续证明自适应方法泛化能力差。

    3.3自适应方法导致过拟合问题

    自适应方法在真实数据集上的泛化程度通常比非自适应方法差。进行了一些列的推导,没有搞懂,待解决。

    4 、深度学习实验

    在确定自适应和非自适应方法可以在凸设置下找到不同的解之后,我们现在转向对深层神经网络的实证研究,看看我们是否在泛化方面观察到了类似的差异。我们比较了两种非自适应方法-SGD和重球方法(HB)-与三种流行的自适应方法-AdaGrad,RMSProp和ADAM。我们研究了四个深度学习问题的性能:(C1)CIFAR-10图像分类任务(L1)在小说《战争与和平》上进行角色级语言建模,在Penn Treebank上进行(L2)判别式解析和(L3)生成式解析。

    我们的实验结果表明:
    (I)自适应方法找到的解比非自适应方法找到的解的泛化程度更差。
    (Ii)即使当自适应方法达到与非自适应方法相同的训练损失或更低的训练损失时,验证或测试性能也比非自适应方法差。
    (Iii)自适应方法在训练集上通常表现出较快的初始进展,但在验证集上的表现很快停滞不前。
    (Iv)虽然传统观点认为ADAM不需要调整,但我们发现调整ADAM的初始学习速率和衰减方案在所有情况下都比其默认设置有显著的改善。

    4.1 调整超参数

    实验发现对性能影响最大的参数是初始步长和步长衰减方案。我们保留其余参数的默认设置。
    初始步长经过试验对比,得出初始步长为2比较合适
    步长衰减方案,本文提出了两种,一是基于验证的衰减方案(DevDecay)和固定频率衰减方案(Fixed-Decay)。
    对于dev-decay,我们一直跟踪到目前为止的最佳验证性能,在每个纪元,如果模型没有达到新的最佳值,则以一个恒定的系数δ衰减学习率。
    对于固定衰减,我们每k个周期以一个恒定因子δ衰减学习速率。
    当我们处理的数据集中包含验证集是,步长衰减方案推荐使用dev-decay。

    4.2 卷积神经网络的选择—针对试验进行设置

    4.3;4.4部分都是对四个试验的具体配置。

    5、结论

    尽管我们的实验证据表明,自适应方法对机器学习并不具有优势,但Adam算法仍然非常受欢迎。我们并不清楚具体原因,但希望我们的步长调整建议能让从业者更容易在研究中使用标准随机梯度方法。在与其他研究人员的交流中,我们推测自适应梯度方法在训练GANs[18,5]和函数逼近的Q-learning[13,9]时特别受欢迎。这两种应用之所以突出,是因为它们不是在解决优化问题。有可能Adam的动力学意外地与这些类型的无优化迭代搜索程序很匹配。也有可能经过仔细调整的随机梯度方法在这两种应用中都能发挥同样的作用,甚至效果更好.确定其中哪种可能性是真的,并更好地理解其原因,是未来工作的一个令人兴奋的方向。

    问题:

    • 1、 regret guarantees 是什么意思?
    • 2、文中所指margin 是什么意思?
    • 3、本文中的推理部分,自己还没有搞清楚,需要再继续进行一步学习。
    展开全文
  • 最近经常挺多很多人有这方面的问题,那么到底什么是百度快照呢,快照根据字面意思就是快速照相用于储存和查看。快照大方向分为:搜索引擎快照,存储快照,图像快照。我们这里说到的百度快照主要就是搜索引擎快照...

    百度快照是什么?百度快照排名怎么做?如何删除百度快照?最近经常挺多很多人有这方面的问题,那么到底什么是百度快照呢,快照根据字面意思就是快速照相用于储存和查看。快照大方向分为:搜索引擎快照,存储快照,图像快照。我们这里说到的百度快照主要就是搜索引擎快照(百度快照,搜狗快照,360快照)。下面主要给大家介绍一下如何删除百度快照,什么是百度快照优化。

    3144730-119bb9fe716fa602.png

    如何删除更新百度快照?

    3144730-3018b393e91fc021.png

    百度官方提供删除更新百度快照的通道一般情况可以通过投诉快照的方式来删除快照或者更新快照,删除快照的条件是网站页面不存在或者网站无法打开才能判定为快照无效使之删除。除过手动更新百度快照外,百度搜索引擎也会定期自动更新网站上变化的内容。

    什么是百度快照优化?

    3144730-50b8ff64cae7162f.png

    百度快照优化通常也叫百度排名优化/百度SEO,大多数不清楚SEO的伙伴会分不清楚百度快照优化和百度优化的区别。我们通常看到的百度快照只是个名词就叫做百度快照,百度优化(百度网站优化)其实是通过对网站自身网站结构连接代码等调整来达到排名提高的效果,其实大家看到的百度快照是相对百度竞价广告的另一种展现形式而已。

    来源:王尘宇博客,欢迎分享,(QQ/微信:314111741)

    展开全文
  • 优化理论与凸优化到底是干嘛的?

    万次阅读 多人点赞 2017-12-15 20:47:53
    优化的定义 1.1 凸优化 ...1.1 凸优化优化问题目前在机器学习,数据挖掘等领域应用非常广泛,因为机器学习简单来说,主要做的就是优化问题,先初始化一下权重参数,然后利用优化方法来优化这个
    1. 凸优化的定义
      1.1 凸优化
      1.2 全局最优化与局部最优化
    2. Least-squares and linear programming(最小二乘与线性规划)
      2.1 最小二乘
      2.2 线性规划
    3. 最优化方法的一般结构
    4. 优化理论在机器学习,深度学习中扮演的角色

    1.优化的定义

    1.1 凸优化

    最优化问题目前在机器学习,数据挖掘等领域应用非常广泛,因为机器学习简单来说,主要做的就是优化问题,先初始化一下权重参数,然后利用优化方法来优化这个权重,直到准确率不再是上升,迭代停止,那到底什么是最优化问题呢?

    它的一般形式为:

    minimize f0(x)
    使 fi(x)bi,i=1,,m
    第一个为优化的目标,即最小化目标函数f(x),而带大于号或小于号的,则是约束条件。我们希望找到一个满足约束条件的 x ,使得对于任意的 z 满足约束条件:
    f1(z)b1,,fm(z)bm
    f0(z)f0(x)
    x 就是我们所求的最后结果。

    • 相当于你要从上海去北京,你可以选择搭飞机,或者火车,动车,但只给你500块钱,要求你以最快的时间到达,其中到达的时间就是优化的目标,500块钱是限制条件,选择动车,火车,或者什么火车都是x。

    满足所有约束条件的点集称为可行域,记为X,又可以写为:

    min f(x)   s.t xX
    ,s.t表示受限于(subject to)。

    在优化问题中,应用最广泛的是凸优化问题:

    • 若可行域X是一个凸集:即对于任给的 x,yX ,总有
      λx+(1λ)yX, λ(0,1)
    • 并且目标函数是一个凸函数:即
      f(λx+(1λ)y))λf(x)+(1λ)f(y)
      我们称这样的优化问题为凸优化问题。

    用图像来表示就是:
    这里写图片描述
    函数上方的点集就是凸集,函数上任意两点的连线,仍然在函数图像上方。

    一句话说清楚就是:希望找到合适的 x ,使得f0(x)最小。

    1.2 全局最优化与局部最优化

    全局最优化指的是在满足条件约束的情况下,找到唯一的一个点满足最大值或者最小值。

    局部最优化指的是在满足条件约束的情况下,有可能找到一个局部最大/小点,但不是全局最大或者最小的点。
    用图像表示为:
    这里写图片描述

    2.Least-squares and linear programming(最小二乘与线性规划)

    关于这两个问题的更详细的例子会在接下来的文章中说到,这次只是简单的介绍一下我们的内容。

    2.1 最小二乘

    最小二乘问题是无约束的优化问题,通常可以理解为测量值与真实值之间的误差平方和:

    minimize f0(x)=Axb22=i=1k(aTixbi)2
    其中 ARk x nk>naTiAix

    这个问题既然没有约束条件,那应该怎么求解呢?我们的目标是求解出最好的x,观察这个式子可以发现,这个式子一定是大于等于0的,所以这样的最优化问题,我们可以把它转成线性方程来求解:

    ATAx=ATb
    AT 为A的转置,因此根据矩阵的逆:
    (ATA)1ATA=1
    可以把上式表示为:
    x=(ATA)1ATb

    加权的最小二乘问题

    i=1kwi(aTixbi)2
    权值均为正数,代表每一个 aTixbi 对结果的影响程度。

    正则化的最小二乘问题:

    i=1k(aTixbi)2+ρi=1nx2i
    ρ 是人为的选择的,用来权衡 最小化 ki=1(aTixbi)2 的同时,使得 ni=1x2i 不必太大的关系。

    2.2 线性规划
    另一类重要的优化问题是线性规划,它的目标函数和约束条件都是线性的:

    minimize cTx
    s.t    aTixbi,i=1,,m

    用画图的方法,就是根据条件,画出可行域,然后将目标函数在可行域上移动,直到得到最大值。
    这里写图片描述

    3.最优化方法的一般结构

    最优化的过程,相当于爬山,如图:
    这里写图片描述
    希望找到一个点列 xk 使得他的函数值是一直减少的,直到到达某一停止条件或者达到最小值的点 xk .

    用数学上的术语可以表示为:

    • xk 为第k次迭代点, dk 为第k次搜索方向, αk 为第k次迭代的步长因子,则第k次迭代为:
      xk+1=xk+αkdk

    从这里可以看到不同的步长和不同的搜索方向组成了不同的优化方法,这就是最优化理论中所讨论的。 f xk的函数,搜索方向 dkfxk 处的下降方向,即 dk 满足:

    f(xk)Tdk<0
    或者
    f(xk+1)=f(xk+αkdk)<f(xk)

    而最优化的基本可以表示为:给定初始点 xk

    1. 确定搜索方向 dk ,即按照一定规则画方法确定f在 xk 处的下降方向
    2. 确定步长因子 αk ,使得目标函数有一定的下降
    3. xk+1=xk+αkdk
      不断迭代,直到 xk+1 满足某种某种停止条件,即得到最优解 xk+1

    最优化中的问题中,大部分都是在寻找各种各样的方法确定步长和方向,使得迭代的速度尽可能快,得到的解尽可能是最优的解。

    4.优化理论在机器学习,深度学习中扮演的角色

    凸优化,或者更广泛的说,是最优化理论,在目前的机器学习,数据挖掘,或者是深度学习的神经网络中,都要用到。

    他的地位相当于人的脊背一样的,支撑着整个模型的学习过程。因为模型,通俗来说就像人学习思考一样,我们自己知道自己该学什么,该怎么学,发现自己的知识学错了之后怎么调整,但计算机可没有人这么聪明,知道学什么,往哪里学。

    而最优化,就是告诉模型应该学什么,怎么学的工具。模型学习的往往都是一个映射函数,也就是模型中的参数W,这个参数的好坏,得看答案才能知道,但知道自己错了之后,该往哪里学,怎么学,怎么调整,这就是优化理论在其中扮演的角色。如果没有优化理论,那么模型是不知道该怎么学习的,也就是没有了最优化,模型的学习永远都是停滞不前的,这下你知道最优化理论的重要性了吧。

    展开全文
  • 将三维重建中捆集调整算法用于优化重建结果, 是非常关键的步骤, 然而传统单核串行算法耗时量大不太 适合大场景重建. 对此, 首先对捆集调整算法本身进行了改进; 然后在此基础上提出了多核并行捆集调整算法并采用 ...
  • YOLO算法的调整优化

    千次阅读 2017-11-21 17:47:55
    CSC是和CSR相对应的一种方式,即按列压缩的意思。 ELLPACK (ELL) 用两个和原始矩阵相同行数的矩阵来存:第一个矩阵存的是列号,第二个矩阵存的是数值,行号就不存了,用自身所在的行来表示;这两个...
  • 本示例说明如何使用分位数误差实现贝叶斯优化调整回归树的随机森林的超参数。 如果计划使用模型来预测条件分位数而不是条件均值,则使用分位数误差而不是均方误差来调整模型是合适的。查找关于树复杂性和要使用...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    这些浏览器的内核分别是什么? 21 每个HTML文件里开头都有个很重要的东西,Doctype,知道这是干什么的吗? 21 Quirks模式是什么?它和Standards模式有什么区别 21 div+css的布局较table布局有什么优点? 22 img的alt...
  • 究竟什么是迭代?

    千次阅读 多人点赞 2019-12-04 20:50:18
    最近读了一篇我觉得写的特别好的一篇文章,受益匪浅 来源:简书 作者:韩同志 最近几年有一个词,频繁的出现,很多人...有一个词和“迭代”意思比较接近,叫“升级”,这个词我就很熟悉,也非常好理解。比如,Win...
  • YCbCr 4:2:2到底是什么意思呢?

    千次阅读 2020-02-22 13:28:20
    YCbCr 即YUV,主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。其中“Y”表示明亮度(Luminance或...
  • 13.ajax的步骤 什么是ajax? ajax(异步javascript xml) 能够刷新局部网页数据而不是重新加载整个网页。 如何使用ajax? 第一步,创建xmlhttprequest对象,var xmlhttp =new XMLHttpRequest();XMLHttpRequest对象用来...
  • Python数据分析与挖掘

    万人学习 2018-01-08 11:17:45
    从海量数据中获得别人看不见的信息,创业者可以通过数据分析来优化产品,营销人员可以通过数据分析改进营销策略,产品经理可以通过数据分析洞察用户习惯,金融从业者可以通过数据分析规避投资风险,程序员可以通过...
  • 第二,它可以使用xml的方式来组织管理我们的sql,因为一般程序出错很多情况下是sql出错,别人接手代码后能快速找到出错地方,甚至可以优化原来写的sql。 SSM框架整合配置 好了,前面bb那么多,下面我们...
  • ITIL是什么意思?ITIL是什么

    千次阅读 2020-09-24 17:25:53
    ITIL是什么? ITIL是Information Technology Infrastructure Library的缩写,即:信息技术基础架构库。 ITIL是由英国政府部门CCTA(Central Computing and Telecommunications Agency)在20世纪80年代末开发的一套IT...
  • 平时我们在工作在把网站做好后,往往喜欢把404页面忘记在服务器里面...一、404是什么意思呢? 404意思就是在点击网站某个页面的时候出现显示的是404错误,意思就是这个页面没有正常的打开这个页面,是一个死链接,专
  • seo是什么意思?包含哪些方面?

    千次阅读 2018-06-09 20:34:45
    入行10年,准确的说才一年零3个月,为什么这么说的,因为之前是做与SEO相关的业务,后来半路出家亲身实践做SEO的,所以说,只能算是新手。但是想想SEO行业什么时候才出现(已经20年多了,seo其实就是伴随着搜索引擎...
  • 常用优化算法介绍

    万次阅读 多人点赞 2018-07-10 19:59:16
    我们把解决此类优化问题的方法叫做优化算法,优化算法本质上是一种数学方法,常见的优化算法包括梯度下降法、牛顿法、Momentum、Nesterov Momentum、Adagrad、Adam等。其实大部分机器学习算法...
  • Java集合面试题

    万次阅读 多人点赞 2019-06-25 14:46:19
    什么是迭代器(Iterator)? Iterator 接口,提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的 #...
  • 优化理论(1)

    万次阅读 多人点赞 2019-03-26 20:27:53
    优化本质上是一个优化问题,所以我们先来看优化问题是什么优化问题有三个最重要的因素:目标函数、优化变量、优化约束。一个简单的优化问题可以描述如下: 其中x为优化变量,而F(x)为优化函数。此问题称为...
  • 什么是oa? oa是:办公自动化(Office Automation,简称OA)是将现代化办公和计算机网络功能结合起来的一种新型的办公方式。办公自动化没有统一的定义,凡是在传统的办公室中采用各种新技术、新机器、新设备从事办公...
  • 大数据是什么意思

    万次阅读 2020-04-29 19:18:58
    能源大数据服务平台针对能源规划(能源结构调整和转型)、综合能源决策(各能源协调发展)、跨部门协同管理、个性化的公众信息服务等需求提供服务。而更加专业的能源管理协同决策平台将被用于解决整合资源储量数据、...
  • seo和sem是什么意思

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

    万次阅读 多人点赞 2019-10-25 15:33:32
    文章目录授人以鱼不如授人以渔目的服务器资源Tomcat配置优化Linux环境安装运行Tomcat8AJP连接执行器(线程池)3种运行模式部署测试用的web项目...测试报告调整Tomcat参数进行优化禁用AJP连接设置线程池最大线程数为150...
  • 指数增强是什么意思? ​ 指数增强策略并不是被动的跟踪某个指数波动,而是采用量化增强模型,利用多因子alpha模型预测股票超额回报,同时力求进行有效的风险控制、降低交易成本、优化投资组合。指数增强策略不会对...
  • linux 内核参数调整优化网络

    万次阅读 2013-11-21 13:48:58
    Linux系统内核设置优化tcp网络,# vi /etc/sysctl.conf,添加以下内容 net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; ...
  • 优化算法之粒子群算法(PSO)

    万次阅读 多人点赞 2018-08-03 10:26:45
      粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优...
  • 优化

    千次阅读 多人点赞 2018-11-07 20:47:15
    SLAM问题的处理方法主要分为滤波和图优化两类。滤波的方法中常见的是扩展卡尔曼滤波、粒子滤波、信息滤波等,熟悉滤波思想的同学应该容易知道这类SLAM问题是递增的、实时的处理数据并矫正机器人位姿。比如基于粒子...
  • Windows 对全屏应用的优化

    千次阅读 2020-05-02 16:00:47
    本文主要告诉大家从微软官方的文档以及考古了解到的 Windows 对全屏应用的优化,以及是如何进行的优化,方便小伙伴在撕的时候可以找到根据 当然,很多小伙伴只是需要依据,所以我就先贴出一篇特别好的官方文档,...
  • 深入理解SVM

    千次阅读 多人点赞 2017-03-15 12:45:22
    SVM核心思想一最大间隔 SVM核心思想二决策公式 SVM核心思想三目标函数 SVM核心思想四优化理论 SVM核心思想五损失函数 SVM核心思想六核方法 SVM核心思想七SMO
  • MySQL优化必须调整的10项配置

    千次阅读 2018-08-30 17:48:35
    最佳选项是将其从一开始就停用,设置query_cache_size = 0(现在MySQL 5.6的默认值)并利用其他方法加速查询:优化索引、增加拷贝分散负载或者启用额外的缓存(比如memcache或redis)。如果你已经为你的应用启用了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 81,584
精华内容 32,633
关键字:

优化调整是什么意思