Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

caibing1872/DeepLearning_Python

Open more actions menu
 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

64 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

深度学习 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基础

  • 由于 github 中不支持 Mathjax 公式,查看请移步我的博客

  • Tensorflow中实现一个例子:查看这里

About

Deep Learning--深度学习

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • HTML 55.3%
  • JavaScript 44.7%
Morty Proxy This is a proxified and sanitized view of the page, visit original site.