吴恩达机器学习2022学习笔记(二)

吴恩达机器学习2022学习笔记(二)

oyxy2019 463 2022-11-29

吴恩达机器学习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函数:

g(z)=11+ezg(z) = \frac{1}{1+e^{-z}}

ReLU函数(rectified linear unit修正线性单元):

g(z)=max(0,z)g(z) = \max(0,z)

线性激活函数(也可以说是没有激活函数):

g(z)=zg(z) = z

后续还会讲到第四个激活函数,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

zj=wjx+bj(j=1,2,...,N)z_j = w_j·x + b_j (j=1,2,...,N)

aj=ezjk=1Nezka_j = \frac{e^{z_j}}{\sum_{k=1}^{N}{e^{z_k}}}

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分数即为精确度和召回率的调和均值:

F1=21precision+1recallF1 = \frac{2}{\frac{1}{precision}+\frac{1}{recall}}

15 决策树(底子先锤hhh)

15.1 决策树模型

一个猫分类的例子:给出一些特征(耳朵形状、脸型、是否有胡须),你想训练一个分类器,快速告诉你一个动物是不是猫。

15.2 学习过程

给定训练集,构建决策树的过程分为几个步骤:决策树学习的第一步是,我们必须决定在根节点上使用什么特征,我们会通过一个算法决定(下章节)。然后训练样本会被划分为两部分,左分支和右分支。第二步是决定左右分支下一个用于划分的特征,再划分…,直到划分到纯度为100%,即不再有猫和狗的混合,建立叶子节点。

两个关键决策

Decison 1:如何选择每个节点的特征?

  • 最大化纯度(Maximize purity)

Decison 2:何时停止划分?

  • 当纯度为100%
  • 超过设置的决策树的最大深度
  • 如果优先级分数的提高低于某个阈值,即最小纯度的增益太小
  • 样本数量低于某个阈值

16 决策树学习

16.1 测量纯度

纯度:

熵:衡量一组样本的不纯度,假设p1是猫的比例,熵函数如下:

  • 当猫和狗的数量五五开的时候,熵最大为1.0
  • 两端处,即全是猫或者全是狗的时候,熵为0

熵方程:

H(p1)=p1log2(p1)p0log2(p0)=p1log2(p1)(1p1)log2(1p1)\begin{aligned} H\left(p_{1}\right) & =-p_{1} \log _{2}\left(p_{1}\right)-p_{0} \log _{2}\left(p_{0}\right) \\ & =-p_{1} \log _{2}\left(p_{1}\right)-\left(1-p_{1}\right) \log _{2}\left(1-p_{1}\right) \end{aligned}

一般化的公式(超过两种分类):

H(x)=i=1nP(xi)log2P(xi)H(x)=-\sum_{i=1}^{n} P\left(x_{i}\right) \log _{2} P\left(x_{i}\right)

16.2 选择拆分信息增益

选择什么样的特征来划分节点可以最能减少熵,熵的减少称为信息增益。

上图中,图a以耳朵形状对根节点进行划分,分别得到左右两边的p1和熵H,如何评价三种划分方法哪一个最好?一种简单的方法是加权平均(510H(0.8)+510H(0.2))\left(\frac{5}{10} H(0.8)+\frac{5}{10} H(0.2)\right),权重为子节点数量占总数量的比例。然后,实际的方法是用根节点的熵H(0.5)H(0.5)减去这个加权平均,这个差值就表示熵的减少,即信息增益。最后,0.28>0.12>0.03,故选择第一个。

计算信息增益的基本公式:

Information Gain=H(p1root )(wleft H(p1left )+wright H(p1right ))Information \ Gain =\mathrm{H}\left(\mathrm{p}_{1}^{\text {root }}\right)-\left(w^{\text {left }} H\left(p_{1}^{\text {left }}\right)+w^{\text {right }} H\left(p_{1}^{\text {right }}\right)\right)

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 连续值的特征

如果有特征是连续值而不是离散的,那么,可以通过阈值来划分,选取使得信息增益最大化的那个阈值。

16.6 回归树(选修)

17 集成学习

17.1 使用多个决策树

17.2 放回抽样

17.3 随机森林算法

17.4 XGBoost

17.5 什么时候使用决策树(决策树 vs. 神经网络)