精华内容
下载资源
问答
  • 神经网络参数更新

    千次阅读 2017-08-25 14:48:18
    一、参数更新 1.随机梯度下降及各种更新方法 【普通更新】:沿着负梯度方向改变参数 x+= -learning_rate * dx 其中学习率是一个超参数,它是一个固定的常量。 【动量更新】(Momentum) 这...

    一、参数更新

    1.随机梯度下降及各种更新方法


    【普通更新】:沿着负梯度方向改变参数

    x+= -learning_rate * dx

    其中学习率是一个超参数,它是一个固定的常量。

    【动量更新】(Momentum)

    这个方法在深度网络上几乎总能得到更好的收敛速度。是从物理角度上对最优化问题得到的启发。它将损失值理解为是山的高度(因此高度势能是U=mgh,所以U正比于h)用随机数字初始化参数等同于在某个位置给质点设定初始速度为0,这样,最优化过程可以看做是模拟参数向量(即质点)在地形上滚动的过程


    因为作用于质点的力与梯度的潜在能量(F=-▽U)有关,质点所受的力就是损失函数的(负)梯度。还有,因为F=ma,所以在这个观点下,梯度与质点的加速度是成比例的。与SDG不同的是,此处认为梯度只是影响速度,然后速度再影响位置。

    # 动量更新
    v = mu * v - learning_rate * dx # 与速度融合
    x += v # 与位置融合
    引入了一个初始化为0的变量v和一个超参数mu,这个mu就是被看做动量(一般设0.9),但其物理意义与摩擦系数更一致,这个变量有效地抑制了速度,降低了系统的动能,不然质点在山底永远不会停下来。通过交叉验证,这个参数通常设[0.5,0.9,0.95,0.99]中的一个,通过动量更新,参数向量会在任何有持续梯度的方向上增加速度。

    【Nesterov动量】最近变得流行,在实践中比标准动量表现更好一些

    核心思路: 但当参数向量位于某个位置x时,由上述公式知,动量部分会通过mu*v稍微改变参数向量。因此,如果要计算梯度,那么可以将未来的近似位置x+mu*V看做是“向前看”,这个点在我们一会要停止的位置附近,因此计算x+mu*v的梯度而不是旧位置x的梯度就有意义了。



    如右图,既然我们知道动量将会把我们带到绿色箭头指向的店,我们就不要再远点(红色点)那里计算梯度了。

    x_ahead = x + mu * v
    # 计算dx_ahead(在x_ahead处的梯度,而不是在x处的梯度)
    v = mu * v - learning_rate * dx_ahead
    x += v

    实际应用中,通过对x_ahead=x+mu*v使用变量变化进行改写,然后用x_ahead而不是x来表示上面的更新,也就是说实际存储的参数向量总是向前一步的那个版本,x_ahead(将其重新命名为x)的公式就变成了:

    v_prev = v # 存储备份
    v = mu * v - learning_rate * dx # 速度更新保持不变
    x += -mu * v_prev + (1 + mu) * v # 位置更新变了形式

    二、学习率退火


    如果学习率过高,系统的动能就过大,参数向量就会无规律地跳动,不能够稳定到损失函数更深更窄的部分去。实现学习率退火有3种方式:


    1.随步数衰减

    典型的值是每过5个周期就将学习率减小一半,但这要依赖具体问题和模型的选择。有一种经验做法:使用一个固定的学习率来进行训练的同时观察验证集错误率,每当验证集错误率停止下降,就乘以一个常数(0.5)来降低学习率

    2.指数衰减

    \alpha=\alpha_0e^{-kt},t是迭代次数

    3.1/t衰减

    \alpha=\alpha_0/(1+kt)



    三、二阶方法

    基于牛顿法,其迭代如下

    \displaystyle x\leftarrow x-[Hf(x)]^{-1}\nabla f(x)

    Hf(x)是函数的二阶偏导数的平方矩阵,▽f(x)是梯度向量,直观理解Hf(x)描述了损失函数的局部曲率,从而使得可以进行更高效的参数更新。使得在曲率大的时候小步前进,曲率小的时候大步前进。但一个巨大难题在于要计算矩阵的逆,这是非常耗时的。这样,各种各样的拟-牛顿方法就被发明出来,最流行的是L-BFGS.



    四、逐参数适应学习率方法

    前面讨论都是对学习率进行全局地操作,并且对所有的参数都是一样的。有一些人发明了能够适应性对学习率调参的方法,甚至是逐个参数适应学习率调参。如下是一些常用的适应算法


    1.Adagrad

    cache += dx**2
    x += - learning_rate * dx / (np.sqrt(cache) + eps)

    接收到高梯度值的权重更新的效果被减弱,而接受到低梯度值的权重的更新效果将会增强


    2.RMSprop

    简单修改了Adagrad方法,让它不那么激进,总体来说,就是是使用了一个梯度平方的滑动平均:

    cache =  decay_rate * cache + (1 - decay_rate) * dx**2
    x += - learning_rate * dx / (np.sqrt(cache) + eps)
    在上面的代码中,decay_rate是一个超参数,常用的值是[0.9,0.99,0.999]。其中x+=和Adagrad中是一样的,但是cache变量是不同的。因此,RMSProp仍然是基于梯度的大小来对每个权重的学习率进行修改,这同样效果不错。但是和Adagrad不同,其更新不会让学习率单调变小。

    3.Adam

    像是RMSprop的动量版

    m = beta1*m + (1-beta1)*dx
    v = beta2*v + (1-beta2)*(dx**2)
    x += - learning_rate * m / (np.sqrt(v) + eps)

    五、超参数调优

    神经网络最常用的超参数有:

    • 初始学习率
    • 学习率衰减方式(例如一个衰减常量)
    • 正则化强度(L2惩罚,随机失活强度)
    在实践中,一个具体的设计使用仆程序持续地随机设置参数然后进行最优化。在训练过程中,仆程序会对每个周期后验证集的准确率进行监控,然后向文件系统写下一个模型的记录点(记录点中有各种各样的训练统计数据,比如随着时间的损失值变化等),这样就能方便查找和排序了。然后还有一个主程序,它可以启动或者结束计算集群中的仆程序,有时候也可能根据条件查看仆程序写下的记录点,输出它们的训练统计数据等。


    超参数范围

    在对数尺度上进行超参数搜索。例如,一个典型的学习率应该看起来是这样:learning_rate=10** uniform(-6,1),因为学习率乘以了计算出的梯度,因此,比起加上或者减少某些值,思考学习率的范围是乘以或者除以某些值更加自然。但是有一些参数(比如随机失活概率)还是在原始尺度上进行搜索


    随机搜索优于网络搜索



    对于边界上的最优值要小心,这种情况一般发生在你在一个不好的范围内搜索超参数。比如,假设我们使用learning_rate=10** uniform(-6,1)来进行搜索。一旦我们得到一个比较好的值,一定要确认你的值不是出于这个范围的边界上。

    从粗到细地分阶段搜索。在实践中,先进行初略范围搜索,然后根据好的结果出现的地方,缩小范围进行搜索。进行粗搜索的时候,让模型训练一个周期就可以了,小范围搜索时,可以让模型运行5个周期,而最后一个阶段就在最终的范围内进行仔细搜索,运行多次周期。


    六、评价

    模型集成

    在实践的时候,有一个总是能提升神经网络几个百分点准确率的办法,就是在训练的时候训练几个独立的模型,然后在测试的时候平均它们预测结果。集成的模型数量增加,算法的结果也单调提升(但提升效果越来越少)。还有模型之间的差异度越大,提升效果可能越好。进行集成有以下几种方法:

    • 同一个模型,不同的初始化:使用交叉验证来得到最好的超参数,然后用最好的参数来训练不同初始化条件的模型                                                                                                          
    • 在交叉验证中发现最好的模型:使用交叉验证来得到最好的超参数,然后取其中最好的几个(比如10个)模型来进行集成。这样就提高了集成的多样性,实际操作中,这样操作起来比较简单,在交叉验证后就不需要额外的训练                                                                                                                                                                                                                
    • 一个模型设置多个记录点:如果训练非常耗时,那就在不同的训练时间对网络留下记录点(比如每个周期结束),然后用它们来进行模型集成。很显然,这样做多样性不足,但是在实践中效果还是不错的,这种方法的优势是代价比较小
    • 在训练的时候跑参数的平均值:这个方法就是在训练过程中,如果损失值相较于前一次权重出现指数下降时,就在内存中对网络的权重进行一次备份,这样你就对前几次循环中的网络状态进行了平均。你会发现这个“平滑”过的版本的权重总是能得到更少的误差。


    【这两幅动图帮助你理解学习的动态过程】




    七、总结

    训练一个神经网络需要:

    • 利用小批量数据对实现进行梯度检查,还要注意各种错误。

    • 进行合理性检查,确认初始损失值是合理的,在小数据集上能得到100%的准确率。

    • 在训练时,跟踪损失函数值,训练集和验证集准确率,如果愿意,还可以跟踪更新的参数量相对于总参数量的比例(一般在1e-3左右),然后如果是对于卷积神经网络,可以将第一层的权重可视化。

    • 推荐的两个更新方法是SGD+Nesterov动量方法,或者Adam方法。

    • 随着训练进行学习率衰减。比如,在固定多少个周期后让学习率减半,或者当验证集准确率下降的时候。

    • 使用随机搜索(不要用网格搜索)来搜索最优的超参数。分阶段从粗(比较宽的超参数范围训练1-5个周期)到细(窄范围训练很多个周期)地来搜索。

    • 进行模型集成来获得额外的性能提高。


    展开全文
  • 参数更新方法

    千次阅读 2017-05-26 16:33:44
    动量下降, 代码实现 https://github.com/hsmyy/zhihuzhuanlan/blob/master/momentum.ipynb 1、梯度下降法 加大梯度下降的步长 继续加大步长 2、动量更新 Momentum改进自SGD算法,让每一次的参数更新方向不仅仅取决...
    代码实现 
    

    https://github.com/hsmyy/zhihuzhuanlan/blob/master/momentum.ipynb

    1、梯度下降法

    clipboard

    加大梯度下降的步长

    clipboard[1]

    继续加大步长


    2、动量更新

    Momentum改进自SGD算法,让每一次的参数更新方向不仅仅取决于当前位置的梯度,还受到上一次参数更新方向的影响。

    v = mu * v - learning_rate * dx # integrate velocity 

    x += v # integrate position 

    clipboard[3]

    3、NAG

    如果预到的地点梯度比较大,更新就比较快,如果梯度比较小就更新比较慢

    1. x_ahead = x + mu * v   通过上一次的动量v估计本次的位置,
    1. v = mu * v - learning_rate * d x_ahead  通过估计的位置计算梯度,
    2. x += v 

    clipboard[4]

    4、Adagrad

    cache += dx**2 

    x += - learning_rate * dx / (np.sqrt(cache) + eps)

    这个方法其实是动态更新学习率的方法,其中cache将每个梯度的平方和相加,而更新学习率的本质是,如果求得梯度距离越大,那么学习率就变慢,而eps是一个平滑的过程,取值通常在(10^-4~10^-8 之间)

    clipboard[5]

    gt,i=∇θJ(θi)是目标函数对参数的梯度,ϵ是平滑项,防止除零操作,一般取值1e−8

    Adagrad的一大优势时可以避免手动调节学习率,比如设置初始的缺省学习率为0.01,然后就不管它,另其在学习的过程中自己变化。当然它也有缺点,就是它计算时要在分母上计算梯度平方的和,由于所有的参数平法必为正数,这样就造成在训练的过程中,分母累积的和会越来越大。

    5、RMSprop

    cache = decay_rate * cache + (1 - decay_rate) * dx**2 

    x += - learning_rate * dx / (np.sqrt(cache) + eps)

    6、Adam

    m = beta1*m + (1-beta1)*dx 

    v = beta2*v + (1-beta2)*(dx**2) 

    x += - learning_rate * m / (np.sqrt(v) + eps)

    展开全文
  • caffe中网络参数更新总结

    千次阅读 2016-05-28 09:42:33
    前面已经总结了caffe中的foward和backward的过程,最后可以得到代价函数...对深度学习网络的优化也大多在这一方面,对网络参数的更新一般会遇到下面的问题:第一,简单的网络参数更新网络可能导致网络不够generalized,

        前面已经总结了caffe中的foward和backward的过程,最后可以得到代价函数相对于网络中的每一个参数的梯度,接下来就要利用梯度对网络参数进行更新。

        网络参数的更新就是网络学习罪关键的一个过程,怎么利用梯度对参数更新也是一个很重要的问题。对深度学习网络的优化也大多在这一方面,对网络参数的更新一般会遇到下面的问题:第一,简单的网络参数更新网络可能导致网络不够generalized,简单的更新方式就是利用梯度和事先规定的学习速率对网络参数进行修正,这样的方式会导致学习的网络在训练样本之外不够适用,即generalization不能很好实现;第二,不当的网络参数更新方式回导致网络学习过慢,网络学习都是以梯度为基础的,如果梯度过小,就会导致网络学习过慢,所以应该构造出有效的网络参数更新方式,加快学习速率。第三,对于网络中的不同参数,分配不同的学习速率可能会使网络学习的效果更好,而且我们也希望学习速率能根据训练进行自适应的调整。

        综上,在参数更新中我们要解决两个问题:让网络更generalized和让网络能更快地学习。

        下面看一下caffe中lenet网络的参数更新过程,lenet是采用在线学习的方式,即stochastic gradient learning;同时又是才应mini-batch的形式。原始的stochastic gradient learning都是每输入一个样本,都会更新网络参数,而mini-batch的形式是每训练一定数量的样本,然后根据这些样本的梯度均值对参数更新,关于stochastic learning的优点在另一篇文章里有总结。在backward过程获得梯度之后,更新网络参数在lenet中分以下几步,caffe中的程序如下:

    for (int param_id = 0; param_id < this->net_->learnable_params().size();
           ++param_id) { // compute update value for every layer
        Normalize(param_id); // if iteration size > 1, then we need normalize, else, we need not
        Regularize(param_id);
        ComputeUpdateValue(param_id, rate);
      }
      this->net_->Update(); // update parameters for every layer
        从上面可以看出,caffe先求出网络中所有参数需要更新的权值,然后再利用computeUpdateValue统一对参数更新。

        先对梯度进行normalize,考虑到也许网络是经过好几个batch之后才对参数更新,如果是这样,就要先对网络中的梯度进行nornalize,如果是每个batch都对参数更新,那么就不需要normalize。

        接下来就是进行regularize,进行regularize的方法很多,这个在另一篇总结中已经有说,这里采用的是L2 regularization。具体也可以看《deep learning》Page 219。

        然后就是根据学习速率计算每个参数需要更新的值,即ConputeUpdateValue,在这个函数里面,考虑了怎么对网络学习进行加速,Mnmentum的加速方法,具体细节以后在总结,在《Deep Learning》Page 275也有详细叙述,这个方法的原理和为什么能够加速网络的学习现在还没有完全搞懂。

        经过上面三步,网络中每个参数需要更新的值都已经计算出来了,计算的过程不复杂,但用到的generalization和参数学习加速的方法的原理需要事先弄清楚。这些值计算完成之后就是对网络中参数进行更新了,更新的过程就是简单加减过程。

        从上面我么可以看出,参数的更新才是整个深度网络的重中之重,主要体现在怎么实现网络的generalization和怎么加快optimization,这个需要在以后深入学习深度学习网络中好好总结。

    展开全文
  • 参数更新,子组件不刷新不到可能有以下几个方面的原因 0、没加watch监听子组件参数变化 1、箭头函数 2、如果监听的参数为对象,可能因为没有深度监听, 选项:deep,为了发现对象内部值的变化,可以在选项参数...

    参数更新,子组件不刷新不到可能有以下几个方面的原因

    0、没加watch监听子组件参数变化

    1、箭头函数

    2、如果监听的参数为对象,可能因为没有深度监听,

    选项:deep,为了发现对象内部值的变化,可以在选项参数中指定 deep: true 。注意监听数组的变动不需要这么做。

    
    watch:{
      data: {           // data为监听参数名
          handler: function (val, oldVal) { /* ... */ },
          deep: true
      }
    },
    
    

    3、如果发现参数监听偶尔可以,那么查一下子组件是否用了v-ifv-if每次不展示就会销毁,展示时重新添加dom节点。

    解决方法:把v-if改成v-show,或者可以在监听里面加immediate: true这项在选项参数中指定 immediate: true 将立即以表达式的当前值触发回调,这样在首次赋值的时候也会触发watch里面的handler事件,写法如下:
    PS: 动态组件的切换也是同样销毁重新添加组件

    
    watch:{
      data: {           // data为监听参数名
          handler: function (val, oldVal) { /* ... */ },
          immediate: true
      }
    },
    
    

    4、Vue.js 不能检测到对象属性的添加或删除

    解决方法:通过this.$set(object, key, value)来进行对象的操作

    参考:https://www.jianshu.com/p/4e275abda2a7

    展开全文
  • 神经网络参数更新方法

    千次阅读 2017-08-08 21:07:59
    神经网络参数更新方法 SGD及变种 1、普通SGD update  SGD(Stochastic Gradient Descent)就是最常见的随机梯度下降。  向着参数的梯度的负方向改变(梯度方向是增加的方向)。  这里的x可以是权值w也...
  • 反向传播与参数更新

    千次阅读 2019-09-28 06:53:50
    反向传播原理比较简单,先定义损失函数,然后使用梯度下降算法找到最小化损失函数的W和b,梯度下降算法需要计算损失函数...2、参数更新 η是学习率 转载于:https://www.cnblogs.com/yongfuxue/p/10095710.html...
  • LoRaWAN地区参数更新至版本B,新增了印度865频段。这为塔塔通讯近期宣布的 20 万传感器和基站节点建设计划进行了规范铺路。
  • BLE连接参数更新过程详解 有关连接参数概念和作用我们在 Generic Access Profile (GAP) 一章中已经详细讲解过,这一章演示如何通过修改simple_peripheral例程实现连接参数更新,并分析程序流程。 介绍 连接...
  • 蓝牙ble连接参数更新和低功耗原理

    千次阅读 2016-03-26 09:12:06
    主设备发出连接参数更新请求以 后,主从设备不需要进行协商,从设备接受,使用连接参数或者断开连接。  连接请求包含了早先的一些参数信息,还包含了一个新的参数……瞬时;  1,瞬时  瞬
  • Pytorch参数更新实验

    千次阅读 2019-10-23 11:33:10
    如何更新 起因 实现随机深度策略时,在block内部进行requires_grad=True/False操作会报错(后面测试知道其实是DataParallel的锅) ref: 1, 2 结论 初始化各模块如self.conv3后,其_grad值为None self.conv3只有在...
  • 一、参数更新 1.随机梯度下降及各种更新方法 【普通更新】:沿着负梯度方向改变参数 x+= -learning_rate * dx 其中学习率是一个超参数,它是一个固定的常量。 【动量更新】(Momentum) 这个方法在深度网络上几乎...
  • 关于低功耗蓝牙的连接参数更新

    千次阅读 2016-03-05 18:16:41
    首先要明确:连接参数是由主机端确定的,从机端可以发起更新连接参数的请求。主机端可以直接下发连接参数,而从机端则只能是发起更新请求并附带想要的连接参数范围。在初始化中将想要的连接参数设置进osal( 在和IOS...
  • Vue路由参数更新但是页面不刷新

    千次阅读 2019-07-24 19:42:36
    是我在写本博客的遇到的问题 当前路由显示时,跳转同路由的不同参数,会出现参数变化,页面不刷新。例如: ... ... 可以看到地址栏id变化,但是页面...监听路由变化,若参数不相同,则重新加载数据,更新视图: watch: { ...
  • pytorch中网络loss传播和参数更新理解

    千次阅读 多人点赞 2018-12-26 21:46:02
    ,在机器学习或者深度学习中,我们需要通过修改参数使得损失函数最小化或最大化,一般是通过梯度进行网络模型的参数更新,通过loss的计算和误差反向传播,我们得到网络中,每个参数的梯度值,后面我们再通过优化算法...
  • 从机在L2CAP层发送连接参数更新请求,主机启动Connection Parameter Update Control,给从机发送连接参数更新相应, 需要额外关注的是这个过程是在L2CAP层完成 。如果主机响应包回复的是拒绝,从机要么接受主机的...
  • 【转载】梯度下降算法的参数更新公式

    万次阅读 多人点赞 2018-05-21 19:02:03
    但是如何更新参数看了不少描述,下面的叙述比较易懂的:   1、在吴恩达的CS229的讲义的第四页直接给出参数迭代公式   在UFLDL中反向传导算法一节也是直接给出的公式   2、例子: 第一步:随机对比重...
  • 神经网络的反向传播和参数更新

    千次阅读 2018-12-22 18:36:33
  • 需要注意,在机器学习或者深度学习中,我们需要通过修改参数使得损失函数最小化或最大化,一般是通过梯度进行网络模型的参数更新,通过loss的计算和误差反向传播,我们得到网络中,每个参数的梯度值,后面我们再...
  • 一、引言 与全连接神经网络不同,卷积神经网络每一层中的...因此其权重和偏置更新公式与全连接神经网络不通。通过卷积核替代权重矩阵的意义在于:1. 降低的计算量;2. 权重得到共享,降低了参数量。 UFLDL(Unsuperv
  • 1 梯度检验权重的更新梯度是否正确决定着函数是否想着正确的方向迭代,在UFLDL中我们提到过,计算时梯度公式如果计算错误是不容被察觉的,我们需要比较分析法得到梯度与数值法得到的梯度是否相似,下面是一些技巧:...
  • 神经网络更新参数的几种方法

    千次阅读 2016-05-06 20:59:06
    梯度下降中,计算完各个参数的... 但是这种方法收敛速度非常慢,其实除了这个更新参数的方法,还有很多的方法可以进行参数更新。     【Momentum update】:   这个方法对于深度学习的网络参数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,699,905
精华内容 679,962
关键字:

参数更新