批量归一化
其实归一化简单一点理解就类似于我们学过的数学中的每个数值减去平均值除以标准差。
神经网络中的批量归一化(Batch Normalization,BN)就是其中一个“把山铲平”的想法。不要小看优化这个问题,有时候就算误差表面是凸(convex)的,它就是一个碗的形状,都不一定很好训练。
看下面这个图就可以看出来,假设两个参数对损失的斜率差别非常大,在 w1 这个方向上面,斜率变化很小,在 w2 这个方向上面斜率变化很大。
如果是固定的学习率很难得到很好的结果,所以我们才需要使用自适应学习率等各种优化的方法。
但是从另外一个角度想一下,我们能不能把难做的误差表面修改一下得到更好的结果,那么怎么去解决这个问题呢?
第一步:从根本上解决w1,w2为什么会出现斜率大很多的问题。
来看一个简单的线性模型:
其输入是 x1 跟 x2,对应的参数为 w1 跟 w2,它是一个线性的模型,没有激活函数。w1 乘 x1,w2 乘 x2 加上 b 以后就得到 yˆ,然后会计算 yˆ 跟 y 之间的差距当做 e,把所有训练数据 e 加起来就是损失,然后去最小化损失。
如果我们尝试使用大小为1的小批量应用批量规范化,我们将无法学到任何东西。这是因为在减去均 值之后,每个隐藏单元将为0。所以,只有使用足够大的小批量,批量规范化这种方法才是有效且稳定的。请 注意,在应用批量规范化时,批量大小的选择可能比没有批量规范化时更重要。 从形式上来说,用x ∈ B表示一个来自小批量B的输入,批量规范化BN根据以下表达式转换x:
卷积神经网络
我们从卷积神经网络开始,探讨网络的架构设计。卷积神经网络是一种非常典型的网络架构,常用于图像分类等任务。通过卷积神经网络,我们可以知道网络架构如何设计,以及为什么合理的网络架构可以优化网络的表现。
图片分类就是给机器一张图片,机器判断图片中有哪些内容。那么怎么把图片当作模型输入呢?
对于机器,图像可以描述为三维张量(张量可以想成维度大于 2 的矩阵)。一张图像是一个三维的张量,其中一维代表图像的宽,另外一维代表图像的高,还有一维代表图像的通道(channel)的数目。
彩色图片就有三个通道,分别是R、G、B代表红、绿、蓝三色
将代表图片的三维张量输入到网络中
如果把向量当作全连接网络的输入,输入特征向量的长度就是100*100*3.由于每个神经元跟输入的向量中的每个数值都需要一个权重,所以当输入的向量长度是 100 × 100 × 3,且第 1 层有 1000 个神经元时,第 1 层的权重就需要 1000×100×100×3 = 3 ×107 个权重,这是一个非常巨大的数目。更多的参数为模型带来了更好的弹性和更强的能力,但也增加了过拟合的风险。模型的弹性越大,就越容易过拟合。为了避免过拟合,在做图像识别的时候,考虑到图像本身的特性,并不一定需要全连接,即不需要每个神经元跟输入的每个维度都有一个权重。接下来就是针对图像识别这个任务,对图像本身特性进行一些观察。
模型的输出有很多种,根据模型的目标来判断模型输出。如果模型的目标是分类,我们就需要使用独热变量来表示分类的结果,在最终的分类结果中目标类别的数值为1,其他的类别数值为0。例如,输入为一张小猫的图片,最终输出向量,猫的概率最大,所以最终判断图片的内容是猫。
观察1:检测模式不需要整张图片
假设我们的任务是让网络识别出图像的动物。对一个图像识别的类神经网络里面的神经元而言,它要做的就是检测图像里面有没有出现一些特别重要的模式(pattern),这些模式是代表了某种物体的。比如有三个神经元分别看到鸟嘴、眼睛、鸟爪 3 个模式,这就代表类神经网络看到了一只鸟,如图所示。
人在判断一个物体的时候,往往也是抓最重要的特征。看到这些特征以后,就会直觉地看到了某种物体。对于机器,也许这是一个有效的判断图像中物体的方法。但假设用神经元来判断某种模式是否出现,也许并不需要每个神经元都去看一张完整的图像。因为并不需要看整张完整的图像才能判断重要的模式(比如鸟嘴、眼睛、鸟爪)是否出现,如图 4.5 所示,要知道图像有没有一个鸟嘴,只要看非常小的范围。这些神经元不需要把整张图像当作输入,只需要把图像的一小部分当作输入,就足以让它们检测某些特别关键的模式是否出现,这是第 1 个观察。
简化1:感受野
根据上述对鸟的观察,在每个不同的一小片区域卷积神经网络会设定一个区域,这个区域叫做感受野。每个神经元都只关心自己的感受野里面发生的事情,感受野是由我们自己决定的。蓝色的神经元只关心红框圈到的部分,将这个3*3*3张量输入到神经网络中,由神经元给出每个维度的不同权重,加上偏置后得到输出,这个输出在输给下一个神经元作为输入。
蓝色的神经元看左上角这个范围,这是它的感受野。黄色的神经元看右下角 3 × 3 × 3 的范围。图 4.7 中的一个正方形代表 3 × 3 × 3 的范围,右下角的正方形是黄色神经元的感受野。感受野彼此之间也可以是重叠的,比如绿色的神经元的感受野跟蓝色的、黄色的神经元都有一些重叠的空间。我们没有办法检测所有的模式,所以同个范围可以有多个不同的神经元,即多个神经元可以去守备同一个感受野。接下来我们讨论下如何设计感受野。
感受野可以有大有小,因为模式有的比较小,有的比较大。有的模式也许在 3 × 3 的范围内就可以被检测出来,有的模式也许要 11 × 11 的范围才能被检测出来。此外,感受野可以只考虑某些通道。目前感受野是 RGB 三个通道都考虑,但也许有些模式只在红色或蓝色的通道会出现,即有的神经元可以只考虑一个通道。之后在讲到网络压缩的时候,会讲到这种网络的架构。感受野不仅可以是正方形的,例如刚才举的例子里面 3 × 3、11 × 11,也可以是长方形的,完全可以根据对问题的理解来设计感受野。虽然感受野可以任意设计,但下面要跟大家讲一下最经典的感受野安排方式。
一般在做图像识别的时候,可能不会觉得有些模式只出现在某一个通道里面,所以会看全部的通道。既然会看全部的通道,那么在描述一个感受野的时候,只要讲它的高跟宽,不用讲它的深度,因为它的深度就等于通道数,而高跟宽合起来叫做核大小。图 4.8 中的核大小就是 3 × 3。在图像识别里面,一般核大小不会设太大,3 × 3 的核大小就足够了,7 × 7、9 × 9算是蛮大的核大小。如果核大小都是 3 × 3,意味着我们觉得在做图像识别的时候,重要的模式都只在 3 × 3 这么小的范围内就可以被检测出来了。但有些模式也许很大,也许 3 × 3 的范围没办法检测出来,后面我们会再回答这个问题。常见的感受野设定方式就是核大小为 3 × 3。
根据专家学者们研究出来的特性,感受野可以变化,但是要覆盖所有的通道。感受野每次移动的距离称为不负。举一个例子来说,当步幅stride=2,那么感受野就会这样移动,如下图所示:
但是我们发现了一个问题,当移动到第三个感受野时,最后一列被空在了数据区域的外面,这样的话最后一列的数据就不是有效值,会导致输出出现误差。怎么解决这个问题就需要我们根据需要增加padding填充,在数据的外面加上一圈全0数据,来保证每次都把有效数据充分使用。
观察 2:同样的模式可能会出现在图像的不同区域
下图中可以看到同样的鸟嘴可以在不同的区域出现,如果只需要鸟嘴那么我们就不需要每个感受野都去放一个检测鸟嘴的神经元,那样的话参数太多
简化2:共享参数
那么怎么简化参数,就是我们要学习的共享参数。
举个例子,解释一下这个概念:类似于教务处希望可以推大型的课程一样,假设每个院系都需要深度学习相关的课程,没必要在每个院系都开机器学习的课程,可以开一个比较大型的课程,让所有院系的人都可以修课。
在神经网络中共享参数是两个神经元的权重完全相同。
小总结
感受野+参数共享=卷积层,用到卷积层的网络叫卷积神经网络。卷积神经网络的偏差比较大。但模型偏差大不一定是坏事,因为当模型偏差大,模型的灵活性较低时,比较不容易过拟合。全连接层可以做各式各样的事情,它可以有各式各样的变化,但它可能没有办法在任何特定的任务上做好。而卷积层是专门为图像设计的,感受野、参数共享都是为图像设计的。虽然卷积神经网络模型偏差很大,但用在图像上不是问题。如果把它用在图像之外的任务,就要仔细想想这些任务有没有图像用的特性。
卷积层里面有很多滤波器,这些滤波器的大小是 3 × 3 × 通道。如果图像是彩色的,它有 RGB 三个通道。如果是黑白的图像,它的通道就等于 1。一个卷积层里面就是有一排的滤波器,每个滤波器都是一个 3 × 3 × 通道,其作用是要去图像里面检测某个模式。这些模式要在 3 × 3 × 通道,这个小的范围内,它才能够被这些滤波器检测出来。举个例子,假设通道为 1,也就是图像是黑白的。
卷积层中的滤波器
使用滤波器的例子:
观察 3:下采样不影响模式检测
把一张比较大的图像做下采样(downsampling),把图像偶数的列都拿掉,奇数的行都拿掉,图像变成为原来的 1/4,但是不会影响里面是什么东西。如图所示,把一张大的鸟的图像缩小,这张小的图像还是一只鸟。
简化 3:汇聚根据第 3 个观察,汇聚也称为池化
池化分为最大池化和平均池化
最大池化就是说在下采样过程中,取每个感受野中数值最大的那个当作计算结果
平均池化是取感受野内所有数据的平均值当作结果
卷积神经网络的应用:下围棋
以 AlphaGo 为例。下围棋其实是一个分类的问题,网络的输入是棋盘上黑子跟白子的位置,输出就是下一步应该要落子的位置。网络的输入是一个向量,棋盘上有 19 × 19 个位置,可以把一个棋盘表示成一个 19 × 19 维的向量。在这个向量里面,如果某个位置有一个黑子,这个位置就填1,如果有白子,就填 -1,如果没有子,就填 0。不一定要黑子是 1,白子是 -1,没有子就是0,这只是一个可能的表示方式。通过把棋盘表示成向量,网络就可以知道棋盘上的盘势。把这个向量输到一个网络里面,下围棋就可以看成一个分类的问题,通过网络去预测下一步应该落子的最佳位置,所以下围棋就是一个有 19 × 19 个类别的分类问题,网络会输出 19 × 19个类别中的最好类别,据此选择下一步落子的位置。这个问题可以用一个全连接网络来解决,但用卷积神经网络的效果更好。