一、批量化归一
当误差表面崎岖不平,就意味着它比较难以训练,而利用批量化归一将崎岖的误差表面“铲平”则是其中的方法之一。如果是固定学习率,可能很难得到好的结果,因此才需要自适应的学习率。
当输入的特征,每一个维度的值,它的范围差距很大的时候,我们就可能产生像这样子的误差表面,就可能产生不同方向,斜率非常不同,坡度非常不同的误差表面所以怎么办呢,有没有可能给特征里面不同的维度,让它有同样的数值的范围。如果我们可以给不同的维度,同样的数值范围的话,那我们可能就可以制造比较好的误差表面,让训练变得比较容易一点其实有很多不同的方法,这些不同的方法往往就合起来统称为特征归一化(feature normalization)。
以下所讲的方法只是特征归一化的一种可能性,即 Z 值归一化(Z-score normalization),也称为标准化(standardization)。它并不是特征归一化的全部,假设 x1 到 xR,是我们所有的训练数据的特征向量。我们把所有训练数据的特征向量,统统都集合起来。向量 x1 里面就x11 代表 x1 的第一个元素,x21 代表 x2 的第一个元素,以此类推。我们把不同笔数据即不同特征向量,同一个维度里面的数值,把它取出来,对于每个维度 i,计算其平均值(mean) mi和标准差(standard deviation)σi。接下来我们就可以做一种归一化。
我们就是把这边的某一个数值 x,减掉这一个维度算出来的平均值,再除掉这个维度,算出来的标准差,得到新的数值 x˜。得到新的数值以后,再把新的数值把它塞回去。
1. 考虑深度学习
x˜ 代表归一化的特征,把它丢到深度网络里面,去做接下来的计算和训练。如图 3.41 所示,x˜1 通过第一层得到 z1,有可能通过激活函数,不管是选 sigmoid 或者 ReLU 都可以,再得到 a1,接着再通过下一层等等。对每个 x 都做类似的事情。
虽然 x˜ 已经做归一化了,但是通过 W1 W1 以后,没有做归一化。如果 x˜ 通过 W1 W1 得到 z1,而 z1 不同的维度间,它的数值的分布仍然有很大的差异,训练 W2 W2 第二层的参数也会有困难。对于 W2W2,a 或 z 其实也是一种特征,也应该要对这些特征做归一化。如果选择 sigmoid,比较推荐对 z 做特征归一化,因为 sigmoid 是一个 s 的形状,其在 0 附近斜率比较大,如果对 z 做特征归一化,把所有的值都挪到 0 附近,到时候算梯度的时候,算出来的值会比较大。如果使用别的激活函数,可能对 a 归一化也会有好的结果。一般而言,特征归一化,要放在激活函数之前,之后都是可以的,在实现上,没有太大的差别。
2. 测试时的批量归一化
但是在做批量归一化的时候,µ,σ 是用一个批量的数据算出来的。但如果在测试的时候,根本就没有批量,如何算 µ,σ 呢?所以真正的实现上的解法是这个样子的。批量归一化在测试的时候,并不需要做什么特别的处理,PyTorch 已经处理好了。在训练的时候,如果有在做批量归一化,每一个批量计算出来的 µ,σ,都会拿出来算移动平均(moving average)。假设现在有各个批量计算出来的 µ1, µ2, µ3, · · · · · · , µt,则可以计算移动平均
其中,µ¯ 是 µ 的个平均值,p 是因子,这也是一个常数,这也是一个超参数,也是需要调的那种。在 PyTorch 里面,p 设 0.1。计算滑动平均来更新 µ 的平均值。最后在测试的时候,就不用算批量里面的 µ 跟 σ 了。因为测试的时候,在真正应用上也没有批量,就可以就直接拿µ¯ 跟 σ¯ ,也就是 µ,σ 在训练的时候,得到的移动平均来取代原来的 µ 跟 σ,如图 3.45 所示,这就是批量归一化在测试的时候的运作方式。
3.内部协变量偏移
始的批量归一化论文里面提出内部协变量偏移(internal covariate shift)概念。如图 3.47 所示,假设网络有很多层,-x 通过第一层后得到 a,a 通过第二层以后得到 b;计算出梯度以后,把 A 更新成 A′,把 B 这一层的参数更新成 B′。但是作者认为说,我们在计算 B 更新到 B′ 的梯度的时候,这个时候前一层的参数是 A,或者是前一层的输出是 a。那当前一层从 A 变成 A′ 的时候,其输出就从 a 变成 a′ 。但是我们计算这个梯度的时候,是根据 a 算出来,所以这个更新的方向也许它适合用在 a 上,但不适合用在 a′ 上面。因为我们每次都有做批量归一化,就会让 a 和a′ 的分布比较接近,也许这样就会对训练有帮助。
二、卷积神经网络
卷积神经网络主要用于图像分类任务。一张图象是一个三维的张良,一维代表宽、一维代表高、另一维代表通道数目。一般RGB三色图像的通道为三通道。如果把向量当做全连接网络的输入,输入的特征向量(feature vector)的长度就是 100 × 100 × 3。这是一个非常长的向量。由于每个神经元跟输入的向量中的每个数值都需要一个权重,所以当输入的向量长度是 100 × 100 × 3,且第 1 层有 1000 个神经元时,第 1 层的权重就需要 1000×100×100×3 = 3 ×107 个权重,这是一个非常巨大的数目。更多的参数为模型带来了更好的弹性和更强的能力,但也增加了过拟合的风险。模型的弹性越大,就越容易过拟合。为了避免过拟合,在做图像识别的时候,考虑到图像本身的特性,并不一定需要全连接,即不需要每个神经元跟输入的每个维度都有一个权重。
图像识别的任务是识别图像中的物体,那么如果识别一个物品,那么其值对应为1,其他的对应值为0. 独热向量的长度决定了模型可以识别出多少种不同种类的东西,现在较强的图像识别系统往往可以识别出1000种以上。
1. 检测模式不需要整张图像
假设我们的任务是让网络识别出图像的动物。对一个图像识别的类神经网络里面的神经元而言,它要做的就是检测图像里面有没有出现一些特征,这些特征是代表了某种物体的。比如有三个神经元分别看到鸟嘴、眼睛、鸟爪 3 个特征。
人在判断一个物体的时候,往往也是抓最重要的特征。看到这些特征以后,就会直觉地看到了某种物体。对于机器,也许这是一个有效的判断图像中物体的方法。但假设用神经元来判断某种模式是否出现,也许并不需要每个神经元都去看一张完整的图像。因为并不需要看整张完整的图像才能判断重要的模式(比如鸟嘴、眼睛、鸟爪)是否出现,如图 4.5 所示,要知道图像有没有一个鸟嘴,只要看非常小的范围。这些神经元不需要把整张图像当作输入,只需要把图像的一小部分当作输入,就足以让它们检测某些特别关键的模式是否出现,这是第 1 个观察。
2. 感受野
卷积神经网络会设定一个区域,叫感受野,每个神经元只关心自己感受野里面发生的事情,不需要关心整个 图像里面有什么东西,这样一个神经元对的维度向量输入就会大大减少。
感受野可以有大有小,因为模式有的比较小,有的比较大。有的模式也许在 3 × 3 的范围内就可以被检测出来,有的模式也许要 11 × 11 的范围才能被检测出来。此外,感受野可以只考虑某些通道。目前感受野是 RGB 三个通道都考虑,但也许有些模式只在红色或蓝色的通道会出现,即有的神经元可以只考虑一个通道。
一般在做图像识别的时候,可能不会觉得有些模式只出现在某一个通道里面,所以会看全部的通道。既然会看全部的通道,那么在描述一个感受野的时候,只要讲它的高跟宽,不用讲它的深度,因为它的深度就等于通道数,而高跟宽合起来叫做核大小。
一般同一个感受野会有一组神经元去守备这个范围,比如 64 个或者是 128 个神经元去守备一个感受野的范围。目前为止,讲的都是一个感受野,接下来介绍下各个不同感受野之间的关系。我们把左上角的感受野往右移一个步幅,就制造出一个新的守备范围,即新的感受野。移动的量称为步幅(stride)。
接下来需要考虑一个问题:感受野超出了图像的范围,怎么办呢?如果不在超过图像的范围“摆”感受野,就没有神经元去检测出现在边界的模式,这样就会漏掉图像边界的地方,所以一般边界的地方也会考虑的。一般使用零填充(zero padding),超出范围就补 0,如果感受野有一部分超出图像的范围之外,就当做那个里面的值都是 0。其实也有别的补值的方法,比如补整张图像里面所有值的平均值或者把边界的这些数字拿出来补没有值的地方。
除了水平方向的移动,也会有垂直方向上的移动,垂直方向步幅也是设 2,如图 4.11 所示。我们就按照这个方式扫过整张图像,所以整张图像里面每一寸土地都是有被某一个感受野覆盖的。也就是图像里面每个位置都有一群神经元在检测那个地方,有没有出现某些模式。这个是第 1 个简化。
3.同样的特征出现在图像不同的区域
第 2 个观察是同样的模式,可能会出现在图像的不同区域。比如说模式鸟嘴,它可能出现在图像的左上角,也可能出现在图像的中间,同样的模式出现在图像的不同的位置也不是太大的问题。因为出现在左上角的鸟嘴,它一定落在某一个感受野里面。因为感受野是盖满整个图像的,所以图像里面所有地方都在某个神经元的守备范围内。假设在某个感受野里面,有一个神经元的工作就是检测鸟嘴,鸟嘴就会被检测出来。所以就算鸟嘴出现在中间也没有关系。
4. 共享参数
在提出简化技巧前,我们先举个类似的例子。这个概念就类似于教务处希望可以推大型的课程一样,假设每个院系都需要深度学习相关的课程,没必要在每个院系都开机器学习的课程,可以开一个比较大型的课程,让所有院系的人都可以修课。如果放在图像处理上,则可以让不同感受野的神经元共享参数,也就是做参数共享(parameter sharing)。
5. 下采样不影响
第 3 个观察是下采样不影响模式检测。把一张比较大的图像做下采样(downsampling),把图像偶数的列都拿掉,奇数的行都拿掉,图像变成为原来的 1/4,但是不会影响里面是什么东西。
6. 汇聚
它就是一个操作符(operator),其行为都是固定好的,不需要根据数据学任何东西。每个滤波器都产生一组数字,要做汇聚的时候,把这些数字分组,可以 2 × 2 个一组,3 × 3、4 × 4 也可以,这个是我们自己决定的,图 4.27 中的例子是 2 × 2 个一组。在刚才的例子里面,本来 4 × 4 的图像,如果把这个输出的数值 2 × 2 个一组,4 × 4 的图像就会变成 2 × 2 的图像,这就是汇聚所做的事情。一般在实践上,往往就是卷积跟汇聚交替使用,可能做几次卷积,做一次汇聚。比如两次卷积,一次汇聚。不过汇聚对于模型的性能(performance)可能会带来一点伤害。假设要检测的是非常微细的东西,随便做下采样,性能可能会稍微差一点。
一般架构就是卷积加汇聚,汇聚是可有可无的,很多人可能会选择不用汇聚。如图 4.30所示,如果做完几次卷积和汇聚以后,把汇聚的输出做扁平化(flatten),再把这个向量丢进全连接层里面,最终还要过个 softmax 来得到图像识别的结果。这就是一个经典的图像识别的网络,里面有卷积、汇聚和扁平化,最后再通过几个全连接层或 softmax 来得到图像识别的结果。
标签:Task3,里面,批量,AI,李宏毅,归一化,感受,图像,神经元 From: https://blog.csdn.net/2301_81185698/article/details/141757447