在吴恩达深度学习视频以及大树先生的博客提炼笔记基础上添加个人理解,原大树先生博客可查看该链接地址大树先生的博客- ZJ
CSDN:http://blog.csdn.net/junjun_zhao/article/details/79228114
3.1 Neural Networks Overview (神经网络概览)
- ,我们会使用新的符号,上标 方括号 1,表示与这些节点相关的量,所谓的“层”
- 上标 表示,第 个训练样本, 圆括号是用来表示单个训练样本的。
- 在神经网络中我们要做多次计算,反复计算 z 和 a,反复计算 a 和 z,最后计算损失函数。
3.2 Neural Network Representation (神经网络表示)
简单神经网络示意图:
神经网络基本的结构和符号可以从上面的图中看出,这里不再复述。
主要需要注意的一点,是层与层之间参数矩阵的规格大小:
-
输入层和隐藏层之间
:前面的 4 是隐层神经元的个数,后面的 3 是输入层神经元的个数;
:和隐藏层的神经元个数相同; -
隐藏层和输出层之间
:前面的 1 是输出层神经元的个数,后面的 4 是隐层神经元的个数;
:和输出层的神经元个数相同;
隐藏层”的含义是,在训练集中这些中间节点的真正数值,我们是不知道的,训练集中只能看到 输入值和输出值,但是隐藏层中的值,是无法看到的,这就是所谓的“隐藏层”,只是表示你无法在训练集中看到。
由上面我们可以总结出,在神经网络中,我们以相邻两层为观测对象,前面一层作为输入,后面一层作为输出,两层之间的 w 参数矩阵大小为 ,b 参数矩阵大小为 ,这里是作为 的线性关系来说明的,在神经网络中, 。
在 Logistic regression 中,一般我们都会用 来表示参数大小,计算使用的公式为: ,要注意这两者的区别。
一个双层神经网络 (2 layer NN )是,只有一个隐藏层的神经网络。
3.3 Computing a Neural Networks’s Output (计算神经网络的输出)
计算神经网络的输出
除输入层之外每层的计算输出可由下图总结出:
其中,每个结点都对应这两个部分的运算,z 运算和 a 运算。
在编程中,我们使用向量化去计算神经网络的输出:
在对应图中的神经网络结构,我们只用 Python 代码去实现右边的四个公式即可实现神经网络的输出计算。
3.4 Vectorizing across multiple examples (多个例子中的向量化)
3.5 Explanation for Vectorized implementation (向量化实现的解释)
Recap:
向量化实现
假定在 m 个训练样本的神经网络中,计算神经网络的输出,用向量化的方法去实现可以避免在程序中使用 for 循环,提高计算的速度。
下面是实现向量化的解释:
由图可以看出,在 m 个训练样本中,每次计算都是在重复相同的过程,均得到同样大小和结构的输出,所以利用向量化的思想将单个样本合并到一个矩阵中,其大小为 ,其中 表示每个样本输入网络的神经元个数,也可以认为是单个样本的特征数,m 表示训练样本的个数。
通过向量化,可以更加便捷快速地实现神经网络的计算。
3.6 Activation functions (激活函数)
Recap:
激活函数的选择
几种不同的激活函数 :
sigmoid:
- 导数:
tanh:
- 导数:
ReLU(修正线性单元):
Leaky ReLU:
激活函数的选择:
函数和 函数比较:
隐藏层: 函数的表现要好于 函数,因为 取值范围为[−1,+1],输出分布在 0 值的附近,均值为 0,从隐藏层到输出层数据起到了归一化(均值为 0)的效果。
输出层:对于二分类任务的输出取值为 {0,1},故一般会选择
函数。
然而
和
函数在当
很大的时候,梯度会很小,在依据梯度的算法中,更新在后期会变得很慢。在实际应用中,要使
尽可能的落在 0 值附近。
弥补了前两者的缺陷,当 z>0 时,梯度始终为 1,从而提高神经网络基于梯度算法的运算速度。然而当 z<0 时,梯度一直为0,但是实际的运用中,该缺陷的影响不是很大。
保证在 z<0 的时候,梯度仍然不为 0。
在选择激活函数的时候,如果在不知道该选什么的时候就选择 ,当然也没有固定答案,要依据实际问题在交叉验证集合中进行验证分析。
3.7 Why do you need non-linear activation functions? (为什么需要非线性激活函数?)
线性激活函数 术语: 恒等激活函数
如果你要用线性激活函数,或者叫恒等激活函数,或者如果没有激活函数,那么神经网络只是把输入线性组合再输出,那么无论你的神经网络有多少层,一直在做的只是计算线性激活函数,所以不如直接去掉全部隐藏层,所以使用线性激活函数是没有用的。
唯一可以用线性激活函数的地方,通常就是输出层。
3.8 Derivatives of activation functions (激活函数的导数 )
sigmoid:
- 导数:
tanh:
- 导数:
ReLU(修正线性单元):
Leaky ReLU:a=
激活函数的选择:
函数和 函数比较:
隐藏层: 函数的表现要好于 函数,因为 取值范围为[−1,+1],输出分布在 0 值的附近,均值为 0,从隐藏层到输出层数据起到了归一化(均值为 0)的效果。
输出层:对于二分类任务的输出取值为 {0,1},故一般会选择
函数。
然而
和
函数在当
很大的时候,梯度会很小,在依据梯度的算法中,更新在后期会变得很慢。在实际应用中,要使
尽可能的落在 0 值附近。
弥补了前两者的缺陷,当 z>0 时,梯度始终为 1,从而提高神经网络基于梯度算法的运算速度。然而当 z<0 时,梯度一直为0,但是实际的运用中,该缺陷的影响不是很大。
保证在 z<0 的时候,梯度仍然不为 0。
在选择激活函数的时候,如果在不知道该选什么的时候就选择 ,当然也没有固定答案,要依据实际问题在交叉验证集合中进行验证分析。
3.9 Gradient descent for neural networks (神经网络的梯度下降法)
神经网络的梯度下降法
以本节中的浅层神经网络为例,我们给出神经网络的梯度下降法的公式。
- 参数: ;
- 输入层特征向量个数: ;
- 隐藏层神经元个数: ;
- 输出层神经元个数: ;
- 的维度为 , 的维度为 ;
- 的维度为 , 的维度为 ;
下面为该例子的神经网络反向梯度下降公式(左)和其代码向量化(右):
3.10 Backpropagation intuition (直观理解反向传播)
3.11 Random Initialization (随机初始化 )
随机初始化
如果在初始时,两个隐藏神经元的参数设置为相同的大小,那么两个隐藏神经元对输出单元的影响也是相同的,通过反向梯度下降去进行计算的时候,会得到同样的梯度大小,所以在经过多次迭代后,两个隐藏层单位仍然是对称的。无论设置多少个隐藏单元,其最终的影响都是相同的,那么多个隐藏神经元就没有了意义。
在初始化的时候,W 参数要进行随机初始化,b 则不存在对称性的问题它可以设置为 0。
以 2 个输入,2 个隐藏神经元为例:
W = np.random.rand((2,2))* 0.01
b = np.zero((2,1))
这里我们将 W 的值乘以 0.01 是为了尽可能使得权重 W 初始化为较小的值,这是因为如果使用 sigmoid 函数或者 tanh 函数作为激活函数时,W 比较小,则 所得的值也比较小,处在 0 的附近,0 点区域的附近梯度较大,能够大大提高算法的更新速度。而如果 W 设置的太大的话,得到的梯度较小,训练过程因此会变得很慢。
ReLU 和 Leaky ReLU 作为激活函数时,不存在这种问题,因为在大于 0 的时候,梯度均为 1。
参考文献:
[1]. 大树先生.吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-3)– 浅层神经网络
PS: 欢迎扫码关注公众号:「SelfImprovementLab」!专注「深度学习」,「机器学习」,「人工智能」。以及 「早起」,「阅读」,「运动」,「英语 」「其他」不定期建群 打卡互助活动。