激活函数的导数(Derivatives of activation functions)
在神经网络中使用反向传播的时候,你真的需要计算激活函数的斜率或者导数。
针对以下四种激活,求其导数如下:
1)sigmoid activation function
其具体的求导如下(如果你学过微积分,那么这个求导对于你来说其实并不难):
公式1:
注:
当z = 10或z=-10 d/dz g(z)≈0
当z= 0 d/dz g(z)=g(z)(1-g(z))=1/4
在神经网络中
a=g(z);
g(z)'=d/dz g(z)=a(1-a)
2) Tanh activation function
其具体的求导如下:
公式2: g(z)=tanh(z)=(e^z-e^(-z))/(e^z+e^(-z) )
在神经网络中;
3)Rectified Linear Unit (ReLU)
g(z)=max(0,z)
注:通常在z= 0的时候给定其导数1,0;当然z=0的情况很少
4)Leaky linear unit (Leaky ReLU)
与ReLU类似
注:通常在z=0的时候给定其导数1,0.01;当然z=0的情况很少
神经网络的梯度下降(Gradient descent for neural networks)
下面会给你实现反向传播或者说梯度下降算法的方程。
你的单隐层神经网络会有W^([1]),b^([1]),W^([2]),b^([2])这些参数,
还有个n_x表示输入特征的个数,n^([1])表示隐藏单元个数,n^([2])表示输出单元个数。
在我们的例子中,我们只介绍过的这种情况,那么参数:
矩阵W^([1])的维度就是(n^([1]),n^([0])),
b^([1])就是n^([1])维向量,可以写成(n^([1]),1),就是一个的列向量。
矩阵W^([2])的维度就是(n^([2]),n^([1])),
b^([2])的维度就是(n^([2]),1)维度。
你还有一个神经网络的成本函数,假设你在做二分类任务,那么你的成本函数等于:
Cost function:
公式2:
loss function和之前做logistic回归完全一样。
训练参数需要做梯度下降,在训练神经网络的时候,随机初始化参数很重要,而不是初始化成全零(对的,如果全部初始化成0,这个就和我们之前说的那个为什么用非线性激活函数一个道理,其实都没有什么意义了,因为大家都是0)。当你参数初始化成某些值后,每次梯度下降都会循环计算以下预测值:
公式3: dW^([1])=dJ/(dW^([1]) ),db^([1])=dJ/(db^([1]) )
公式4: dW^([2])=dJ/(dW^([2]) ),db^([2])=dJ/(db^([2]) )
其中
公式5: W^([1])⟹W^([1])-adW^([1]),b^([1])⟹b^([1])-adb^([1])
公式6: W^([2])⟹W^([2])-adW^([2]),b^([2])⟹b^([2])-adb^([2])
正向传播方程如下(之前讲过):
forward propagation:
(1) z^([1])=W^([1]) x+b^([1])
(2) a^([1])=σ(z^([1]))
(3) z^([2])=W^([2]) a^([1])+b^([2])
(4) a^([2])=g^([2]) (z^([z]))=σ(z^([2]))
反向传播方程如下:
back propagation:
dW^([1])=1/m dz^([1]) x^T
((db^([1]))┬⏟)┬((n^([1]),1))=1/m np.sum(dz^([1]),axis=1,keepdims=True)
上述是反向传播的步骤,
注:这些都是针对所有样本进行过向量化,Y是1×m的矩阵;
这里np.sum是python的numpy命令,
axis=1表示水平相加求和,
keepdims是防止python输出那些古怪的秩数(n,),加上这个确保阵矩阵db^([2])这个向量输出的维度为(n,1)这样标准的形式。
目前为止,我们计算的都和Logistic回归十分相似,但当你开始计算反向传播时,你需要计算,是隐藏层函数的导数,输出在使用sigmoid函数进行二元分类。
这里是进行逐个元素乘积,因为W^([2]T) dz^([2])和(z^([1]))这两个都为(n^([1]),m)矩阵;
还有一种防止python输出奇怪的秩数,需要显式地调用reshape把np.sum输出结果写成矩阵形式。
以上就是正向传播的4个方程和反向传播的6个方程