deeplearning.ai 吴恩达网上课程学习(五)——浅层神经网络理论学习
本文主要来讲解包含一个隐藏层的神经网络结构及其原理。
本文参考链接: https://www.missshi.cn/api/view/blog/59a6ad67e519f50d040000e5
1.概念初识:
之前逻辑回归的模型:
一个包含隐藏的神经网络的网络结构:
2.神经网络的表示:
其中,x1,x2,x3表示其输入层,中间的四个圆圈则表示隐藏层,最后的一个节点是其输出层。而隐藏层数据是我们无法知道而需要进行训练学习的。对于上述网络结构而言,我们称其为一个两层的神经网络。(输入层不包含在内)
3.神经网络的前向传播计算:
第一个隐藏层神经元的计算逻辑:
第二个隐藏层神经元而言,计算逻辑相同:
其中,对于ai[l]而言,l表示它是在第l层,而i则表示它是该层的第i个节点,对于w和b而言,符号表示的含义相同。
4.训练样本的矢量化:
此时w是(m,3)的矩阵,x是(3,n)的矩阵,b是(m,1)的矩阵,在与wx相加时有广播效果,最后得到z(m,n)的矩阵。其中m是隐含层层数,n是样本个数。
5.**函数:
对于隐藏层和输出层而言,我们通常会选择一个**函数用于对其输出进行处理。
之前我们接触的**函数都是sigmod函数,但实际上,还有一些可能更好用的**函数。例如tanh函数通常会比sigmod函数用更好的性能。
tanh作为**函数优点:由于其平均值更接近于0,可以起到中心化的作用,通常更有利用算法优化。
特殊情况:二分类问题输出层的**函数,由于我们仅希望对其进行是否判断,其实更类似于0,1判断,此时选择sigmod函数是一个更加合理的选择。除二分类输出层外,几乎不使用:
sigmod函数和tanh函数共同的问题:当输入变量特别大或者特别小时,斜率非常小,此时并不利于梯度下降法进行学习。
在机器学习中,一个非常常用的**函数叫做ReLU函数(修正线性单元函数)。(推荐)
6.**函数不选择线性函数的原因
若**函数选择线性函数,线性函数作用到线性函数上,结果还是线性函数,也就是说,无论最终有多少隐藏层,得到的最终输出结果仍然是输入的线性组合。(很简单,不会推导的参看原文)
7. **函数求导:
① sigmod函数:
Ps:在后续的文章中,我们会使用g'(z)来表示dg(z)/dz。
② tanh函数
③ ReLU函数
当z=0时,ReLU函数的导数不存在,不过这个并不重要,我们可以假设其导数也是1即可。
④ Leaky ReLU函数:
7. 梯度下降法:
接下来,就让我们继续来看一个两层的神经网络吧:
8.参数为什么要随机初始化:
参数初始化一个常用的原则是:使用较小的随机数来对参数进行初始化。
① 为什么不能使用一个固定参数(例如0)来对神经网络进行初始化。
② 实际初始化过程:
③ 为什么要乘以一个小系数