精华内容
下载资源
问答
  • 深度学习笔记9:权值更新的实现

    万次阅读 2016-08-24 20:09:08
    权值更新 在前面的反向传播中我们计算出每一层的权值W和偏置b的偏导数之后,最后一步就是对权值和偏置进行更新了。 在之前的BP算法的介绍中我们给出了如下公式: 其中的α为学习速率,一般学习率并不是一个常数,...

    权值更新

    在前面的反向传播中我们计算出每一层的权值W和偏置b的偏导数之后,最后一步就是对权值和偏置进行更新了。

    在之前的BP算法的介绍中我们给出了如下公式:


    其中的α为学习速率,一般学习率并不是一个常数,而是一个以训练次数为自变量的单调递减的函数。使用变化的学习率有以下几点理由:

    1、开始时学习率较大,可以快速的更新网络中的参数,是参数可以较快的达到目标值。而且由于每次更新的步长较大,可以在网络训练前期“跳过”局部最小值点。

    2、当网络训练一段时间后,一个较大的学习率可能使网络的准确率不再上升,即“网络训练不动”了,这时候我们需要减小学习率来继续训练网络。

    在我们的网络中,含有参数的层有卷积层1、卷积层2、全连接层1和全连接层2,一共有4个层有参数需要更新,其中每个层又有权值W和偏置b需要更新。实际中不管权值还是偏置,还有我们前面计算出了的梯度,都是线性存储的,所以我们直接把整个更新过程用到的数据看作对一维数组就可以,不用去关注权值W是不是一个800*500的矩阵,而且这样的话,权值更新和偏置更新的具体实现可以共用一份代码,都是对一维数组进行操作。

    权值更新策略

    在caffe中,使用了随机梯度下降(Stochastic gradient descent)的方法进行权值更新。具体如下公式(即动量更新):

    其中Δhistory为多次的梯度的累加:


    caffe中的学习率更新策略

    在\src\caffe\solvers\sgd_solver.cpp文件的注释中,caffe给出如下几种学习率更新策略:

    // Return the current learning rate. The currently implemented learning rate
    // policies are as follows:
    //    - fixed: always return base_lr.
    //    - step: return base_lr * gamma ^ (floor(iter / step))
    //    - exp: return base_lr * gamma ^ iter
    //    - inv: return base_lr * (1 + gamma * iter) ^ (- power)
    //    - multistep: similar to step but it allows non uniform steps defined by
    //      stepvalue
    //    - poly: the effective learning rate follows a polynomial decay, to be
    //      zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power)
    //    - sigmoid: the effective learning rate follows a sigmod decay
    //      return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))
    //
    // where base_lr, max_iter, gamma, step, stepvalue and power are defined
    // in the solver parameter protocol buffer, and iter is the current iteration.
    

    可以看出,学习率的更新有fixed、step、exp、inv、multistep、poly和sigmoid几种方式,看上边的公式可以很清楚的看出其实现过程。

    实际中我们的网络使用的是inv的更新方式,即learn_rate=base_lr * (1 + gamma * iter) ^ (- power)。


    Caffe中权值更新的实现

    在配置文件\examples\mnist\lenet_solver.prototxt中,保存了网络初始化时用到的参数,我们先看一下和学习率相关的参数。

    # The base learning rate, momentum and the weight decay of the network.
    base_lr: 0.01
    momentum: 0.9
    weight_decay: 0.0005
    # The learning rate policy
    lr_policy: "inv"
    gamma: 0.0001
    power: 0.75
    

    根据上面的参数,我们就可以计算出每一次迭代的学习率learn_rate= base_lr * (1 + gamma * iter) ^ (- power)。



    获取学习率之后,我们需要使用学习率对网络中的参数进行更新。在\src\caffe\solvers\sgd_solver.cpp中包含了进行权值更新的具体函数ApplyUpdate(),下面我们介绍一下这个函数。

    template <typename Dtype>
    void SGDSolver<Dtype>::ApplyUpdate() {
      CHECK(Caffe::root_solver());
      //GetLearningRate()函数获取此次迭代的学习率
      Dtype rate = GetLearningRate();
      if (this->param_.display() && this->iter_ % this->param_.display() == 0) {
        LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate;
      }
      ClipGradients();
      //对网络进行更新,一共4个层,每层有W和b2个参数需要更新,故size=8
      for (int param_id = 0; param_id < this->net_->learnable_params().size();
           ++param_id) {
    	//归一化,我们的网络没有用到这一函数
        Normalize(param_id);
    	//正则化
        Regularize(param_id);
    	//计算更新用到的梯度
        ComputeUpdateValue(param_id, rate);
      }
      //用ComputeUpdateValue计算得到的梯度进行更新
      this->net_->Update();
    }
    

    其中的正则化函数Regularize主要进行了 的计算。
    ComputeUpdateValue函数分两步,第一步是更新历史偏置值

    然后将历史偏置值赋值给偏置值

    在ComputeUpdateValue用到了lr_mult学习率因子参数,这个在之前的配置信息里面也见过,同一层中的weight和bias可能会以不同的学习率进行更新,所以也可以有不同的lr_mult。

    最后this->net_->Update()函数使用前边ComputeUpdateValue计算出来的偏导数对参数进行了更新
    展开全文
  • Matlab代码实践——BP神经网络

    千次阅读 2019-07-16 12:03:11
    它的学习规则是使用梯度下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括 输入层 (input)、 隐层 (hidden layer)和 输出层 (output layer)。  2、BP网络...

                                                           1、什么是BP神经网络

    BP(Back Propagation)神经网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用梯度下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hidden layer)和输出层(output layer)。

                                                                2、BP网络构建

    这里写图片描述

                                                          3、BP网络的训练函数

    这里写图片描述

                                                     4、BP网络训练参数

    1.训练参数                       2.参数介绍             3.训练函数  
    net.trainParam.epochs    最大训练次数(缺省为10)    traingd、traingdm、traingda、traingdx、trainrp、traincgf、traincgp、traincgb、trainscg、trainbfg、trainoss、trainlm 
    net.trainParam.goal      训练要求精度(缺省为0)  traingd、traingdm、traingda、traingdx、trainrp、traincgf、traincgp、traincgb、trainscg、trainbfg、trainoss、trainlm 
    net.trainParam.lr         学习率(缺省为0.01)     traingd、traingdm、traingda、traingdx、trainrp、traincgf、traincgp、traincgb、trainscg、trainbfg、trainoss、trainlm 
    net.trainParam.max_fail  最大失败次数(缺省为5)   traingd、traingdm、traingda、traingdx、trainrp、traincgf、traincgp、traincgb、trainscg、trainbfg、trainoss、trainlm 
    net.trainParam.min_grad  最小梯度要求(缺省为1e-10)   traingd、traingdm、traingda、traingdx、trainrp、traincgf、traincgp、traincgb、trainscg、trainbfg、trainoss、trainlm 
    net.trainParam.show    显示训练迭代过程(NaN表示不显示,缺省为25) traingd、traingdm、traingda、traingdx、trainrp、traincgf、traincgp、traincgb、trainscg、trainbfg、trainoss、trainlm 
    net.trainParam.time    最大训练时间(缺省为inf)   traingd、traingdm、traingda、traingdx、trainrp、traincgf、traincgp、traincgb、trainscg、 trainbfg、trainoss、trainlm 
    net.trainParam.mc        动量因子(缺省0.9)       traingdm、traingdx 
    net.trainParam.lr_inc  学习率lr增长比(缺省为1.05) traingda、traingdx 
    net.trainParam.lr_dec  学习率lr下降比(缺省为0.7)  traingda、traingdx 
    net.trainParam.max_perf_inc 表现函数增加最大比(缺省为1.04) traingda、traingdx 
    net.trainParam.delt_inc  权值变化增加量(缺省为1.2)  trainrp 
    net.trainParam.delt_dec  权值变化减小量(缺省为0.5)  trainrp 
    net.trainParam.delt0   初始权值变化(缺省为0.07)     trainrp 
    net.trainParam.deltamax 权值变化最大值(缺省为50.0)  trainrp 
    net.trainParam.searchFcn 一维线性搜索方法(缺省为srchcha) traincgf、traincgp、traincgb、trainbfg、trainoss 
    net.trainParam.sigma  因为二次求导对权值调整的影响参数(缺省值5.0e-5) trainscg 
    net.trainParam.lambda Hessian矩阵不确定性调节参数(缺省为5.0e-7) trainscg 
    net.trainParam.men_reduc 控制计算机内存/速度的参量,内存较大设为1,否则设为2(缺省为1) trainlm 
    net.trainParam.mu       的初始值(缺省为0.001) 
    trainlm 
    net.trainParam.mu_dec    的减小率(缺省为0.1) 
    trainlm    
    net.trainParam.mu_inc   的增长率(缺省为10) 
    trainlm 
    net.trainParam.mu_max   的最大值(缺省为1e10) 
    trainlm

                                                            5、[Matlab]例1

    输入:P=[-1 -1 2 2 4;0 5 0 5 7]; 
    输出:T=[-1 -1 1 1 -1];

    代码

    clear;
    clc;
    P=[-1 -1 2 2 4;0 5 0 5 7];
    T=[-1 -1 1 1 -1];
    %利用minmax函数求输入样本范围
    net = newff(minmax(P),[5,1],{'tansig','purelin'},'trainrp');
    
    net.trainParam.show=50;  %显示训练迭代过程
    net.trainParam.lr=0.05;  %学习率
    net.trainParam.epochs=300; %最大训练次数
    net.trainParam.goal=1e-5; %训练要求精度
    [net,tr]=train(net,P,T); %网络训练
    
    W1= net.iw{1, 1}  %输入层到中间层的权值
    B1 = net.b{1} %中间各层神经元阈值
    W2 = net.lw{2, 1} %中间层到输出层的权值
    B2 = net.b{2} %输出层各神经元阈值
    
    sim(net,P) %利用得到的神经网络仿真

                                                          6、matlab工具箱结果解释

    这里写图片描述

                                                            7、[Matlab]例2

    利用三层BP神经网络来完成非线性函数的逼近任务,其中隐层神经元个数为五个。 
    样本数据: 
    这里写图片描述

    代码

    看到期望输出的范围是[-1, 1] ,所以利用双极性Sigmoid函数作为转移函数。

    clear;
    clc;
    X=-1:0.1:1;
    D=[-0.9602 -0.5770 -0.0729 0.3771 0.6405 0.6600 0.4609...
        0.1336 -0.2013 -0.4344 -0.5000 -0.3930 -0.1647 -.0988...
        0.3072 0.3960 0.3449 0.1816 -0.312 -0.2189 -0.3201];
    figure;
    plot(X,D,'*'); %绘制原始数据分布图(附录:1-1)
    net = newff([-1 1],[5 1],{'tansig','tansig'});
    net.trainParam.epochs = 100; %训练的最大次数
    net.trainParam.goal = 0.005; %全局最小误差
    net = train(net,X,D); 
    O = sim(net,X); 
    figure; 
    plot(X,D,'*',X,O); %绘制训练后得到的结果和误差曲线(附录:1-2、1-3)
    V = net.iw{1,1}%输入层到中间层权值
    theta1 = net.b{1}%中间层各神经元阈值
    W = net.lw{2,1}%中间层到输出层权值
    theta2 = net.b{2}%输出层各神经元阈值

    输出图像

    这里写图片描述



     

    另外本人还开设了个人公众号:JiandaoStudio ,会在公众号内定期发布行业信息,以及各类免费代码、书籍、大师课程资源。

     

                                                

    扫码关注本人微信公众号,有惊喜奥!公众号每天定时发送精致文章!回复关键词可获得海量各类编程开发学习资料!

    例如:想获得Python入门至精通学习资料,请回复关键词Python即可。

    展开全文
  • 文章目录一、理论基础1、飞蛾火焰优化算法2、改进的飞蛾火焰优化算法(1)动态惯性权值(2)AMFO算法二、仿真实验与分析三、参考文献四、Matlab仿真程序 一、理论基础 1、飞蛾火焰优化算法 请参考这里。 2、改进的...

    一、理论基础

    1、飞蛾火焰优化算法

    请参考这里

    2、改进的飞蛾火焰优化算法

    (1)动态惯性权值

    惯性权值参数对算法的全局和局部搜索有着重要影响。MFO算法中权值大小决定了上次迭代中火焰个体对本次迭代中飞蛾个体的影响程度。迭代初期,希望有较高的全局搜索能力以探索新的解空间,跳出局部极值;迭代后期,则重视局部开发以加快收敛并发现精确解。若MFO算法采用线性递减惯性权值,对于复杂高维函数,当迭代次数较大时,每次迭代的惯性权值的变化量较小,将影响权值调整策略功能的发挥;同时,单一的变化模式,在迭代后期,飞蛾在陷入局部最优后将很难飞出。基于上述分析,除了考虑算法所处的迭代阶段以外,还应该将飞蛾的适应度值考虑进去,即权值大小由迭代次数和飞蛾的适应度值共同决定。动态惯性权值 w w w描述如下: w i , j = exp ⁡ ( f ( j ) / μ ) 2.4 + ( exp ⁡ ( − f ( j ) / μ ) ) i t e r (1) w_{i,j}=\frac{\exp(f(j)/\mu)}{2.4+(\exp(-f(j)/\mu))^{iter}}\tag{1} wi,j=2.4+(exp(f(j)/μ))iterexp(f(j)/μ)(1)
    式中, μ \mu μ为第一次寻优过程的平均适应度值; f ( j ) f(j) f(j)为第 j j j个飞蛾的适应度值; i t e r iter iter表示当前迭代次数。针对极小值优化问题,设置飞蛾优化解对应的函数值为适应度值,随着迭代次数增加, f ( j ) f(j) f(j)呈现非线性减小趋势, 2.4 + ( e x p ( − f ( j ) / μ ) ) i t e r 2.4+(exp(-f(j)/\mu))^{iter} 2.4+(exp(f(j)/μ))iter呈现非线性增加趋势,故权值 w w w
    着适应度值和迭代次数呈现非线性减小趋势。图1给出了动态惯性权值变化曲线。
    在这里插入图片描述

    图1 动态惯性权值曲线

    从图1中可以看出,开始迭代阶段, w w w值大于1,随着迭代次数和适应度值的变化,迅速减小, w w w值在迭代后期接近并稳定在0.294附近。改进后的位置更新公式如式(2)所示: S ( M i , F j ) = w i , j × D i × e b t × cos ⁡ ( 2 π t ) + ( 1 − w i , j ) × F j (2) S(M_i,F_j)=w_{i,j}×D_i×e^{bt}×\cos(2\pi t)+(1-w_{i,j})×F_j\tag{2} S(Mi,Fj)=wi,j×Di×ebt×cos(2πt)+(1wi,j)×Fj(2)动态惯性权值随着迭代次数和适应度值非线性动态变化,人工飞蛾逐渐向适应度值较优的火焰运动,利于MFO算法的性能提升。

    (2)AMFO算法

    基于上述描述,AMFO算法流程描述如下:
    (1)初始化算法参数:飞蛾数量 n n n、维数 d d d、最大迭代次数 T T T等;
    (2)种群初始化;
    (3)计算种群中人工飞蛾和人工火焰的适应度值,并按适应度值排序;
    (4)更新火焰最优解和火焰数量;
    (5)按式(1)更新动态惯性权值;
    (6)按式(2)更新飞蛾位置;
    (7)若满足终止条件,算法结束,获得最优解,否则返回步骤(3)。

    二、仿真实验与分析

    对表1中8个测试函数进行测试。

    表1 测试函数

    在这里插入图片描述为了说明AMFO算法的有效性,将AMFO与MFO算法、PSO算法和DE算法进行比较。PSO算法设置 c 1 = c 2 = 1.5 , w ′ = 0.9 , w ′ ′ = 0.4 c_1=c_2=1.5,w'=0.9,w''=0.4 c1=c2=1.5,w=0.9,w=0.4;DE算法设置 F = 0.6 , C r = 0.85 F=0.6,Cr=0.85 F=0.6,Cr=0.85;MFO和AMFO算法设置 b = 1 b=1 b=1。四种优化算法种群规模为40,迭代次数为1000。对于表1的8个测试函数,维度设置为10。四种算法均独立运行30次, 记录并保存最佳解的最大值、最小值、平均值和标准差。
    结果显示如下:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    函数:F1
    PSO:最大值: 8.4983e-05,最小值:1.1546e-10,平均值:3.2292e-06,标准差:1.5481e-05
    DE:最大值: 8.7146e-32,最小值:2.3194e-35,平均值:6.6497e-33,标准差:1.6238e-32
    MFO:最大值: 2.696e-30,最小值:4.4738e-34,平均值:4.9164e-31,标准差:7.6557e-31
    AMFO:最大值: 5.589e-271,最小值:2.6632e-277,平均值:3.7055e-272,标准差:0
    函数:F2
    PSO:最大值: 0.26615,最小值:0.0036761,平均值:0.078469,标准差:0.078358
    DE:最大值: 3.7714e-17,最小值:1.6988e-18,平均值:1.2862e-17,标准差:9.3978e-18
    MFO:最大值: 1.5563e-18,最小值:4.8763e-21,平均值:3.4001e-19,标准差:3.8187e-19
    AMFO:最大值: 1.6438e-146,最小值:5.0147e-152,平均值:8.5459e-148,标准差:3.0028e-147
    函数:F3
    PSO:最大值: 0.054229,最小值:6.8676e-10,平均值:0.0076137,标准差:0.013037
    DE:最大值: 8.9015e-14,最小值:1.3047e-16,平均值:1.5338e-14,标准差:2.0193e-14
    MFO:最大值: 5000,最小值:8.5859e-13,平均值:166.6667,标准差:912.8709
    AMFO:最大值: 2.2061e-235,最小值:9.6136e-242,平均值:1.4643e-236,标准差:0
    函数:F4
    PSO:最大值: 2.5346,最小值:0.011349,平均值:0.47454,标准差:0.47791
    DE:最大值: 1.8221e-10,最小值:5.3534e-12,平均值:5.0468e-11,标准差:3.5962e-11
    MFO:最大值: 8.3859,最小值:1.035e-08,平均值:0.33042,标准差:1.5302
    AMFO:最大值: 7.4133e-137,最小值:6.5523e-142,平均值:7.1406e-138,标准差:1.5635e-137
    函数:F5
    PSO:最大值: 0.0067951,最小值:0.00053889,平均值:0.0026584,标准差:0.0017408
    DE:最大值: 0.028654,最小值:0.0015815,平均值:0.011146,标准差:0.0059163
    MFO:最大值: 0.0096477,最小值:0.0010157,平均值:0.0040222,标准差:0.0023624
    AMFO:最大值: 0.00010438,最小值:2.5904e-06,平均值:2.5711e-05,标准差:2.6951e-05
    函数:F6
    PSO:最大值: 15.9193,最小值:1.9899,平均值:10.019,标准差:3.7335
    DE:最大值: 31.9501,最小值:1.8089,平均值:19.3475,标准差:6.6745
    MFO:最大值: 48.8239,最小值:5.9698,平均值:20.6027,标准差:11.4578
    AMFO:最大值: 0,最小值:0,平均值:0,标准差:0
    函数:F7
    PSO:最大值: 3.0266,最小值:2.5307e-06,平均值:1.344,标准差:0.94939
    DE:最大值: 4.4409e-15,最小值:4.4409e-15,平均值:4.4409e-15,标准差:0
    MFO:最大值: 7.9936e-15,最小值:4.4409e-15,平均值:4.5593e-15,标准差:6.4863e-16
    AMFO:最大值: 8.8818e-16,最小值:8.8818e-16,平均值:8.8818e-16,标准差:0
    函数:F8
    PSO:最大值: 0.48236,最小值:0.027052,平均值:0.20612,标准差:0.11358
    DE:最大值: 0.43513,最小值:0.012316,平均值:0.24793,标准差:0.12992
    MFO:最大值: 0.63978,最小值:0.032006,平均值:0.17322,标准差:0.12678
    AMFO:最大值: 0,最小值:0,平均值:0,标准差:0
    

    综上所述,AMFO算法能够有效地找到全局最优值或接近理论最优值,提出的AMFO算法的改进策略是成功的,针对函数优化问题,AMFO是一个非常高效的优化算法。

    三、参考文献

    [1] 田鸿, 陈国彬, 刘超. 新型飞蛾火焰优化算法的研究[J]. 计算机工程与应用, 2019, 55(16): 138-143.

    展开全文
  • 权值更新在前面的反向传播中我们计算出每一层的权值W和偏置b的偏导数之后,最后一步就是对权值和偏置进行更新了。在之前的BP算法的介绍中我们给出了如下公式:其中的α为学习速率,一般学习率并不是一个常数,而是一...

    权值更新

    在前面的反向传播中我们计算出每一层的权值W和偏置b的偏导数之后,最后一步就是对权值和偏置进行更新了。

    在之前的BP算法的介绍中我们给出了如下公式:


    其中的α为学习速率,一般学习率并不是一个常数,而是一个以训练次数为自变量的单调递减的函数。使用变化的学习率有以下几点理由:

    1、开始时学习率较大,可以快速的更新网络中的参数,是参数可以较快的达到目标值。而且由于每次更新的步长较大,可以在网络训练前期“跳过”局部最小值点

    2、当网络训练一段时间后,一个较大的学习率可能使网络的准确率不再上升,即“网络训练不动”了,这时候我们需要减小学习率来继续训练网络。

    在我们的网络中,含有参数的层有卷积层1、卷积层2、全连接层1和全连接层2,一共有4个层有参数需要更新,其中每个层又有权值W和偏置b需要更新。实际中不管权值还是偏置,还有我们前面计算出了的梯度,都是线性存储的,所以我们直接把整个更新过程用到的数据看作对一维数组就可以,不用去关注权值W是不是一个800*500的矩阵,而且这样的话,权值更新和偏置更新的具体实现可以共用一份代码,都是对一维数组进行操作。

    权值更新策略


    caffe中的学习率更新策略

    在\src\caffe\solvers\sgd_solver.cpp文件的注释中,caffe给出如下几种学习率更新策略:

    [cpp]  view plain  copy
    1. // Return the current learning rate. The currently implemented learning rate  
    2. // policies are as follows:  
    3. //    - fixed: always return base_lr.  
    4. //    - step: return base_lr * gamma ^ (floor(iter / step))  
    5. //    - exp: return base_lr * gamma ^ iter  
    6. //    - inv: return base_lr * (1 + gamma * iter) ^ (- power)  
    7. //    - multistep: similar to step but it allows non uniform steps defined by  
    8. //      stepvalue  
    9. //    - poly: the effective learning rate follows a polynomial decay, to be  
    10. //      zero by the max_iter. return base_lr (1 - iter/max_iter) ^ (power)  
    11. //    - sigmoid: the effective learning rate follows a sigmod decay  
    12. //      return base_lr ( 1/(1 + exp(-gamma * (iter - stepsize))))  
    13. //  
    14. // where base_lr, max_iter, gamma, step, stepvalue and power are defined  
    15. // in the solver parameter protocol buffer, and iter is the current iteration.  

    可以看出,学习率的更新有fixed、step、exp、inv、multistep、poly和sigmoid几种方式,看上边的公式可以很清楚的看出其实现过程。

    实际中我们的网络使用的是inv的更新方式,即learn_rate=base_lr * (1 + gamma * iter) ^ (- power)。

    Caffe中权值更新的实现

    在配置文件\examples\mnist\lenet_solver.prototxt中,保存了网络初始化时用到的参数,我们先看一下和学习率相关的参数。

    [cpp]  view plain  copy
    1. # The base learning rate, momentum and the weight decay of the network.  
    2. base_lr: 0.01  
    3. momentum: 0.9  
    4. weight_decay: 0.0005  
    5. # The learning rate policy  
    6. lr_policy: "inv"  
    7. gamma: 0.0001  
    8. power: 0.75  

    根据上面的参数,我们就可以计算出每一次迭代的学习率learn_rate= base_lr * (1 + gamma * iter) ^ (- power)。

    获取学习率之后,我们需要使用学习率对网络中的参数进行更新。在\src\caffe\solvers\sgd_solver.cpp中包含了进行权值更新的具体函数ApplyUpdate(),下面我们介绍一下这个函数。

    template <typename Dtype>  
    void SGDSolver<Dtype>::ApplyUpdate() {  
      CHECK(Caffe::root_solver());  
      //GetLearningRate()函数获取此次迭代的学习率  
      Dtype rate = GetLearningRate();  
      if (this->param_.display() && this->iter_ % this->param_.display() == 0) {  
        LOG(INFO) << "Iteration " << this->iter_ << ", lr = " << rate;  
      }  
      ClipGradients();  
      //对网络进行更新,一共4个层,每层有W和b2个参数需要更新,故size=8  
      for (int param_id = 0; param_id < this->net_->learnable_params().size();  
           ++param_id) {  
        //归一化,我们的网络没有用到这一函数  
        Normalize(param_id);  
        //正则化  
        Regularize(param_id);  
        //计算更新用到的梯度  
        ComputeUpdateValue(param_id, rate);  
      }  
      //用ComputeUpdateValue计算得到的梯度进行更新  
      this->net_->Update();  
    }


    void SGDSolver<Dtype>::Regularize(int param_id) {
      const vector<Blob<Dtype>*>& net_params = this->net_->learnable_params();
      const vector<float>& net_params_weight_decay =
          this->net_->params_weight_decay();
      Dtype weight_decay = this->param_.weight_decay();
      string regularization_type = this->param_.regularization_type();
      // local_decay = 0.0005 in lenet
      Dtype local_decay = weight_decay * net_params_weight_decay[param_id];
    
      ...
          if (regularization_type == "L2") {
            // axpy means ax_plus_y. i.e., y = a*x + y
            caffe_axpy(net_params[param_id]->count(),
                local_decay,
                net_params[param_id]->cpu_data(),
                net_params[param_id]->mutable_cpu_diff());
          } 
      ...
    }

    void SGDSolver<Dtype>::ComputeUpdateValue(int param_id, Dtype rate) {
      const vector<Blob<Dtype>*>& net_params = this->net_->learnable_params();
      const vector<float>& net_params_lr = this->net_->params_lr();
      // momentum = 0.9 in lenet
      Dtype momentum = this->param_.momentum();
      // local_rate = lr_mult * global_rate
      // lr_mult为该层学习率乘子,在lenet_train_test.prototxt中设置
      Dtype local_rate = rate * net_params_lr[param_id];
    
      // Compute the update to history, then copy it to the parameter diff.
    
      ...
        // axpby means ax_plus_by. i.e., y = ax + by
        // 计算新的权值更新变化值 \delta w,结果保存在历史权值变化中
        caffe_cpu_axpby(net_params[param_id]->count(), local_rate,
                  net_params[param_id]->cpu_diff(), momentum,
                  history_[param_id]->mutable_cpu_data());
    
        // 从历史权值变化中把变化值 \delta w 保存到历史权值中diff中
        caffe_copy(net_params[param_id]->count(),
            history_[param_id]->cpu_data(),
            net_params[param_id]->mutable_cpu_diff());
       ... 
    }
    caffe_axpy<Dtype>(count_, Dtype(-1),
            static_cast<const Dtype*>(diff_->cpu_data()),
            static_cast<Dtype*>(data_->mutable_cpu_data()));

    在ComputeUpdateValue用到了lr_mult学习率因子参数,这个在之前的配置信息里面也见过,同一层中的weight和bias可能会以不同的学习率进行更新,所以也可以有不同的lr_mult。

    最后this->net_->Update()函数使用前边ComputeUpdateValue计算出来的偏导数对参数进行了更新

    layer {
      name: "conv2_1/2/conv"
      type: "Convolution"
      bottom: "conv2_1/2/pre"
      top: "conv2_1/2"
      param {
        lr_mult: 1.0
        decay_mult: 1.0
      }
      param {
        lr_mult: 2.0
        decay_mult: 0.0
      }
      convolution_param {
        num_output: 24
        weight_filler {
          type: "xavier"
        }
        bias_filler {
          type: "constant"
          value: 0.1
        }
        pad_h: 1
        pad_w: 1
        kernel_h: 3
        kernel_w: 3
        stride_h: 1
        stride_w: 1
      }
    }
    展开全文
  • PLL query1(int rt,int l,int r,LL k) //二分找到需删除权值的分界点 { if(l==r) { if(k%b[l]==0) return PLL(l,k/b[l]); //返回分界点权值 else //以及需要删除的该分界点权值的具体个数 return PLL(l,k/b[l]...
  • import java.util.Scanner; public class Weigh_ { public static void main(String[] args...这是我写的代码,可是只能输入小写字母,而且没法统计符号出现的次数,新手入门,请大神指教。。。要怎么改??多谢。。
  • 动态网络最短路径是交通、通信等系统中的重要问题。在处理多链路权值变大时,多链路权值增大的动态最短路径算法可有效地减少...算法复杂度分析和仿真结果显示,DSPT-MLI算法具有更少的节点更新次数和更高的时间效率。
  • 近期总结一一些面试题 都是企业的面试题笔记题 感觉薪资10k下的都会出笔试题 ...同时分享一个自己录制的CSS3动画特效经典案例【推荐教程】--后期会更新vue框架 微信小程序等内容。 https://ke.qq.com/cou...
  • 人工智能——BP神经网络

    千次阅读 2019-05-29 14:35:20
    BP神经网络应该是所有神经网络里面的比较简单易懂的一种。 当然,python是有BP神经网络的库,但是我这次要给的代码,...3.初始化其中的w(权值),b(偏置)。 4.随机选取一个训练集数据,进行正向传播,h = wi*xi ...
  • python3_实现BP神经网络 + BP神经网络应用实例

    万次阅读 多人点赞 2018-07-29 22:10:28
    样本总体训练的次数 for it in range(maxiter): # 衡量每一个样本的误差 err = np.zeros([len(data_tr)]) # 2.训练集训练一遍 for j in range(len(data_tr)): net_in[:2] = data_tr[j, :2] # 存储当前对象前两个属性...
  • 一文读懂逻辑回归

    千次阅读 多人点赞 2019-03-24 21:21:25
    逻辑回归虽然带有回归字样,但是逻辑回归属于分类算法。逻辑回归可以进行多分类操作,但由逻辑回归算法本身性质决定其更常用于二分类...其中,Y为决策值,x为特征值,e为自然对数,w为特征值的权值,b为偏置。为两者...
  • 深度学习入门

    万次阅读 多人点赞 2017-11-05 21:23:46
    如果η太小,网络调参的次数就太多,从而收敛很慢。如果η太大,容易错过了网络的参数的最优解。因此,合适的η大小,在某种程度上,还依赖于 人工经验 。 5.5 感知机的表征能力   1969年,马文·...
  • 权值线段树

    2018-08-14 08:25:47
    权值线段树 简介 维护全局的值域信息,每个节点记录的是该值域的值出现的总次数。 使用二分的思想(离散化的时候,需要用到) 支持查询全局K小值,全局rank,前驱,后继等。 单词操作时间复杂度为O(logn) 空间...
  • 哈夫曼书计算权值

    2012-04-13 18:09:40
    多组输入,第一个正整数T表示组数。 每组第一行有一个正整数n,1≤n≤1000表示所用的字符种数。 接下来一行为n个正整数,表示每个字符在文章中出现的次数。 输出 哈夫曼树 的带权路径长度。
  • 一、权值线段树 简介 1.线段树 线段树是一种用于维护区间信息的高效数据结构,可以在 O(log⁡N)O(\log N)O(logN) 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。...
  • 原文采用的是固定权值,此处采用线性递减的权值策略,以提供另一种思路 ''' 参考: https://blog.csdn.net/winycg/article/details/79120154 https://zhuanlan.zhihu.com/p/107485342 原文采用的是固定
  • 数据结构之权值

    千次阅读 2019-05-10 18:21:00
    在一组数据里,一个数据出现的次数称为权。 例子:学校学期末成绩,期中考试占30%,期末考试占50%,作业占20%,假如某人期中考试得了84,期末92,作业分91,如果是算数平均,那么就是 ; 加权后的,那么加权...
  • BP算法

    千次阅读 2018-03-05 15:04:25
    训练次数多使得学习效率低下,收敛速度慢(需做大量运算);   4) 隐节点的选取缺乏理论支持;   5) 训练时学习新样本有遗忘旧样本趋势。注 3 :改进算法 — 增加动量项、自适应调整学习速率(这个似乎不错 ) 及...
  • 首先我们在学习主席树之前应该先学习权值线段树,因为最基本的...记录权值指的是,每个点上存的是区间内的数字出现的总次数。比如一个长度为10的数组[1,1,2,3,3,4,4,4,4,5]。 这这颗权值线段树中,每一个节点维护的...
  • 卷积神经网络CNN---权值共享

    千次阅读 2021-03-12 13:51:31
    1、权值共享的由来: 权值共享这个词最开始其实是由LeNet5模型提出来,在1998年,LeCun发布了LeNet网络架构,就是下面这个: 虽然现在大多数的说法是2012年的AlexNet网络是深度学习的开端,但是CNN的开端最早...
  • 给定一棵包含N 个节点的完全二叉树,树上每个节点都有一个权值,按从上到下、从左到右的顺序依次是A1, A2, AN,如上图所示: 现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点权值之和最大? 如果...
  • 在确定了网络及结构并设置了最大循环次数和富裕权值初始后,设计者可以方便利用MATLAB,根据题意以及感知器的学习、训练过程来编写自己的程序。
  • 迭代是利用变量的原值推出新值,是某段代码实现循环,不断地精益求精。 ...哈夫曼树权值计算:一棵哈夫曼树的带权路径长度等于树中所有的叶结点的权值乘上其到根结点的路径长度。 装填因子 = (...
  • 1、维护全局的值域信息,每个结点记录的其实是该值域的值出现的总次数 2、用了二分的思想 3、支持查询全局K小值,全局rank,前驱,后继等 (前驱:小于x,且最大的数 后继:大于x,且最小的数) 4、单次操作时间...
  • 魔法权值

    2016-09-13 20:58:04
    魔法权值 给出 n 个字符串,对于每个 n 个排列 p,按排列给出的顺序(p[0] , p[1] … p[n-1])依次连接这 n 个字符串都能得到一个长度为这些字符串长度之和的字符串。所以按照这个方法一共可以生成 n! 个字符串。 一...
  • 权值线段树 基础入门知识详解

    千次阅读 多人点赞 2018-08-17 19:50:17
    权值线段树,相当于一个桶,每个节点用来表示一个区间的数出现的次数。 为什么要用它 我们可以用它来维护一段区间的数出现的次数,从它的定义上来看,它可以快速计算一段区间的数的出现次数。 ...
  • 最小生成树-最小权值

    千次阅读 2018-01-02 06:53:13
    两种方式 1.kruskal:归并边 存储方式:邻接表 时间复杂度:O(eloge) 适用于:稀疏网 ...SL:将边按照从小到大排序,通过判断父节点是否相同,不同可归并,归并边次数n-1 /* Kruskal:最小生成树 原理:归并边; */
  • 先介绍一下离散化 桶排大家应该知道,就是开一个数组(下标为数值,记录了该数值的出现次数)然后遍历过去如果出现次数不为零,那就输出这些数字,理论时间复杂度可以达到O(N)但是由于内存限制,不能开很大的数组。...
  • 一个字符串由小写字母组成,字符串的权值被定义为其中出现次数最多的字符的次数减去出现次数最少的字符的次数。(注意,在讨论出现最少的字符的时候,该字符必须至少出现一次)现在何大爷给你一个字符串,何大爷想...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,783
精华内容 17,513
关键字:

更新权值的次数