吴恩达机器学习2022学习笔记(二)
第二部分 高级学习算法[Advanced Learning Algorithms]
- 神经网络
- 推理(预测)
- 训练
- 构建机器学习系统的实用建议
- 决策树(Decision Trees)
1 神经网络介绍
1.3 案例-需求预测
名词:输入层,隐藏层,输出层
神经网络避免了特征工程,隐藏层的神经元代表新特征,如是否承担得起、知名度、质量偏见等
神经网络结构问题:多少个隐藏层,每个隐藏层有多少个神经元
1.4 案例-图像识别
隐藏层中的不同神经元在计算什么?
第一层学习各种边缘,第二层学习局部部件,第三层学习整体轮廓
词汇表:
nerve-[n.]神经,Neural Networks-[adj.]神经网络,neuron-[n.]神经元
2 神经网络模型
2.1 神经网络的层(layer)
每一个神经元都是一个小小的逻辑回归单元,有参数w和b,经过一个激活函数,输出为激活值a
2.3 预测(前向传播forward propagation)
案例:手写数字识别
计算每一层的激活向量a,从左到右依次计算出a1、a2、a3,所以这个过程也被称为前向传播
5 AGI(强人工智能)猜想
AI可分为ANI(Artifical Narrow Intelligence)和AGI(Artifical General Intelligence),即弱人工智能和强人工智能
目前的两个瓶颈:1、只用了简单的函数来模拟复杂的神经元。2、当今还不清楚人脑的工作机制
实现AGI的路径希望:一个算法可以自动根据输入数据,能够适应各种各样的传感器输入,就如同一块脑组织能够学会看东西,或触觉,或感觉等(可塑性)
6 矩阵乘法(选修)
向量与向量相乘(点积)
设:a = [a1, a2, …, an],w = [w1, w2, …, wn]
z = a DOT w = a1×w1 + a2×w2 + … + an×wn(结果为标量)
向量与矩阵相乘
设:a = [a1, a2, …, an],W = [w1, w2, …, wm]
W大写表示矩阵,把W矩阵的每一列看作是列向量,a分别与每个向量做点积(见上),结果保存
z = [a DOT w1, a DOT w2, …, a DOT wm]
矩阵与矩阵相乘
设:矩阵A(n×m),矩阵B(m×k)
Z = AB(n×k)
7 训练神经网络
① Sequential()序列函数搭建神经网络的层Dense
② compile()函数编译模型,指定损失函数
③ 调用fit()函数训练模型,其中epochs指梯度下降的步数
8 激活函数
sigmoid函数:
ReLU函数(rectified linear unit修正线性单元):
线性激活函数(也可以说是没有激活函数):
后续还会讲到第四个激活函数,softmax
8.2 如何选择激活函数
如果是输出层的话,那么根据标签选择激活函数就比较自然。例如二分类问题(y=0|1)选择sigmoid;回归问题选择线性激活函数;如果y只能取非负值那么最自然的选择就是ReLU
如果是隐藏层呢?ReLU函数是目前为止最常用的。原因:1、ReLU的计算速度比sigmoid更快。2、在函数平坦的地方,梯度下降会变得非常缓慢,sigmoid有两个,而ReLU只有x负半轴是平坦的,ReLU激活函数可以使神经网络更快地学习
总结:隐藏层选择ReLU,输出层根据需求
其他的激活函数:tanh、LeakyReLU、swish
8.3 激活函数的重要性
为了产生非线性变换。反例是,假如有一个模型激活函数全部使用线性激活函数(g(z)=z)(相当于不使用激活函数),这样这个神经网络就等价于线性回归/逻辑回归了。
疑问:ReLU在x正半轴不就是线性激活函数吗?
9 多分类
多分类问题:标签y的可能取值超过两种
9.2 softmax
note:a1+a2+…+an = 1
代价函数(交叉熵损失Crossentropy loss):
9.3 神经网络softmax输出
MNIST with softmax
tensflow中,输出层直接设为10个units,激活函数设为softmax:
Dense(units=10, activation='softmax')
注意到loss函数设置为了’SparseCategoricalCrossentropy’(稀疏分类交叉熵):
model.compile(loss=SparseCategoricalCrossentropy())
稀疏指的是y只能取这10个值中的一个,每个图像要么是0,要么是1,一直到9。
9.4 Softmax的改良代码
原来的问题:数字舍入误差
改良代码:
1.将上面那句代码添加改为:
model.compile(loss=SparseCategoricalCrossentropy(from_logits=True))
2.将最后一层改为’linear’线性激活函数,预测时套用softmax
Dense(units=10, activation='linear')
logits = model(X)
f_x = tf.nn.softmax(logits)
可以让计算更加精确
9.5 多标签分类
【多标签分类问题】和【多分类问题】容易混淆
例子:判断一张图片里:是否含有车?是否含有bus?是否含有行人?此时的输出不再是一个数字,而是一个长度为3的向量。
不推荐使用:三个网络分别检测。更好的方法是:训练一个神经网络对应3个输出,输出层的3个神经元使用3个sigmoid激活函数。
10 神经网络概念补充
10.1 高级优化算法
原来的梯度下降算法学习率固定不变,Adam算法可以自动调整学习率。
Adam:Adaptive Moment estimation(自适应矩估计)
tensflow调用方法:
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=1e-3),
loss=SparseCategoricalCrossentropy(from_logits=True))
10.2 Additional Layer Types
目前讲过的神经网络层都是全连接层(Dense),其实也有一些其他属性类型的的层。
接下来提到卷积层和卷积神经网络CNN。
11 构建机器学习系统的实用建议
11.1 决定下一步做什么
11.2 模型评估
将数据集划分为训练集、测试集,使用测试集上的误差来评估模型
11.3 模型选择&交叉验证
将数据集划分为训练集、验证集、测试集,使用验证集来选择模型
12 偏差和方差
12.1 诊断偏差方差(Bias and Variance)
观察算法的偏差和方差能够很好的指导下一步该做什么(提前停止策略)
12.2 正则化
正则化惩罚参数防止参数过大,超参λ的设置可以使用交叉验证。
12.3 建立性能的基准水平(Establishing a baseline level of performance)
baseline level of performance指的是你能够对学习算法最终得到的误差水平有个合理的期待。
建立基准水平的方法:
- 衡量人类在这项任务上能做得多好
- 其他的竞争算法
来判断高方差(过拟合) or 高偏差(欠拟合)
12.4 学习曲线
学习曲线(Learning curves)是一种帮助你了解学习算法性能怎么样的方法,曲线随着经验数量(算法所拥有的训练样本数)发生变化。用来判断模型过拟合欠拟合。
假设模型是一个二次多项式,随着训练集的大小增加,训练集上的累计误差会越来愈大,而验证集会逐渐降低。
下面看看高偏差vs高方差的学习曲线。
高偏差的学习曲线
如果一个模型过于简单,这会造成欠拟合,最后随着训练集增大,两条线会趋于平坦,但总是距离期望值有一段差距。
在这种高偏差欠拟合的情况下,增大训练集不会有多大帮助。
解决措施:
- 增加模型参数,增加特征
- 减小正则化项系数
- 采用更复杂的模型
高方差的学习曲线
Jcv远高于Jtrain,通过增大训练集的方法可以收敛,但收敛缓慢
解决措施:
- 增大训练集
- 降低模型复杂度,增大正则化项系数
- 特征筛选
12.5 高偏差高方差后下一步做什么
12.6 神经网络的偏差方差
神经网络如此成功的原因之一就是神经网络,加上大数据的概念,提供了一种新的方法来解决高偏差和高方差。
当大型网络使用中小型数据集时是低偏差的,也就是说如果你的神经网络足够大,几乎总是可以很好地拟合训练集。
训练神经网络的流程:首先训练模型看它在训练集上是否表现良好,可以通过计算Jtrain是否偏高或者是否能达到基准表现水平(图中左框)。如果它做不到(图中No),那就有一个高偏差的问题,减少偏差的方法就是使用更大的神经网络,比如更多的隐藏层或每层更多的隐藏神经元(图中Bigger network)。随着神经网络越来越大,直到它在训练集中表现良好(图中Yes),然后看看它在验证集上的表现是否够好(图中右框),换句话说就是看它的方差有没有偏高。如果表现不好也就是说它在训练集上好但是在验证集上不好,就是高方差,减少高方差的方法就是获取更多的数据,然后重新训练模型,重复以上过程。直到最后在验证集上也表现良好,那么可能就完成了。
神经网络和正则化
神经网络过大会导致高方差问题吗?事实证明,一个大型神经网络,只要正则化选择恰当,通常会表现得和小的一样好或更好,而不会出现过拟合问题。只不过训练大型神经网络的计算复杂度较高,推理速度变慢。
这里让我想起了一个定理:神经网络可以拟合任意函数。
13 机器学习开发过程
13.1 机器学习开发的迭代循环
选择模型和数据、训练模型、分析偏差方差误差,循环
13.3 数据增强
- 旋转缩放增强图像数据集
- 噪声合成增强语音识别数据集
13.4 迁移学习
对于一个没有那么多数据的算法应用,迁移学习(transfer learning)可以让你用来自不同任务的数据帮助你解决当前任务。
迁移学习的原理:
例:把分类物品的神经网络,拿过来应用于数字识别。
具体做法是:保留神经网络参数,改变输出层,重新运行梯度下降训练输出层的参数。这里有两种选项:选项一为其他层的权重参数保持不变,这适用于新任务数据集较小的情况;选项二为以其为初始值,训练所有层的参数,适用于稍大的数据集。
这种算法被称为迁移学习,因为给人的直观感受是,通过学习识别猫、狗、车、人,它已经为处理输入图像的前面几个层学习了一些合理的参数。新神经网络参数的初始值更合适了,只需要再让算法学习一点,它就能成为一个很好的模型
首先在大型数据集上进行训练,然后在较小的数据集上进一步参数调优,这两个步骤被称为监督预训练(supervised pretraining)。然后使用已经初始化的或从预训练获取到的参数运行梯度下降,进一步微调权重,以适应新任务,这一步称为微调(fine tuning)。
迁移学习的好处在于:可以直接把别人已经训练好并开源的神经网络直接拿过来,改一改输出层再微调,就能获得好的效果。
为什么迁移学习能表现好?
隐藏层参数,预训练好的神经网络已经有一些未知的作用。
13.5 机器学习项目的全流程
- 确定项目的范围
- 收集数据
- 训练模型,进行误差分析不断改进
- 部署应用,并不断维护
14 数据倾斜Skewed datasets(选修)
14.1 误差指标
数据倾斜:
当正负样本的比例非常倾斜,远远不是五五开的时候,通常的误差分析,如准确度,就不那么有效了。
例子:诊断病人,假如样本中有0.5%的病人,你的算法误差率1%,它甚至不如一个一直打印y=0的程序。
精确率和召回率(precision and recall)
混淆矩阵:
精确率和召回率的定义:
precision = TP / (TP + FP)
recall = TP / (TP + FN)
note:注意区分准确率(Accuracy)和精确率(precision)
14.2 权衡率精确率和召回率
精确率和召回率都是越高越好
【精度:预测为正的样本中有多少是真的预测正确了(找得对)】
【召回:样本中的正例有多少被预测正确了(找得全)】
在实践中,精确率和召回率之间往往存在权衡。
- 增大阈值,精确率变高,召回率变低
- 减小阈值,精确率变低,召回率变高
不能用交叉验证法选出一个合适的阈值,只能手动选择。如果想自动权衡精确率和召回率,这里有个指标叫,F1分数(F1 score),它可以自动结合精确率和召回率,帮你选择最佳权衡值。
F1分数是一种结合精确度和召回率的方法,但它更强调这两值中较小的那个。F1分数即为精确度和召回率的调和均值:
15 决策树(底子先锤hhh)
15.1 决策树模型
一个猫分类的例子:给出一些特征(耳朵形状、脸型、是否有胡须),你想训练一个分类器,快速告诉你一个动物是不是猫。
15.2 学习过程
给定训练集,构建决策树的过程分为几个步骤:决策树学习的第一步是,我们必须决定在根节点上使用什么特征,我们会通过一个算法决定(下章节)。然后训练样本会被划分为两部分,左分支和右分支。第二步是决定左右分支下一个用于划分的特征,再划分…,直到划分到纯度为100%,即不再有猫和狗的混合,建立叶子节点。
两个关键决策:
Decison 1:如何选择每个节点的特征?
- 最大化纯度(Maximize purity)
Decison 2:何时停止划分?
- 当纯度为100%
- 超过设置的决策树的最大深度
- 如果优先级分数的提高低于某个阈值,即最小纯度的增益太小
- 样本数量低于某个阈值
16 决策树学习
16.1 测量纯度
纯度:
熵:衡量一组样本的不纯度,假设p1是猫的比例,熵函数如下:
- 当猫和狗的数量五五开的时候,熵最大为1.0
- 两端处,即全是猫或者全是狗的时候,熵为0
熵方程:
一般化的公式(超过两种分类):
16.2 选择拆分信息增益
选择什么样的特征来划分节点可以最能减少熵,熵的减少称为信息增益。
上图中,图a以耳朵形状对根节点进行划分,分别得到左右两边的p1和熵H,如何评价三种划分方法哪一个最好?一种简单的方法是加权平均,权重为子节点数量占总数量的比例。然后,实际的方法是用根节点的熵减去这个加权平均,这个差值就表示熵的减少,即信息增益。最后,0.28>0.12>0.03,故选择第一个。
计算信息增益的基本公式:
16.3 整合(递归算法)
- Start with all examples at the root node
- Calculate information gain for all possible features, and pick the one withthe highest information gain
- Split dataset according to selected feature, and create left and right branches of the tree
- Keep repeating splitting process until stopping criteria is met:
- When a node is 100% one class
- When splitting a node will result in the tree exceeding a maximum depth
- Information gain from additional splits is less than threshold
- When number of examples in a node is below a threshold
翻译:
- 从根节点的所有示例开始
- 计算所有可能特征的信息增益,并选择信息增益最高的一个
- 根据选择的特征拆分数据集,并创建树的左分支和右分支
- 不断重复拆分过程,直到满足停止条件:
- 当节点100%为一类时
- 分裂节点时将导致树的深度超过最大深度
- 额外分割的信息增益小于阈值
- 当节点中的样例数量低于阈值时
16.4 独热编码(one-hot向量)
如果特征分类不是01,而是有两个以上的分类,这种情况下树分支也会超过二叉树,这种情况下就要用到one-hot编码。
将"Ear shape"独热编码为:
16.5 连续值的特征
如果有特征是连续值而不是离散的,那么,可以通过阈值来划分,选取使得信息增益最大化的那个阈值。