详细笔记地址: http://www.ai-start.com/dl2017/
这里只是做些自己的摘抄与理解
写在前面
吴恩达(英语:Andrew Ng)是斯坦福大学计算机科学系和电气工程系的客座教授,曾任斯坦福人工智能实验室主任。他还与达芙妮·科勒一起创建了在线教育平台Coursera。
吴恩达老师的机器学习课程可以说是入门机器学习的同学最先接触的课程,当然后续的deeplearning.ai是更深入的课程。对在线教育,以及人工智能领域的发展提供了很大的帮助,感谢。
Classes 1 神经网络
1 神经网络与深度学习
1.1什么是神经网络
输入层输入的是特征,什么是特征,与预测或处理物体息息相关的事情都可以考虑作为特征,只是特征有轻有重,不同的特征对应的权重不一样,所以需要神经网络去学习特征前的权重参数。
给予足够多的训练样本有关𝑥 和𝑦,神经网络非常擅长计算从𝑥到𝑦的精准映射函数。
1.2 神经网络的监督学习
- 监督学习:表明你的数据不仅只有特征,还有标签
- 结构化数据:结构化数据意味着数据的基本数据库。例如有专门的几列数据告诉你卧室的大小和数量,这就是结构化数据。
- 非结构化数据:非结构化数据是指比如音频,原始音频或者你想要识别的图像或文本中的内容。这里的特征可能是图像中的像素值或文本中的单个单词。
神经网络算法对于结构化和非结构化数据都有用处
1.3 为什么深度学习会兴起
传统的算法面对大数据时候性能有瓶颈
对于神经网络而言,得益于大数据的发展以及计算性能的提升,再次得到发展。
想要获得较高的性能体现,那么你有两个条件要完成,第一个是你需要训练一个规模足够大的神经网络,以发挥数据规模量巨大的优点
小型网络、中型网络以及大型网络对应的数据量以及其性能
另外就是算法上的创新
- 激活函数
- 网络结构
- 快速的迭代
2 神经网络的编程基础
2.1 二分类(Binary Classification)
在电脑的眼里,图片是用矩阵的形式表示
这里将矩阵转化为列向量后作为神经网络的输入
2.2 逻辑回归
为什么用逻辑回归而不是线性回归,因为线性回归wx+b的输出值比1大,或者是比 0小,无法比较输出类别的概率大小,因此使用sigmoid函数对其进行非线性激活,将范围变为0-1之间
2.4 逻辑函数的损失函数
损失函数:用来衡量预测输出值和实际值有多接近
逻辑回归不实用mse均方误差这类损失函数是由于其不是凸函数,只能找到多个局部最优值,梯度下降法很可能找不到全局最优值。
在逻辑回归中用到的损失函数是二元交叉熵损失函数:
𝐿(𝑦^ , 𝑦) = −𝑦log(𝑦^) − (1 − 𝑦)log(1 − 𝑦^)
- 当𝑦 = 1时损失函数𝐿 = −log(𝑦^) ,如果想要损失函数𝐿尽可能得小,那么𝑦^就要尽可能大,因为 sigmoid 函数取值[0,1],所以𝑦^会无限接近于 1。
- 当𝑦 = 0时损失函数𝐿 = −log(1 − 𝑦^) ,如果想要损失函数𝐿尽可能得小,那么𝑦^就要尽可能小,因为 sigmoid 函数取值[0,1],所以𝑦^会无限接近于 0。
损失函数只适用于像这样的单个训练样本,而代价函数是参数的总代价。这里总容易将损失函数与代价函数混为一谈,损失函数关心个体,代价函数关心总的样本。
2.4 梯度下降算法
用于更新参数的一种训练方法,这里不作过多的介绍
2.5 计算图
一个神经网络的计算,都是按照前向或反向传播过程组织的。首先我们计算出一个新的网络的输出(前向过程),紧接着进行一个反向传输操作。
2.6 使用计算图求导数
链式法则反向求J对变量a、b、c的偏导数
2.7 逻辑回归的计算题求解梯度下降
以单样本为例,损失函数L为
-(ylog(a) + (1-y)log(1-a)) y是标签,a是激活值
求解得到
dl/da = (-y/a + (1-y)/(1-a))
dl/dz = dl/da da/dz = (-y/a + (1-y)/(1-a)) a(1-a) = a-y
dl/dw1 = dl/da da/dz dz/dw1 = (a-y) * x1
2.8 向量化(Vectorization)
向量化是非常基础的去除代码中 for 循环的艺术
用向量操作替换循环元素处理
2.9 向量化逻辑回归(Vectorizing Logistic Regression)
numpy 广播机制
- axis=0: 沿着列进行处理
- axis=1: 沿着行进行处理
建议不使用一维数组, 总是使用 𝑛 × 1维矩阵(基本上是列向量),或者 1 × 𝑛 维矩阵(基本上是行向量)表示n个元素。
或者用assert来判断其形状assert(a.shape == (5, 1))
3 浅层神经网络
3.1 神经网络概述
可以把许多sigmoid 单元堆叠起来形成一个神经网络
3.2 神经网络的表示
输入层:传递输入
隐藏层:线性加权求和,再通过激活函数激活
输出层:预测值
向量化表示
3.3 激活函数的类型
sigmoid:输出范围是0~1
tanh: 输出范围是-1~1
注意:
- tanh 函数或者双曲正切函数是总体上都优于 sigmoid 函数的激活函数。tanh 函数是 sigmoid 的向下平移和伸缩后的结果。对它进行了变形后,穿过了(0,0)点。
- sigmoid和tanh共同的缺点是,在𝑧特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,导致降低梯度下降的速度。
ReLU: 输出范围0~+∞
正数的导数为1,负数的导数为0,神经元此时不会训练,易导致稀疏性。
Leaky Relu:输出范围 -∞ ~ + ∞
避免了ReLU负数阶段的导数为0,以一个非常小的数作为梯度值。
总结
- ReLu 激活函数神经网络通常会比使用 sigmoid 或者 tanh 激活函数学习的更快;
- sigmoid 和 tanh 函数的导数在正负饱和区的梯度都会接近于 0,这会造成梯度弥散,而 Relu 和 Leaky ReLu 函数大于 0 部分都为常数,不会产生梯度弥散现象。(同时应该注意到的是,Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀疏性,而 Leaky ReLu 不会有这问题)
- sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
- tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
- ReLu 激活函数:最常用的默认函数,如果不确定用哪个激活函数,就使用 ReLu 或者Leaky ReLu。
如果不确定哪一个激活函数效果更好,可以把它们都试试,然
后在验证集或者发展集上进行评价。然后看哪一种表现的更好,就去使用它。
3.4 为什么使用非线性激活函数
如果隐藏层使用的是线性函数的话就没有意义,等价于逻辑回归时候,中间的多个隐藏层可以直接由一个线性函数表示。
对于神经网络而言,就是需要使用非线性激活函数来获得有意思的函数映射。
但是对于回归问题,其输出层可以使用线性激活函数。唯一可以用线性激活函数的通常就是输出层。
3.5 激活函数的导数
- sigmoid
- tanh
- ReLU 和leaky ReLU
*
3.6 神经网络的梯度下降算法
梯度下降算法用于更新网络中的参数w和偏置b,基于输出值与预期值之间的误差函数来进行反向传播来更新的。
- 正向传播(forward): 从左到右
- 方向传播(back propagation): 从右到左
3.7 随机初始化
当你训练神经网络时,权重随机初始化是很重要的。如果你把权重或者参数都初始化为 0,那么梯度下降将不会起作用。
对于𝑊可以随机初始化,𝑏可以初始化为 0。
𝑊= 𝑛𝑝.𝑟𝑎𝑛𝑑𝑜𝑚.𝑟𝑎𝑛𝑑𝑛(2,2) ∗ 0.01
𝑏 = 𝑛𝑝.𝑧𝑒𝑟𝑜𝑠((2,1))
通常倾向于初始化为很小的随机数, 你用 tanh 或者sigmoid 激活函数,或者说只在输出层是 sigmoid,如果(数值)波动太大,当计算激活值时,如果𝑊很大,𝑧就会很大。𝑧的激活值𝑎就会很大或者很小,这种情况下很可能停在 tanh/sigmoid 函数的平坦的地方,这些地方梯度很小也就意味着梯度下降会很慢,因此学习也就很慢。
4 深层神经网络
4.1 深层神经网络
- 严格上来说逻辑回归也是一个一层的神经网络,而上边右图一个深得多的模型,浅与深仅仅是指一种程度。
- 算神经网络的层数时,不算输入层,只算隐藏层和输出层。
到有一些函数,只有非常深的神经网络能学会,而更浅的模型则学不到。尽管对于任何给定的问题很难去提前预测到底需要多深的神经网络,所以先去尝试逻辑回归,尝试一层然后两层隐含层,然后把隐含层的数量看做是另一个可以自由选择大小的超参数,然后再保留交叉验证数据上评估,或者用你的开发集来评估。
4.2 深层神经网络反向传播
- 前向传播
- 反向传播
4.3 为什么使用深层表示
深度神经网络的这许多隐藏层中,较早的前几层能学习一些低层次的简单特征,等到后几层,就能把简单的特征结合起来,去探测更加复杂的东西。