多个例子中的向量化
其中a[2](i),表示2表示第2层神经网络。i表示第i个训练样本。
故我们可以将左边,使用循环对数值计算的神经网络,转化成右侧向量化计算。
可以看出输入特征为几维,则输出特征为几维。
激活函数
tanh激活函数性能,优于sigmod激活函数。但是,如果分类为一个二分类问题,建议使用sigmod函数。因为其输出的区间,在0,1区间中。
更建议使用ReLu激活函数,其在0到正无穷的区间中,梯度之间差距很大。不会形成sigmod和tanh无穷大或无穷小点收敛缓慢。
对于ReLu在负无穷到0区间中,其梯度为0的问题。我们采用新的Leaky ReLu激活函数。也就是在负无穷到0区间中,其函数图像缓慢下降。
问题:
ReLu激活函数在负无穷到0区间中,梯度很小,可能导致收敛变慢
解答:
对于我们的训练集中,一般正样本的个数要远远多于负样本的个数。故,在0到正无穷区间中的梯度,更能决定整个数据集上的训练速度。
为什么需要非线性激活函数
加入我们使用线性的激活函数,其推导如下:
我们可以看到,最后a[2]=W’ x + b ’ 的形式。也就是不管经过多少层采用线性激活函数的神经网络,其最后输出的结果也一定是线性的。故我们无需使用神经网络,使用一般编程即可达到线性的参数效果。即,神经网络中多少层的隐含层都是没有意义的。其多层神经网络和单层神经网络的效果相同。
只有在小众的,房价预测(回归问题)或压缩算法中,我们才使用线性激活函数。
激活函数的导数
神经网络的梯度下降法推导
注意:
对于反向传播dZ[1] = W[2]T dz[2] 乘号 g[1]’ … 此处乘号为element wise-product,按元素一个一个相乘
直观理解反向传播
da=dL(a,y)/da
dz=da · g’(z)
∂L/∂z = ∂L / ∂a ` da / dz (da / dz = d g(z) / dz = g‘(z))
反向传播计算:da[2] , dz[2] , dw[2] , db[2] , da[1]^ , dz[1]^ , dw[1]^ , db[1]
注意看如图左下角,各个矩阵的维度
dW[2] = dz[2] a[1]T
dW[1] = dz[1] xT (其中x等于a[0])
矩阵化梯度下降
随机初始化
假如我们初始化采用相同的参数W,b,就会产生神经网络的对称现象。
即,a1[1] = a2[1]
dz1[1] = dz2[1]
每一层每一个节点算出来的值,都与同层的节点的数值一样,故没有了意义
我们采用随机初始参数W,b来解决问题。
注意:
此时W[1] = np.random . randn (2,2) * 0.01 (此处乘0.01 是为了防止w很大,即导致z很大。从而使用sigmod激活函数时,其很难收敛)