深度学习之bn(批量标准化)

jimchen1218 jimchen1218     2023-04-27     728

关键词:

     BN作为最近一年来深度学习的重要成果,已经广泛被证明其有效性和重要性。虽然还解释不清其理论原因,但是实践证明好用才是真的好。

一、什么是BN

     机器学习领域有个很重要的假设:独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。BN就是深度神经网络训练过程中使得每层网络的输入保持相同分布。

二、为什么要使用BN

     根据论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》所讲内容,BN主要是解决Internal Convariate Shift问题。那么什么是Internal Convariate Shift呢? 可以这样解释:如果ML系统实例集合<X,Y>中的输入值X的分布老是变,这不符合IID假设,网络模型很难学习到有效的规律。对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariate shift问题只发生在输入层。由此提出了BN:让每个隐层节点的激活输入分布在固定区域。

      图像白化:对输入数据分布变换到0均值,1方差的正态分布。在神经网络的输入层中引入白化操作后收敛会加快,所以,进一步想:如果在神经网络的各层都加入,是不是可以较快的提高收敛速度呢?这就是提出BN的最初想法。

       BN的基本思想:深层神经网络在做非线性变换前的激活输入值(就是y=Wx+B,x是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近。

       对于Sigmoid函数来说,意味着激活输入值Wx+B是大的负值或正值,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因.BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。BN说到底就是这个机制,方法很简单,道理很深刻。

      把激活输入x调整到这个正态分布有什么用?首先我们看下均值为0,方差为1的标准正态分布代表什么含义:

技术图片

图:均值为0方差为1的标准正态分布图

  这意味着在一个标准差范围内,也就是说64%的概率x其值落在[-1,1]的范围内,在两个标准差范围内,也就是说95%的概率x其值落在了[-2,2]的范围内。那么这又意味着什么?我们知道,激活值x=WU+B,U是真正的输入,x是某个神经元的激活值,假设非线性函数是sigmoid,那么看下sigmoid(x)其图形:

技术图片

图: Sigmoid(x)

及sigmoid(x)的导数为:G’=f(x)*(1-f(x)),因为f(x)=sigmoid(x)在0到1之间,所以G’在0到0.25之间,其对应的图如下:

技术图片

图:Sigmoid(x)导数图

  假设没有经过BN调整前x的原先正态分布均值是-6,方差是1,那么意味着95%的值落在了[-8,-4]之间,那么对应的Sigmoid(x)函数的值明显接近于0,这是典型的梯度饱和区,在这个区域里梯度变化很慢,为什么是梯度饱和区?请看下sigmoid(x)如果取值接近0或者接近于1的时候对应导数函数取值,接近于0,意味着梯度变化很小甚至消失。而假设经过BN后,均值是0,方差是1,那么意味着95%的x值落在了[-2,2]区间内,很明显这一段是sigmoid(x)函数接近于线性变换的区域,意味着x的小变化会导致非线性函数值较大的变化,也即是梯度变化较大,对应导数函数图中明显大于0的区域,就是梯度非饱和区。

  从上面几个图应该看出来BN在干什么了吧?其实就是把隐层神经元激活输入x=WU+B从变化不拘一格的正态分布通过BN操作拉回到了均值为0,方差为1的正态分布,即原始正态分布中心左移或者右移到以0为均值,拉伸或者缩减形态形成以1为方差的图形。什么意思?就是说经过BN后,目前大部分Activation的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。

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

     

      

深度学习之序列处理

STL(StandardTemplatelibrary)标准模板库:STL的容器可以分为:顺序容器,有vector,list,deque,string,stack,queue,priorityqueues关联容器,有set,multiset,map,multimap,bitset,hash_set,hash_map,hash_multiset,hash_multimap 序列标注问题:R 查看详情

批量归一化batchnormalization动手学深度学习v2

1.批量归一化BatchNormalization2016年左右出来的2.代码实现对比没有加BN之前的效果,收敛没那么好参考https://www.bilibili.com/video/BV1X44y1r77r?p=1 查看详情

经典bn很nb,精读论文《batchnormalization》

...on:AcceleratingDeepNetworkTrainingbyReducingInternalCovariateShift《批量标准化:通过减少内部协变量的偏移加速深度网络训练》首先看摘要和结论,然后分析核心思想,最后总结表格内容和实验细节。目录一、摘要二、结论三、通... 查看详情

深度学习之bert中文分类学习

深度学习之Bert中文分类学习BERT实验预训练结果分析tfhub_handle_preprocess="https://hub.tensorflow.google.cn/tensorflow/bert_zh_preprocess/3"bert_preprocess_model=hub.KerasLayer(tfhub_handle_preprocess)text_test=['我真是个天才啊! 查看详情

深度学习基础:6.batchnormalization简介/作用(代码片段)

数据标准化由于BatchNormalization包含数据标准化的操作,因此在了解BN前,首先要对数据标准化有个简单认识。数据标准化通常包括两种:0-1标准化和Z-score标准化,深度学习中的标准化往往指代的是后者。0-1标准化0... 查看详情

深度学习之rnn台词生成

深度学习之rnn台词生成写一个台词生成的程序,用pytorch写的。importosdefload_data(path):withopen(path,'r',encoding="utf-8")asf:data=f.read()returndatatext=load_data('./moes_tavern_lines.txt')[81:]train 查看详情

bn层的设置技巧

...ngDeepNetworkTrainingbyReducingInternalCovariateShiftNormalization是数据标准化(归一化,规范化),Batch可以理解为批量,加起来就是批量标准化。先说Batch是怎么确定的。在CNN中,Batch就是训练网络所设定的图片数量batch_size。BN解决的问题是... 查看详情

[转]深度学习之浅见

通常来说,大家认为深度学习的观点是GeoffreyHinton在2006年提出的。这一算法提出之后,得到了迅速的发展。关于深度学习,zouxy09的专栏中有详细的介绍,FreeMind 的博文也很值得一读。本博文是我对深度学习的一点看法,主要... 查看详情

深度学习之超参数调试

...后的感悟,转载请注明出处~  超参数调试  在深度学习中,超参数有很多,比如学习率α、使用momentum或Adam优化算法的参数(β1,β2,ε)、层数layers、不同层隐藏单元数hiddenunits、学习率衰退、mini=batch的大小等。其中... 查看详情

参考《深度学习之pytorch实战计算机视觉》pdf

计算机视觉、自然语言处理和语音识别是目前深度学习领域很热门的三大应用方向。计算机视觉学习,推荐阅读《深度学习之PyTorch实战计算机视觉》。学到人工智能的基础概念及Python编程技能,掌握PyTorch的使用方法,学到深度... 查看详情

深度学习之图像分类(二十六)--convmixer网络详解(代码片段)

深度学习之图像分类(二十六)ConvMixer网络详解目录深度学习之图像分类(二十六)ConvMixer网络详解1.前言2.ASimpleModel:ConvMixer2.1PatchEmbedding2.2ConvMixerLayer2.3ConvMixer网络结构2.4实现代码:3.WeightVisualizations4 查看详情

深度学习deeplearning(05):batchnormalization(bn)批标准化(代码片段)

github地址:https://github.com/lawlite19/DeepLearning_Python四、BatchNormalization(BN)批标准化1、说明参考论文:http://jmlr.org/proceedings/papers/v37/ioffe15.pdf或者查看这里,我放在github上了&#x 查看详情

深度学习之图片压缩算法

近年来,深度学习在计算机视觉领域已经占据主导地位,不论是在图像识别还是超分辨重现上,深度学习已成为图片研究的重要技术;现在深度学习技术已进入图片压缩领域。以图鸭科技最新研发的图片压缩——TinyNetworkGraphics(T... 查看详情

精读ai论文inceptionv2&bn-inception&batchnormalization&bn&批量标准化(代码片段)

文章目录前言摘要(Abstract):引言(Introduction)解决方向(TowardsReducingInternalCovariateShift)解决办法(NormalizationviaMini-BatchStatistics)实验(Experiments)inception系列inceptionV1&GoogleNet精读inceptionV2&BN精读inceptionV3精读inceptionV4精读xception精读前言... 查看详情

深度强化学习之:模仿学习(imitationlearning)

深度强化学习之:模仿学习(imitationlearning)2017.12.10      本文所涉及到的模仿学习,则是从给定的展示中进行学习。机器在这个过程中,也和环境进行交互,但是,并没有显示的得到reward。在某些任务上,也很难定... 查看详情

深度学习bn与神经网络调优(代码片段)

...】BN与神经网络调优1.神经网络调优1.1调参技巧1.2运行2.批标准化(BatchNormalization)2.1批标准化公式2.2过程图2.3为什么批标准化能够是优化过程变得简单2.4BN总结1.神经网络调优我们经常会涉及到参数的调优,也称之为... 查看详情

徐亦达深度学习:概率与深度学习之noisecontrastiveestimation

03:47ptzcamera13504-300:54trackingball8494-201:53perceptual_camera4324-200:33eye_tracking4094-201:16whiteboradtesting2254-200:45posedemo2884-204:05whiteboardsystemdemo2804-200:45multi_person_live_demo 查看详情

深度学习之batch归一化

前言       以下内容是个人学习之后的感悟,转载请注明出处~  Batch归一化  在神经网络中,我们常常会遇到梯度消失的情况,比如下图中的sigmod激活函数,当离零点很远时,梯度基本为0。为... 查看详情