Neural Network Overview
一个神经元构成(其中a=yhat):
那么,当有两层隐藏层时,具体的计算过程,是每层有每层的w和b,进行上述z[1]->a[1]->z[2]->a[2]->L的运算,其中z[1]和z[2]的输入分别为w[1],b[1]和w[2],b[2]。同样,在神经网络中,也会像逻辑回归一样,计算后向传播的da[2],dz[2],dw[2],db[2]和da[1],dz[1],dw[1],db[1]。
Neural Network Representation
隐藏层之所以叫隐藏层,是因为中间这一层节点的真实值不能被观察到。
通常,我们不包括输入层为正式层(把它叫做第0层),所以把有一层隐藏层的神经网络叫做两层神经网络。
Computing a Neural Network's Output
神经网络的计算细节简单来说是将逻辑回归的多次重复。
此时用for_loop效率很低,下面是向量化,把每层的n个节点合在一起得到:
Vectorizing
神经网络如何实现计算所有实例呢?
横着看是对不同训练样本,竖着看是不同结点。
Activation functions
在a=theta(z)这步除了sigmoid函数也能有一些其他选择。
其中的一个选择:a=tanh(z)=(e^z-e^(-z))/(e^z+e^(-z)) 是sigmoid(z)在(-1,1)范围内的移位。也可以在隐藏层a=tanh(z)而在输出层a=sigmoid(z)。
线性整流函数:a=ReLu(z)=max(0,z),此时,z<0,a=0,在实际操作中,通常只会遇到z=0.0000000001的情况。ReLu函数是目前隐藏层广为使用的函数。
另外有a=Leaky ReLu(z)=max(0.01z,z),z<0时有很小的值。
why non-linear Activation functions
若直接令a=z,则会出现
那么可以看到,输出仅仅是输入的线性变化,那么神经网络就失去了意义,相当于没有隐藏层。
当处理回归问题时,可以在输出层使用线性激活函数,这时的输出yhat,就可以为任意实数。但在隐藏层,通常不使用线性激活函数。
Derivatives of Activation functions
a=sigmiod(z): a'=a(1-a)
a=tanh(z): a'=1-a^2
a=ReLU(z): a'=0 if z<0 a'=1 if z>=0
a=Leaky ReLU(z) a'=0.01 if z<0 a'=1 if z>=0
Gradient desecent for Neural Networks
Random Intialization
为什么要把权重参数进行随机初始化呢?
如果把w1,w2,b1,b2的初始化值都设为0,那么会计算出完全相同的两个隐藏单元a1和a2,经过每次迭代后,两个隐藏单元的功能都相同,神经网络失去了意义。
那么为什么w值取得很小呢?
这样在tanh或sigmoid的激活函数时,斜率比较大,意味着初始梯度下降时步长比较大。