Part 1(三)浅层神经网络

接下来我们将学习如何实现一个神经网络

3.1 神经网络概览

概览

我们输入x和参数w,b,计算出z,然后得到a(同时输出y hat),最后可以计算损失函数L。
可以把很多sigmoid单元堆叠成一个神经网络。
Part 1(三)浅层神经网络

神经网络的表示

方括号是表示第几层的数据,输入层是第0层,不把输入层看作标准层,因此下图是两层的
Part 1(三)浅层神经网络

神经网络的计算

上标表示第几层,下标表示该层中的第几个元素,(z1…z4对应了隐藏层中的4个不同的元素,共同组成了第一层的z[1])。
中间的圆圈包含了两个步骤,第一步计算出第一层 z的值(需要用到第一层的w值和第一层的b值),然后计算出第一层的a;接下来将第一层的a作为第二层的输入,接着用第二层的w和b,计算出第二层的a;以此类推。
Part 1(三)浅层神经网络
Part 1(三)浅层神经网络
Part 1(三)浅层神经网络

3.2 多个例子中的向量化

例子

首先是上面讲到的计算z[1],z[2],a[1],a[2]的4条公式,对于输入的特征向量x,对于单个训练样本,你可以用它们生成一个a[2]=y hat。现在如果你有m个训练样本,x(i)表示第i个样本,求出来的结果是a[2] (i) = y hat(i),这里没有向量化的实现,所以,我们用一个for i=1 to m,来遍历m个样本,然后基本实现这4个方程。
Part 1(三)浅层神经网络

然后尝试将这个过程向量化,首先我们将m个样本堆叠成一个矩阵,然后我们需要计算的是下图右边蓝色字部分的那几条公式(z[1]是m个列向量堆叠成的,如下)。对于A[1],竖着扫下来,第一列上的是第一个样本的第1到n个隐藏单元(其实也对应着不同的特征),横着扫每行是第1到m的样本。
Part 1(三)浅层神经网络

向量化实现的解释

第一行,是计算1,2,3样本的z[1],为了方讲述,我们将b变成0。
w[1]是一列向量,计算出w[1]*x(i)我们会得到一些列向量,当w[1]X我们会得到 w[1]x(i)合并起来的一个矩阵,得到z[1]。
Part 1(三)浅层神经网络

Part 1(三)浅层神经网络

3.3**函数

有什么**函数

目前为止,我们用的**函数都是sigmoid**函数,其实还有很多函数效果很好的,我们来看看其他函数:
比如g(z),g(z)可以是非线性函数,不一定是sigmoid函数(between 0 and 1)。有其他函数做的比sigmoid函数好,比如tanh函数(-1 to 1),tanh函数几乎比sigmoid函数都好用,一个例外是输出层,如果y是0或1(做二分类问题时),y hat介于0-1更加合理,这是可以在输出层用sigmoid函数,然后不同层的**函数可以不一样。
然而,对于sigmoid和tanh函数都有一个缺点,就是但z非常大或者非常小的时候,这个函数的倒数或者斜率就会很小接近于0,会拖慢梯度下降的速度。
然后一个比较受欢迎的工具是,修正线性单元(ReLU),公式是a=max(0,z),所以只要z是正数,导数就是1,z为负数导数为0。 如果你不确定隐藏层用什么**函数,你可以选择用ReLU,实际用应用也很多。
ReLU还有另一个版本,叫做带泄露的ReLU函数,就是当z是负数的时候是一条缓慢的斜线,实际上这个理论上来说会比ReLu好,但是实际中并没有那么多人应用。
Part 1(三)浅层神经网络

为什么需要**函数

如果我们去掉**函数就相当于在做线性函数计算,会有下面的形式,输出的结果只是将输入的数据再组合然后输出,所以如果没有**函数,无论你的神经网络有多少层,都只是一直在计算线性**函数,所以不如直接去掉所有的隐藏层。如果你输出的y是一个实数,那么用线性函数去算是可以的,所以唯一能用线性**函数的通常就是输出层。
Part 1(三)浅层神经网络

**函数的导数

Part 1(三)浅层神经网络
Part 1(三)浅层神经网络
Part 1(三)浅层神经网络

  • 再把forward propagation 和back propagation的过程列一遍
    Part 1(三)浅层神经网络

3.4 随机初始化

一般权重会设比较小的数,如0.01,但是不用0
Part 1(三)浅层神经网络
Part 1(三)浅层神经网络