之前吴恩达的deeplearning系列的课程,看完就忘了,所以这次做个笔记的主要目的是为了方便复习所用。大多数内容都是从黄海广博士的笔记里面摘抄过来的。如有错误,烦请指正,补充。
一、 第一周 : 深度 学习 引言
- 神经网络非常擅长计算从x到y的精准映射函数。
- 推动深度学习变得如此热门的主要因素。包括数据规模、计算量及算法的创新。
神经网络方面的一个巨大突破是从 sigmoid 函数转换到一个 ReLU函数,使用 sigmoid 函数和机器学习问题是,在这个区域,也就是这个 sigmoid 函数的梯度会接近零,所以学习的速度会变得非常缓慢,因为当你实现梯度下降以及梯度接近零的时候,参数会更新的很慢,所以学习的速率也会变的很慢,而通过改变这个被叫做激活函数的东西,神经网络换用这一个函数,叫做 ReLU 的函数(修正线性单元),ReLU 它的梯度对于所有输入的负值都是零,因此梯度更加不会趋向逐渐减少到零。而这里的梯度,这条线的斜率在这左边是零,仅仅通过将 Sigmod 函数转换成 ReLU 函数,便能够使得一个叫做梯度下降(gradient descent)的算法运行的更快。
下面是关于第一门课的一些细节,这门课有四周的学习资料:
第一周:关于深度学习的介绍。在每一周的结尾也会有十个多选题用来检验自己对材料的理解;
第二周:关于神经网络的编程知识,了解神经网络的结构,逐步完善算法并思考如何使得神经网络高效地实现。从第二周开始做一些编程训练(付费项目),自己实现算法;
第三周:在学习了神经网络编程的框架之后,你将可以编写一个隐藏层神经网络,所以需要学习所有必须的关键概念来实现神经网络的工作;
第四周:建立一个深层的神经网络。
第二周:神经网络的编程基础
2.1二分类问题
引入:为什么神经网络的训练过程可以分为前向传播和反向传播两个独立的部分。
解答:以逻辑回归为例讲解,逻辑回归是一个用于二分类(binary classification)的算法。
2.2 逻辑回归(Logistic Regression)
本节将主要介绍逻辑回归的 Hypothesis Function(假设函数)。
现在你已经知道逻辑回归模型是什么样子了,下一步要做的是训练参数w和参数b,你需要定义一个代价函数,下一节课对其解释。
2.3 逻辑回归的代价函数(Logistic Regression Cost Function )
为什么需要代价函数:为了训练模型里面的参数,需要定义一个代价函数,通过训练代价函数来得到参数。
逻辑回归的输出函数是:
损失函数(误差函数)---用来衡量算法的运行情况,Loss function:L(y^,y)
- L称为损失函数,来衡量预测输出值和实际值有多接近,一般用预测值和实际值的平方差或者他们平方差的一半,但在逻辑回归中不这样做。因为当我们在学习逻辑回归参数的时候,会发现我们的优化目标不是凸优化,只能找到多个局部最优值,梯度下降法很可能找不到全局最优值。我们在逻辑回归中用到的损失函数是:
- 最终的目的是让损失函数尽可能的小,即让误差尽可能的小,使用上面的损失函数可以达到同样的目的,因此可以将逻辑回归的损失函数定义成上面的样子。
- 损失函数是在单个训练样本中定义的,它衡量的是算法在单个训练样本中表现如何,为了衡量算法在全部训练样本上的表现如何,我们需要定义一个算法的代价函数,算法的代价函数是对m个样本的损失函数求和然后除以m :
损失函数只适用于像这样的单个训练样本,而代价函数是参数的总代价,所以在训练逻辑回归模型时候,我们需要找到合适的w和b,来让代价函数 J 的总代价降到最低。逻辑回归可以看成是一个非常小的神经网络,接下来会看到神经网络会做什么。
2.4 梯度下降法(Gradient Descent )


2.5 导数(Derivatives )
导数就是斜率,而函数的斜率在不同的点是不同的。
2.7 计算图(Computation Graph)
一个神经网络的计算,都是按照前向或反向传播过程组织的。首先我们计算出一个新的网络的输出(前向过程),紧接着进行一个反向传输操作。后者我们用来计算出对应的梯度或导数。

2.8 计算图的导数计算(Derivatives with a Computation Graph )上图红色的部分
2.9 逻辑回归中的梯度下降(Logistic Regression Gradient Descent )
单个样本的代价函数定义如下: L(a,y) = −(ylog(a) + (1 −y)log(1− a)) 其中a是逻辑回归的输出,y是样本的标签值。
复习下梯度下降法,w和b的修正量可以表达如下:

首先我们需要反向计算出代价函数L(a,y)关于a的导数。然后再求对z的,然后计算对w和b的。如下图所示:

2.10 m 个样本的梯度下降(Gradient Descent on m Examples)

但这种计算中有两个缺点,也就是说应用此方法在逻辑回归上你需要编写两个for循环。第一个 for 循环是一个小循环遍历𝑛个训练样本,第二个 for 循环是一个遍历所有特征的 for循环。然而使用for循环的效率低。所以这里有一些叫做向量化技术,它可以允许你的代码摆脱这些显式的 for 循环。
2.11 向量化(Vectorization)
向量化实现将会非常直接计算w的转职*x,代码如下z=np.dot(w.T,x)+b。


2.12 向量化的更多例子(More Examples of Vectorization )
numpy 库有很多向量函数。比如 u=np.log 是计算对数函数(log)、 np.abs(),是 计 算 数 据 的 绝 对 值 、 np.maximum() 计 算 元 素y中 的 最 大 值 , 你 也 可 以np.maximum(y,0)
2.13 向量化逻辑回归(Vectorizing Logistic Regression)

numpy 命令是Z= np.dot(w.T,X)+b。这里在 Python 中有一个巧妙的地方,这里 b 是一个实数,或者你可以说是一个 1 × 1 矩阵,只是一个普通的实数。但是当你将这个向量加上这个实数时,Python 自动把这个实数 b 扩展成一个 1 × m的行向量。在Python中称为广播。
2.14 向量化 logistic 回归的梯度输出(Vectorizing Logistic Regression's Gradient )
对m个训练数据


- w:= w − a ∗ dw
- b:= b − a ∗ db
但如果你希望多次迭代进行梯度下降,那么仍然需要 for循环,放在最外层。不过我们还是觉得一次迭代就进行一次梯度下降,避免使用任何循环比较舒服一些。
2.15 Python 中的广播(Broadcasting in Python )
在 numpy 中,0 轴是垂直的,也就是列,而 1 轴是水平的,也就是行。
广播的一般原则如下:

注:当我们写代码时不确定矩阵维度的时候,通常会对矩阵进行重塑来确保得到我们想要的列向量或行向量。重塑操作 reshape 是一个常量时间的操作,时间复杂度是𝑃(1),它的调用代价极低。
2.16 关于 python _ numpy 向量的说明(A note on python or numpy vectors)
a = np.randomrandn(5),这样会生成存储在数组 a 中的 5 个高斯随机数变量。之后输出 a,从屏幕上可以得知,此时 a 的 shape(形状)是一个(5,)的结构。这在 Python 中被称作一个一维数组 。它既不是一个行向量也不是一个列向量,这也导致它有一些不是很直观的效果。

2.17介绍了jupyterNotebook
2.18讲解了logistics损失函数(!!!)
网友评论