神经网络概览
下图所示,第一行是一个单神经元的神经网络,第二行我们是回归了logistic回归的实现流程,第三行是多个神经元的神经网络。L(a,y)是损失函数。
红框圈出的两个位置,分别代表第一层神经元,第二层神经元。
神经网络表示
只有一个隐藏层的神经网络,输入特征x1,x2,x3这是神经网络的输入层。中间四个圆圈是隐藏层,最后一个圆圈是输出层,负责输出预测值。隐藏层的数值在训练集中,我们是看不到的。这图是双层神经网络,神经网络的层数不包含输入层。
计算神经网络的输出
回归logistic回归,中间的圆圈代表了回归计算的步骤,首先计算出z,然后计算出激活函数a(sigmoid(z))。
将两层神经网络进行分析,先只看其中隐藏层的一个节点,计算过程类似于logistic回归。
这里的z1、w1、b1、a1的上标[1]表示神经网络的第一层,即隐藏层,下标1表示该层的第几个节点。z2、w2、b2、a2也是同样的。其他隐藏层的单元也是类似于这样。
下一步就是把四个z值,进行向量化,我们可以把输入的x看做a[0],其中z[1]是(4,1)的矩阵,a[1]也是四行一列的矩阵。
不同的训练样本向量化
对于单个训练样本,这个神经网络可以按照右边公式进行计算,输出预测值。
对于m个训练样本,可能需要重复计算。x(1)一直到x(m)个训练样本,中括号[2]表示神经网络的第二层,小括号(m)表示第m个训练样本。
如果想遍历所有的训练样本并计算的话,使用for循环,代码逻辑如下。
向量化就类似于在logistic回归中的对输入特征x的操作一样,存储入一个大的X矩阵。这里把Z[1] (1)一直到Z[1] (m)存储入一个大的z[1]矩阵中,a[1](1)也是同理放入A[1]中。
激活函数
对于神经网络,可以选择隐藏层用什么激活函数,输出单元用什么激活函数。除了常见的sigmoid函数(激活函数)如下图,还有其他的。
tanh()函数,如下图所示。横轴是z,纵轴是a值。
修正线性函数RElu()图像如下,横轴是z,纵轴是a,a=max(0,z),只要z为正,a就等于z,z为负,a就等于0.
选择激活函数的时候一些经验法则,如果是在做二元分类,输出预测为0或1,那么sigmoid函数很适合做输出层的激活函数,然后其他单元都用RElu()。Relu()函数还有一个版本,叫带泄露的RElu,他在z的负半轴,导数(斜率)不为0,即图像不是一条水平直线。
非线性激活函数的必要性
下图是神经网络的计算式,为什么不能去掉函数g(),即非线性函数,直接输出a=z呢,事实上,如果去掉的话,这个模型的输出y值不过就是输入特征x的线性组合了。唯一可以用线性激活函数(恒等函数)的地方通常是输出层。
激活函数的导数
对神经网络进行反向传播,即计算激活函数的斜率或者导数的时候。以sigmoid函数为例,g(z)是函数表达式,那么对g(z)求导,g‘(z)是导数表达式,然后g’(z0)就是在z0这一点的斜率。
对于tanh()函数,即双曲正切函数,其表达式和导数表达式如下。
随机初始化
对应logistic回归,随机初始化权重可以为0.对于神经网络各部分参数初始设置为0,是不可以的。
例如,对于下图中的w[1]和b[1]都设置为0,那么隐藏层的两个单元,根据计算公式,就是在做相同的工作,其结果也一样,过程也一样。是无意义的。
那么随机初始化,可以用python中的程序,比如权重矩阵w=np.random.randn((2,2))*0.01,这就将其随机初始化了一个很小的数,是2行2列的矩阵。