All Projects → lawlite19 → Deeplearning_python

lawlite19 / Deeplearning_python

Licence: mit
Deep Learning--深度学习

Projects that are alternatives of or similar to Deeplearning python

Yolo V2 Pytorch
YOLO for object detection tasks
Stars: ✭ 302 (+145.53%)
Mutual labels:  cnn, deeplearning
Servenet
Service Classification based on Service Description
Stars: ✭ 21 (-82.93%)
Mutual labels:  cnn, deeplearning
Liteflownet
LiteFlowNet: A Lightweight Convolutional Neural Network for Optical Flow Estimation, CVPR 2018 (Spotlight paper, 6.6%)
Stars: ✭ 474 (+285.37%)
Mutual labels:  cnn, deeplearning
Gordon cnn
A small convolution neural network deep learning framework implemented in c++.
Stars: ✭ 241 (+95.93%)
Mutual labels:  cnn, deeplearning
Tools To Design Or Visualize Architecture Of Neural Network
Tools to Design or Visualize Architecture of Neural Network
Stars: ✭ 1,143 (+829.27%)
Mutual labels:  cnn, deeplearning
WSCNNTDSaliency
[BMVC17] Weakly Supervised Saliency Detection with A Category-Driven Map Generator
Stars: ✭ 19 (-84.55%)
Mutual labels:  cnn, deeplearning
Quickdraw
Implementation of Quickdraw - an online game developed by Google
Stars: ✭ 805 (+554.47%)
Mutual labels:  cnn, deeplearning
Deeplearning Notes
Notes for Deep Learning Specialization Courses led by Andrew Ng.
Stars: ✭ 126 (+2.44%)
Mutual labels:  cnn, deeplearning
Jacinto Ai Devkit
Training & Quantization of embedded friendly Deep Learning / Machine Learning / Computer Vision models
Stars: ✭ 49 (-60.16%)
Mutual labels:  cnn, deeplearning
Keras basic
keras를 이용한 딥러닝 기초 학습
Stars: ✭ 39 (-68.29%)
Mutual labels:  cnn, deeplearning
Hierarchical Attention Networks Pytorch
Hierarchical Attention Networks for document classification
Stars: ✭ 239 (+94.31%)
Mutual labels:  cnn, deeplearning
Tf Mobilenet V2
Mobilenet V2(Inverted Residual) Implementation & Trained Weights Using Tensorflow
Stars: ✭ 85 (-30.89%)
Mutual labels:  cnn, deeplearning
Liteflownet2
A Lightweight Optical Flow CNN - Revisiting Data Fidelity and Regularization, TPAMI 2020
Stars: ✭ 195 (+58.54%)
Mutual labels:  cnn, deeplearning
In Prestissimo
A very fast neural network computing framework optimized for mobile platforms.QQ group: 676883532 【验证信息输:绝影】
Stars: ✭ 268 (+117.89%)
Mutual labels:  cnn, deeplearning
Bilinear Cnn Tensorflow
This is an implementation of Bilinear CNN for fine grained visual recognition using TensorFlow.
Stars: ✭ 187 (+52.03%)
Mutual labels:  cnn, deeplearning
Deeplearning
深度学习入门教程, 优秀文章, Deep Learning Tutorial
Stars: ✭ 6,783 (+5414.63%)
Mutual labels:  cnn, deeplearning
Twitter Sentiment Analysis
Sentiment analysis on tweets using Naive Bayes, SVM, CNN, LSTM, etc.
Stars: ✭ 978 (+695.12%)
Mutual labels:  cnn, deeplearning
Cnn Paper2
🎨 🎨 深度学习 卷积神经网络教程 :图像识别,目标检测,语义分割,实例分割,人脸识别,神经风格转换,GAN等🎨🎨 https://dataxujing.github.io/CNN-paper2/
Stars: ✭ 77 (-37.4%)
Mutual labels:  cnn, deeplearning
Wb color augmenter
WB color augmenter improves the accuracy of image classification and image semantic segmentation methods by emulating different WB effects (ICCV 2019) [Python & Matlab].
Stars: ✭ 89 (-27.64%)
Mutual labels:  cnn, deeplearning
Aspect Extraction
Aspect extraction from product reviews - window-CNN+maxpool+CRF, BiLSTM+CRF, MLP+CRF
Stars: ✭ 117 (-4.88%)
Mutual labels:  cnn

深度学习 Deep Learning

一、CNN卷积神经网络

1、概述

  • 典型的深度学习模型就是很深层的神经网络,包含多个隐含层,多隐层的神经网络很难直接使用BP算法进行直接训练,因为反向传播误差时往往会发散,很难收敛
  • CNN节省训练开销的方式是权共享weight sharing,让一组神经元使用相同的权值
  • 主要用于图像识别领域

2、卷积(Convolution)特征提取

  • 卷积核(Convolution Kernel),也叫过滤器filter,由对应的权值W和偏置b体现

  • 下图是3x3的卷积核在5x5的图像上做卷积的过程,就是矩阵做点乘之后的和 enter description here
    i个隐含单元的输入就是:$${W_{\rm{i}}}{x_{small}} + {b_i}$$,其中$${x_{small}}$$就时与过滤器filter过滤到的图片

  • 另外上图的步长stride1,就是每个filter每次移动的距离

  • 卷积特征提取的原理

  • 卷积特征提取利用了自然图像的统计平稳性,这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。

  • 当有多个filter时,我们就可以学到多个特征,例如:轮廓、颜色等

  • 多个过滤器filter(卷积核)

  • 例子如下 enter description here

  • 一张图片有RGB三个颜色通道,则对应的filter过滤器也是三维的,图像经过每个filter做卷积运算后都会得到对应提取特征的图像,途中两个filter:W0和W1,输出的就是两个图像

  • 这里的步长stride2(一般就取2,3)

  • 在原图上添加zero-padding,它是超参数,主要用于控制输出的大小

  • 同样也是做卷积操作,以下图的一步卷积操作为例:
    与w0[:,:,0]卷积:0x(-1)+0x0+0x1+0x1+0x0+1x(-1)+1x0+1x(-1)+2x0=-2
    与w0[:,:,1]卷积:2x1+1x(-1)+1x1=2
    与w0[:,:,2]卷积:1x(-1)+1x(-1)=-2
    最终结果:-2+2+(-2)+1=-1 (1为偏置) enter description here

3、池化(Pooling)

  • 也叫做下采样
  • Pooling过程
  • 把提取之后的特征看做一个矩阵,并在这个矩阵上划分出几个不重合的区域,
  • 然后在每个区域上计算该区域内特征的均值最大值,然后用这些均值或最大值参与后续的训练 enter description here -下图是使用最大Pooling的方法之后的结果 enter description here
  • Pooling的好处
  • 很明显就是减少参数
  • Pooling就有平移不变性((translation invariant) 如图feature map12x12大小的图片,Pooling区域为6x6,所以池化后得到的feature map2x2,假设白色像素值为1,灰色像素值为0,若采用max pooling之后,左上角窗口值为1 enter description here
    将图像右移一个像素,左上角窗口值仍然为1
    enter description here
    将图像缩放之后,左上角窗口值仍然为1
    enter description here
  • Pooling的方法中average方法对背景保留更好,max对纹理提取更好
  • 深度学习可以进行多次卷积、池化操作

4、激活层

  • 在每次卷积操作之后一般都会经过一个非线性层,也是激活层
  • 现在一般选择是ReLu,层次越深,相对于其他的函数效果较好,还有Sigmod,tanh函数等 enter description here
  • sigmodtanh都存在饱和的问题,如上图所示,当x轴上的值较大时,对应的梯度几乎为0,若是利用BP反向传播算法, 可能造成梯度消失的情况,也就学不到东西了

5、全连接层 Fully connected layer

  • 将多次卷积和池化后的图像展开进行全连接,如下图所示。 enter description here
  • 接下来就可以通过BP反向传播进行训练了
  • 所以总结起来,结构可以是这样的 enter description here

6、CNN是如何工作的

  • 看到知乎上的一个回答还不错:https://www.zhihu.com/question/52668301
  • 每个过滤器可以被看成是特征标识符( feature identifiers)
  • 如下图一个曲线检测器对应的值
    enter description here
  • 我们有一张图片,当过滤器移动到左上角时,进行卷积运算
    enter description here
  • 当与我们的过滤器的形状很相似时,得到的值会很大 enter description here
  • 若是滑动到其他的部分,可以看出很不一样,对应的值就会很小,然后进行激活层的映射。
    enter description here
  • 过滤器filter的值怎么求到,就是我们通过BP训练得到的。

7、CNN的Tensorflow实现


8、CNN公式推导

(1)说明

(2)符号说明

  • l..................当前层
  • $${{M_j}}$$..................输入maps的集合
  • up()..................上采样函数
  • ㅇ....................表示对应每个元素相乘
  • β....................下采样对应的“权重”(定义为常量)
  • $${p_i^{l - 1}}$$...................$${{\rm{x}}_i^{l - 1}}$$中在卷积运算中逐个与$${k_{ij}^l}$$相乘的patch
  • down()..................下采样函数

(3)卷积层

  • 1)卷积层计算公式

  • $${\rm{x}}j^l = f(\sum\limits{i \in {M_j}} {{\rm{x}}i^{l - 1}*k{ij}^l + b_j^l} )$$

  • $${\rm{x}}_j^l$$ 表示第l层的第jfeature map特征图

  • 可以对照到上面多个卷积核的例子看

  • j相当于是第几个卷积核

  • i相当于对应卷积核或是map的维度

  • 2)卷积层梯度计算

  • paper中叫做使用BP计算当前层layer单元的灵敏度(sensitivity)

  • 也就是误差的计算,之前我在BP神经网络中推导过,这里不再给出

  • 当前层的第j个unit的灵敏度$$\delta _{\rm{j}}^l$$结果就是:先对下一层的节点(连接到当前层l的感兴趣节点的第l+1层的节点)的灵敏度求和(得到$$\delta _{\rm{j}}^{l + 1}$$),然后乘以这些连接对应的权值(连接第l层感兴趣节点和第l+1层节点的权值)W。再乘以当前层l的该神经元节点的输入u的激活函数f的导数值

  • $$\delta _{\rm{j}}^l = \beta _j^{l + 1}({f^'}(u_j^l) \circ up(\delta _{\rm{j}}^{l + 1}))$$

  • 下采样的“weights”可以定义为常量β(可以查看下面Pooling层输出的表示)

  • up表示上采样操作,因为我们之前假设每个卷积层之后跟着一个Pooling层,所以反向传播需要进行上采样

  • up上采样可以使用克罗内克积(Kronecker)实现,如果A是一个 m x n 的矩阵,而B是一个 p x q 的矩阵,克罗内克积则是一个 mp x nq 的矩阵,$$up({\rm{x}}) = {\rm{x}} \otimes {1_{n \times n}}$$ enter description here

  • 所以偏置梯度为:$${{\partial E} \over {\partial {b_j}}} = \sum\limits_{u,v} {{{(\delta {\rm{j}}^l)}{uv}}} $$ (因为神经网络中对b的梯度为:($${{\partial E} \over {\partial b}} = {{\partial E} \over {\partial u}}{{\partial u} \over {\partial b}} = \delta $$(δ就是误差,根据定义的代价函数E得来的),其中u为layer的输入:$${u^l} = {W^l}{{\rm{x}}^{l - 1}} + {b^l}$$

  • 所以卷积核权值的梯度为:$${{\partial E} \over {\partial k_{ij}^l}} = \sum\limits_{u,v} {{{(\delta {\rm{j}}^l)}{uv}}(p_i^{l - 1})uv} $$ (其中:$${p_i^{l - 1}}$$$${{\rm{x}}_i^{l - 1}}$$中在卷积运算中逐个与$${k_{ij}^l}$$相乘的patch,因为权重的系数就是对应的patch,对权重求导,就是这个系数)

(4)子采样层(Sub-sampling Layers)

  • 1)子采样层计算公式

  • $${\rm{x}}_j^l = f(\beta j^ldown({\rm{x}}{\rm{j}}^{l - 1}) + b_j^l)$$

  • 乘以一个常数权重β,再加上偏置,然后再调用激活函数(这里和上面的pooling的操作有所不同,但总的来数还是下采样的过程)

  • 2)梯度计算

  • 敏感度公式:$$\delta _{\rm{j}}^l = {f^'}(u_j^l) \circ conv2(\delta _{\rm{j}}^{l + 1},rot180(k_j^{l + 1}),'full')$$

  • 和上面的其实类似,就是换成下一层对应的权重k,rot180()是旋转180度,因为卷积的时候是将卷积核旋转180度之后然后在点乘求和的

  • 对偏置b的梯度与上面的一样

  • 对于乘法偏置(文中叫 multiplicative bias)β的梯度为:$${{\partial E} \over {\partial {\beta j}}} = \sum\limits{u,v} {{{(\delta {\rm{j}}^l \circ d_j^l)}{uv}}} $$,其中$$d_j^l = down({\rm{x}}_j^{l - 1})$$

二、权重初始化问题1_Sigmoid\tanh\Softsign激励函数

1、说明

2、实验

  • 论文先是指出了Sigmoid激励函数是不适合作为深度学习的激励函数的,因为它的均值总是大于0的,导致后面隐含层hidden layer的神经元趋于饱和
    enter description here
  • 构建了含有4个隐层的神经网络,激活函数为Sigmoid,观察每一层的激活值的均值和标准差的岁训练次数的变化情况,layer1表示第一个隐含层,一次类推。
  • 初始化权重$${W_{ij}} \sim U[ - {1 \over {\sqrt n }},{1 \over {\sqrt n }}]$$,即服从均匀分布
  • 如下图所示,实线表示均值mean value垂直的条表示标准差。
  • 因为使用的均匀分布进行的初始化,所以前几层x的均值近似为0,所以对应Sigmoid函数的值就是0.5
  • 但是最后一层layer4的输出很快就饱和了(激活值趋于0),训练到大100的时候才慢慢恢复正常
  • 作者给出当有5个隐含层的时候,最后一层始终处于饱和状态
  • 标准差反应的是数值的波动,可以看出后面才有了标准差的值
    enter description here
  • 直观解释
  • 最后使用的是softmax(b+Wh)作为预测,刚开始训练的时候不能够很好的预测y的值,因此误差梯度会迫使Wh趋于0,所以会使h的值趋于0
  • h就是上一层的激活输出,所以对应的激活值很快降为0
  • tanh激活函数是关于原点对称的,趋于0是没有问题的,因为梯度能够反向传回去。
    enter description here

3、初试化方法公式推导

  • 首先代价函数使用的是交叉熵代价函数,相比对于二次代价函数会更好,看下对比就知道了,二次代价函数较为平坦,所以使用梯度下降会比较慢。(图中W1表示第一层的权重,W2表示第二层的权重)
    enter description here
  • tanh激活函数为例
  • 符号说明
  • $${z^i}$$………………………………第i层的激活值向量
  • $${{\rm{s}}^i}$$………………………………第i+1层的输入
  • x…………………………………输入
  • $${{\rm{n}}_i}$$………………………………..第i层神经元个数
  • W………………………………权重
  • Cost………………………………代价函数
  • 所以第i+1层的输入:
    $${{\rm{s}}^i} = {z^i}{W^i} + {b^i}$$
  • 激活之后的值表示:
    $${z^{i + 1}} = f({s^i})$$
  • 根据BP反向传播可以得到:
    $${{\partial Cost} \over {\partial s_k^i}} = {f^'}(s_k^i)W_{k, \bullet }^{i + 1}{{\partial Cost} \over {\partial {s^{i + 1}}}}$$
  • 权重的偏导(梯度)就为:
    $${{\partial Cost} \over {\partial w_{l,k}^i}} = z_l^i{{\partial Cost} \over {\partial s_k^i}}$$
  • 还是BP反向传播的推导,可以查看我之前给的BP反向传播的推导。
  • 它这里W是从0开始的,所以对应可能不太一致。
  • tanh的导数为:
    $${[\tanh (x)]^'} = 1 - {[\tanh (x)]^2}$$
  • 所以:$${f^'}(0) = 1$$
  • $$s_k^i$$的很小时,可以得到:$${f^'}(s_k^i) \approx 1$$
  • 这里实际上他是假设激励函数是线性的,下一篇论文中也有提到。
  • 根据方差公式:
    $$Var(x) = E({x^2}) - {E^2}(x)$$ 可以得到
    $$Var[{z^i}] = Var[x]\prod\limits_{j = 0}^{i - 1} {{n_j}Var[{W^j}]} $$
    推导如下:
  • $$Var(s) = Var(\sum\limits_i^n {{w_i}{x_i}} ) = \sum\limits_i^n {Var({w_i}{x_i})} $$
  • enter description here(式子太长,直接截图的,没用LaTex解析)
  • 因为输入的均值为0,可以得到:$$E(w) = E(x) = 0$$
  • 所以:$$Var(wx) = Var(w)Var(x)$$,代入上面即可。
  • 因为之前$${f^'}(s_k^i) \approx 1$$,所以可以得到
    $$V{\rm{ar}}[{{\partial Cost} \over {\partial {s^i}}}] = Var[{{\partial Cost} \over {\partial {s^n}}}]\prod\limits_{j = i}^n {{n_{j + 1}}Var[{W^j}]} $$
  • ❸❹代入到对权重w偏导(即为梯度)的方差为:$$Var[{{\partial Cost} \over {\partial {w^i}}}] = \prod\limits_{j = 0}^{i - 1} {{n_j}Var[{W^j}]} \prod\limits_{j = i}^{n - 1} {{n_{j + 1}}Var[{W^j}]}  * Var[x]Var[{{\partial Cost} \over {\partial {s^n}}}]$$
  • 对于正向传播,我们希望: $$\forall (i,j),Var[{z^i}] = Var[{z^j}]$$
  • 对于反向传播,同样希望:$$\forall (i,j),Var[{{\partial Cost} \over {\partial {s^i}}}] = Var[{{\partial Cost} \over {\partial {s^j}}}]$$
  • 两种情况可以转化为:
    $${n_i}Var[{w^{\rm{i}}}] = 1$$$${n_{i + 1}}Var[{w^{\rm{i}}}] = 1$$
    (比如第一种:
    $$V{\rm{ar}}({z^i}) = Var(x)$$ ,所以 $${n_i}Var[{w^{\rm{i}}}] = 1$$,第二种情况同理)
  • ❺❻两式相加得:
    $$Var[{W^i}] = {2 \over {{n_i} + {n_{i + 1}}}}$$
  • 最后提出了一个归一化的初始化方法,因为W服从均匀分布U[-c,c],根据均匀分布的方差公式得:
    $${{{{[c - ( - c)]}^2}} \over {12}} = {{{c^2}} \over 3}$$
  • 所以:$${2 \over {{n_i} + {n_{i + 1}}}} = {{{c^2}} \over 3}$$
  • 求出,$$c = {{\sqrt 6 } \over {\sqrt {{n_i} + {n_{i + 1}}} }}$$
  • 所以◆◆最终给出初始化权重的方法为:
    $$W \sim U[ - {{\sqrt 6 } \over {\sqrt {{n_i} + {n_{i + 1}}} }},{{\sqrt 6 } \over {\sqrt {{n_i} + {n_{i + 1}}} }}]$$
  • 这就是Xavier初始化方法

三、权重初始化问题2_ReLu激励函数

1、说明

2、ReLu/PReLu激励函数

  • 目前ReLu激活函数使用比较多,而上面一篇论文没有讨论,如果还是使用同样初始化权重的方法(Xavier初始化)会有问题
  • PReLu函数定义如下:
  • enter description here
  • 等价于:$$f({y_i}) = \max (0,{y_i}) + {a_i}\min (0,{y_i})$$
  • ReLu(左)和PReLu(右)激活函数图像
    enter description here

3、前向传播推导

  • 符号说明
  • ε……………………………………目标函数
  • μ……………………………………动量
  • α……………………………………学习率
  • f()………………………………激励函数
  • l……………………………………当前层
  • L……………………………………神经网络总层数
  • k……………………………………过滤器filter的大小
  • c……………………………………输入通道个数
  • x……………………………………k^2c*1的向量
  • d……………………………………过滤器filter的个数
  • b……………………………………偏置向量
  • $${y_l} = {W_l}{{\rm{x}}_l} + {b_l}$$..............................................................(1)
  • $${{\rm{x}}l} = f({y{l - 1}})$$
  • $${{\rm{c}}l} = {d{l - 1}}$$
  • 根据式(1)得:
    $$Var[{y_l}] = {n_l}Var[{w_l}{x_l}]$$..................................................(2)
  • 因为初始化权重w均值为0,所以期望$$E({w_l}) = 0$$方差$$Var[{w_l}] = E(w_l^2) - {E^2}({w_l}) = E(w_l^2)$$
  • 根据式(2)继续推导:
    enter description here............................................(3)
  • 对于x来说:$$Var[{x_l}] \ne E[x_l^2]$$,除非x的均值也是0,
  • 对于ReLu函数来说:$${x_l} = \max (0,{y_{l - 1}})$$,所以不可能均值为0
  • w满足对称区间的分布,并且偏置$${b_{l - 1}} = 0$$,所以$${y_{l - 1}}$$也满足对称区间的分布,所以:
    enter description here..........................................(4)
  • 将上式(4)代入(3)中得:
    $$Var[{y_l}] = {1 \over 2}{n_l}Var[{w_l}]Var[{y_{l - 1}}]$$.......................................................(5)
  • 所以对于L层:
    $$Var[{y_L}] = Var[{y_1}]\prod\limits_{l = 2}^L {{1 \over 2}{n_l}Var[{w_l}]} $$.....................................................................(6)
  • 从上式可以看出,因为累乘的存在,若是$${1 \over 2}{n_l}Var[{w_l}] < 1$$,每次累乘都会使方差缩小,若是大于1,每次会使方差当大。
  • 所以我们希望:
    $${1 \over 2}{n_l}Var[{w_l}] = 1$$
  • 所以初始化方法为:是w满足均值为0标准差$$\sqrt {{2 \over {{n_l}}}} $$高斯分布,同时偏置初始化为0

4、反向传播推导

  • $$\Delta {{\rm{x}}_l} = \widehat {{W_l}}\Delta {y_l}$$....................................................(7)

  • 假设$$\widehat {{W_l}}$$$$\Delta {y_l}$$相互独立的

  • $$\widehat {{W_l}}$$初始化Wie对称区间的分布时,可以得到:$$\Delta {{\rm{x}}_l}$$均值为0

  • △x,△y都表示梯度,即:
    $$\Delta {\rm{x}} = {{\partial \varepsilon } \over {\partial {\rm{x}}}}$$$$\Delta y = {{\partial \varepsilon } \over {\partial y}}$$

  • 根据反向传播
    $$\Delta {y_l} = {f^'}({y_l})\Delta {x_{l + 1}}$$

  • 对于ReLu函数,f的导数01,且概率是相等的,假设$${f^'}({y_l})$$$$\Delta {x_{l + 1}}$$是相互独立的,

  • 所以:$$E[\Delta {y_l}] = E[\Delta {x_{l + 1}}]/2 = 0$$

  • 所以:$$E[{(\Delta {y_l})^2}] = Var[\Delta {y_l}] = {1 \over 2}Var[\Delta {x_{l + 1}}]$$...................................................(8)

  • 根据(7)可以得到:
    enter description here

  • L层展开得:
    $$Var[\Delta {x_2}] = Var[\Delta {x_{L + 1}}]\prod\limits_{l = 2}^L {{1 \over 2}\widehat {{n_l}}Var[{w_l}]} $$...........................................................(9)

  • 同样令:$${1 \over 2}\widehat {{n_l}}Var[{w_l}] = 1$$

  • 注意这里:$$\widehat {{n_l}} = k_l^2{d_l}$$,而$${n_l} = k_l^2{c_l} = k_l^2{d_{l - 1}}$$

  • 所以$${{\rm{w}}_l}$$应满足均值为0标准差为:$$\sqrt {{2 \over {\widehat {{n_l}}}}} $$的分布

5、正向和反向传播讨论、实验和PReLu函数

  • 对于正向和反向两种初始化权重的方式都是可以的,论文中的模型都能够收敛

  • 比如利用反向传播得到的初始化得到:$$\prod\limits_{l = 2}^L {{1 \over 2}\widehat {{n_l}}Var[{w_l}]}  = 1$$

  • 对应到正向传播中得到:
    enter description here

  • 所以也不是逐渐缩小的

  • 实验给出了与第一篇论文的比较,如下图所示,当神经网络有30层时,Xavier初始化权重的方法(第一篇论文中的方法)已经不能收敛。
    enter description here

  • 对于PReLu激励函数可以得到:$${1 \over 2}(1 + {a^2}){n_l}Var[{w_l}] = 1$$

  • a=0时就是对应的ReLu激励函数

  • a=1是就是对应线性函数


四、Batch Normalization(BN)批标准化

1、说明

2、论文概述

  • 2015年Google提出的Batch Normalization
  • 训练深层的神经网络很复杂,因为训练时每一层输入的分布在变化,导致训练过程中的饱和,称这种现象为:internal covariate shift
  • 需要降低学习率Learning Rate和注意参数的初始化
  • 论文中提出的方法是对于每一个小的训练batch都进行标准化(正态化)
  • 允许使用较大的学习率
  • 不必太关心初始化的问题
  • 同时一些例子中不需要使用Dropout方法避免过拟合
  • 此方法在ImageNet classification比赛中获得4.82% top-5的测试错误率

3、BN思路

  • 如果输入数据是白化的(whitened),网络会更快的收敛

  • 白化目的是降低数据的冗余性和特征的相关性,例如通过线性变换使数据为0均值单位方差

  • 并非直接标准化每一层那么简单,如果不考虑归一化的影响,可能会降低梯度下降的影响

  • 标准化与某个样本和所有样本都有关系

  • 解决上面的问题,我们希望对于任何参数值,都要满足想要的分布;

  • $$\widehat x{\rm{ = }}N{\rm{orm}}({\rm{x}},\chi )$$

  • 对于反向传播,需要计算:$${{\partial N{\rm{orm}}({\rm{x}},\chi )} \over {\partial {\rm{x}}}}$$$${{\partial N{\rm{orm}}({\rm{x}},\chi )} \over {\partial \chi }}$$

  • 这样做的计算代价是非常大的,因为需要计算x的协方差矩阵

  • 然后白化操作:$${{{\rm{x}} - E[{\rm{x}}]} \over {\sqrt {Cov[{\rm{x}}]} }}$$

  • 上面两种都不行或是不好,进而得到了BN的方法

  • 既然白化每一层输入代价非常大,我们可以进行简化

  • 简化1

  • 标准化特征的每一个维度而不是去标准化所有的特征,这样就不用求协方差矩阵

  • 例如d维的输入:$${\rm{x}} = ({x^{(1)}},{x^{(2)}}, \cdots ,{x^{(d)}})$$

  • 标准化操作:
    $${\widehat x^{(k)}} = {{{x^{(k)}} - E[{x^{(k)}}]} \over {\sqrt {Var[{{\rm{x}}^{(k)}}]} }}$$

  • 需要注意的是标准化操作可能会降低数据的表达能力,例如我们之前提到的Sigmoid函数
    enter description here

  • 标准化之后均值为0方差为1,数据就会落在近似线性的函数区域内,这样激活函数的意义就不明显

  • 所以对于每个 ,对应一对参数$${\gamma ^{(k)}},{\beta ^{(k)}}$$ ,然后令:$${y^{(k)}} = {\gamma ^{(k)}}{\widehat x^{(k)}} + {\beta ^{(k)}}$$

  • 从式子来看就是对标准化的数据进行缩放和平移,不至于使数据落在线性区域内,增加数据的表达能力(式子中如果:$${\gamma ^{(k)}} = \sqrt {Var[{{\rm{x}}^{(k)}}]} $$$${\beta ^{(k)}} = E[{x^{(k)}}]$$ ,就会使恢复到原来的值了)

  • 但是这里还是使用的全部的数据集,但是如果使用随机梯度下降,可以选取一个batch进行训练

  • 简化2

  • 第二种简化就是使用mini-batch进行随机梯度下降

  • 注意这里使用mini-batch也是标准化每一个维度上的特征,而不是所有的特征一起,因为若果mini-batch中的数据量小于特征的维度时,会产生奇异协方差矩阵, 对应的行列式的值为0,非满秩

  • 假设mini-batch 大小为mB

  • $$B = { {x_{1 \ldots m}}} $$,对应的变换操作为:$$B{N_{\gamma ,\beta }}:{x_{1 \ldots m}} \to {y_{1 \ldots m}}$$

  • 作者给出的批标准化的算法如下:
    enter description here

  • 算法中的ε是一个常量,为了保证数值的稳定性

  • 反向传播求梯度:

  • 因为:$${y^{(k)}} = {\gamma ^{(k)}}{\widehat x^{(k)}} + {\beta ^{(k)}}$$

  • 所以:$${{\partial l} \over {\partial {{\widehat x}_i}}} = {{\partial l} \over {\partial {y_i}}}\gamma $$

  • 因为:$${\widehat x_i} = {{{x_i} - {\mu _B}} \over {\sqrt {\sigma _B^2 + \varepsilon } }}$$

  • 所以:$${{\partial l} \over {\partial \sigma B^2}} = {\sum\limits{i = 1}^m {{{\partial l} \over {\partial {{\widehat x}_i}}}({x_i} - {u_B}){{ - 1} \over 2}(\sigma _B^2 + \varepsilon )} ^{ - {3 \over 2}}}$$

  • $${{\partial l} \over {\partial {u_B}}} = \sum\limits_{{\rm{i = 1}}}^m {{{\partial l} \over {\partial {{\widehat x}_i}}}} {{ - 1} \over {\sqrt {\sigma _B^2 + \varepsilon } }}$$

  • 因为:$${\mu B} = {1 \over m}\sum\limits{i = 1}^m {{x_i}} $$$$\sigma B^2 = {1 \over m}\sum\limits{i = 1}^m {({x_i}}  - {\mu _B}{)^2}$$

  • 所以:$${{\partial l} \over {\partial {x_i}}} = {{\partial l} \over {\partial {{\widehat x}_i}}}{1 \over {\sqrt {\sigma _B^2 + \varepsilon } }} + {{\partial l} \over {\partial \sigma _B^2}}{{2({x_i} - {\mu _B})} \over m} + {{\partial l} \over {\partial {u_B}}}{1 \over m}$$

  • 所以:$${{\partial l} \over {\partial \gamma }} = \sum\limits_{i = 1}^m {{{\partial l} \over {\partial {y_i}}}} {\widehat x_i}$$

  • $${{\partial l} \over {\partial \beta }} = \sum\limits_{i = 1}^m {{{\partial l} \over {\partial {y_i}}}} $$

  • 对于BN变换可微分的,随着网络的训练,网络层可以持续学到输入的分布。

4、BN网络的训练和推断

  • 按照BN方法,输入数据x会经过变化得到BN(x),然后可以通过随机梯度下降进行训练,标准化是在mini-batch上所以是非常高效的。
  • 但是对于推断我们希望输出只取决于输入,而对于输入只有一个实例数据,无法得到mini-batch的其他实例,就无法求对应的均值和方差了。
  • 可以通过从所有训练实例中获得的统计量代替mini-batch中m个训练实例获得统计量均值和方差
  • 我们对每个mini-batch做标准化,可以对记住每个mini-batch的B,然后得到全局统计量
  • $$E[x] \leftarrow {E_B}[{\mu _B}]$$
  • $$Var[x] \leftarrow {m \over {m - 1}}{E_B}[\sigma _B^2]$$(这里方差采用的是无偏方差估计)
  • 所以推断采用BN的方式为:
  • $$\eqalign{ & y = \gamma {{x - E(x)} \over {\sqrt {Var[x] + \varepsilon } }} + \beta   \cr & {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt} {\kern 1pt}  = {\gamma  \over {\sqrt {Var[x] + \varepsilon } }}x + (\beta  - {{\gamma E[x]} \over {\sqrt {Var[x] + \varepsilon } }}) \cr} $$
  • 作者给出的完整算法:
    enter description here

5、实验

  • 最后给出的实验可以看出使用BN的方式训练精准度很高而且很稳定enter description here

五、RNN和LSTM_01基础

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].