精华内容
下载资源
问答
  • 【学习笔记】基于分解的多目标进化算法中两种归一化方法的同时使用---MOEA/D-2N算法简介对比算法:MOEA/D、MOEA/D-N 算法简介 Q:在实际应用中,每个目标的数量级是不同的,对于目标数量级不同的问题,常采用归一化...

    算法简介

    Q:在实际应用中,每个目标的数量级是不同的,对于目标数量级不同的问题,常采用归一化操作来对每个目标引起同等的重视。目标空间归一化对每种算法的性能(即每种算法对现实问题的实际适用性)有很大的影响。
    A:本文在MOEA/D的基础上,采取两种归一化操作,来弥补MOEA/D中归一化操作带来的性能下降。

    对比算法:MOEA/D、MOEA/D-N

    测试组件:DTLZ、WFG、城市排水规划问题

    两种归一化操作

    对于多目标问题:在这里插入图片描述

    最低点(The nadir point)定义:在这里插入图片描述在这里插入图片描述
    理想点(the ideal point)定义:
    在这里插入图片描述
    在这里插入图片描述

    方法一:非标准化(non-normalization)

    为了确保权重向量从理想点开始,所有的目标值被归一化如下在这里插入图片描述

    方法二:自适应归一化(the adaptive normalization )

    另一个广泛采用的标准化机制是基于理想点和最低点:
    在这里插入图片描述
    ϵ = 10−6,为了防止分母为零。

    几种方法的图示

    不带归一化操作,以及带两种归一化操作的PBI方法如下图:
    在这里插入图片描述
    首先是不带归一化操作的PBI方法,PBI中参数d1、d2的定义如下:在这里插入图片描述
    如图(a)所示,从目标空间的原点计算距离。d1、d2的值在图中已给出。

    接下来是使用第一种归一化操作(非标准化)。该情况如图b:
    此时权重向量从理想点(原点变成了理想点)开始,这种方法不能解决不同尺度目标的问题,使个体的评估更靠近理想点。在这里插入图片描述
    使用自适应归一化方法的情况如图c,自适应归一化解决不同尺度目标的问题。使得f1、f2两目标具有相同的评估标准。
    在这里插入图片描述
    实际应用中每个目标的规模通常完全不同。例如,机组组合问题有三个目标(即,系统运行成本、空气污染物排放、预期能源非服务成本)。当能量发生器的数量指定为60时,每个目标的范围之比约为3 : 1 : 50 。显然,对于一个帕累托前沿规模如此之大的问题,目标空间归一化方法的选择将显著影响MOEA/D的搜索行为.
    以图(a)为例。在不同的目标空间中,不同的子问题通过使用PBI函数和权重向量来获得。结果,不同目标空间中的解以不同的方式被评估。如图1(b)所示,在偏移的目标空间(使用非标准归一化)中,蓝色解相对于权重向量w优于红色解。这是因为红色解和蓝色解的d2相同,而蓝色解的d1小于红色解的d1。
    然而,在图(c)的归一化目标空间(使用自适应归一化)中,相对于权重向量w,红色解比蓝色解好得多。这是因为红色解的D1和蓝色解的D1相同,而红色解的d2比蓝色解的D2小得多。

    比较之后的结论: 不同目标空间中两个解之间的比较结果甚至可以颠倒。我们可以看到归一化对MOEA/D的性能有很大的影响,因此要选择合适的归一化操作。

    MOEA/D-2N算法核心

    两种不同的归一化方法,协作进化两个种群P1、P2.
    例如P1用非标准归一化、P2使用自适应归一化。
    在这里插入图片描述

    • P2为P1种群的副本,对P1进行随机初始化之后,直接复制到P2中。[line4]。
    • 利用每个种群中的选择的父代,变异交叉,P1种群产生子代x1,P2种群产生子代x2. [line10-13]
    • 在每一代,利用P1,P2,x1,x2的合并种群来更新最低点和理想点。[line14,15]
    • 然后P1,P2的子代x1,x2来更新P1,P2.[line16-17]
      生成的子代和每个目标空间中的每个相邻权重向量的当前解比较,每个权重向量有三种情况:
      1.当x1比x2和当前解都优秀,那当前解就用x1替代。
      2.当x2比x1和当前解都优秀,那当前解就用x2替代。
      3.当当前解优于x1,x2。则不发生替代。
    • 最后输出P1种群。
      在这里插入图片描述
    展开全文
  • 种群初始 计算每个个体的适应度 选择 交叉 变异 根据是否满足解的精度要求和迭代次数来判断是否进行下一轮的遗传进化。 NSGA算法存在的3个问题 O(MN^3)计算时间复杂度(其中M代表目标个数,N代表种群个数) 非...

    参考博客链接
    https://blog.csdn.net/qq_35414569/article/details/79639848?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0.no_search_link&spm=1001.2101.3001.4242
    因为NSGA-II算法是一种遗传算法,所以首先搞清楚遗传算法的流程。

    遗传算法流程

    一般遗传算法的流程:

    1. 种群初始化
    2. 计算每个个体的适应度
    3. 选择
    4. 交叉
    5. 变异

    根据是否满足解的精度要求和迭代次数来判断是否进行下一轮的遗传进化。

    NSGA算法存在的3个问题

    1. O(MN^3)计算时间复杂度(其中M代表目标个数,N代表种群个数)
    2. 非精英机制方法
    3. 需要指定一个共享参数

    NSGA-II算法

    NSGA-II算法主要由以下三个部分组成
    A、快速非支配排序方法
    B、拥挤比较算子
    C、主程序

    A、快速非支配排序方法

    • 传统排序方法:时间复杂度O(MN3),M是目标个数,N是种群个数。为了计算第一非支配前沿面,需要判断每个解和种群中的其他解的支配关系。一个解和其他解的支配关系需要O(MN)复杂度,每个解和其他解的支配关系需要O(MN2)复杂度。最坏的情况,N个解各自构成一个前沿面,时间复杂度就是O(MN3)。
    • 快速非支配排序方法:首先需要计算两个变量 1)支配计数np,即支配解p的解的数量。2)Sp,即解p支配的解的集合。
      在地方里插入图片描述
      如上图所示,对解c而言,解c被a,b两个解支配,所以nc为2。对解b而言,解b支配c,d,e,所以Sb={c,d,e}。

    算法流程如下:
    在这里插入图片描述
    首先计算每个解的np和Sp,这需要O(MN2)时间复杂度,同时得到了第一前沿面 F 1 \mathcal{F1} F1。第二部分就是计算其余的前沿面,需要遍历前沿面中的每个解以及这个解的Sp集合,将对应解p的np值减一,如果np值减为0了,就加入下一前沿面集合,这部分需要O(N2)时间复杂度。由于第一部分和第二部分是分开的,所以总的时间复杂度是O(MN2)。

    B、拥挤比较算子

    密度估计:对同一前沿面的解按照目标函数值排序,计算每个解在该目标函数下两侧解的目标函数归一化差值,然后将所有目标函数下的分量累加作为拥挤系数。

    具体算法流程如下:在这里插入图片描述
    在这里插入图片描述
    如图所示,直观上看,解i的拥挤系数就是虚线矩形周长的一半。

    C、主程序

    • 种群初始化:随机创建父代种群P0 ,为父代种群利用快速非支配排序算法计算出非支配等级,并利用二进制锦标赛机制重组以及变异算子生成大小为N的子代种群。
    • 子代个体选择
      在这里插入图片描述
      代码实现
      参考博客链接
      https://www.omegaxyz.com/2017/05/04/nsga2matlabzdt1/
      主体代码是这篇博客的,仅将非支配排序部分修改为了原始论文中的
    %% NSGA-II算法
    clear; close all; clc; tic;
    
    %% 初始化/参数设定
    generations=100;                                %迭代次数
    popnum=100;                                     %种群大小(须为偶数)
    poplength=30;                                   %个体长度
    minvalue=repmat(zeros(1,poplength),popnum,1);   %个体最小值
    maxvalue=repmat(ones(1,poplength),popnum,1);    %个体最大值    
    %% 随机创建父代种群  
    population=rand(popnum,poplength).*(maxvalue-minvalue)+minvalue;    %产生新的初始种群
    
    %% 开始迭代进化
    for gene=1:generations                      %开始迭代
        %% 交叉
        newpopulation=zeros(popnum,poplength);  %子代种群
        for i=1:popnum/2                        %交叉产生子代
                k=randperm(popnum);                 %从种群中随机选出两个父母,不采用二进制联赛方法
                beta=(-1).^round(rand(1,poplength)).*abs(randn(1,poplength))*1.481; %采用正态分布交叉产生两个子代
                newpopulation(i*2-1,:)=(population(k(1),:)+population(k(2),:))/2+beta.*(population(k(1),:)-population(k(2),:))./2;    %产生第一个子代           
                newpopulation(i*2,:)=(population(k(1),:)+population(k(2),:))/2-beta.*(population(k(1),:)-population(k(2),:))./2;      %产生第二个子代
        end
        
        %% 变异
        k=rand(size(newpopulation));    %随机选定要变异的基因位
        miu=rand(size(newpopulation));  %采用多项式变异
        temp=k<1/poplength & miu<0.5;   %要变异的基因位
        newpopulation(temp)=newpopulation(temp)+(maxvalue(temp)-minvalue(temp)).*((2.*miu(temp)+(1-2.*miu(temp)).*(1-(newpopulation(temp)-minvalue(temp))./(maxvalue(temp)-minvalue(temp))).^21).^(1/21)-1);        %变异情况一
        newpopulation(temp)=newpopulation(temp)+(maxvalue(temp)-minvalue(temp)).*(1-(2.*(1-miu(temp))+2.*(miu(temp)-0.5).*(1-(maxvalue(temp)-newpopulation(temp))./(maxvalue(temp)-minvalue(temp))).^21).^(1/21));  %变异情况二
        
        %% 越界处理/种群合并
        newpopulation(newpopulation>maxvalue)=maxvalue(newpopulation>maxvalue); %子代越上界处理
        newpopulation(newpopulation<minvalue)=minvalue(newpopulation<minvalue); %子代越下界处理
        newpopulation=[population;newpopulation];                               %合并父子种群
        
        %% 计算目标函数值
        functionvalue=zeros(size(newpopulation,1),2);           %合并后种群的各目标函数值,这里的问题是ZDT1
        functionvalue(:,1)=newpopulation(:,1);                  %计算第一维目标函数值
        g=1+9*sum(newpopulation(:,2:poplength),2)./(poplength-1);
        functionvalue(:,2)=g.*(1-(newpopulation(:,1)./g).^0.5); %计算第二维目标函数值
        
        %% 非支配排序,NSGA-II论文中的算法
        Sp = zeros(size(newpopulation,1));              %Sp解p支配的解的集合
        np = zeros(size(newpopulation,1),1);            %支配解p的解的数量
        Prank = zeros(size(newpopulation,1),1);         %每个解的前沿面编号
        F = zeros(size(newpopulation,1));               %保存每层前沿面的个体
        for p = 1:size(newpopulation,1)
            for q = 1:size(newpopulation,1)
                if isDomin(functionvalue,p,q)
                    Sp(p,sum(Sp(p,:)~=0)+1) = q;
                elseif isDomin(functionvalue,q,p)
                    np(p) = np(p)+1; 
                end
            end
            if np(p)==0
                Prank(p) = 1;
                F(1,sum(F(1,:)~=0)+1) = p;
            end
        end
        i = 1;
        while sum(F(i,:)~=0)
            Q = zeros(1,size(F,2));
            for p = 1:sum(F(i,:)~=0)
                for q = 1:sum(Sp(F(i,p),:)~=0)
                    np(Sp(F(i,p),q)) = np(Sp(F(i,p),q)) - 1;
                    if np(Sp(F(i,p),q))==0
                        Prank(Sp(F(i,p),q)) = i+1;
                        Q(sum(Q(:)~=0)+1) = Sp(F(i,p),q);
                    end
                end
            end
            i = i+1;
            F(i,:) = Q;
        end
        
        %% 计算拥挤距离/选出下一代个体  
        fnum = 0;
        psum = 0;
        while psum <= popnum                        %判断前多少个面的个体能完全放入下一代种群
            fnum = fnum + 1;
            psum = psum + sum(F(fnum,:)~=0);
        end
        num = popnum - (psum - sum(F(fnum,:)~=0));  %num表示在当前前沿面需要多少个个体
        population(1:popnum-num,:) = newpopulation(Prank<fnum,:);
        % 计算当前前沿面个体的拥挤距离
        I = F(fnum,:);
        l = sum(I(:)~=0);
        I = I(1:l);
        I_distance = zeros(l,1);
        fmax = max(functionvalue(I,:),[],1);
        fmin = min(functionvalue(I,:),[],1);
        for m = 1:size(functionvalue,2)
           [~,oldsite] = sortrows(functionvalue(I,m));
           I_distance(oldsite(1)) = inf;
           I_distance(oldsite(end)) = inf;
           for i = 2:l-1
               I_distance(oldsite(i)) = I_distance(oldsite(i)) + (functionvalue(I(oldsite(i+1)),m)-functionvalue(I(oldsite(i-1)),m))/(fmax(m)-fmin(m));
           end
        end
        I = sortrows([I_distance,I'],1,'descend');                          %按拥挤距离降序排序
        population(popnum-num+1:popnum,:) = newpopulation(I(1:num,2),:);    %将第fnum个面上拥挤距离较大的前num个个体复制入下一代 
    end
        
    %% 程序输出
    fprintf('已完成,耗时%4s秒\n',num2str(toc));          %程序最终耗时
    output=sortrows(functionvalue(Prank==1,:));    %最终结果:种群中非支配解的函数值
    plot(output(:,1),output(:,2),'*b');                 %作图
    axis([0,1,0,1]);xlabel('F_1');ylabel('F_2');title('ZDT1')    
        
    

    结果
    在这里插入图片描述

    展开全文
  • CNN优化之批量归一化

    2021-07-12 20:41:42
    上一篇文章介绍了卷积神经网络CNN的结构和CNN模型,这篇文章介绍CNN优化方式:批量归一化。 文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:以下是本篇...

    而深层模型,每层输入的分布和权重在同时变化,训练相对困难。上一篇文章介绍了卷积神经网络CNN的结构和CNN模型,这篇文章介绍CNN优化方式:批量归一化。

    文章目录

    前言

    一、 背景介绍

    二、BN介绍

        2.1.BN基本思想

        2. 2BN算法整体流程如下图

       2.3 Batch Normalization的反向传播

    三、BN主要作用

    四、BN在CNN中的使用

    五、BN的优点

    总结


    前言

    BN的思想是2015年由谷歌的团队提出来的一种模型训练优化方法。参考论文:Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift,这是一个深度神经网络训练的技巧 ,目前BN已经成为几乎所有卷积神经网络的标配技巧了。在这里,结合论文及网络一些优秀的博文,简单地介绍批次归一化,主要从背景,BN原理,BN作用,和BN在cnn中的使用四个方面简介。

    论文摘要:

    由于每层输入的分布在训练过程中随着前一层的参数发生变化而发生变化,因此训练深度神经网络很复杂。 由于需要较低的学习率和仔细的参数初始化,这会减慢训练速度,并且使得训练具有饱和非线性的模型变得非常困难。我们将这种现象称为内部协变量偏移( Internal Covariate Shift,并通过归一化层输入来解决该问题。

    我们的方法的优势在于将标准化作为模型架构的一部分,并为每个训练小批量执行标准化。 Batch Normalization 允许我们使用更高的学习率并且在初始化时不那么小心,并且在某些情况下消除了 Dropout 的需要。

    应用于最先进的图像分类模型,批量归一化以减少 14 倍的训练步骤实现相同的精度,并以显着的优势击败原始模型。使用批量归一化网络的集合,我们改进 在 ImageNet 分类上发布的最佳结果:达到 4.82% 的 top-5 测试错误,超过人类评估者的准确性


    一、 背景介绍

    (0)常规的归一化方法

           对于数据归一化的常见方法有零均值和PCA,

           如下图,左图中,如果我们用红线去拟合绿线,在第一张图这种我们需要做多次迭代,才可以得到我们需要的目标直线,右图我们做了零均值操作,让数据的均值为零,这样的调节能够提高我们的训练速度。

                            

            PCA白化操作即为:就是对输入数据分布变换到0均值,单位方差的正态分布,对输入数据做了标准化处理:处理后的任意一个特征在数据集中所有样本上的均值为0、标准差为1。标准化处理输入数据使各个特征的分布相近:这往往更容易训练出有效的模型。

                                                          

          通常来说,数据标准化预处理对于浅层模型就足够有效了。随着模型训练的进行,当每层中参数更新时,靠近输出层的输出较难出现剧烈变化。 但对深层神经网络来说,即使输入数据已做标准化,训练中模型参数的更新依然很容易造成靠近输出层输出的剧烈变化。这种计算数值的不稳定性通常令我们难以训练出有效的深度模型。

     (1)   “Internal Covariate Shift”问题

            论文刚开始作者比较了Mini-Batch SGD和One Example SGD,并指出小批次SGD的优势在于梯度更新方向更准确;并行计算速度快;缺点在于调参麻烦。之后,作者提出了 Internal Covariate Shift,在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,

            网络一旦训练起来,参数就要发生更新,除了输入层的数据外,其它层的数据分布是一直发生变化的,因为在训练的时候,网络参数的变化就会导致后面输入数据的分布变化,比如第二层输入,是由输入数据和第一层参数得到的,而第一层的参数随着训练一直变化,势必会引起第二层输入分布的改变,把这种改变称之为:Internal Covariate Shift,BN就是为了解决这个问题的。

                                                

     随后,作者提出了BN的基本思想:能不能让每个隐层节点的激活输入分布固定下来呢

     BN的主要的思想可以理解为对深层神经网络每个隐层神经元的激活值做简化版本的白化操作。

    (2)单层视角看BN

    在单层神经网络中,对于中间的某一层,其前面的层可以看成是对输入的处理,后面的层可以看成是损失函数,如下图所示:

    一次反向传播过程会同时更新所有层的权重W1,W2,…,WL,前面层权重的更新会改变当前层输入的分布,对 Wk_{}的更新是在假定其输入不变的情况下进行的。对于某一层某个节点的输入而言,y=w1x1+w2x2+b。

                                                            

           在单层神经网络中,直线调整了位置,输入分布又在发生变化,直线再调整位置,就像是直线和分布之间的“追逐游戏”。当分布发生变化时,调整参数,使得直线拟合分布,比较容易,而深层模型,每层输入的分布和权重在同时变化,训练相对困难。

      (3)多层视角看BN

            在多层中,反向传播过程中,每层权重的更新是在假定其他权重不变的情况下,向损失函数降低的方向调整自己。问题在于,在一次反向传播过程中,所有的权重会同时更新,导致层间配合“缺乏默契”,层数越多,相互配合越困难,文中把这个现象称之为 Internal Covariate Shift,示意图如下。为了避免过于震荡,学习率不得不设置得足够小,足够小就意味着学习缓慢。

                                

    一个较为形象的理解,参数间的细小变化在神经网络中都可能引起“雪崩”,即

                                                              

     多层神经网络对于数据的敏感性使得每次都需要考虑学习率的超参数,如果对每层的输入做Normalization,这样可以降低对参数的学习。

    二、BN介绍

    1.BN基本思想

     

      BN基本思想在于:

    因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。

    而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布就是把越来越偏的分布强制拉回比较标准的分布,使得激活输入值落在非线性函数对输入比较敏感的区域,这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

     

    就像激活函数层、卷积层、全连接层、池化层一样,BN也是网络的一层。该算法本质是: 在网络的每一层输入的时候,插入了一个归一化层, 然后再进 入网络的下一层。BN算法在实际使用的时候会把特征给强制性的归到均值为0,方差为1的数学模型下。把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。

    综上:BN的基本思想在于BN其实就是把每个隐层神经元的激活输入分布从偏离均值为0方差为1的正态分布,通过平移均值压缩或者扩大曲线尖锐程度,调整为均值为0方差为1的正态分布。

     如果都通过BN,这意味着网络的表达能力下降了,也意味着深度的意义就没有了。所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。论文作者并未明确这样说。但是很明显这里的scale和shift操作是会有争议的。

    2.BN算法实现

        2.1  BN算法实现

         cnn循环网路中包括卷积层,激励层,池化层等,现在,需要加入BN层,BN被建议插入在(每个)ReLU激活层前面,BN就是在神经网络的训练过程中对每层的输入数据加一个标准化处理:

    è¿éåå¾çæè¿°

     传统的神经网络,只是在将样本输入层之前对进行标准化处理(减均值,除标准差),以降低样本间的差异性。BN是在此基础上,对输入层的输入数据进行标准化,对每个隐藏层的输入进行标准化。
     

    BN算法的具体实现过程:

                                                   å·ç§¯ç¥ç»ç½ç»CNNââ BN(Batch Normalization) åçä¸ä½¿ç¨è¿ç¨è¯¦è§£

    具体计算过程示例如下:

    1. 计算mini-batch内样本的均值

    例如输入mini-batch包含3个样本,每个样本有2个特征,分别是:

     对每个特征分别计算mini-batch内样本的均值:

    则样本均值是:

     2. 计算mini-batch内样本的方差

    上面的计算公式先计算一个批次内样本的均值μB和方差σ2B,然后再对输入数据做归一化,将其调整成均值为0,方差为1的分布。

    对于上述给定的输入数据x(1),x(2),x(3),可以计算出每个特征对应的方差

    则样本方差是:

     3. 计算标准化之后的输出

     

    对于上述给定的输入数据x(1),x(2),x(3),可以计算出标准化之后的输出:

     

     在标准化之后,BatchNorm会紧接着对数据做缩放和平移。

    其中γ和β是可学习的参数,可以赋初始值γ=1,β=0,在训练过程中不断学习调整。 

    2.2  BN算法整体流程如下图

                                                               

    输入:待进入激活函数的变量 
    输出: 

    1.对于K维的输入,假设每一维包含m个变量,所以需要K个循环。每个循环中按照上面所介绍的方法计算γ与β。这里的K维,在卷积网络中可以看作是卷积核个数,如网络中第n层有64个卷积核,就需要计算64次。需要注意,

    在正向传播时,会使用γ与β使得BN层输出与输入一样。

    2.在反向传播时利用γ与β求得梯度从而改变训练权值(变量)。
    3.通过不断迭代直到训练结束,求得关于不同层的γ与β。如网络有n个BN层,每层根据batch_size决定有多少个变量,设定为m,这里的mini-batcherB指的是特征图大小*batch_size,即m=特征图大小*batch_size,因此,对于batch_size为1,这里的m就是每层特征图的大小。
    4.不断遍历训练集中的图片,取出每个batch_size中的γ与β,最后统计每层BN的γ与β各自的和除以图片数量得到平均直,并对其做无偏估计直作为每一层的E[x]与Var[x]。
    5.在预测的正向传播时,对测试数据求取γ与β,并使用该层的E[x]与Var[x],通过图中11:所表示的公式计算BN层输出。
    注意,在预测时,BN层的输出已经被改变,所以BN层在预测的作用体现在此处

    2.3 ​​​​​​​Batch Normalization的反向传播

    对于目前的神经网络计算框架,BatchNorm的梯度该如何求取?

    在正向传播的时候,通过可学习的γ与β参数求出新的分布值

    在反向传播的时候,通过链式求导方式,求出γ与β以及相关权值

                                     

           根据反向传播的顺序,首先求取损失ℓ对BN层输出yi的偏导∂ℓ / ∂yi,然后是对可学习参数的偏导∂ℓ / ∂γ和∂ℓ / ∂β,用于对参数进行更新, 然后对变量μ、σ2和x^的偏导,根据链式法则再求这些变量对x的偏导 。

    三、BN主要作用

    BN的主要作用在于避免梯度爆炸或者梯度消失。

    BN的作用:

    (1)允许较大的学习率;

    (2)减弱对初始化的强依赖性

    (3)保持隐藏层中数值的均值、方差不变,让数值更稳定,为后面网络提供坚实的基础;

    (4)有轻微的正则化作用(相当于给隐藏层加入噪声,类似Dropout)

    如下图,在sigmoid函数中, 当X到一定的数值,就变化很小,

     如果输入很大,其对应的斜率就很小,我们知道,其斜率(梯度)在反向传播中是权值学习速率。所以就会出现如下的问题,

    å·ç§¯ç¥ç»ç½ç»CNNââ BN(Batch Normalization) åçä¸ä½¿ç¨è¿ç¨è¯¦è§£

     这会造成的影响是在一个很大的深度网络中,浅层基本不学习,权值变化小,后面几层一直在学习,结果就是,后面几层基本可以表示整个网络,失去了深度的意义。

     当我们进行归一化操作时,

      a中左图是没有经过任何处理的输入数据,曲线是sigmoid函数,数据在梯度很小的区域,那么学习率就会很慢甚至陷入长时间的停滞。b)图中进行归一化操作之后,减均值除方差后,数据就被移到中心区域如右图所示,

    而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

    四、BN在CNN中的使用

    目前在CNN中最流行的结构是:卷积+BN+激活函数,

     假设对于一个深层神经网络来说,其中两层结构如下:

                                 

    要对每个隐层神经元的激活值做BN,可以想象成每个隐层又加上了一层BN操作层,它位于X=WU+B激活值获得之后,非线性函数变换之前,其图示如下:

                                 

     而BN算法的具体操作是:

    BN算法的思路如下

                                            

     在最后做归一化操作时出现前向传到公式为:

                                     

     其结构图如下:

                                    

    BN算法的实现过程如下:

                                                  è¿éåå¾çæè¿°

    五、BN的优点

    BN层的有效性已有目共睹,其原因在于:

    1,BN层让损失函数更平滑。添加BN层后,损失函数的landscape(losssurface)变得更平滑,相比高低不平上下起伏的loss surface,平滑losssurface的梯度预测性更好,可以选取较大的步长。如下图所示,

    2,BN更有利于梯度下降。VGG和NIN网络在有无BN层的情况下,loss surface的差异,包含初始点位置以及不同优化算法最终收敛到的local minima位置,如下图所示。没有BN层的,其loss surface存在较大的高原,有BN层的则没有高原,而是山峰,因此更容易下降。

     

     注:

       其他常见的归一化方法有:

    常用的Normalization方法主要有:Batch Normalization(BN,2015年)、Layer Normalization(LN,2016年)、Instance Normalization(IN,2017年)、Group Normalization(GN,2018年)。它们都是从激活函数的输入来考虑、做文章的,以不同的方式对激活函数的输入进行 Norm 的

    神经网络中的各种归一化算法_u014514939的博客-CSDN博客

                                          


    总结

      BN的作用就是把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。 
     ​​​​​​​

    参考:

    1, BN(Batch Normalization) 原理与使用过程详解

    2,  5.10. 批量归一化

    3,深入理解Batch Normalization批标准化

    展开全文
  • 多目标优化(二)简单的 NSGA-Ⅲ

    千次阅读 2021-02-25 14:49:14
    多目标优化(二)简单的 NSGA-Ⅲ 写在前面: 1、最近好多人收藏了我的文章啊!那就把其他多目标优化学习内容也整理一下!! 2、本文主要介绍自己理解的 NSGA-II Matlab 程序实现,在学习中迷糊的地方都会点出来!...

    多目标优化(二)简单的 NSGA-Ⅲ

    写在前面:

    1、最近好多人收藏了我的文章啊!那就把其他多目标优化学习内容也整理一下!!

    2、本文主要介绍自己理解的 NSGA-III Matlab 程序实现,在学习中迷糊的地方都会点出来!!

    3、本文程序基于 上一篇 NSGA-II  改编;

    4、欢迎指正。

    算法概要:

    1、基础 Pareto 概念请转:
    2、算法目标:我们知道遗传算法会构建一个带有 NP 个个体的种群,单目标输出的就是迭代后种群中最好的 个体。但在多目标中,输出的是迭代后整个种群作为 NP 个 Pareto 最优解,构成一个 Pareto 实际前沿面。(单目标是要找最优个体,多目标是要找最接近理论前沿面的实际前沿面)
    3、快速非支配排序:将当代种群根据各个目标函数值进行 Pareto 等级分层(用到非支配解的概念)
    4、基于参考点分类个体:在空间中(几个目标就是几维空间),生成一组参考点(参考点个数自定,建议选择和种群大小相同,每个解对应一个参考点是最理想的)
    5、选择、交叉、变异:GA基本操作,NSGA-III论文并没有限定选用哪种方法,我觉得可以随意选用
    6、精英保留:就是将生成的候选种群和原种群合并,重新 Pareto 分层和计算各个个体归属的参考点,然后按照 Pareto 层级和参考点所拥有的个体数选择前NP 个个体进入下一循环(就是让新种群中个体归属的参考点尽可能均匀分布)

    NSGA-II 与 NSGA-III 的区别:

    NSGA-II中根据拥挤度来选择个体,NSGA-III根据参考点来选择个体;

    拥挤度是一个数值呀,一维上能精确的表示长度,二维上能表示无数种形状的面积,三维上能表示无数的无数种的体积,所以对于多目标(大于3)是不合理的。

    参考点是在空间中均匀的选择点位置,画出两目标和三目标的图,应该能理解了吧??

    主程序:

    clear; close all; clc
    global NP x_num f_num iter_max fun bound f_min  % 定义全局变量
    % NP:种群大小
    % iter_max:最大迭代次数
    % f_num:目标个数
    % x_num:解得维数
    % f_min: 当前寻找到的各目标函数的最小值
    
    %% 测试ZDT1函数,参数如下:
    f_num = 2; % 目标函数个数
    x_num = 30; % 决策变量个数
    x_min = zeros(1,x_num); % 决策变量的最小值
    x_max = ones(1,x_num); % 决策变量的最大值
    f_min = ones(1, f_num) * inf;
    NP = 100; iter_max = 500;
        
    % 初始化种群
    chromo_ori = x_min + rand(NP, x_num) .* (x_max - x_min);  % 初始化种群
    chromo_ori = fun(chromo_ori);  % 计算适应度函数值
    [F0, chromo] = non_domination_sort(chromo_ori);  % 子函数:非支配排序
    Ref_Points = Gen_RefPoints();  % 子函数:生成参考点
    
    % 开始迭代
    for i = 1:iteration
    
        chromo_parent = chromo(:,1:x_num+f_num+2); % 定义父代种群,最后两列放pareto等级和参考点归属类
        % 交叉 变异
        chromo_cro = crossover(pick_sel, chromo_parent); 
        chromo_mut = mutation(chromo_parent);
        chromo_off = [chromo_cro; chromo_mut]; 
    
        % 种群合并
        chromo_co = [chromo_parent(:,1:x_num+f_num); chromo_off(:,1:x_num+f_num)]; % 种群个数 2*NP
        [F_i, chromo_co] = non_domination_sort(chromo_co); % 非支配排序
        f_min_new = min(chromo_co(:, x_num+1:x_num+f_num)); % 看看各目标的最小值有没有更新
        if sum(f_min > f_min_new)
            f_min = min(f_min, f_min_new); % 更新各目标最小值
        end
        
        % 精英保留
        chromo_co = Classify_RefPoint(); % 将合并后的种群个体分属于参考点中
        chromo = elitism(chromo_co); % 按 Pareto 等级和拥挤度从2*NP个个体中选出NP个个体进入下一代
    
    end

     

    子程序原理:

    1、 大部分子程序原理同NSGA-II一样,请转https://blog.csdn.net/weixin_41942547/article/details/102527352

    2、 Gen_RefPoints:

    ① 参考点生成一次就行了,默认是各目标均等的分成几份,然后在多维空间上均匀分布参考点。

    ② 有几个目标,参考点就是一个几维向量。

    function RefPoints = Gen_RefPoints()
        global f_num
        n_div = floor(f_num * 3); % 各目标分成几份
        RefPoints = Get_Matrix(f_num, n_div)' / n_div;
    end
    
    function A = Get_Matrix(f_num, n_div)
        if f_num < 1
            error('f_num cannot be less than 1.');
        end
        if floor(f_num) ~= f_num
            error('f_num must be an integer.');
        end
        if f_num == 1
            A = n_div;
            return;
        end
        A = [];
        for i = 0:n_div
            B = Get_Matrix(f_num-1, n_div-i);
            A = [A; i*ones(size(B,1),1) B];
        end
    end

    3、 Classify_RefPoint:

    ① 这部分就是NSGA-III的核心也是难点。

    ② 由于参考点是按标准化计算的,所以我们需要将各目标所在的目标空间转换成和参考点的空间一致。

    ③ 首先,是改变“原点”,将当前寻找到的个目标值的最小值作为原点,即将目标空间进行平移变换。

    ④ 其次,由于各目标的取值的区间差异很大,所以将其归一化。(因为参考点也相当于是归一化后取得的)

    上两步骤可参考(标准化目标空间)https://zhuanlan.zhihu.com/p/124917159

    ⑤ 经过上述步骤,就能将参考点完全匹配到目标空间上啦,接下来就是计算每个个体所属的参考点。

    ⑥ 判断归属的参考点就是计算每个个体到各个参考点向量(“原点”与参考点的连线)的距离,选择最短的那个。

    function chromo = Classify_RefPoint(chromo)
    
        global f_min x_num f_num RefPoints habitat
        
        fit = chromo(:, x_num+1:x_num+f_num);
        fit = fit - f_min; % 函数目标坐标变换
        for i = 1:f_num
            w = 10-6 * ones(1, f_num); w(i) = 1;
            [f_max(i), ~] = min(max(fit ./ w, [], 2));
        end
        fit = fit ./ f_max; % 坐标归一化
        
        for i = 1:numel(habitat)
            w = RefPoints(:, i) / norm(RefPoints(:, i));
            for j = 1:size(chromo, 1)
                dis(j, i) = norm(fit(j, :)' - w'*fit(j, :)'*w);
            end
        end
        [~, idx] = min(dis, [], 2);
        chromo(:, x_num+f_num+2) = idx; % 各个个体归属到哪个参考点
    
    end

    4、 elitism:

    ① 变异后的种群就是子代种群了,和父代种群合并以下吧(变成 2NP 个个体了)
    将这 2NP 个个体 Pareto 分层和计算拥挤度吧,
    ③ 先将 Pareto 等级为1的选中,再选 Pareto 等级为2的,……
    ④ 选 NP 个就够啦,比如 Pareto 等级为1的个体有 NP/2 个,Pareto等级为2的个体有NP个,那么就需要从Pareto等级为2的个体中挑选出NP/2个。

    ⑤ 首先,挑选出Pareto等级为1的个体有NP/2个,统计这NP/2个个体归属的参考点各有几个。

    ⑥ 选择归属的参考点个数最少的参考点,从Pareto等级为2的个体中挑选出一个归属于那个参考点的个体。重复这个过程直到挑出NP/2个个体。

    function chromo = elitism(chromo_co)
        
        global NP f_num x_num habitat
        habitat = min(habitat, 0);
        chromo_co_sort = sortrows(chromo_co, x_num+f_num+1); % 按 pareto_rank 排序
        
        chromo = [];
        pareto_rank = 1;
        while size(chromo, 1) < NP
            
            % 取出 pareto_rank 整层
            temp = chromo_co_sort(chromo_co_sort(:,x_num+f_num+1)==pareto_rank,:);
            if (size(temp, 1) + size(chromo, 1)) < NP
                chromo = [chromo; temp];
                for i = 1:size(temp, 1)
                   habitat(temp(i, x_num+f_num+2)) = habitat(temp(i, x_num+f_num+2)) + 1; 
                end
            else
                while size(chromo, 1) < NP
                    [~, idx] = min(habitat); % 找出小生境中数量最少的
                    pick = find(temp(:, x_num+f_num+2)==idx);
                    if isempty(pick)
                        habitat(idx) = inf;
                    else
                        chromo = [chromo; temp(pick(1), :)];
                        temp(pick(1), :) = [];
                        habitat(idx) = habitat(idx) + 1;
                    end
                end
            end
            pareto_rank = pareto_rank + 1;
        end
     
    end

    可执行的完整代码见:https://download.csdn.net/download/weixin_41942547/15467105

    展开全文
  • 数据预处理-归一化/数据转换

    千次阅读 2020-12-28 20:28:27
    有时候我们在拿到原始数据的时候,我们不能直接使用。大概场景有下面这些,我遇到的1....数据的标准化(normalization)和归一化数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特...
  • 点上方计算机视觉联盟获取更干货仅作学术分享,不代表本公众号立场,侵权联系删除转载于:作者丨马东什么@知乎(已授权)来源丨https://zhuanlan.zhihu.com/p/3623...
  • 归一化 标准化

    2021-02-23 16:40:34
    2)SVM、线性回归之类的最优化问题需要归一化,是否归一化主要在于是否关心变量取值; 3)神经网络需要标准化处理,一般变量的取值在-1到1之间,这样做是为了弱化某些变量的值较大而对模型产生影响。一般神经网络中...
  • 论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate ShiftInternal Covariate Shift深度神经网络涉及到很层的叠加,而每一层的参数更新会导致上层的输入数据分布发生...
  • 前言买了本《百面机器学习》看着玩,虽然已经毕业了,机器学习还是放不下吧,希望以后新的机会出现能够及时...(1)线性函数归一化(Min-Max Scaling)。它对原始数据进行线性变换,使结果映射到[0, 1]的范围,实现对...
  • 特征归一化详解

    2021-05-16 11:12:56
    特征归一化 场景描述:分析一个人的身高和体重对健康的影响,如果使用米和千克作为单位,那么身高特征就会在1.6 - 1.8m这样一个范围内,体重会在50 - 100kg的范围内,分析出来的结果显然会倾向于数值差别比较大的...
  • 将问题中目标函数归一化后取消了不同量纲对解的影响,能够更好的得到最优解 主程序 clear clc close all tic %% 用importdata这个函数来读取文件 % shuju=importdata('cc101.txt'); load('cc101'); shuju=c101; ...
  • 作者丨何杰文@知乎(已授权)来源丨https://zhuanlan.zhihu.com/p/422104433编辑丨极市平台导读本文总结了6个目标检测回归损失函数的优缺点以及对其公式的分...
  • 优化算法做的事就是在 模型表征空间中找到模型评估指标最好的模型。这里就引出了什么是模型的表征空间,以及什么是评估指标了。只有正确地应用表征空间以及评估指标,才可以更好地优化模型 譬如SVM的模型表征空间...
  • 目标检测损失函数

    千次阅读 2021-12-08 22:36:50
    损失由两部分组成,分别是类别误差损失以及定位误差损失。 1、分类损失 采用一个二分类的softmax loss用来做分类,分类损失如下: ...其中x、y、w、h分别为目标的中心点及宽高,ti为真值、ui为对...
  • RVEA:参考向量引导多目标优化进化算法 参考文献 《A Reference Vector Guided Evolutionary Algorithm for Many-Objective Optimization》 要点 本文提出了一种参考向量引导多目标优化进化算法。参考向量不仅...
  • 目标检测中目标框回归损失函数(IoU, GIoU, DIoU, CIoU)总结 1. Smooth L1 Loss 这个是 Faster-RCNN 中的损失函数。具体可以参考深度学习目标检测之 R-CNN 系列:Faster R-CNN 网络详解 中相应介绍。 Smooth L1 ...
  • 为了消除数据特征之间的量纲影响,我们需要对特征进行归一化处理,使得不同指标之间具有可比性。例如,分析一个人的身高和体重对健康的影响, 如果使用米( m )和千克( kg ) 作为单位, 那么身高特征会在1.6 1.8m,...
  • 关注并星标从此不迷路计算机视觉研究院公众号ID|ComputerVisionGzq学习群|扫码在主页获取加入方式计算机视觉研究院专栏作者:Edison_G为了解决目标检测任务中小目标检测精...
  • 多目标进化优化-BiGE

    2021-11-16 20:52:00
    1. 基本思想 BiGE算法是将众目标问题转换为2目标问题的一个算法。然后再在二维空间中使用某种非支配排序算法进行选择 其中,转化为的2个目标分别是收敛性和多样...归一化后,个体的近似距离为每个维度的目标值的和 3
  • 协方差偏移的影响: 训练深度网络的时候,神经网络隐藏层参数更新会导致网络输出层输出数据的分布发生变化,如果不做归一化,那么每层网络输入的数据分布都是不同的。随着层数的增加,根据链式法则,这种偏移现象会...
  • 深度学习知识点整理 —— batch normalization (批归一化) 与 l2正则化 batch normalization 1. 为什么要有batch normalization? 为什么要做归一化,正常深度学习的学习过程,就是通过学习训练数据的分布,来对...
  • L2正则 tensorflow实现 示例1: from tensorflow.python.keras.regularizers import l2 self.kernels = [self.add_weight(name='kernel' + str(i), shape=(hidden_units[i], hidden_units[i + 1]), initial
  • 机器学习 - 归一化

    2021-02-17 13:55:11
    这篇文章来探讨一下,为什么一些机器学习模型需要对数据进行归一化? 维基百科给出的解释: 1)归一化后加快了梯度下降求最优解的速度; 2)归一化有可能提高精度。 下面简单扩展解释下这两点。 1. 归一化为什么能...
  • 平面分离法求解带有偏好的动态多目标优化问题 I.介绍 动态目标进化算法 DMOP:决策问题的目标函数不仅与决策变量有关,并且还会随着时间(环境)的变化而变化。因此该决策问题的最优解可能也会随时间(环境)的变化...
  • 向量归一化即将向量的方向保持不变,大小归一化到1。向量的归一化向量为: 引用 【1】...
  • 点击上方“CVer”,选择加"星标"置顶重磅干货,第一时间送达本文转载自:机器之心深度学习,已经不需要归一化了。我们知道,在传递给机器学习模型的数据中,我们需要对数据进行归...
  • 目标检测之损失函数

    2021-04-19 09:53:27
    目标检测任务的损失函数一般由Classificition Loss(分类损失函数)和Bounding Box Regeression Loss(回归损失函数)两部分构成。 Bounding Box Regeression的Loss近些年的发展过程是:Smooth L1 Loss-> IoU ...
  • 损失函数是指用于计算标签值和预测值之间差异的函数,对于不同的任务,使用的损失函数也不相同,在目标检测等领域,损失函数往往需要自己定义。 1、L1 Loss L1Loss 计算的是预测值和真实值之间绝对误差的平均数。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,796
精华内容 12,318
关键字:

多目标优化函数归一化