神经网络基础——由浅入深

1.神经网络的表示

直观上看,神经网络就是多层非线性单元(例如sigmoid单元)堆叠而成的。

我们以双层神经网络(加上输入层是三层)为例,描述神经网络的表示记号。中括号[ ]表示和layer相关,如下图所示:

2.神经网络的输出的计算过程

针对单个样本的向量化神经网络的计算过程,是将各个节点竖向堆叠到各行上。如图所示:


综合两层的计算过程,如下图所示:


其中,W向量维数的规律是:行数为所在层的节点数,列数为前一层的节点数

b向量和z向量维数的规律是:行数为所在层的节点数,列数恒为1.

3.多个样本(训练集上)的计算过程

通过把训练样本堆叠到各列上,我们定义出了X矩阵,Z矩阵和A矩阵


得到双层神经网络的前向传播的向量化表示:


也就是只需要简单的四行代码,就可以计算出双层神经网络的输出。这里面使用到了python中广播这一原理,因为b是个向量,矩阵加上向量的操作使用了广播这一特性。

4.激活函数

当你在搭建多层神经网络的时候,可以选择在隐层和输出层使用不同于sigmoid函数的其它激活函数。

一个经验是:基本上不使用sigmoid激活函数了,除非输出层是二元分类。

1.双曲正切函数tanh(更优越)


为什么更加优越:因为tanh的输出范围在-1和1之间,平均值为0,有类似数据中心化的效果。使得下一层的学习效果更好。

sigmoid和tanh都有一个缺点:当z十分大或者十分小的时候,激活函数斜率接近于0,这样会拖慢梯度下降算法。

2.修正线性单元ReLU(最常用)


    PReLU中的ai是根据数据变化的;作者称,在ImageNet分类(2015,Russakovsky等)上,PReLU是超越人类分类水平的关键所在。

    Leaky ReLU中的ai是固定的;

    RReLU中的aji是一个在一个给定的范围内随机抽取的值,这个值在测试环节就会固定下来。

sigmoid和tanh 是“饱和激活函数”,而ReLU及其变体则是“非饱和激活函数”。使用“非饱和激活函数”的优势在于两点:
    1.首先,“非饱和激活函数”能解决所谓的“梯度消失”问题。

    2.其次,它能加快收敛速度。

5.为什么不用线性激活函数(恒等激活函数)

如果使用线性激活函数,那么输出y帽子(hat)将是输入特征x的线性组合。线性隐层一点用都没有,不如直接去掉。除非你引入了非线性激活函数,才能产生更有趣的函数。

只有一个地方可以使用,就是回归问题的输出层,输出一个实数。

6.激活函数的导数

在计算神经网络的反向传播的过程中,大量的涉及了激活函数的导数及链式法则:


7.正向传播与反向传播

!

8.神经网络中的梯度下降

!

9.随机初始化

在logistic回归中,可以对参数初始化为0,但是在神经网络中将参数初始化为0,那将完全无效。

那样的话,dw将是一行一行的形式,同一层的neuron之间无差别。

初始化参数比较小最好,那样避免激活函数处于饱和状态,以致梯度下降比较慢。

猜你喜欢

转载自blog.csdn.net/sinat_28520127/article/details/81042334