吴恩达深度学习笔记
吴恩达深度学习笔记
README.md
自用,大概只记录一些有的没有的,不会详尽,只是尝试。
第一课
3.监督学习
一种机器学习
结构化数据和非结构化数据
4.为什么深度学习会兴起
积累了很多的数据,之前是因为数据量和算力达不到
用m来表示数据集的大小
(零基础包听不懂的,兄弟,还好我还行)
5.关于这门课
6.
7.二分分类
遍历数据集并不需要直接只用for循环
正向传播,反向传播
计算机保存图片要保存三个独立矩阵,分别对应红,绿,蓝三个颜色通道,如果输入64X64,就会有三个64X64的矩阵(vocal,markdown怎么写乘号)
X数据集是一个矩阵,用列向量表示就是Nx行,m列。X.shape=(Nx,m)
则Y是一个1*m的矩阵。Y.shape=(1,m)
X就相当于土堆里面的img,Y相当于target
8. logistic回归
sigmoid
9. logistic回归损失函数
loss function
cost function:在全体训练样本上的表现
loss function只适用于单个训练样本
找到w和b让cost J尽可能的小
10. 梯度下降法
grad.step()
11. 导数
vocal,这也能教
12. 更多导数
13. 计算图
流程图,计算某一个函数的
14. 使用计算图求导
15. logistic回归中的梯度下降法
改变w、b的值来最小化损失函数
逆推
看w、b的值如何变化
16. m个样本的梯度下降
J=0;dw1=0;dw2=0;db=0;
for i = 1 to m
z(i) = wx(i)+b;
a(i) = sigmoid(z(i));
J += -[y(i)log(a(i))+(1-y(i))log(1-a(i));
dz(i) = a(i)-y(i);
dw1 += x1(i)dz(i);
dw2 += x2(i)dz(i);
db += dz(i);
J/= m;
dw1/= m;
dw2/= m;
db/= m;
w=w-alpha*dw
b=b-alpha*db
17.向量化
如果数据集很大,用上一节的for很花时间
向量化使用来节省时间计算cost
import numpy as np
np.dot(a,b)
计算两个向量的点乘
numpy并行化指令
18. 向量化的更多例子
well,使用python的内置函数
19. 向量化logistic回归
20. 向量化logistic回归的梯度输出
21. python中的广播
使代码更高效
用reshape来保证矩阵形状是想要的
22. 关于python_numpy向量
优势略势,奇怪的bug,给出行向量跟列向量相加的结果
编写神经网络时不要使用(5,)或者(n,)这这种秩为1的数组
最好直接指定行列,如下图:
建议每次创建数组时直接定义成列向量或者行向量
23. 关于jupyter笔记本快速指南
24.(选)logistic损失函数的解释
25. 神经网络概览
[1][2]表示第一层第二层,例如卷积和池化
同样神经网络反向传播(红色箭头
26.神经网络表示
从左至右依次输入层、隐藏层、输出层
隐藏层中的值不可知
输入层为[0],图中的可以称之为双层神经网络
27. 计算神经网络的输出
图中矩阵为四行三列,因为输入层有三个神经元,隐藏层有四个神经元,
GPT这么说:
在神经网络中,权重矩阵的维度取决于两个因素:
- 输入层的神经元数量:每个输入神经元会与下一层的每个神经元相连接。
- 输出层(或隐藏层)的神经元数量:每个输出神经元(或隐藏层神经元)从输入层接收的所有连接都需要一个权重值。
假设我们有一个简单的神经网络,其中:
- 输入层有 3 个神经元。
- 隐藏层有 4 个神经元。
权重矩阵的构造:
- 行数(4):代表隐藏层中的神经元数量。每个隐藏层神经元有一行权重。
- 列数(3):代表输入层中的神经元数量。每个输入神经元有一列权重。
因此,权重矩阵的维度为 4x3。这意味着:
- 每个隐藏层的神经元从输入层接收 3 个输入信号,每个信号都有一个对应的权重。
- 总共有 4 行,每一行对应隐藏层的一个神经元,每一行中的 3 个权重值分别与输入层的 3 个神经元相连接。
计算示例:
假设输入层的神经元输出为 [x1,x2,x3],权重矩阵为:
那么,隐藏层第一个神经元的输入总和为:
$$
z_1 = w_{11} \cdot x_1 + w_{12} \cdot x_2 + w_{13} \cdot x_3
$$
这个过程会重复 4 次,每次针对隐藏层的一个神经元,使用对应的权重行和输入信号进行计算。
上面是输入层到隐藏层的计算,下面展示隐藏层到输出层的计算
总结一下:
28. 多个样本的向量化
同样可以使用向量化
A矩阵中横向代表不同的训练样本,纵向代表隐藏层中的第几个神经元,类似的可以应用于Z矩阵和X矩阵
29. 向量化实现的解释
上一节的细化
30. 激活函数
不确定隐层用哪个,就用ReLU作为激活函数(真的假的?)
31. 为什么需要非线性激活函数
只用线性激活函数或者没有激活函数,不如直接去掉全部隐藏层,因为两个线性函数的组合本身就是线性函数,层数再多也不行
唯一可以用线性激活函数的地方通常是输出层
32. 激活函数的导数
sigmoid函数不用多说了
导数如下:
$$
\sigma'(x) = \sigma(x) \cdot (1 - \sigma(x))
$$
tanh函数......
ReLU......
33.神经网络的梯度下降法
34.(选)直观理解反向传播
35. 随机初始化
w矩阵初试化为0会出问题,b矩阵无所谓
np来随机生成,而且不能很大,因为有些函数不好梯度下降
36. 深层神经网络
37. 深层网络中的前向传播
老前向传播+向量化,多重复几遍,看起来没多少东西好像?
从隐藏层第一层到输出层也不是不能使用for
38. 核对矩阵的维数
由Z是(3,1)的矩阵,x是(2,1)的矩阵,推出w的维数,以及w的公式
计算反向传播时,dw听该和w有相同的维度,db和b有相同的维度,当样本为数据集时再推矩阵的列数。
39. 为什么使用深层表示
循序渐进,由小到大,高大上(难蚌)
40. 搭建深层神经网络块
单神经元的正向传播和反向传播
整个:
41. 前向和反向传播
前向就不说了。
反向:
这俩是什么:
42. 参数VS超参数
目前学习率是超参数
43. 这和大脑有什么关系
44、45、46 采访
第二课
47. 训练_开发_测试集
训练数据划分为及部分,一部分为训练集,一部分为简单交叉验证集(验证集),最后一部分是测试集。
七成验证集,三成测试集
大数据集为 98、1、1,甚至更小的后者
还要保证验证集和测试集的数据来自同一分布
48. 偏差_方差_
最优误差也叫做基本误差
49. 机器学习基础
高偏差:查看训练集的性能、换更大的网络等等
高方差:查看验证集性能,正则化,更合适的神经网络框架
50. 正则化
范数
Frobenius范数
L2正则化
51. 为什么正则化可以减少过拟合
过拟合是指:
神经网络的所有隐藏单元依然存在,只是他们的影响力变小了,神经网络变得更简单了,看起俩更不容易发生过拟合
调试梯度下降的时候也应该使用新式子
否则J可能不会在所有调幅范围内都单调递减
52. Dropout(随机失活) 正则化
反向随机失活
在测试阶段应用dropout函数,预测会受到干扰
测试和预测不dropout,且不用除以那个dropout系数
53. 理解dropout
通常不对输入层进行dropout
计算机视觉领域应用较多
54.其他正则化方法
数据扩增data augmentationn
提早停止训练神经网络Early stopping,但不能同时进行降低J和和减少过拟合
55. 归一化输出
第一步是零均值化
第二步是归一化方差
56. 梯度消失与梯度爆炸
训练时导数或者坡度变得非常大,或者非常小。当w都大于1或者都小于1的时候,层数再非常大,就有可能发生
57. 神经网络的权重初始化
一种初始化w的方法
58. 梯度的数值逼近
双边误差O(h^2)比单边误差O(h)更接近,
59. 梯度检验
使用双边误差检验跟实际数据是否差很多,
60. 关于梯度检验实现的注记
-
不要在训练中使用梯度检验,他只用于debug
-
如果苏澳你噶的梯度检验失败,要检查所有项
-
如果使用正则化,请注意正则项,特别是反向传播时
-
梯度检验不能与dropout同时使用,因为每次迭代时,dropout会随机消除,难以计算梯度下降上的代价函数J
61. Mini-batch梯度下降法
向量化能够让你相对较快地处理所有个样本。如果很大的话,处理速度仍然缓慢。比如说,如果是500万或5000万或者更大的一个数,在对整个训练集执行梯度下降法时,你要做的是,你必须处理整个训练集,然后才能进行一步梯度下降法,然后你需要再重新处理500万个训练样本,才能进行下一步梯度下降法。所以如果你在处理完整个500万个样本的训练集之前,先让梯度下降法处理一部分,你的算法速度会更快,准确地说,这是你可以做的一些事情。
你可以把训练集分割为小一点的子集训练,这些子集被取名为mini-batch,假设每一个子集中只有1000个样本,那么把其中的到取出来,将其称为第一个子训练集,也叫做mini-batch,然后你再取出接下来的1000个样本,从到,然后再取1000个样本,以此类推。
接下来我要说一个新的符号,把到称为,到称为,如果你的训练样本一共有500万个,每个mini-batch都有1000个样本,也就是说,你有5000个mini-batch,因为5000乘以1000就是5000万。
62. 理解 Mini-batch 梯度下降法
mini-batch大小在1跟m之间,1就是随机梯度下降,m就是batch梯度下降,1失去了所有向量化带来的加速。所以应该取一些位于中间的。
63. 指数加权平均
采用不同的β取值代表不同的涵义
64. 理解指数加权平均
65. 指数加权平均的偏差修正
因为前几项一般都会不准确,所以可以使用这个公式:
66. 动量梯度下降法
67. RMS prop
跟上一节很相似,可以消除梯度下降中的摆动
有平方
68. Adam 优化算法
结合了Momentum和RMS prop梯度下降法,并且是一种极其常用的学习算法。
69. 学习率衰减
假设你要使用mini-batch梯度下降法,mini-batch数量不大,大概64或者128个样本,在迭代过程中会有噪音,下降朝向这里的最小值,但是不会精确地收敛,所以你的算法最后在附近摆动,并不会真正收敛,因为你用的 α 是固定值,不同的mini-batch中有噪音。
指数衰减
离散下降
70. 局部最优的问题
鞍点
平稳段会减缓学习,平稳段是一块区域,其中导数长时间接近于0,如果你在此处,梯度会从曲面从从上向下下降,因为梯度等于或接近0,曲面很平坦,你得花上很长时间慢慢抵达平稳段的这个点,因为左边或右边的随机扰动
此时可以使用前面几节提到的优化算法
71. 调试处理
α 学习速率是需要调试的最重要的超参数
Momentum参数 β ,0.9就是个很好的默认值;mini-batch的大小;隐藏单元;。。。
对超参数在一定范围内进行随机取值,有侧重点,并且在某一部分由粗糙到精细。
72. 为超参数选择合适的范围
对数标尺搜索超参数的方式会更合理,因此这里尽量不使用线性轴
73. 超参数训练实战:Pandas vs. Caviar
两种超参数的优化方法
74. 归一化网络的激活函数
阿巴阿巴
Batch归一化的作用是它适用的归一化过程,不只是输入层,甚至同样适用于神经网络中的深度隐藏层
75. 将 Batch 拟合进神经网络
Batch归一化是发生在计算 z 和 a 之间的
在深度学习框架中,Batch归一化的过程,经常是类似一行代码的东西
76. Batch Norm为什么起作用
Batch归一化做的,是它减少了隐藏值分布变化的数量。
Batch归一化减少了输入值改变的问题,它的确使这些值变得更稳定,神经网络的之后层就会有更坚实的基础。即使使输入分布改变了一些,它会改变得更少。它做的是当前层保持学习,当改变时,迫使后层适应的程度减小了。
你可以这样想,它减弱了前层参数的作用与后层参数的作用之间的联系,它使得网络每层都可以自己学习,稍稍独立于其它层,这有助于加速整个网络的学习
也有轻微的正则化效果
77. 测试时的Batch Norm
78. Softmax 回归
用于多分类问题的一种模型,逻辑回归的扩展,适用于分类问题中有两个以上类别的情况。可以将网络的输出值转化为一个概率分布。所有类的概率综合为1。
Softmax的激活函数的特殊之处在于,因为需要将所有可能的输出归一化,就需要输入一个向量,最后输出一个向量。
用途:图像分类,例如CIFAR-10.文本分类,自然语言处理中的磁性标注。
Softmax回归也常作为深度神经网络最后一层的输出层,用于多分类任务的概率计算。
79. 训练一个 Softmax 分类器
80. 深度学习框架
81. Tensor Flow
只需要说明如何计算损失函数,它就能求导,并且运用梯度优化器,Adam优化器或者其他优化器。
Tensor Flow程序的核心是计算损失函数,然后自动计算出导数,以及如何最小化损失。
已经内置了所有必要的反向函数,自动用反向函数来实现反向传播,即便函数非常复杂。
第三课
82. 为什么需要机器学习策略
优化策略,优先级?
83. 正交化
没学过数学包听不懂说什么的兄弟,独立调节大概。
84. 单一数字评估指标
不推荐使用两个评估指标,假设,有查准率和查全率两个评估指标,可以使用所谓的F1分数来作为两个评估指标的调和平均数,使用这么一个单个评估指标可以提高效率。
85. 满足和优化指标
虽然c的准确度最高,但是运行时间过长,可以把指标设置成100ms(如果用户不在乎100还是50),然后在满足指标的分类器里面进行筛选
86. 训练/开发/测试集划分
数据要来自同一分布
类似不能用这个国家训练,那个国家测试。
可行的一种类似方法是:将所有数据随机洗牌,放入开发集和测试集,
87. 开发集和测试集的大小
在机器学习中,把你取得的全部数据用70/30比例分成训练集和测试集。或者如果你必须设立训练集、开发集和测试集,你会这么分60%训练集,20%开发集,20%测试集,这是机器学习早期说是。
现代98训练1开发1测试例子,假设1m的样本,1开发就是1w个样本。
在大数据时代旧的经验规则,这个70/30不再适用了。现在流行的是把大量数据分到训练集,然后少量数据分到开发集和测试集,特别是当你有一个非常大的数据集时。
88. 什么时候改变开发和测试集评估指标
我是用户我包选A的(
正经,再设置一个指标设置不同的权重对准确率和推送porn的几率,一个指标,这个时候就需要进行正交化。
89. 为什么是人的表现
机器学习的进展在前期往往相当快,当超越人类的表现之前一直很快,当你超越人类的表现后进展就会变慢。
90. 可避免误差
边际递减效应说是
贝叶斯错误率或者说贝叶斯错误率的估计和训练错误直接的插值就衡量了所谓可避免偏差。
91. 理解人的表现
在定义人类水平错误率时,要弄清目标所在,超越单个人类时3%才是合适的,
训练误差与开发误差之间的差值可以衡量或者估计你的学习算法的方差问题有多严重。
当离人类水平很远的时候,将优化目标放在偏差或者方差上可能更容易一点。
92. 超越人的表现
机器学习的进展会在接近或者超越人类水平的时候变得越来越慢。
上面提到过,可以拿人类的错误率来大概当成贝叶斯错误率,但是当你的算法的错误率已经比一群充分讨论过的人类专家的错误率更低,那么之后就没有足够的信息来判断优化你的算法时应该减少偏差还是减少方差。此时很难去依靠人类直觉去判断算法还能往什么方向优化。
93. 改善你的模型表现
想要让一个监督学习算法达到实用,基本上希望或者假设你可以完成两件事情。首先,你的算法对训练集的拟合很好,这可以看成是你能做到可避免偏差很低。还有第二件事你可以做好的是,在训练集中做得很好,然后推广到开发集和测试集也很好,这就是说方差不是太大。
总结了一下这周的内容说是
94. 误差分析
人工统计错误类型说是,人工?工人!
95. 清楚标注错误的数据
构造实际系统时,通常需要更多的人工错误分析
96. 快速搭建你的第一个系统,并进行迭代
想搭建全新的机器学习程序,就是快速搭好你的第一个系统,然后开始迭代。
建立这个初始系统的所有意义在于,它可以是一个快速和粗糙的实现,你知道的,别想太多。初始系统的全部意义在于,有一个学习过的系统,有一个训练过的系统,让你确定偏差方差的范围,就可以知道下一步应该优先做什么,让你能够进行错误分析,可以观察一些错误,然后想出所有能走的方向,哪些是实际上最有希望的方向。
97. 使用来自不同分布的数据,进行训练和测试
当你收集到足够多带标签的数据构成训练集时,算法效果最好,这导致很多团队用尽一切办法收集数据,然后把它们堆到训练集里,让训练的数据量更大,即使有些数据,甚至是大部分数据都来自和开发集、测试集不同的分布。
98. 数据不匹配时,偏差和方差的分析
?没有特别系统的方法去解决数据不匹配的问题