吴恩达机器学习课程笔记_Course2_Week2_1
仅做个人学习使用
继上次更新后继续开始本周的笔记更新,本次笔记从其他神经网络概念开始记录
1 其他神经网络概念
1.1 先进优化算法
本节课介绍的梯度下降的优化版本,Adam(adaptive moment estimation),这一算法是对梯度下降算法的优化版本。传统的梯度下降算法公式如下,其学习率是固定的,这并没有什么问题,但在某些情况下其效率较低,科学家对此并不满意,所以他们提出了Adam算法,其可以根据梯度下降的过程调整学习率。
例如在下方图片左侧这种情况下,梯度逐渐下降,直至接近最小值,算法本身没有问题,但是太慢了。通过观察你可以发现我们何不调整学习率的值去加快这一进程呢?(另一种来回震荡的情况下,当然也可以调小学习率)于是乎Adam算法应运而生!
具体代码截图如下,只需要在编译部分进行优化器的更改即可
1.2 其他类型的神经网络层
本节主要介绍了卷积层,由卷积层构成的神经网络就是大家耳熟能详的卷积神经网络(CNN)。卷积层与传统的隐藏层最大的不同在于:卷积层中的神经元(unit)只接收上一层的部分输出。例如下图所示,蓝色神经元接受的输入仅是9个单元格中的一个,其他神经元也是一样。这样做由两大好处:
- 它可以加快计算速度。
- 使用这种卷积层的神经网络可能需要更少的训练数据 ,或者也可以不太容易出现过度拟合。
2 反向传播
本节内容都是选修内容,其对数学有些基础的要求。博主本科没学过高数,以高中数学水平看完了3个视频,总体感觉下来还行,课程讲解非常详细,基本都能理解。
2.1 什么是导数?
2.1.1 基本定义
这一节介绍了导数的原理,高中数学里就讲过导数,在我的记忆里导数代表了函数变化的趋势。求导的法则也十分简单,总的来说就是降幂,相信大家也都会。但是本节课程将导数的原理更加清晰的讲述出来了,并且也介绍了如何利用python代码进行快速求导。
如下图所示,函数上J(w)相对于w的导数是:w变化一个很小的值的情况下,J(w)的变化值相对于w的倍数。例如途中w增加了0.001,最终J(w)增加了0.006,所以该点的导数为6,这与公式的计算结果相同(下降同理,w下降0.001,那么J(w)也下降0.006)。
2.1.2 Python中的实现方式
实现方式实际上有两种,一种是按照定义实现,另一种是直接引用库实现,我们首先展示按定义实现的方式。
J = (3)**2
J_epsilon = (3 + 0.001)**2
k = (J_epsilon - J)/0.001 # difference divided by epsilon
print(f"J = {J}, J_epsilon = {J_epsilon}, dJ_dw ~= k = {k:0.6f} ")
接下来是引用库的实现方式,这里使用了sympy库。
from sympy import symbols, diff
J, w = symbols('J, w') #此处是定义符号
J=w**2
dJ_dw = diff(J,w) #定义导数
dJ_dw.subs([(w,2)]) # derivative at the point w = 2
2.2 计算图
这一节的内容就比较复杂了,计算图的概念很好理解,但是听课过程中需要有着链式求导的前置知识,博主没学过这个,但也勉强听懂了。
下图是一个典型的计算图,其将神经网络中前向传播与反向传播的步骤进行划分,下图的目的是计算函数a的成本函数J(其实可以理解为计算单个神经元的成本函数J)。
那么课程引入计算图是为了什么呢?正如标题所说,这节课程主要为了介绍反向传播。那么什么是前向传播、什么又是反向传播呢?
这里引用其他博主关于前向传播和反向传播的一句话:**前向传播是为反向传播准备好要用到的数值,反向传播本质上是一种求梯度的高效方法,而计算图则是用于简化反向传播的计算过程。**上图中从左到右是前向传播,从右到左是反向传播。
链接: 理解前向传播、反向传播(Backward Propagation,BP)
课程中提到过这么做的优点,在有N个节点、P个参数的情况下,如果不利用计算图,那么计算梯度下降需要的导数时,其总计算步骤是N×P;如若引入了计算图,那么计算步骤则变为N+P。对于为什么是N×P我的理解存在不足,这里就不与大家分享了。但是N+P这个通过上图就可以看出前向传播过程中有N个节点,进行N次计算;反向传播过程中有P个参数,则需要计算P次,那么总计算次数就是N+P次。前向传播和后向传播是一个先后顺序,先前再后。
这里还有一个链式求导的问题,下图可以进行解释,下图和前面的计算图是对应的。