清华大学马少平教授:第一篇 神经网络是如何实现的(四)
点击上方“图灵人工智能”,选择“星标”公众号
您想知道的人工智能干货,第一时间送达
第四节:卷积神经网络
小明对神经网络的学习越来越感兴趣,这天又来找艾博士。
小明:艾博士,上次您说除了全连接神经网络外,还有其他形式的神经网络,我想知道还有哪些形式的神经网络。
艾博士说:好的,今天我们就来讲讲神经网络的另一种形式:卷积神经网络。
首先我们看看全连接神经网络有什么不足。正如其名字一样,全连接神经网络,两个相邻层的神经元都有连接,当神经元个数比较多时,连接权重会非常多,一方面会影响神经网络的训练速度,另一方面,在使用神经网络时也会影响计算速度。实际上,在有些情况下,神经元是可以共享的。
小明,你还记得我们讲过,一个神经元的作用是什么吗?
小明回答说:艾博士,我记得您以数字识别举例时讲过,一个神经元就相当于一个模式。
艾博士说:小明你说的很对。一个神经元可以看作是一个模式,模式体现在权重上,通过运算,可以抽取出相应的模式。神经元的输出可以看作是与指定模式匹配的程度或者概率。
在一个图像的局部是否有某个模式,概率有多大,用一个小粒度的模式,在一个局部范围内匹配就可以了。比如,假设 表示了一个3×3的模式,我们先不管这个模式代表了什么,我们想知道在一个更大的图像中,比如5×5大小的图像上是否具有这种模式,由于图像比模式大,具有多个3×3的区域,每个区域上都可能具有这个模式,这样的话,我们就需要用k在每个区域上做匹配得到一个匹配值,匹配值的大小反应了这个区域与模式的匹配程度。图1.15给出了左上角3×3区域与模式k的匹配结果,图1.16给出的是中间3×3区域与模式k的匹配结果。如果我们先按行、再按列,每次移动一个位置进行匹配,就得到了图1.15、图1.16中的输出结果。
图1.15 左上角区域与模式匹配示意图
图1.15、1.16也可以看成是一个图1.17所示的神经网络,5×5的图像就是输入层,最终得到的3×3的匹配结果就可以看成输出层。
图1.16 中间区域与模式匹配示意图
图1.17 卷积神经网络示意图
艾博士指着图问小明:你看看图1.17的神经网络与我们之前介绍的全连接神经网络有什么不同吗?
小明一边观察一边回答说:两层之间的神经元不是全部有连接的,比如输出层左上角的神经元只与输入层左上角区域的9个神经元有连接,而输出层右下角的神经元只与输入层右下角区域的9个神经元有连接,其他神经元虽然没有画出来,也应该是一样的。
艾博士说:小明你回答的很对,正是这样的。这就是所谓的局部连接。因为我们只是查看一个局部范围内是否有这种模式,所以只需要局部连接就可以了,既减少了连接数量,又达到了局部匹配的目的。这样就减少了连接权重,可以加快计算速度。还有就是,像图1.17所示的,无论是与图像的左上角匹配,还是与右下角匹配,我们都是与同一个模式进行匹配,因此图中红色的连接权重,和绿色的连接权重应该是一样的,这样才可能匹配的是同一个模式。
小明一听到这里,忍不住大喊起来:还真是这样啊,不同区域的权重就应该是一样的。
艾博士接着说:是这样的。在这种情况下,权重一共就9个,再加上神经元的偏置项b,一共也就10个参数。而且与输入层有多少个神经元无关,这就是所谓的权值共享。
艾博士对小明说:小明,计算一下如果是全连接神经网络需要多少个参数?
小明边说边计算起来:输入是5×5共25个输入,输出是3×3共9个神经元,如果是全连接的话,则需要25*9=225个权重参数,再加上每个神经元有一个偏置项b,则总的参数量为225+9=234个。
艾博士:你看,如果是全连接神经网络需要234个参数,而采用这种局部连接、权值共享的神经网络则只需要10个参数,是不是大大地减少了参数量?
小明:还真是这样的。
艾博士进一步解释说:这样的神经网络,称为卷积神经网络,其中的模式k称作卷积核。其特点就是局部连接、权值共享。
小明恍然大悟道:原来这就是卷积神经网络啊,那么卷积核的大小都是3×3吗?
艾博士说:当然不是,可以根据需要设置不同的大小,卷积核越小,所表示的模式粒度就越小。由于卷积核相当于抽取具有某种模式的特征,所以又被称作过滤器。
小明向艾博士提出建议:艾博士,经您的讲解基本了解了卷积神经网络是怎么回事,但是前面的例子还是比较抽象,能举个具体的例子吗?
艾博士回答说:好啊,下面我们就给一个例子。图1.18是“口”字的图像,我们想提取图像中“横”模式的特征,可以使用如图1.19的3×3卷积核对其进行匹配,卷积结果如图1.20(a)所示。
图1.18 “口”字图像
图1.19 反应“横”模式特征的卷积核
图1.20(a)中,绿色部分反应了“口”字上下两个“横”的上边缘信息,除了两端的匹配结果为3外,其余均为4,匹配值都比较大。而黄色部分反应的是“口”字上下两个“横”的下边缘信息,除了两端匹配值为-3外,其余均为-4,匹配值的绝对值也都比较大。“口”字中间部分如图1.18所示的中间蓝色部分是没有笔画的,可以认为是一个没有笔画的“横”,其上边缘反应在图1.20(a)中的粉色部分,匹配值为-3或-4,而下边缘对应图1.20(a)的灰色部分,匹配值为3或者4。对于“口”字的其他与“横”没有关系的部分,匹配值基本为0,少数几个与“横”连接的位置匹配是1或者-1。由此可见,只要是与“横”有关的,匹配值的绝对值都比较大,大多为4,少数位置为3,而与“横”无关的部分,匹配值的绝对值都比较小,大多为0,少数地方为1。
同前面介绍过的数字识别的例子一样,也可以在卷积神经元中加上一个sigmoid函数,表示是不是“横”的概率,对匹配值取了绝对值后再使用sigmoid函数的结果如图1.20(b)所示,从图中可以看出,与“横”有关的位置概率值基本为1,而其他位置基本为0.5,说明结果不确定。所以,图1.19所示的卷积核就起到了提取“横”模式特征的作用。同样的,我们也可以用类似的方法提取“竖”模式特征。
图1.20 “口”字卷积结果
小明看着结果很兴奋地说:这个例子可以很好地体现出卷积神经网络提取局部模式特征的作用。但是如何设计卷积核呢?
艾博士回答说:同全连接神经网络一样,卷积核也就是权重,也是可以通过BP算法训练出来的,不需要人工设计。只是对于卷积神经网络来说,由于有局部连接和权值共享等,需要重新推导具体的BP算法,其算法思想是完全一样的。
听了艾博士的讲解,小明对卷积神经网络有所了解,但还是有一系列的问题想问艾博士,他一一问道:艾博士,那么卷积神经网络只有一个输入层和一个输出层吗?
艾博士:不是的,在一层卷积之后,还可以再添加卷积层,可以有很多层。
小明问艾博士:以图1.15所示的例子为例,输入层有5×5个神经元,经过一个3×3的卷积操作后,下一层就只有3×3个神经元了,这样一层层做下去后面的神经元数是不是就越来越少了?
图1.21 通过填充使得卷积层前后的神经元个数不变
图1.22 有两个卷积核的卷积示意图
艾博士:小明你说的是对的,这样一层层加上卷积层后,每层的神经元确实会越来越少。如果想保持经过一个卷积层后神经元个数不变,可以通过在前一层神经元四周填充0的办法解决。比如图1.15的例子,我们可以在输入层填充一圈0,由原来的5×5变为7×7,这样卷积层的输出就还是保持5×5的大小了,如图1.21所示。究竟需要补充几圈0,与卷积核的大小有关,对于3×3的卷积核需要补充一圈0,而对于5×5的卷积核,则需要补充两圈0,才能使得输出的神经元数与输入保持一致。事实上,在讲图1.19的“口”字的例子时,为了保持输出的神经元个数与输入一致,我们已经进行了填充操作。
小明:对于一个输入,可以做不同的卷积吧?当有多个卷积时,输出是怎样的呢?
艾博士:同一个输入可以有多个不同的卷积,每个卷积得到一个输出,称作通道,有多少个卷积核,就得到多少个通道,不同的通道并列起来作为输出。如图1.22所示,具有两个卷积核,得到两个通道的输出。
图1.23 多通道输入时卷积示意图
图1.24 两通道卷积示意图
小明:如图1.22所示,输出得到两个通道,如果在后面再接一个卷积层,由于输入变成了两个通道,这时卷积如何计算呢?
艾博士:这真是一个好问题,这就涉及到了多通道卷积问题。这时的卷积核可以看成是“立体”的,除了高和宽以外,又多了一个“厚度”,厚度的大小与输入的通道数一样。图1.23给出了一个多通道时卷积示意图。
在图1.23中,输入由三个通道组成,所以卷积核的厚度与通道数一致也为3。这样卷积核的参数共有3×3×3+1=28个。前面的3×3是卷积核的大小,最后一个3对应3个通道。计算时与单通道时一样,也是从左上角开始,按照先行后列的方式,依次从输入中取3×3×3的区域,与卷积核对应位置的权重相乘,再求和,得到一个输出值。值得注意的是,无论有几个输入通道,如果只有一个卷积核,那么输出的通道数也只有一个。如果有多个卷积核,则输出的的通道数就有多个,与卷积核数一致。图1.24给出了一个输入具有两个通道的卷积计算示例。
图1.24中,最左边是输入的两个通道,中间是与两个通道相对应的厚度为2的卷积核,最右边是卷积的结果,由于只有一个卷积核,结果也只有一个通道。同样可以通过多个卷积核得到多个通道的输出。
由于卷积核的厚度总是与输入的通道数是一致的,所以平时说卷积核时,往往会省略其厚度,只说卷积核的高和宽,比如上例中的卷积核为3×3,不用说具体的厚度是多少,默认厚度就是输入的通道数。
小明又问道:卷积核的大小体现了什么特点呢?
艾博士回答说:卷积核越小,关注的“视野”范围也越小,提取的特征粒度也就越小。反之卷积核越大,其视野范围也大,提取的特征粒度也就越大。但是这些都是相对于同样的输入情况下来说的。由于多个卷积层可以串联起来,同样大小的卷积核在不同的层次上,其提取的特征粒度也是不一样的。
小明不解地问道:这是为什么呢?
艾博士解释说:因为不同层的卷积其输入是不同的。以图像处理为例,如果输入是原始图像,则输入都是一个个的像素,卷积核只能在像素级提取特征。如果是下一个卷积层,输入是已经抽取的特征,是在特征级的水平上再次抽取特征,所以这两种情况下,即便卷积核大小是相同的,其抽取的特征粒度也是不同的,越是上层(靠近输出层),提取到的特征粒度越大。下面举一个简单的例子说明这个道理。
图1.25 高层的卷积核具有更大的视野
图1.25给出了一个简单的卷积核大小为3的例子。中间一层神经元(可以认为是一个卷积核)每个只能感受到下面3个输入的信息,最上边的神经元,虽然卷积核也是3,但是通过中间层的3个神经元,可以感受到输入层的5个输入信息,相当于视野被扩大了,提取的特征粒度也就变大了。
小明对照着图想了想回答道:确实是这么一个道理。
一系列的问题得到解答之后,小明又陷入了沉思之中。沉默片刻之后,他问艾博士:卷积核的作用相当于提取具有某种模式的特征,有些特征比较明显,取值就比较大,有些特征不明显,甚至没有这种特征,取值就会比较小。是否可以只把取值大的特征保留下来,突出这些特征呢?
艾博士非常满意小明认真思考的精神,高兴地说道:小明你说的非常正确,我正想讲解这个问题呢。在卷积层之后,可以加入一个被称作“池化”的层进行一次特征的筛选,将明显的特征保留下来,去掉那些不明显的特征。
图1.26 最大池化示意图
图1.26展示的是一个窗口为2×2、步长为2的最大池化示意图。池化窗口先行后列进行移动,每次移动一个步长的位置,在这个例子中就是两个位置,然后取窗口内的最大值作为池化的输出,这就是最大池化方法。窗口和步长的大小是可以设置的,最常用的是窗口为2×2、步长为2池化。经过这种最大池化之后,保留了每个窗口内最大的模式特征,同时使得神经元的的个数减少到原来的四分之一,起到了数据压缩的作用。
除了最大池化方法外,还有平均池化方法,取窗口内的平均值作为输出。最大池化体现的是一个局部区域内的主要特征,平均池化体现的是一个局部区域内特征的平均值。
另外,需要强调的是,池化方法是作用在每个通道上的,池化前后的通道数是一样多的。
小明越学越兴奋,迫不及待地问艾博士:艾博士,您讲解了全连接神经网络和卷积神经网络,能否举一个实际应用的例子呢?
图1.27 数字识别方法示意图
艾博士说:可以的,下面就讲解一个数字识别的实际例子,该例子通过联合应用全连接神经网络和卷积神经网络实现手写数字的识别。如图1.27所示。
这是一个比较早期的用于手写数字识别的神经网络LeNet,输入是32×32的灰度数字图像,第一个卷积层采用6个无填充、步长为1的5×5卷积核,这样就得到了6个通道,每个通道为28×28个输出。然后使用一个2×2的步长为2的最大池化,得到6个14×14的通道。第二个卷积层采用16个无填充、步长为1的5×5卷积核,得到16个通道、每个通道为10×10的输出。再使用一个2×2步长为2的最大池化,进一步压缩为16个通道、每个通道为5×5的输出。接下来连接两个全连接的隐含层,神经元个数分别为120和84,最后一层是10个输出,分别对应10个数字的识别结果。每个卷积核或者神经元均带有激活函数,早期激活函数大多采用sigmoid函数,现在一般在输出层用softmax激活函数,其他地方用ReLU激活函数。
艾博士指着图1.27对小明说:你计算一下,这个数字识别系统共有多少个参数?
小明拿出笔和纸认真地计算了起来:
第一个卷积层是5×5的卷积核,输入是单通道,每个卷积核25个参数,共6个卷积核,所以参数个数为5×5×6=150;第二个卷积层的卷积核还是5×5的,但是通道数为6,所以每个卷积核参数个数为5×5×6个参数,共有16个卷积核,所以参数个数为5×5×6×16=2400;第一个全连接输入是16个5×5的通道,所以共有5×5×16个神经元,这些神经元与其下一层的120个神经元一一相连,所以有5×5×16×120=48000个参数,该120个神经元又与下一层的84个神经元全连接,所以有120×84=10080个参数;这层的84个神经元与输出层的10个神经元全连接,有84×10=840个参数。所以这个神经网络的全部参数个数为上述参数个数之和,即150+2400+48000+10080+840=61470个参数。
艾博士看着小明计算结果,提醒小明说:小明,你再考虑一下,是否漏掉了什么?
小明一一验算刚才的计算结果,认为没有问题:我觉得全部考虑进去了,应该没有漏掉吧?池化层应该没有参数吧。
艾博士提醒说:池化层确实没有参数,我说的不是这个。我们前面讲神经元时,是不是还有一个偏置b?
小明恍然大悟道:我怎么把这个给忘记了?偏置b也应该是一个参数。对于卷积核来说,由于共享参数,所以一个卷积核有一个b,而对于全连接部分来说,每个神经元有一个b。这样的话,第一个卷积层有6个卷积核,所以有6个b,第二个卷积层有16个卷积核,所以有16个b,而后面的全连接层分别有120、84和10个神经元,所以偏置的数量分别是120、84和10。这样算的话,在前面参数的基础上,应该再加上6+16+120+84+10=236个参数,所以全部参数是61470+236=61706个。
艾博士看着小明的计算结果说:这次算对了,这是全部的参数个数。
小明指着图1.27的第一个全连接层,问艾博士:这里16个5×5的通道,怎么跟下一层的120个神经元全连接呢?
艾博士回答说:这个很简单,16个5×5通道共有400个神经元,把它们展开成一长串就可以了。相当于400个神经元与120个神经元全连接。
小明:原来这样啊,确实不难,刚才被16个通道给迷惑了。
艾博士:小明,我们再举一个规模比较大的神经网络VGG-16的例子,如图1.28所示。该神经网络曾经参加ImageNet比赛,以微弱差距获得第二名。ImageNet是一个图像识别的比赛,有1000个类别的输出,该项比赛有力地促进了图像识别研究的发展。
该神经网络非常规整,像一个塔一样,我们从输入到输出分块介绍其组成。
(1)由于处理的是彩色图像,所以输入是由红、绿、蓝三色组成的三个通道,大小为224×224×3,这里的3是指3个通道。
(2)连续2层带填充的3×3卷积层(即边缘补充0),每层都有64个卷积核,输出是64个通道,每个通道为224×224。每个卷积核均附加ReLU激活函数。后面的卷积核均附加了ReLU激活函数,如果没有特殊情况,就不再单独说明了。
(3)2×2步长为2的最大池化,还是64个通道,每个通道被压缩到112×112。
(4)连续2层带填充的3×3卷积层,每层都有128个卷积核,输出是128个通道,每个通道为112×112。
(5)2×2步长为2的最大池化,输出是128个通道,每个通道被压缩到56×56。
(6) 连续3层带填充的3×3卷积层,每层都有256个卷积核,输出是256个通道,每个通道为56×56。
(7)2×2步长为2的最大池化,输出是256个通道,每个通道被压缩到28×28。
(8)连续3层带填充的3×3卷积层,每层都有512个卷积核,输出是512个通道,每个通道为28×28。
(9)2×2步长为2的最大池化,输出是512个通道,每个通道被压缩到14×14。
(10)连续3层带填充的3×3卷积层,每层都有512个卷积核,输出是512个通道,每个通道为14×14。
(11)2×2步长为2的最大池化,输出是512个通道,每个通道被压缩到7×7。
(12)连续2层全连接层,每层4096个神经元,均附带ReLU激活函数。
(13)由于输出是1000个类别,所以输出层有1000个神经元。
最后加一个softmax激活函数,将输出转化为概率。
图1.28 VGG-16神经网络示意图
小明读书笔记
卷积神经网络的特点是局部连接、参数共享,通过这种方式有效地减少了神经网络的参数量。
卷积神经网络通过卷积核提取局部特征,由于其局部连接、参数共享的特点,可以提取输入图像在不同位置具有相似属性的特征模式。卷积核的大小决定了提取的特征粒度,卷积核越小,提取的特征粒度越小,卷积核越大,提取的特征粒度越大。当多个卷积层串联在一起时,越是在上层(靠近输出层)的卷积层,体现的视野越大,提取的特征粒度也越大,即便卷积核大小是一样的,由于输入的粒度大小不一样,其提取的特征粒度也是不一样的。
在图像处理中,卷积核的大小一般是k×k的方形矩阵,按照给定的步长对输入图像先行后列地进行“扫描”,获取图像中不同位置的相似特征。当输入为多个通道时,卷积核变成了一个长方体,其“厚度”与输入的通道数一致,所以通常在说卷积核大小时并不包含其厚度,厚度默认为输入的通道数。
一个卷积核构成一个输出通道,而不论其输入包含多少个通道。在同一个输入下可以使用多个卷积核,获得多个输出通道,输出通道数与卷积核的数量一致。
如果希望卷积层的输出大小与输入大小一致,可以通过在输入图像四周填充0的方式实现,具体需要填充多少圈0,与卷积核的大小和步长有关。比如同是在步长为1的情况下,如果卷积核的大小是3×3,则需要在输入图像四周填充一圈0,如果卷积核的大小是5×5,则需要填充两圈0。
在卷积神经网络中,通常还包含池化层,起到特征压缩的目的。在图像处理中,池化窗口一般是方形的,依据取窗口内的最大值或者平均值,池化分为最大池化和平均池化两种。同卷积操作一样,池化也是依据给定的步长对输入进行先行后列的扫描。所不同的是,池化窗口并没有厚度,只作用在一个通道上,输入有多少个通道,输出还是多少个通道,并不改变通道的个数。
通常卷积神经网络是和全连接神经网络混合在一起使用的,前面几层是卷积层,用于提取特征,后面几层是全连接层,通过对特征的综合实现分类等操作。LeNet网络和VGG-16网络是两个典型的应用。
未完待续
内容来自《艾博士:深入浅出人工智能》,扫描如下二维码购买:
马少平,清华大学计算机系长聘教授,博世知识表示与推理冠名教授,天工智能计算研究院常务副院长,中国人工智能学会副监事长,中国中文信息学会副理事长。主要研究方向为智能信息处理、信息检索、推荐系统等。
本书入围“一生一课,一生一书”计划项目,是最好的人工智能通俗讲义之一。
本书设计了博学的艾博士和好学的小明两个人物,以师徒二人对话的方式,一步步由浅入深地讲解人工智能的基本原理和方法,讲解详细,通俗易懂,给读者以在教室听课的真实感。
本书精心挑选了人工智能发展史上一些主要的方法进行详细讲解,通过本书的学习,使得读者对人工智能有一个比较全面的了解,为进一步深入学习和研究人工智能打下良好的基础。
结合例题,本书对相关概念和算法背后的原理做了详细的讲解,对学习过程中容易犯的错误做了重点说明,适合于对人工智能感兴趣的初学者、从事人工智能开发的工程人员以及讲授相关课程的教师阅读,通过本书的学习,可以对相关概念和算法有更加深入的理解。
本书提供全部的讲课PPT,在微信公众号“跟我学AI”和B站(在B站搜“马少平”)还配有详细的讲课视频,可以通过前言中提供的二维码获取这些资源。
扫描如下二维码加入马少平教授读者群:
版权声明
转自夕小瑶科技说, 版权属于原作者,仅用于学术分享
文章精选: