在深度学习中,一般我们会把喂给网络模型的训练图片进行预处理,使用最多的方法就是零均值化(zero-mean) / 中心化,即让所有训练图片中每个位置的像素均值为0,使得像素值范围变为[-128,127],以0为中心。
举个例子,假设训练图片有5000张,图片大小为32*32,通道数为3,则用python表示如下:
x_train = load_data(img_dir) # 读取图片数据 x_train的shape为(5000,32,32,3)
x_train = np.reshape(x_train, (x_train.shape[0], -1)) # 将图片从二维展开为一维,x_train 变为(5000,3072)
mean_image = np.mean(x_train, axis=0) # 求出所有图片每个像素位置上的平均值 mean_image为(1, 3072)
x_train -= mean_image # 减去均值图像,实现零均值化
这样做的优点是为了在反向传播中加快网络中每一层权重参数的收敛。为什么能加快呢?李飞飞的cs231n课程中给出了很好的解释。
我们来看一下神经网络中的计算过程,如上图所示通常每一层的计算公式都可以表示成上面这个式子。假设上游返回的梯度为L,运用链式法则,反向传播时权重的梯度可以表示如下:
∂
L
i
∂
w
i
=
∂
L
i
∂
f
∂
f
∂
w
i
=
∂
L
i
∂
f
x
i
\frac{∂L_i}{∂w_i} = \frac{∂L_i}{∂f}\frac{∂f}{∂w_i} = \frac{∂L_i}{∂f}x_i
∂wi∂Li=∂f∂Li∂wi∂f=∂f∂Lixi
假设图中蓝色箭头方向理想最优w向量,根据上述公式,我们可以想一想:
当x全为正或者全为负时,每次返回的梯度都只会沿着一个方向发生变化,即梯度变化的方向就会向图中红色箭头所示,一会向上太多,一会向下太多。这样就会使得权重收敛效率很低。
但当x正负数量“差不多”时,就能对梯度变化方向进行“修正”,使其接近上图中蓝色箭头的方向,加速了权重的收敛。
参考自:李飞飞深度学习课程cs231n
解释得可能没有老师清楚 w(゚Д゚)w,跑-_-||