深度学习基础复习1:CNN系列

CNN原理

1.CNN效果图

使用两个三通道过滤器,从三通道RGB图像中生成两个卷积输出的详细过程:
深度学习基础复习1:CNN系列_第1张图片

对应位置做乘法然后相加:第一列滑动窗格 * 中间第一个filter=右边第一个矩阵
(1)中间是含有两个filter即两个神经元(下边还包括bias等参数),参数数depth=2。可知3*3滑动窗,且Stride=2。
(2)每个神经元之所以各有三个小矩阵,是因为有RGB三个通道同时过滤计算。
(3)输入的数据之所有周边赋予0,是因为Zero-Padding参数填充0值。

CNN的有三个重要的思想架构

  • 局部区域感知
      每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。
  • 权重共享
      每个神经元与局部区域的连接权值参数都是一样的,也就是说它们共享一个过滤器(即卷积核),但是这只能过滤一种特征。如果需要关注多个特征,就设计多个卷积核。
  • 空间上的降采样
      为什么是下采样?利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量同时保留有用信息。
      对于一个 96X96 像素的图像,假设我们已经学习得到了400个定义在8X8输入上的特征,每一个特征和图像卷积都会得到一个 (96 − 8 + 1) × (96 − 8 + 1) = 7921 维的卷积特征,由于有 400 个特征,所以每个样例 (example) 都会得到一个 7921 × 400 = 3,168,400 维的卷积特征向量。学习一个拥有超过 3 百万特征输入的分类器十分不便,并且容易出现过拟合 (over-fitting)。
      为了解决这个问题,我们可以对图像进行池化操作。

2.CNN层

CNN主要由三种不同的层组成,即「卷积层」、「池化层」、「Dropout层」和「全连接层」。
卷积层
  假设一张图像有 5 * 5 个像素,1 代表白,0 代表黑,这幅图像被视为 5 * 5 的单色图像。现在用一个由随机地 0 和 1 组成的 3 * 3 矩阵去和图像中的子区域做乘法,每次迭代移动一个像素,这样该乘法会得到一个新的 3 * 3 的矩阵。下面的动图展示了这个过程。
深度学习基础复习1:CNN系列_第2张图片
  上述的 3 * 3 的矩阵被称作「滤波器」,它的任务是提取图像特征,它使用「优化算法」来决定 3 * 3 矩阵中具体的 0 和 1。我们在神经网络的卷积层中使用好几个这样的滤波器来提取多个特征。3 * 3 矩阵的每一个单个步骤被称作「步幅」(stride)。
  卷积输出大小计算
  (1)输入图片大小:nxn
  (2)卷积核大小:fxf
  (3)步长:s
  (4)Padding大小:p,假设上下补齐一样大
  则卷积输出大小为:[(n+2p-f)/s + 1],向下取整。
池化层
  池化层的输入一般来源于上一个卷积层,主要作用是提供了很强的鲁棒性(例如max-pooling是取一小块区域中的最大值,此时若此区域中的其他值略有变化,或者图像稍有平移,pooling后的结果仍不变),并且减少了参数的数量,防止过拟合现象的发生。池化层一般没有参数,所以反向传播的时候,只需对输入参数求导,不需要进行权值更新。
Dropout层
  随机断开一定百分比的输入神经元链接,以防止过拟合。为了解决这个问题,Dropout层将有意识的随机减少模型参数,让模型变得简单,而越简单的模型越不容易产生过拟合。代码中Dropout()函数只有一个输入参数——指定抛弃比率,范围为0~1之间的浮点数,其实就是百分比。这个参数亦是一个可调参数,我们可以根据训练结果调整它以达到更好的模型成熟度。
Flatten层
  截止到Flatten层之前,在网络中流动的数据还是多维的(对于我们的程序就是2维的),经过多次的卷积、池化、Dropout之后,到了这里就可以进入全连接层做最后的处理了。全连接层要求输入的数据必须是一维的,因此,我们必须把输入数据“压扁”成一维后才能进入全连接层,Flatten层的作用即在于此。该层的作用如此纯粹,因此反映到代码上我们看到它不需要任何输入参数。
全连接层(dense layer)
  全连接层的作用就是用于分类或回归,对于我们来说就是分类。全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的。我们通过Dense()函数定义全连接层。这个函数的一个必填参数就是神经元个数,其实就是指定该层有多少个输出。这个参数可以根据实际训练情况进行调整,没有可参考的调整标准,自调之。

3.每层的神经元数目和参数的个数推导

深度学习基础复习1:CNN系列_第3张图片

  • 输入层:输入层输入一个28x28的图片。
  • 卷积层1:该层使用20个5x5的卷积核分别对输入层图片进行卷积,所以包含20x5x5=500个参数权值参数。卷积后图片边长为(28-5+1)/1 = 24,故产生20个24x24个map,包含20x24x24 = 11520个神经元。
  • 池化(pooling)层1:对上一层每个2x2区域进行降采样,选取每个区域最大值,这一层没有参数。降采样过后每个map的长和宽变为原来的一半。
  • 卷积层2:该层使用50个20x5x5的卷积核分别对上一层的20个map进行卷积(每个卷积核一次同时对20个map进行卷积),所以包含50x20x5x5=25000个参数权值参数。卷积后图片边长为(12-5+1)/1= 8,故产生50个8x8个map,包含50x8x8 = 3200个神经元。
  • 池化层2:和上一个池化层功能类似,将8x8的map降采样为4x4的map。该层无参数。
  • 全连接层1:将上一层的所有神经元进行连接,该层含有500个神经元,故一共有50x4x4x500 = 400000个权值参数。
  • relu层:激活函数层,实现x=max[0,x],该层神经元数目和上一层相同,无权值参数。
  • 全连接层2:该层共有10个神经元,包含500x10=5000个参数。
  • softmax层:实现分类和归一化。

Note:这里是2012年以来获得 ImageNet 竞赛冠军的 CNN 模型:优秀的CNN模型

CNN如何用在NLP上?

从处理图像到处理文本:
  在自然语言处理中,多数任务的输入都不再是图片像素,而是以矩阵表示的句子或者文档。矩阵的每一行对应一个token,一般是一个单词或者字符。也即每行代表一个词向量,通常是像word2vec或GloVe词嵌入(word embedding,低维表示),但这些只能是独热码向量(one-hot vector),10个单词的句子用100维嵌入,那输入矩阵就是10 x 100,这就是我们的“图像”。
  在视觉问题中,卷积核滑过的是图像的一“块”区域,但在自然语言领域里我们一般用卷积核滑过矩阵的一“行”(单词)。然后卷积核的“宽度”就是输入矩阵的宽度,“高度”可能会变,但一般是每次扫过2-5个单词。
  综上所述,一个用于NLP的卷积神经网络看起来大概是这样:
深度学习基础复习1:CNN系列_第4张图片
  CNN的一大优势在于快,非常快,卷积是计算机图形学的核心部分,已经可以通过GPU硬件级实现。与n-grams等方法相比,CNN在表征方面也更加高效。随着词汇量越来越大,计算任何多于3-grams的东西都会非常昂贵。即便是google都没有提供出超过5-grams。卷积滤波器自动学习表征,不需要表示所有词汇,而大于5的卷积核是很平常的事。我觉得第一层的很多卷积核都是捕捉了与n-grams相似的特征,但是以更简洁的形式表达了出来。也可以这样理解,CNN就是一个超级N-Gram,而N-Gram就是考虑局部统计信息的语言模型,CNN相当于在低维向量空间中实现了它。

在什么情况下适合用CNN

分类
  最天然适合于CNN的应该是分类任务,比如情感分析(Sentiment Analysis),垃圾检测(Spam Detection)和主题分类(Topic Categorization)。卷积和池化丢失了词的局部顺序信息,所以单纯用CNN做序列标注比如 PoS Tagging 或 Entity Extraction 就稍微难点儿(但也不是不行,可以把位置特征也加入到输入里)。

Note:
①对于CNN而言,无论input什么内容,只要符合规矩,都可以process,所以可以不使用word2vec。甚至可以使用ASCII码(0,256)来表达每个位置上的字符,然后组成一个大大的matrix。每个字符都可以被表示出来,而且使有意义的。
②分类器的使用也是多种多样的,可以用LSTM或者RNN等接在CNN的那句Flatten语句后,来提高预测结果。

你可能感兴趣的:(CNN原理,NLP)