01 神经网络概览
- 在这里用[ l ]来表示神经网络的第l层,用来跟( i )表示的第几个训练样本做区分。神经网络需要反复的计算z和a。
02 神经网络表示
- 只有一个隐藏层的神经网络:分为输入层、隐藏层、输出层。其中输入层和输出层的值都是在训练集中能看到的,隐藏层的值不能看到。在计算神经网络层数时是不算输入层的,同时我们使用a ^ [ l ]_i表示符号,a也代表激活的意思,它意味着网络中不同层的值会传递给后面的层,即每一层都会产生激活值,我们将这些激活值用a ^ [ l ]_i表示(l表示第几层,下标i表示层中的第几个节点)。在本例中w参数是(4,3)维的,其中4代表四个隐藏单元,3代表有三个输入特征
03 计算神经网络的输出
神经网络的输出究竟是如何算出来的
- 这里的圆圈代表逻辑回归计算的两个步骤,神经网络只不过是计算这些步骤很多次(隐藏层的每一个节点都计算一次)。
- 下面把这四个等式向量化:向量化时的一条经验法则就是当我们在一层中有不同的节点,那就纵向的堆叠起来(例如a^ [1]就是a^ [1] _1~a^ [4] _ 4这些激活值的堆叠)。
- 计算出四个隐藏层中的逻辑回归单元使用的是前两个等式,计算出输出层的逻辑回归用的是后两个等式
04 多个例子中的向量化
- 对于新的符号a^ [2] (i):这个i表示训练样本i。下面是没有向量化的实现并且想要计算所有训练样本的预测:
- 下面将for循环变成向量化实现:将这些向量横向堆叠起来。
- 总结一下就是横向堆叠对应的是不同的训练样本,竖向堆叠的是不同的输入特征(也就是一层中不同的节点)。
05 向量化实现的解释
- 为什么z^ [1]=w ^ [1]x+b^ [1]?
- 如果将输入成列向量堆叠,那么在方程运算之后,也能得到成列对堆叠的输出。右上图是在单个训练样本中实现正向传播算法就是从1循环到m,右下图第一行代码可以对所有m个例子同时向量化,类似的右下图这四行代码都是上面四行代码正确的向量化形式。
06 激活函数
搭建神经网络,你可以选择在隐藏层用哪个激活函数,在输出层用哪个激活函数。
- 一些其他的激活函数:【1】tanh函数(双曲正切函数)范围在-1到1之间。如果让函数g(z)=tanh(z),这几乎总比sigma函数效果好,因为现在函数输出介于-1和1之间,激活函数的平均值就更接近0。使用tanh也有类似数据中心化的效果,使得数据的平均值接近0而不是0.5,这使得下一层的学习更方便。几乎tanh函数在所有场合都适用,但是在输出层例外,因为如果输出层y是0或1,那么肯定要介于0和1之间,于此同时在二元分类就可以使用sigma函数作为输出层了。tanh函数和sigma函数都有一个缺点:当z特别大或者特别小时,函数的斜率可能就很小,这样会拖慢梯度下降算法。【2】ReLU函数(修正线性单元),ReLU的好处在于对很多z空间激活函数的斜率和0差很远。在实践中使用ReLU函数,你的神经网络的学习速度通常会比使用tanh或者sigma激活函数快很多,主要是ReLU没有这种斜率接近0时减慢学习速度的效应。
- 选择激活函数的经验:如果在做二元分类,输出值是0和1,那么选择sigma函数作为输出层的激活函数,然后其他所有单元都用ReLU。一般不使用sigma函数,因为tanh函数比他更适用,ReLU是默认的激活函数,不知道选谁就选它。如果实在不知道选择哪个激活函数,就在验证集或者开发集上跑跑,看看哪个效果好就选择哪个。
- 下面是四种激活函数(最后一个是ReLU的特殊形式叫做带泄露的ReLU)
07 为什么需要非线性激活函数?
要让你的神经网络能够计算出有趣的函数就必须使用非线性激活函数。
- 如果使用线性激活函数或者叫恒等激活函数,那么神经网络只是把输入线性组合再输出。线性隐层一点用都没有,只有一个地方可以使用线性激活函数g(z)=z,就是你的机器学习是回归问题的输出层。
08 激活函数的导数
当对神经网络使用反向传播的时候,你需要计算激活函数的斜率或者说导数
09 神经网络的梯度下降法
- 输入层有n^ [0]个,隐层有n^ [1]个,输出层有n^ [2]个,还有一个神经网络的成本函数,在二元分类的情况下,成本函数就是1/m对损失函数求平均。要训练参数,算法就需要做梯度下降,在训练神经网络时随机初始化参数很重要,而不是全部初始化为0。
- 针对于所有样本的前向传播和后向传播:keepdims就是防止python直接输出秩为1的数组((n,)),确保python输出的是矩阵((n,1))。*代表逐个元素乘积。
10 直观理解反向传播
- 双层神经网络:实现后向传播算法有个技巧,你必须确保矩阵的维度互相匹配。
11 随机初始化
对于逻辑回归可以将权重初始化为0,但是如果将神经网络的各参数数组全部初始化为0,再使用梯度下降算法将会完全无效
- 如果将w所有值初始化为0,那么因为两个隐藏单元最开始就在做同样的计算,对输出单元的影响也一样大。那么一次迭代之后,同样的对称性依然存在,两个隐藏单元依然是对称的。无论你神经网络训练多久,两个隐藏单元依然在计算完全一样的函数,所以这种情况多个隐藏单元是没有意义的。当然对多个隐藏单元也适用。
- 因此解决这个问题就要随机初始化,通常喜欢将权重初始化成很小的数,因此乘一个0.01(深层就要乘一个0.01以外的数)。因为当使用tanh和sigma激活函数时,如果权重过大就会落到斜率平缓处,导致学习缓慢。
|