【深度学习】初识神经网络
神经网络的表示
一个简单的两层神经网络如下图所示,每个圆圈都代表一个神经元,又名预测器。
一个神经元的计算详情如下。在我们原本输入的变量x的基础上,还有权重w和偏置b;在计算z过后,再将其带入sigmoid激活函数,得到a;如果神经元所在的层为最后一层,便可进行损失函数的计算,在进行前向传播。
如果神经元所在的层并非最后一层,需要进行重复的z、a计算。右上角括号内的数字,代表在神经网络中所处的层数。
下面是神经网络各个层的表示,以单隐藏层/双层神经网络为例:
在神经网络的表示中,可以看到一个神经元的处理包括两个步骤,第一个是输出z,第二个是输出a。我们可以得到详细的符号表示:
我们可以将一个训练样本的参量进行堆叠,形成一个矩阵:
最终可以转换为矩阵的运算:
多个样本的向量化
当拥有m个训练样本时,我们需要一个for循环进行计算。为了减少计算量,我们可以将for循环通过向量化的方式进行替代。其中,方括号中的数字代表的是所处的层数,圆括号中的数字代表的是第几个训练样本,对于一个a[1](1)或者是一个z[1](1)这样一个列向量,第一行为第一个隐藏单元,第二行为第二个隐藏单元。
更详细地来说,我们有m个样本,不使用矩阵的表示形式,我们需要进行for循环,依次进行第一个样本到第m个样本的遍历。其中,x(i)代表的是第i个样本的参数矩阵[x1, x2, x3];W[1]的矩阵大小为4x3(4行3列),每一列都对应一个神经元,每一行都代表对应参数的权重值。
激活函数
各类激活函数
sigmoid激活函数适用范围较窄,通常在二元分类的输出层使用,因为在其他场景下,tanh比sigmoid更好用。如果不知道使用什么激活函数,就采用ReLu激活函数,也可以尝试一下Leaky ReLu(ReLu的改进版)。
对于sigmoid和tanh激活函数来说,导数的梯度,函数的斜率可能会随着z的增大或减小而减小。而ReLu函数,a=max(0,z),将会解决这一问题。通常情况下,我们只会在二元分类的输出输出层使用sigmoid。如果不知道隐藏层使用什么激活函数,就使用修正线性单元(ReLu)但是当当z为负的时候,导数为0,为了避免这个缺点,Leaky ReLu出现了,当z为负的时候拥有一个很小的斜率值。
为什么需要非线性激活函数
事实证明,要让神经网络计算出有趣的函数,我们不得不使用非线性激活函数。如果使用一个线性激活函数和一个sigmoid激活函数,其计算复杂度与一个logistic回归函数是相同的。而两个线性函数的组合,与一个线性函数无异。
激活函数的导数
当对神经网络进行前向传播的时候,需要进行导数或者斜率的计算。