GitHub - lqchenCode/DeepLearning_Python at fe31d7e7d40634bbd0f08dd1235e0d93e29cca97 · GitHub
Skip to content

lqchenCode/DeepLearning_Python

Folders and files

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
  • 符号说明
  • $${z^i}$$………………………………第i层的激活值向量
  • $${{\rm{s}}^i}$$………………………………第i+1层的输入
  • x…………………………………输入
  • $${{\rm{n}}_i}$$………………………………..第i层神经元个数
  • W………………………………权重

About

Deep Learning--深度学习

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

Languages

  • HTML 55.3%
  • JavaScript 44.7%