CS231n笔记五:训练神经网络1(激活函数、数据预处理、权值初始化)

一、激活函数

1、定义 activation function

在全连接层或卷积层,我们会输入与权重值W矩阵相乘,得到一个中间结果(对全连接层是一个值,对卷积层是一个矩阵)。对于这个结果,需要将其输入到一个激活函数或者非线性单元中,以得到最终输出。过程如下:
在这里插入图片描述


2、常见激活函数

这里是一些激活函数的例子:
在这里插入图片描述


  1. Sigmoid函数
    1、将输入值压缩到 [0, 1] 区间内;
    2、很常用,因为它可以看成是一个神经元的饱和放电率。
    3、问题:
    1)当x较大或较小时,sigmoid函数可能会导致梯度流消失。比如下面这个神经元:我们希望使用back propagation来计算梯度 dL/dx,于是我们需要一个local gradient dσ/dx,但当x取-10或10时,可以观察到sigmoid函数曲线几乎是平的,也就是dσ/dx为0。那么这样再一用链式法则就会导致dL/dx也变成0了。于是这个神经元传给下游神经元的梯度就是0,导致之后的梯度流都消失了。
    在这里插入图片描述
    2)sigmoid函数是一个非零中心的函数。这种非零中心(即要么大部分函数值都为正,要么大部分函数值都为负)的函数有一个很大的缺点,以sigmoid函数为例:
    设上一个神经元的输出为x,它是经过sigmoid函数激活过的值,那么x一定恒为正。现在考虑下一个神经元,它以x作为输入,先与W做点积再加上b,之后再经过一个激活函数f,最后得到输出传给上游神经元。
    现在考虑最终的总函数L,想求L在W上的梯度,即dL/dW。现在我通过反向传播已经从上游神经元处得到了dL/df,于是我现在要求local梯度df/dW。求df/dW需要两步,先求df/dz(设z为x与W做点积再加b的结果,它是激活函数f的输入),由于激活函数一般都单调增,因而df/dz恒正;然后要求dz/dw,其值仅与x有关,因此也恒为正。所以整个过程下来,这个神经元再向下游神经元输出的梯度值dL/dW的正负仅取决于上游神经元给它输入的梯度值的正负,且dL/dW中的W可以是w1、w2、…、wn中的任意一个,即所有dL/dwi都同时为正或同时为负(取决于上游神经元给它输入的梯度值的正负)。
    在这里插入图片描述
    这也就是说,要么所有wi一起增加(可以同时增加同一个值,也可以同时增加不同的值,但总之就是都增大),要么所有wi一起减小(同上)。假设这里我们的W是二维的,即有一个w1和一个w2(为了方便画图表示),那么dW只能要么在第一象限(一起增大),要么只能在第三象限(一起减小)。所以我们的W只能沿着红色的箭头来进行更新(zig zag path)。但可能实际上最佳的更新方向可能是蓝色箭头,可我们不能直接沿蓝色箭头来更新W,而必须通过麻烦的红色箭头来更新。所以通常我们希望激活函数是zero-mean的
    3)第三个问题是指数的计算代价比较大。但这并不是主要问题,因为卷积层中的点积计算其实计算量更大。

  1. tanh函数
    与sigmoid函数十分类似,唯一的不同之处在于sigmoid函数值在[0, 1]区间,而tanh函数值在[-1, 1]之间。因而它是一个zero-centered函数,不存在上述第二个问题。但仍然会在x取值较大或较小时导致梯度流消失。

  1. ReLU函数
    1、功能:f(x) = max(0, x)
    若输入x为负数,则输出函数值为0;若输入x为正数,则输出仍为x。
    2、优点:
    (1)在输入为正时都不会出现梯度消失的情况;
    (2)计算成本低;
    (3)收敛更快,相较于sigmoid和tanh,其收敛速度大约为二者的六倍;
    (4)比sigmoid和tanh更类似于真实的神经元工作原理。
    3、缺点:
    (1)仍然不是zero-centered的;
    (2)在x <= 0时,其梯度都会变成0(实际上x = 0时是不可导的,但我们在使用时默认其导数为0),也就是在一半的input area中,仍然会出现梯度消失的问题。而ReLU里这个梯度消失的问题会造成很严重的后果
    因为当输入x <= 0时,梯度将始终是0,那么它传给下游神经元的梯度值就是0,即最终算出来的梯度就还是0,也就是最终算出来W的梯度也还是0,也就是W不会更新。那么如果训练数据刚好使得所有输入x都<=0,那么这时的W就永远都不会更新了。。。
    以上这种悲伤的情况发生在初始化的W很unlucky时,若初始W刚好使ReLU函数的所有输入x<=0,那么W就永远不会更新了。这些W的区域又叫dead ReLU。同时也有可能发生在学习率step_size比较大的情况下,这样虽然刚开始W是ok的,然后更新着更新着突然蹦出去了,蹦到了dead ReLU的范围内,那么它也就挂掉了。
    事实证明在真实训练中有10%-20%的机率会挂掉。。。

  1. Leaky ReLU
    1、定义:f(x) = max(0.1x, x)
    2、优点:
    (1)不会导致梯度消失,即使x<=0时也会有一个小斜率,因而不会die!!!
    (2)计算成本低;
    (3)收敛更快;
    3、推广:参数整流器(PReLU)
    (1)定义:Parametric Rectifier,f(x) = max(αx, x)
    负区间的斜率有参数α决定,我们不需要事先指定它,而是把它当作一个可以反向传播和学习的参数。

  1. ELU(Exponential Linear Units)
    1、 表达式见第二张图
    2、优点:
    (1)具备所有ReLU的优点;
    (2)还是zero-mean的;
    (3)在negative 区域会饱和,也就是会出现梯度消失现象,但这同时也带给它对于噪声更好的鲁棒性,compared to Leaky ReLU。
    3、缺点:
    (1)计算需要指数exp();

  1. 最大输出神经元(Maxout Neuron)
    1、定义:这个函数和之前的激活函数有些不一样,之前的都是将x和W取点积然后加一个偏置bias,将这个计算结果输入导激活函数里。但在Maxout里,我们直接把这两个步骤融合成一个公式了:max(w1.T * x + b1, w2.T * x + b2)
    2、优点:
    (1)是ReLU或Leaky ReLU的一种泛化形式,保留了取最大值的这个属性;
    (2)不会饱和、不会die;
    3、缺点:
    (1)参数个数变成了原来的两倍,因为现在既有W1还有W2,而以前仅有一个W。

  1. 总结
    1、用ReLU,但要谨慎设置学习率;
    2、也可以用Leaky ReLU或Maxout或ELU;
    3、可用tanh,但结果可能不会很好;
    4、不要用sigmoid!!!

二、数据预处理 data preprocessing

  • 一些预处理
    包括零均值化、标准化。
    在这里插入图片描述
  • 零均值化主要可以避免输入数据全为正/全为负/大部分为正/大部分为负的情况,以避免W只能沿限定的方向更新。思想类似于激活函数中zero-mean,但仅解决了第一层输入的问题。图像处理中通常只用零均值化。一般对于一个图像,可以减去其所有通道中所有像素的均值(subtract the mean image),也可以将每个通道单独算均值单独减(subtract pre-channel mean)。
  • 均值化ps:以上提到的所有像素的均值和每个通道的均值实际上对应image mean和pixel mean。
    1、image mean:读入一张彩色图像,假设是(N * N * 3),其对应的image mea也是N * N * 3,相当于把所有训练集在同一个空间位置上的像素的对应通道求了均值。
    2、pixel mean:如对R通道的pixel mean就是把训练集里面所有图片的所有R通道像素求均值,G、B通道类似,也就是不考虑空间位置了。所以求出来就是三个数值(R_mean, G_mean, B_mean)。其实就是根据通道分波把image mean再求了一次均值。
  • 标准化:使所有的特征都在相同的值域内,这样它们的贡献程度相同。但在对于图像的处理上,像素值都在差不多的范围里,因而一般不选择标准化。
  • 在训练集和测试集上都需要数据预处理。通常我们在训练集上做完零均值化,之后会把训练集上的均值应用于测试集来给测试集做同样的零均值化。
  • 一些深入理解:
    看下图,在normalization之前,数据都集中在离原点很远的地方,虽然我仍可以用一条直线把红点蓝点分开,但只要这条线稍微变化一点就会有差错。也就意味着此时的损失函数对于权重矩阵的微小扰动非常敏感。而标准化了之后,损失函数会对权重矩阵的变化更鲁棒,也就更好训练了。
    在这里插入图片描述

三、权重初始化

初始化的原则是需要打破参数对称化!!

  1. 初始化W为小的随机数
    其中np.random.randn(d1,d2,…,dn)会产生一个或一组服从“0~1”均匀分布的随机样本值,取值范围为[0, 1),不包括1。
    在这里插入图片描述
    但这种方法不适用于大型复杂网络。因为大型网络往往层数很多,而每一层的权值都是一些很小的数,那么刚开始几层的神经元的输出可能还会比较好,但随着层数加深,慢慢的这些输出都越乘越小,最后就都变成零了。而当反向传播时,这就又会导致W的梯度为0,以至于所有W都无法更新。具体解释见下:
    在这里插入图片描述

  2. 过大的初始W
    对于tanh和sigmoid这些容易饱和激活函数来说,使用过大的W会导致输入值x过大(或负的过小),这样会导致激活函数饱和,梯度流消失。
    但如果用ReLU呢?不就不会饱和了吗???这里不太懂

  3. Xavier初始化
    (这个没太懂)
    1、思想:为了使得网络中信息更好的流动,每一层输出的方差应该尽量相等。即要求每层的输入数据的方差和输出结果的方差保持一致。当输入数据个数较少时,我们希望W比较大,以维持方差一致;当输入数据个数较多时,则希望W比较小。
    2、公式:通过以上思想可以推导出计算初始权重W的公式:
    W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in)
    其中fan_in和fan_out指扇入和扇出数,代表W所对应的输入/输出层神经元的数量。
    3、特点:
    (1)这样初始化的W可以使每层神经元的输入基本为单位高斯分布(正态分布)。
    (2)这个初始化方法的前提是假设tanh激活函数始终处于激活状态,但对于ReLU函数来讲,因为它会杀死一半的神经元(把负的输入的输出值设为0),所以方差实际上是减半的。那么之前的那个公式就不能确保输入和输出的方差是一致的了。可以通过对方差多除一个2来解决这个问题。

Xavier公式的推导参考可这篇博客:https://blog.csdn.net/shuzfan/article/details/51338178

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值