Neural Networks and Deep Learning-Week3:Shallow neural networks
Shallow Neural Network
1. Neural Networks Overview:神经网络概述
新符号的引入,将介绍如何实现神经网络

2. Neural Network Representation:神经网络表示
输入层,隐藏层,输出层,上标的含义,双层神经网络(不包括输入层在内,隐藏层是第一层)

3. Computing a Neural Network's Output:计算神经网络的输出
探究神经网络是如何计算出来的,已知单个训练样本时计算神经网络的预测隐藏层中间计算结果作为输出层的输入进行下一步的计算
单层神经网络到双层神经网络的推导

双层神经网络的表达式:非向量方式和向量化方式
 
      
推导过程如下
- ------单个神经元:

- ------第一层的神经元:[1]表示的是第一层,wj,k 表示的是第j个隐藏单元的第k个参数w

- ------向量化:

- ------第二层的神经元:

最终:

4. Vectorizing across multiple examples:多个样本的双层神经网络的向量化
将不同训练样本向量化,横向扫描的是训练样本,纵向扫描的是隐藏单元
m个样本时:
 
                    
写成向量的形式:横向是样本数,纵向是隐藏单元数,即第[1]层有n个隐藏单元,共有m个样本

最终结果如下:m个样本的向量化:

5. Explanation for Vectorized Implementation:向量化实现的解释
证明多样本向量化的正确性,以双层网络为例,同上的推导过程
6. Activation functions:激活函数
神经网络的每一层都可以使用不同的激活函数:
Sigmoid函数


- σ:取值范围在(-1,1)使平均值接近0.5,在二分类输出层时用σ激活函数更好因为取值在0-1之间,Sigmoid函数是深度学习领域开始时使用频率最高的activation function。它是便于求导的平滑函数
- 容易出现gradient vanishing:
- 
优化神经网络的方法是Back Propagation,即导数的后向传递:先计算输出层对应的loss,然后将loss以导数的形式不断向上一层网络传递,修正相应的参数,达到降低loss的目的。 Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新,神经网络无法被优化。原因在于两点:(1) 在上图中容易看出,当中较大或较小时,导数接近0,而后向传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近0 (2) Sigmoid导数的最大值是0.25,这意味着导数在每一层至少会被压缩为原来的1/4,通过两层后被变为1/16,…,通过10层后为1/1048576。请注意这里是“至少”,导数达到最大值这种情况还是很少见的。
- 函数输出并不是zero-centered:
- 
Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。举例来讲,对,如果所有均为正数或负数,那么其对的导数总是正数或负数,这会导致如下图红色箭头所示的阶梯式更新,这显然并非一个好的优化路径。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。
- 幂运算相对来讲比较耗时
- 相对于前两项,这其实并不是一个大问题,我们目前是具备相应计算能力的,但面对深度学习中庞大的计算量,最好是能省则省 :-)。之后我们会看到,在ReLU函数中,需要做的仅仅是一个thresholding,相对于幂运算来讲会快很多
tanh函数


- tanh:取值范围在(0,1).使数据的平均值接近0
- 解决了zero-centered的输出问题,然而,gradient vanishing的问题和幂运算的问题仍然存在。

观察这两种激活函数,不难发现,在激活函数的两侧由于斜率很小接近零,就拖慢了梯度下降法的速度,
ReLU函数


- ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient
- 解决了gradient vanishing问题 (在正区间)
- 计算速度非常快,只需要判断输入是否大于0
- 收敛速度远快于sigmoid和tanh
ReLU也有几个需要特别注意的问题:
- ReLU的输出不是zero-centered
- Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
Leaky ReLU函数


人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为而非0。另外一种直观的想法是基于参数的方法,即Parametric ReLU:,其中可由back propagation学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU,特点是当z为负值的时候会有很平缓的斜率
ELU (Exponential Linear Units) 函数


ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:
- 不会有Deal ReLU问题
- 输出的均值接近0,zero-centered
它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。
7. Why do you need non-linear activation functions?:为什么需要非线性激活函数
神经网络中为什么需要激活函数
如果不使用激活函数或者使用线性激活函数或者恒等激活函数,那么神经网络只是将输入特征x的线性组合之后再输出
	但是如果神经网络预测是一个回归问题,比如房价问题,那么就可以使用线性激活函数
8. Derivatives of activation functions:激活函数的导数
激活函数的导数上面提到的几种激活函数的导数定义,参考第6小节
9. Gradient descent for Neural Networks:神经网络的梯度下降法
神经网络的梯度下降法
参数维度

正向传播方程

反向传播方程

10. Backpropagation intuition (optional)
11. Random Initialization
全部初始化为0是不行的,如果很大也不好,速度慢初始化参数一般取很小
12. Ian Goodfellow interview
    http://www.cnblogs.com/makexu/

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号