批量归一化(Batch Normalization,BN)
如果说自适应学习率是让训练适应loss,那归一化就是让loss适应训练。
我们抛掉使用自适应学习率的想法,重新看下面的图。可以看到w1固定时,w2的梯度是比较大的。w2固定时,w1的梯度较小。固定学习率,不是太大导致在w2方向上来回震荡,就是太小导致在w1方向上下降缓慢。
我们想出了一个思路,将这个椭圆(凸的凹凸表面)尽量修成圆的,那这样每个参数的梯度都差不多,就不会出现上述问题了嘛。
要解决椭圆,先思考出现椭圆的原因:
椭圆是loss构成的等高线。
l
o
s
s
由
y
和
y
^
loss由y和\hat y
loss由y和y^得到,y固定,所以只关心
y
^
\hat y
y^。
w是训练得到的参数,我们不管。那原因就出在
x
i
x_i
xi即输入数据(特征)上。如果
x
i
=
1
e
9
x_i=1e9
xi=1e9,那
w
w
w改一点点也会对
y
^
\hat y
y^造成很大的变化。如果
x
i
=
0.000001
x_i=0.000001
xi=0.000001,那么w变很大也改变不了多少
y
^
\hat y
y^。
所以我们可以对不同样本的同一个维度做归一化(比如对[1,2,3],[9,10,11]的[3,11]做归一化),将他们的数值范围统一成相同。方法在机器学习里也有提及过,主要还是结合方差和均值那些。
因为要得到所有数据的标准差、均值这些,而我们往往每次处理一个batch的数据,并且可以在每层之后应用归一化,而不是只对初始输入样本做归一化。所以与feature normalization做区分,叫batch normalization。
在实际应用模型时我们不可能一批一批的获取到数据,但我们也想归一化一下。这里用到了移动平均。
内部协变量偏移看不懂,没看了。。。
卷积神经网络(CNN)
图像其实就是一个像素矩阵,我们都知道有宽高和通道三个维度。
如果用全连通神经网络做,假设图像的宽高是100,第一层线性层有1000个神经元,那么就是100*100*3*1000=3e7,这种简单情况就需要这么多权重值了,更别提复杂网络了。同时,对于图像,也不需要那么多参数,容易导致过拟合,因此不应该考虑全连接。
这里就引出了非常常用的CNN。卷积的意思就是用一个矩阵(卷积核)在一张输入图像上从左到右、从上到下依次扫描,进行矩阵的点积运算,得到相应位置的运算结果并输出。
感受野
我们发现图像检测不需要查看整张图像
出于减少连接数以减少参数个数的目的,我们可以让一个神经元只负责他的感受野区域。感受野可以重叠(防止交界处无神经元检测),可大可小,可以只负责某些通道(比如RGB中只负责R)
在图像任务中,由于不会觉得有些模式只出现在某一个通道里面,所以会看全部的通道。既然会看全部的通道,那么在描述一个感受野的时候,只要讲它的高跟宽,而高跟宽合起来叫做核大小。常见的感受野设定方式就是核大小为 3
∗
*
∗ 3。
由于图像的四周,重叠的感受野不如图像内部的,其检测效果肯定不一样。为了统一,又或者保持图像输出尺寸不变,可以在外层做零填充。
参数共享
我们想训练一个识别叶子的神经元,但是叶子在图像中多次出现在不同的感受野中,同时因为这种任务是位置无关的(只关心是不是,不关心在图像哪个部分)。我们完全可以把这个针对“叶子识别”任务的参数提取出来作为一个共享参数,而不是针对每个感受野都学习一组参数。其实这个共享参数就是一个卷积核,对于不同的感受野,用同一个卷积核处理,这就实现了共享。
CNN
全连接层,通过引入感受野减少参数个数,再加上参数共享,就变成了卷积层。
由于参数量减少(每个神经元只负责特定的一小块感受野),甚至还加上了位置无关的参数共享策略,模型的限制较大,灵活性较低,但也不易过拟合。这些策略是针对图像任务的特性来设计的。
图像通过卷积核的卷积操作,会产生一组新的特征。通过N个滤波器,会对同一个感受野生成N组特征,可以认为是N组通道。
池化
想到了之前看过的一个视频:b站视频-原来图片是这样压缩的
对一张图片的各个部分分别取一小部分,拼接为一个新的像素明显变少的图像,我们仍能大致看出两张图有一定相似性,即用新生成的图像作为训练样本是有一定可行性的。这就是降采样。
因此我们在CNN中也可以使用这种方式减少网络内传递的参数。可以对一个感受野只取一个MAX值,或取一个平均值,进一步减少参数个数。这就是池化。
相比较卷积层是对感受野进行映射,池化层像一个算子,不需要学习什么,只需要做一个转换操作,比如取最大值(max pooling)、求平均值(mean pooling)。在CNN中会将卷积层与池化层交替使用。
但是!这种方式本质上还是用降低精度来降低计算资源消耗。对于追求高精度、且算力足够时,可能没有必要使用池化。
经典图像识别网络
传入样本数据->卷积与池化交替->输出扁平化(矩阵转向量)->全连接层+softmax->输出结果
什么时候用CNN
只要问题与图像有相似性质就行。图像的特征就比如有位置无关、一些模式只要观察局部特征就行。比如五子棋、围棋这种。