神经网络概览

下图是最基本的神经网络——双层神经网络(输入层一般不看做一个标准的层)。

神经网络堆积ai 神经网络tanh_激活函数

表示方法:

神经网络堆积ai 神经网络tanh_神经网络_02


神经网络堆积ai 神经网络tanh_激活函数_03

计算过程:

首先计算a^[1]层的第一个单元

神经网络堆积ai 神经网络tanh_神经网络堆积ai_04


对剩下的三个单元继续计算,最终计算结果如下

神经网络堆积ai 神经网络tanh_神经网络_05


最终得到

神经网络堆积ai 神经网络tanh_神经网络堆积ai_06


向量表示

神经网络堆积ai 神经网络tanh_梯度下降_07

多个不同样本的向量化:

未向量化时

神经网络堆积ai 神经网络tanh_神经网络_08


有一个for循环,计算速度较慢。

向量化时

神经网络堆积ai 神经网络tanh_神经网络_09


神经网络堆积ai 神经网络tanh_深度学习_10

激活函数:

神经网络堆积ai 神经网络tanh_激活函数_11


神经网络堆积ai 神经网络tanh_深度学习_12


使用tanh(z)函数比sigmoid函数效果要好,因为它有数据中心化效果(数据平均值接近于0),可以让下一层学习更方便。

各种激活函数的优缺点以及如何选择:

神经网络堆积ai 神经网络tanh_神经网络堆积ai_13


sigmoid函数

(1)函数输出不是以0为中心的。我们更偏向于当激活函数的输入是0时,输出也是0的函数。

(2)当z非常大或非常小时,导数接近于0,梯度下降速度很慢。

由于sigmod函数梯度下降慢,因此我们一般不用sigmoid函数作为激活函数。

tanh函数

(1)优点:数据平均值接近于0,方便下层学习计算。

(2)缺点:存在梯度下降慢的问题。

一般二分类问题中隐藏层用tanh函数;输出层用sigmoid函数。

Relu(修正线性单元)函数

(1)优点:激活函数斜率与0相差比较大,因此学习速度快。

(2)缺点:当z为负时,导数为0,梯度下降慢。(实际上大部分时候z都是大于0的)

在不确定用哪个激活函数时,一般选用Relu函数,因为它比上面两者速度都快。

实际选择时,多测试几种不同选择,以找到最适合该问题的激活函数。

为何选用非线性激活函数:

若激活函数是线性的,则有

神经网络堆积ai 神经网络tanh_神经网络堆积ai_14


这显然是无意义的。

一般在回归问题(例如预测房价)中输出层用线性激活函数,其他地方一般不用。

激活函数的导数:

神经网络堆积ai 神经网络tanh_神经网络_15

神经网络中的梯度下降:

正向传播

神经网络堆积ai 神经网络tanh_神经网络堆积ai_16


反向传播(求导)

神经网络堆积ai 神经网络tanh_激活函数_17


其中g函数是sigmoid激活函数; -np.sum 是求维度之和;axis= 1 是矩阵的水平求和;keepdims=True 是确保结果输出的是一个矩阵,而不是秩为1的数组。若不用keepdims=True,则可以调用reshape命令。

随机初始化:

初始化时,不能所有的参数都初始化为0.

一般有

神经网络堆积ai 神经网络tanh_深度学习_18


式子(1)中用0.01而不是100/1000的原因:

若使用tanh激活函数或者sigmoid函数,权重太大,则w太大,则z太大,最终导致导数接近于0,梯度下降很慢。

浅层神经网络用0.01可以,但是深层神经网络得换个权重。但是一般都很小。