如何理解卷积神经网络?

Posted 人邮异步社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解卷积神经网络?相关的知识,希望对你有一定的参考价值。

卷积神经网络(convolutional neural net,CNN)得名于在数据样本上用滑动窗口(或卷积)的概念。

卷积在数学中应用很广泛,通常与时间序列数据相关。在本章中,可以不用关注其中的高阶概念,只需要知道它是用一个可视化盒子在一个区域内滑动(如图7-2所示)。大家将从图像上的滑动窗口概念入手,然后扩展到文本上的滑动窗口。总体来说,就是在较大的数据块上设置一个滑动窗口,每次滑动时只能看到窗口范围内的数据。

 

 

图7-2 卷积窗口函数

7.3.1 构建块

卷积神经网络最早出现在图像处理和图像识别领域,它能够捕捉每个样本中数据点之间的空间关系,也就能识别出图像中的是猫还是狗在驾驶推土机。

卷积网络(convolutional net),也称为convnet(这个多出来的n很难发音),不像传统的前馈网络那样对每个元素(图像中的每个像素)分配权重,而是定义了一组在图像上移动的过滤器(filter,也称为卷积核、滤波器或者特征检测器)。这就是卷积

在图像识别中,每个数据点的元素可以是黑白图像中的每个像素点,取值是1(on)或0(off)。

也可以是灰度图像中每个像素的强度(如图7-3和图7-4所示),或者彩色图像中每个像素的每个颜色通道的强度。

 

 

图7-3 电线杆图像

 

 

图7-4 电线杆图像的像素值

卷积核会在输入样本中(在这个例子中,就是图像的像素值)进行卷积或滑动。我们先暂停一下,讲讲滑动是什么意思。在窗口“移动”的时候我们不会做任何事情,大家可以把它看作是一系列的快照,数据通过这个窗口的时候,会做一些处理,窗口向下滑动一点,就再做一次处理。

提示
正是这个滑动/快照使卷积神经网络具有高度的并行性。对给定数据样本的每个快照都可以独立于其他数据样本进行计算,后面的快照也不需要等待上一个快照。

我们谈论的这些卷积核有多大呢?卷积核窗口大小的参数由模型构建器选择,并且高度依赖数据内容。不过其中还是有一些共性的。在图像数据中,大家通常会看到窗口大小为3 × 3(3, 3)像素。在本章后面回到NLP上时我们会更详细地讲解窗口大小的选择。

7.3.2 步长

注意,在滑动阶段,移动的距离是一个参数,一般不会超过卷积核宽度,每个快照通常都与相邻快照有重叠的部分。

每个卷积“走”的距离称为步长,通常设置为1。只移动一个像素(或其他小于卷积核宽度的距离)将使进入卷积核的不同输入在一个位置和下一个位置之间出现重叠。如果由于步长太大而使卷积核之间没有重叠,就会失去像素(在NLP中是词条)与相邻像素之间的“模糊”效果。

这种重叠有一些有趣的特性,特别是在查看卷积核如何随时间变化的时候,这些特性非常明显。

7.3.3 卷积核的组成

到目前为止,我们已经描述了数据上的滑动窗口,以及通过这个窗口来观察数据,但还没有介绍如何处理观察到的数据。

卷积核由两部分组成:

  • 一组权重(就像第5章中给神经元分配的权重);
  • 一个激活函数。

如前所述,卷积核通常是3 × 3(也有其他大小和形状)。

提示
卷积核神经元与普通的隐藏层神经元十分相似,但是在扫描输入样本的整个过程中,每个卷积核的权重是固定的,在整个图像中所有卷积核的权重都一样。卷积神经网络中的每个卷积核都是独一无二的,但是在图像快照中每个卷积核的元素都是固定的。

当卷积核在图像上滑动时,每次前进一个步长,得到当前覆盖像素的快照,然后将这些像素的值与卷积核中对应位置的权重相乘。

假设大家用的是3 × 3卷积核,从左上角开始,第一个像素(0, 0)乘以卷积核第一个位置(0, 0)上的权重,第二个像素(0, 1)乘以位置(0, 1)上的权重,以此类推。

然后对像素和权重(对应位置)的乘积求和,并传递到激活函数中(如图 7-5 所示),通常选择ReLU函数(线性修正单元)——我们待会再讨论这个问题。

在图7-5和图7-6中,xi是位置i上的像素值,z0是ReLU激活函数的输出z_0 = max(sum(x * w),0)z0 = max((xi × wj), 0)。该激活函数的输出将被记录在输出图像中的一个位置上。卷积核滑动一个步长,处理下一个快照,并将输出值放在上一个输出值的旁边(如图7-6所示)。

在一个层中有多个这样的卷积核,当它们在整个图像上进行卷积时,会各自创建一个新的“图像”——一个被“过滤”后的图像。假设有n个卷积核,在经过这个处理之后,将得到n个经过过滤的新图像。

我们一会儿再来看看对这n个新图像的处理。

 

 

图7-5 卷积神经网络步骤

 

 

图7-6 卷积

7.3.4 填充

然而,在图像的边缘会发生一些有趣的事情。如果大家从输入图像的左上角开始一个3 × 3的卷积核,每次移动一个像素,当卷积核的最右侧边缘到达输入图像的最右侧边缘时停止,那么输出的“图像”将比原图像窄两个像素。

Keras提供了处理这个问题的工具。第一个策略是忽略输出维度变小的问题。在Keras中,可以设置参数padding = 'valid'。使用这种方法时,需要注意下一层输入的维度。这种策略的缺点是重叠位置上的内部数据点被多次传递到每个卷积核上,原始输入的边缘数据将被欠采样。在比较大的图像上,这可能不是问题,但是如果把这个概念应用到Twitter数据上,例如,在一个10个单词的数据集上进行欠采样,则可能会极大地改变输出结果。

另一个策略称为填充(padding),即向输入数据的外部边缘添加足够多的数据,使边缘上的第一个数据点可以被视为内部数据点进行处理。这种策略的缺点是向输入数据中添加了可能不相关的内容,导致偏离了输出结果。大家不需要专门去寻找生成虚假数据的模式,可以用几种不同的方法进行填充以尽量减少不良影响。具体做法参见代码清单7-1。

代码清单7-1 Keras中一个卷积层的神经网络

>>> from keras.models import Sequential
>>> from keras.layers import Conv1D

>>> model = Sequential()
>>> model.add(Conv1D(filters=16,
                     kernel_size=3,
                     padding='same',   ⇽--- 'same'和'valid'都是可选项
                      activation='relu',
                     strides=1,
                     input_shape=(100, 300)))   ⇽---  input_shape仍然是输入数据修改前的形状,填充会在后台进行

稍后将详细介绍实现细节。需要对这些数据位多加注意,大家使用的工具中已经对这些问题进行了很好的处理。

还有一些策略,例如在预处理过程中通过模拟已存在的边缘数据点来预测要填充位置上的值。不过这种策略危险性较大,NLP应用中一般不会使用。

卷积流水线

现在有n个卷积核和n个新图像,接下来怎么处理呢?和大多数神经网络应用一样,我们从一个已标注的数据集开始,任务目标也类似:预测一个给定新图像的标签。最简单的方法是将每个过滤后的图像串起来并输入到前馈层,然后像第5章那样来处理。

提示
大家可以将这些经过过滤的图像传递到第二个卷积层,它也有一组卷积核。在实践中,这是最常见的架构,稍后我们会再详细介绍。多层卷积网络对抽象层的学习路径一般是:首先是边缘,然后是形状/颜色,最后是含义。

不管大家在网络中添加了多少层(卷积层或其他层),一旦得到一个最终输出,就可以计算出误差并通过网络进行反向传播该误差。

因为激活函数是可微的,所以可以像之前一样反向传播并更新各个卷积核的权重。然后网络会学习到需要什么样的卷积核才能为给定的输入获得正确的输出。

大家可以将此过程视为神经网络在学习检测和提取信息,以便让后面的层能更容易地进行处理。

7.3.5 学习

就像所有神经网络一样,卷积核本身会以初始化为接近零的随机值的权重开始。那么输出的“图像”怎样才不会是噪声呢?在最初的几轮迭代训练中,它确实只是噪声。

但是大家构建的分类器会根据各个输入数据,从期望标签中获得一定的误差值,并通过激活函数将输入数据反向传播给卷积核。对于误差值的反向传播,我们还需要计算误差对输入权重的导数。

当卷积层刚出现时,它用的是上层梯度对输入权重的导数。这个计算和正常的反向传播类似,对于给定训练样本,卷积核权重会在多个位置上输出对应的结果。

梯度对卷积核权重的导数的具体计算超出了本书的范围,不过可以简单介绍一下,对于一个给定卷积核的权重,梯度是前向传播过程中卷积的每个位置上梯度的和。这是一个相当复杂的公式,两个求和及多个叠加式如下:

 

 

公式7-1 卷积核权值的梯度之和

这一概念与常规的前馈网络基本相同,即计算出每个特定权重对系统总体误差的贡献,然后再来决定如何更好地调整权重,使其能够在后面的训练样本上尽量减小误差。

本文摘自《自然语言处理实战 利用Python理解、分析和生成文本》

 

如果我们想要在机器上模仿或模拟人类的思维,那么自然语言处理可能是至关重要的。此外,大家将在本书中学习词的数据结构及嵌套关系中可能隐藏着的有关智能的重要线索。大家将使用这些结构,而神经网络使无生命的系统能够以看起来像人类的方式消化、存储、检索和生成自然语言。

本书是介绍自然语言处理(NLP)和深度学习的实战书。NLP已成为深度学习的核心应用领域,而深度学习是NLP研究和应用中的必要工具。本书分为3部分:第一部分介绍NLP基础,包括分词、TF-IDF向量化以及从词频向量到语义向量的转换;第二部分讲述深度学习,包含神经网络、词向量、卷积神经网络(CNN)、循环神经网络(RNN)、长短期记忆(LSTM)网络、序列到序列建模和注意力机制等基本的深度学习模型和方法;第三部分介绍实战方面的内容,包括信息提取、问答系统、人机对话等真实世界系统的模型构建、性能挑战以及应对方法。

本书面向中高级Python开发人员,兼具基础理论与编程实战,是现代NLP领域从业者的实用参考书。

以上是关于如何理解卷积神经网络?的主要内容,如果未能解决你的问题,请参考以下文章

通俗理解反卷积

用吃饭消化大白话理解 卷积 卷积神经网络 以及 工作原理

如何理解 Graph Convolutional Network(GCN)

卷积神经网络结构——LeNet-5(卷积神经网络入门,Keras代码实现)

卷积神经网络——数字手写体实现及理解

卷积神经网络的初步理解LeNet-5(转)