机器学习周报(9.30-10.6)

目录

 

摘要

Abstract

1 多标签分类(Multi-label Classification)

2 高级优化方法(Advanced Optimization)

3 额外的层类型(Additional Layer Types)

4 评估和选择模型(Evsluating and Choosing Models)

4.1 模型评估(Evaluating a Model)

4.2 模型选择和训练集、交叉验证集、测试集(Model Selection and Training/ Cross Calidation/ Test Sets)

5 偏差和方差(Bias and Variance)

5.1 诊断偏差和方差(Diagnosing Bias and Variance)

5.2 正则化和偏差或方差(Regularization and Bias/ Variance)

5.3 建立表现基准(Establishing a Baseline Level of Performance)

5.4 学习曲线(Learning Curves)

5.5 偏差与方差的分析(Analysis of Bias and Variance)

5.6 偏差或方差和神经网络(Bias/ Variance and Neural Networks)

6 机器学习发展过程(Machine Learning Development Process)

6.1 机器学习的迭代循环(Iterative Loop of ML)

6.2 误差分析(Error Analysis)

6.3 数据添加(Adding Data)

6.4 迁移学习(Transfer Learning)

6.5 机器学习的完整周期(Full Cycle of A Machine Learning)

6.6 公平、偏见与伦理(Fairness, Bias, and Ethics)

总结


摘要

本周继续学习吴恩达机器学习的神经网络部分。知道了什么是多标签分类,了解了Adam优化方法和卷积层。其次了解了如何进行评估和选择模型以及偏差、方差的相关知识。然后宏观认识机器学习的整体发展过程和完整周期,认识到了迭代循环、误差分析、数据添加、迁移学习等方法。最后对机器学习的公平、偏见与伦理进行了认识,了解到在使用深度学习工具时一定不要将其使用在危害社会的地方上。

Abstract

This week, I continued learning about the neural network section of Andrew Ng's machine learning course. I learned about multi-label classification, the Adam optimization method, and convolutional layers. Additionally, I gained insights into how to evaluate and select models, as well as concepts related to bias and variance. I also developed a macro understanding of the overall development process and complete cycle of machine learning, including methods like iterative cycles, error analysis, data augmentation, and transfer learning. Finally, I recognized the importance of fairness, bias, and ethics in machine learning, understanding that deep learning tools should never be used in ways that harm society.

1 多标签分类(Multi-label Classification)

在多类分类中输出标签eq?y 可能是两个中的任何一个或者可能是两个以上的其中一个。另外有一种不同类型的分类问题称为多标签分类问题,这是与每个图像相关联的地方可能有多个标签。

假设现在要制造一辆自动驾驶或者是有驾驶辅助系统的汽车,然后给到车前的照片,则需要判断这里是否有一辆车还是至少有一辆车或者是否有公共汽车再或者是否有行人。在这种情况下,需要至少三个标签来判断:是否有车?是否有公共汽车?是否有行人?

4ac57352a6a24796af4ceba902fd4189.png

这就是一个多标签分类问题的例子,因为与单个输入图像eq?x 相关联,则实际的输出eq?y 可以表示为一个向量:

bf362ec801e04c4a86ec2c1a8e695142.png

这就与多类分类不同,因为在多类分类中,输出eq?y 只是一个数字,即使这个数字可以有多种不同的可能值。

那应该怎样来构建神经网络来进行多标签分类呢,可以通过构建三个神经网络来分别预测:

9876c6c4afc94efb80b16a089eda7e35.png

但是也可以构建训练一个神经网络来同时预测三辆车,则可以构建如下神经网络,在第一层隐藏层输出eq?%5Cvec%7Ba%7D%5E%7B%5B1%5D%7D ,第二层隐藏层输出eq?%5Cvec%7Ba%7D%5E%7B%5B2%5D%7D ,在这种情况下,最后输出层会有三个输出神经元,然后输出一个eq?%5Cvec%7Ba%7D%5E%7B%5B3%5D%7D ,则eq?%5Cvec%7Ba%7D%5E%7B%5B3%5D%7D 将是一个由三个数字组成的向量。是否有车?是否有公共汽车?是否有行人?这是三个二元分类问题,所以输出层激活函数可以选择Sigmoid函数。

eeb1b6845c964656a38a25e1d4c6ac48.png

2 高级优化方法(Advanced Optimization)

梯度下降是机器学习中广泛应用的优化算法,但现在也存在一些其他的优化算法来最小化代价函数,甚至比梯度下降更好。

接下来将研究一种算法,它可以帮助人们更快地训练神经网络。

梯度下降的表达式为:eq?w_%7Bj%7D%3Dw_%7Bj%7D-%5Calpha%20%5Cfrac%7B%5Cpartial%20%7D%7B%5Cpartial%20w_%7Bj%7D%7DJ%28%5Cvec%7Bw%7D%2Cb%29 。

然后绘制代价函数eq?J%28%5Cvec%7Bw%7D%2Cb%29 使用包含很多椭圆的等高线图,代价函数的最小值在这些椭圆的中心。当开始梯度下降的学习率eq?%5Calpha 很小时,梯度下降的每一步几乎都是朝着同一个方向的。

122656c20a764c278c92ca0ced5fe4e5.png

这时就需要一个算法能自动增加eq?%5Calpha ,让它能迈出更大的步伐,更快地到达最小值,有一种叫做Adam算法的可以做到这一点,甚至在学习率eq?%5Calpha 很大时,降低学习率eq?%5Calpha ,采取更平稳的路径,实现代价函数的最小值。

a872f6e6da194b73ac9628fe665e33b4.png

Adam全称为Adaptive Moment estimation(自适应矩估计),由此可见,Adam算法不使用单一的全局学习率eq?%5Calpha ,它对模型的每个参数使用不同的学习率。

假设有eq?w_%7B1%7D 到eq?w_%7B10%7D 以及eq?b 则存在11个学习率eq?%5Calpha_%7B1%7D 到eq?%5Calpha_%7B11%7D :

eq?%5Cbegin%7Bmatrix%7D%20w_%7B1%7D%3Dw_%7B1%7D-%5Calpha%20_%7B1%7D%5Cfrac%7B%5Cpartial%20%7D%7B%5Cpartial%20w_%7B1%7D%7DJ%28%5Cvec%7Bw%7D%2Cb%29%5C%5C%20%5Ccdot%20%5Ccdot%20%5Ccdot%20%5C%5C%20w_%7B10%7D%3Dw_%7B10%7D-%5Calpha%20_%7B10%7D%5Cfrac%7B%5Cpartial%20%7D%7B%5Cpartial%20w_%7B10%7D%7DJ%28%5Cvec%7Bw%7D%2Cb%29%5C%5C%20b%3Db-%5Calpha%20_%7B11%7D%5Cfrac%7B%5Cpartial%20%7D%7B%5Cpartial%20b%7DJ%28%5Cvec%7Bw%7D%2Cb%29%20%5Cend%7Bmatrix%7D 

梯度下降时如果它似乎继续朝着大致相同的方向移动,则增加该参数的学习率,让它在这个方向上移动地更快,相反,如果一个参数不停地来回振荡,则减少该参数的学习率。

a97c7d12ad7140e398f97902d1e5318a.png

在之前的手写识别0-9代码中,向编译函数添加一个额外的参数优化方法,设定默认的初始学习率为0.001:

# 配置模型的训练参数
model.compile(
    optimizer = tf.keras.optimizers.Adam(learning_rate = 1e-3),
    # 使用Adam优化器,并设置学习率为0.001
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    # 使用稀疏分类交叉熵作为损失函数,且输出是logits(即未经过softmax的原始输出)
)

 对比上周未使用Adam算法的程序运行结果的损失函数对比,使用Adam算法的损失函数值确实会小一些:

f130ef156e48447883d3bd547a43a114.png

使用Adam算法

38e3b5e3bdd5454db79c116a23e7b70f.png

未使用Adam算法​​​​

3 额外的层类型(Additional Layer Types)

到目前为止,所有新的网络信息都是Dense层类型的,每一层中的每一个神经元都从前一层获得输入所有的激活值。通过使用Dense层类型,人们可以构建一些非常强大的学习算法。

回顾Dense层中使用神经元激活的内容,在第二个隐藏层中,有一个关于前一层的每一个激活值的函数:

ce3274bc381647e19c1235023565551e.png

在其他一些应用中,设计神经网络的人可能会选择使用不同类型的层。

在某些工作中你可能会看到的另外一种被称为卷积层(Convolutional Layer)的层类型。在卷积层中每个神经元只能看输入图片的一个区域,这样做的好处是能加快计算速度,需要的训练数据更少或者叫不容易过度拟合。

226a1e6ba2f2475f829eab31aa7b1c2e.png

如果在一个神经网络中有多个卷积层,则可以叫做卷积神经网络(Convolutional Neural Network)即CNN。

举一个心电图诊断这个病人是否患有心脏病或某种可诊断的心脏病的例子,将心电图中100个不同时间点对应的心电图曲线高度设为eq?x_%7B1%7D 到eq?x_%7B100%7D ,将心电图旋转90°,放在一边,则得到100个输入,在构建第一个隐藏层时,不是让100个输入都作为这一层的输入,而是将eq?x_%7B1%7D-x_%7B20%7D 作为第1个神经元的输入,eq?x_%7B11%7D-x_%7B30%7D 作为第2个神经元的输入,eq?x_%7B21%7D-x_%7B40%7D 作为第3个神经元的输入,以此类推到将eq?x_%7B81%7D-x_%7B100%7D 作为第9个神经元的输入,则这就是一个卷积层,在这一层中每个单元只查看输入的有限窗口,然后得到激活值向量eq?%5Cvec%7Ba%7D%5E%7B%5B1%5D%7D 。

同样下一层也可以是卷积层,对应的第二层中神经元不查看前一层的所有九个激活值,让eq?a%5E%7B%5B1%5D%7D_%7B1%7D-a%5E%7B%5B1%5D%7D_%7B5%7D 作为第二层中第1个神经元的输入,eq?a%5E%7B%5B1%5D%7D_%7B3%7D-a%5E%7B%5B1%5D%7D_%7B7%7D 作为第2个神经元的输入,eq?a%5E%7B%5B1%5D%7D_%7B5%7D-a%5E%7B%5B1%5D%7D_%7B9%7D 作为第3个神经元的输入,得到激活值向量eq?%5Cvec%7Ba%7D%5E%7B%5B2%5D%7D ,eq?%5Cvec%7Ba%7D%5E%7B%5B2%5D%7D 作为输出层Sigmoid单元的输入,Sigmoid单元查看eq?%5Cvec%7Ba%7D%5E%7B%5B2%5D%7D 的所有三个值,再对对心脏病的存在或不存在进行二元分类。

b137c562fc7d41f7ba7f5020034e09d5.png

通过设置单个神经元观察窗口的大小以及每层神经元的个数来构建新版本的神经网络,这对某些应用程序来说,它们甚至比Dense层更有效。

目前一些其他的前沿模型:Transformer、LSTM(长短期记忆网络)、Attention(注意力模型)等。

并且还能通过把不同类型的层当作积木一样连接在一起,从而能够形成更加复杂更加强大的神经网络。

4 评估和选择模型(Evsluating and Choosing Models)

4.1 模型评估(Evaluating a Model)

在线性回归中,我们可以通过将数据集分为训练集和测试集,用训练集来训练模型,然后用测试集来进行测试,训练集和测试集的比例可以是7:3也可以是8:2,训练集用eq?%28x%5E%7B%28m_%7Btrain%7D%29%7D%2Cy%5E%7B%28m_%7Btrain%7D%29%7D%29 表示(eq?m_%7Btrain%7D 代表训练集数量),测试集用eq?%28x%5E%7B%28m_%7Btest%7D%29%7D_%7Btest%7D%2Cy%5E%7B%28m_%7Btest%7D%29%7D_%7Btest%7D%29 来表示(eq?m_%7Btest%7D 代表测试集数量)。

e519bb17eaff4485862046d130a28c01.png

通过最小化带平方误差的代价函数eq?J%28%5Cvec%7Bw%7D%2Cb%29 拟合参数:

eq?J%28%5Cvec%7Bw%7D%2Cb%29%3D_%7B%5Cvec%7Bw%7D%2Cb%7D%5E%7Bmin%7D%5B%5Cfrac%7B1%7D%7B2m_%7Btrain%7D%7D%5Csum%20%5E%7Bm_%7Btrain%7D%7D_%7Bi%3D1%7D%28f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D%29-y%5E%7B%28i%29%7D%29%5E%7B2%7D+%5Cfrac%7B%5Clambda%20%7D%7B2m_%7Btrain%7D%7D%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dw%5E%7B2%7D_%7Bj%7D%5D 

计算测试集误差:

eq?J_%7Btest%7D%28%5Cvec%7Bw%7D%2Cb%29%3D%5Cfrac%7B1%7D%7B2m_%7Btest%7D%7D%5B%5Csum%20%5E%7Bm_%7Btest%7D%7D_%7Bi%3D1%7D%28f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D_%7Btest%7D%29-y%5E%7B%28i%29%7D_%7Btest%7D%29%5E%7B2%7D%5D 

计算训练集误差:

eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29%3D%5Cfrac%7B1%7D%7B2m_%7Btrain%7D%7D%5B%5Csum%20%5E%7Bm_%7Btrain%7D%7D_%7Bi%3D1%7D%28f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D_%7Btrain%7D%29-y%5E%7B%28i%29%7D_%7Btrain%7D%29%5E%7B2%7D%5D 

如果只是针对训练集进行训练,最终得到最拟合的函数,但是使用测试集时,可能出现代价函数很大的情况,所以会有模型无法预测新出现的在训练集中没有的新数据点的情况:

d3258dec922a4666a3bedc8b32d9e008.png

然后将上述过程再应用于分类问题上,例如识别手写数字0和1。

得到代价函数eq?J%28%5Cvec%7Bw%7D%2Cb%29 :

eq?-%5Cfrac%7B1%7D%7Bm%7D%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5By%5E%7B%28i%29%7Dlog%28f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D%29%29+%281-y%5E%7B%28i%29%7D%29log%281-f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D%29%29%5D+%5Cfrac%7B%5Clambda%20%7D%7B2m%7D%5Csum_%7Bj%3D1%7D%5E%7Bn%7Dw%5E%7B2%7D_%7Bj%7D

计算测试集误差eq?J_%7Btest%7D%28%5Cvec%7Bw%7D%2Cb%29 :

eq?-%5Cfrac%7B1%7D%7Bm_%7Btest%7D%7D%5Csum_%7Bi%3D1%7D%5E%7Bm_%7Btest%7D%7D%5By%5E%7B%28i%29%7D_%7Btest%7Dlog%28f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D_%7Btest%7D%29%29+%281-y%5E%7B%28i%29%7D_%7Btest%7D%29log%281-f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D_%7Btest%7D%29%29%5D 

计算训练集误差eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 :

eq?-%5Cfrac%7B1%7D%7Bm_%7Btrain%7D%7D%5Csum_%7Bi%3D1%7D%5E%7Bm_%7Btrain%7D%7D%5By%5E%7B%28i%29%7D_%7Btrain%7Dlog%28f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D_%7Btrain%7D%29%29+%281-y%5E%7B%28i%29%7D_%7Btrain%7D%29log%281-f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D_%7Btrain%7D%29%29%5D 

eq?J_%7Btest%7D%28%5Cvec%7Bw%7D%2Cb%29 则表示是被错误分类的测试集的分数,eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29则表示是被错误分类的训练集的分数。

4.2 模型选择和训练集、交叉验证集、测试集(Model Selection and Training/ Cross Calidation/ Test Sets)

运用上一节的方法通过使用训练集找到代价函数最小来选择函数模型,由此我们通过计算eq?x 的一次项到十次项的函数,假设最终计算得到eq?x 的五次项为最小代价函数,但是这可能是个非常拟合训练集的函数,是一个过于正确的预测模型,导致对测试集的预测会存在很大误差。

006f0a777ea84fb19314e9ed61444381.png

因此,我们需要进一步修改训练和测试的过程以进行模型的选择。

这次将数据集分为60%的训练集、20%的交叉验证集和20%的测试集。测试集和训练集的表示方法和上节相同,交叉验证集表示为eq?%28x%5E%7B%28m_%7Bcv%7D%29%7D_%7Bcv%7D%2Cy%5E%7B%28m_%7Bcv%7D%29%7D_%7Bcv%7D%29 ,eq?m_%7Bcv%7D 代表训练集数量。交叉验证(Cross validation)集也被称为验证(Validation)集、开发(Development)集或dev集。

所以得到训练集误差:

eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29%3D%5Cfrac%7B1%7D%7B2m_%7Btrain%7D%7D%5B%5Csum%20%5E%7Bm_%7Btrain%7D%7D_%7Bi%3D1%7D%28f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D_%7Btrain%7D%29-y%5E%7B%28i%29%7D_%7Btrain%7D%29%5E%7B2%7D%5D 

验证集误差:

eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29%3D%5Cfrac%7B1%7D%7B2m_%7Bcv%7D%7D%5B%5Csum%20%5E%7Bm_%7Bcv%7D%7D_%7Bi%3D1%7D%28f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D_%7Bcv%7D%29-y%5E%7B%28i%29%7D_%7Bcv%7D%29%5E%7B2%7D%5D 

测试集误差:

eq?J_%7Btest%7D%28%5Cvec%7Bw%7D%2Cb%29%3D%5Cfrac%7B1%7D%7B2m_%7Btest%7D%7D%5B%5Csum%20%5E%7Bm_%7Btest%7D%7D_%7Bi%3D1%7D%28f_%7B%5Cvec%7Bw%7D%2Cb%7D%28%5Cvec%7Bx%7D%5E%7B%28i%29%7D_%7Btest%7D%29-y%5E%7B%28i%29%7D_%7Btest%7D%29%5E%7B2%7D%5D 

则现在可以通过比较验证集代价函数eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 来比较函数模型,最终选择验证集代价函数最小的那一个,然后使用测试集代价函数eq?J_%7Btest%7D%28%5Cvec%7Bw%7D%2Cb%29估计泛化误差:

65541d72d03e41c1b6e3637f70492a41.png

在神经网络中也可以适用,可以通过选择不同神经网络模型(层数、神经元个数)来计算对应的验证集代价函数eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 ,找到代价函数最小的神经网络模型。

4217930119ea433b97249191c74ee084.png

  • 训练集:参与训练,模型从训练集中学习经验,从而不断减小训练误差;
  • 验证集:不参与训练,用于在训练过程中检验模型的状态,收敛情况,同时验证集在训练过程中还可以用来监控模型是否发生过拟合;
  • 测试集:不参与训练,用于在训练结束后对模型进行测试,评估其泛化能力。测试集仅用于最终评价模型的好坏。

5 偏差和方差(Bias and Variance)

5.1 诊断偏差和方差(Diagnosing Bias and Variance)

在线性回归的例子中,如果选择一次函数进行拟合则拟合效果不太好,如果选择四次函数进行拟合,虽然拟合效果很好但是过拟合不能有效预测,则选择二次函数正好。但是通过设计函数来判断拟合效果有点麻烦和复杂,则有一种更系统的诊断方法,可以通过查看eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 和eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29  大小来判断,通过找到训练集和验证集的代价函数都比较低的情况,这种情况既没有高偏差(Bias)也没有高方差(Variance):

5a097f538b3741c89221a14586539fbc.png

对于多项式的度来说,多项式的度越大,eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 越小,偏差则越小。但是度较大和较小的情况eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 会偏大,只有在中间某个点才合适,此时方差最小。

fceedf2677304c189bae33d5e3e44139.png

  • 当高偏差时,为欠拟合情况,eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 将会较高,eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29%5Capprox%20J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 ;
  • 当高方差时,为过度拟合情况,eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29%5Cgg%20J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 可能会较低;
  • 当高偏差和高方差时,eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 将会较高且eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29%5Cgg%20J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 。

5.2 正则化和偏差或方差(Regularization and Bias/ Variance)

在四阶多项式eq?f_%7B%5Cvec%7Bw%7D%2Cb%7D%3Dw_%7B1%7Dx+w_%7B2%7Dx%5E%7B2%7D+w_%7B3%7Dx%5E%7B3%7D+w_%7B3%7Dx%5E%7B3%7D+b中,使用正则化拟合这个模型,eq?%5Clambda 的值是正则化参数,保持参数eq?w_%7Bj%7D 更好地拟合训练数据。

  • eq?%5Clambda 很大时,eq?w_%7Bj%7D 就会非常小几乎接近于零,最终会得到eq?f_%7B%5Cvec%7Bw%7D%2Cb%7D%3Db ,为欠拟合情况,且eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 会很大;
  • eq?%5Clambda 很小,小到为0时,为过度拟合情况,eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 会很小,但是eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 会很大;
  • eq?%5Clambda 正好时,能很好地拟合数据,使得eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 和eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 都很小。

71dd73462a794d79aea1d8291c67b208.png

可以用交叉验证来准吗选择多项式的度,通过尝试不同的eq?%5Clambda 值,来计算交叉验证的误差,然后使用这些不同的调节参数在交叉验证集上评估性能,从而选择正则化参数的最佳值。

aad280ffea3a4cb294641a6a6a6922fe.png

当横坐标为正则化参数时,eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 和eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 的情况如下,当eq?%5Clambda 值过小时,eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 偏小但是eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 偏大,当eq?%5Clambda 值过大时,eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 和eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 都偏大,只有eq?%5Clambda 值适中时,eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29才偏小,:

ffc6a063ecb746c7a00e1ca657084357.png

这和上一小节中,以多项式的度为横坐标的图像呈镜像,高偏差在eq?%5Clambda 值过大和度过小的情况,高方差在eq?%5Clambda 值过小和度过大的情况。

只有通过尝试评估不同的值,选择一个交叉验证误差较低的值,才能有望为应用程序提供一个良好的模型。

5.3 建立表现基准(Establishing a Baseline Level of Performance)

在语音识别中,如果得出训练误差eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 为10.8%,则表示它完美记录了训练集89.2%的数据,但是在10.8%的训练集犯了错误。然后如何想要测量这个语音识别算法在单独的交叉验证集上的性能,得出验证误差eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 为14.8%,可以看出训练误差和验证误差还是比较大大,存在方差和偏差的问题。

但在分析语音识别时,人类的表现水平也是一个重要指标,人类能否通过这些音频片段正确转录语音。发现测量人类转录语音时也会有10.6%的误差,这是因为有些音频片段中会存在一些噪音,导致无法正常转录这些被噪音干扰的片段。

由此,既然人类表现水平都存在一定的误差,似乎也很难期望有那个学习算法能做到更好了,所以通过观察训练误差是否远高于人类的表现水平可能更有用。

可以看出训练误差eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 仅仅比人类表现水平高0.2%,但是验证误差eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 却远高于练误差eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 ,所以这个算法实际上有更多的方差问题。

2827ff073c6442fea39c3d3cc62a12f6.png

所以想要判断训练误差是否很大时,建立表现基准通常是很有用到,即可以合理地希望学习算法最终会达到什么样的错误水平。建立表现基准有以下几种常见方法:

  • 人类表现水平:尤其在使用非结构化数据(例如音频、图像或文本)时,人类表现水平是一个很好的基准;
  • 相互竞争算法:可以是别人以前实现的甚至是竞争对手的算法来建立一个表现基准;
  • 经验猜测:根据先前已有的相似算法来进行合理的经验猜测,知道算法可能会达到什么样的性能水平。

在评判算法是否有高偏差或者高方差时,通过查看表现基准、训练误差和验证误差之间的差距可以看出:

  • 高方差:训练误差和表现基准之间差距不大,但是验证误差远大于训练误差;
  • 高偏差:训练误差远大于表现基准,但是验证误差和训练误差差距不大;
  • 高偏差、高方差:训练误差远大于表现基准,且验证误差远大于训练误差。

0dd1648971e142ca873d710256f6c427.png

数据总会存在一定的噪点,所以期待得到零误差是可以但是不现实的,通过建立表现基准是有用的,而不是简单追求训练误差和验证误差。

5.4 学习曲线(Learning Curves)

学习曲线就是通过画出不同训练集大小时训练集和交叉验证的准确率,可以看到模型在新数据上的表现,进而来判断模型是否方差偏高或偏差过高,以及增大训练集是否可以减小过拟合。

横坐标为训练集大小,纵坐标为误差:

9f6be697dfe841bf906ab319c062efbb.png

训练误差随着训练集的增大而增大,验证误差随着训练集的增大而减小。

当训练误差和测试误差收敛但却远高于表现基准时,为高偏差。在使用直线拟合数据时就算再多训练集也只能使训练误差和测试误差越来越收敛而不能降低误差率: 

5e1f456ec4344e6aa47fe6bb8e6fc9d7.png

也就是说在高偏差的情况下,增加数据到训练集不一定能有帮助。

当训练集和测试集的误差之间有大的差距时,为高方差。下面使用一个非常高次的多项式模型,并且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果:

48c97f44697a450984ee2d6c290f4708.png

也就是说在高方差的情况下,增加更多数据到训练集可能可以提高算法效果。但是一味的扩大训练集,花费会很高很高。

5.5 偏差与方差的分析(Analysis of Bias and Variance)

前面了解了怎样评价一个学习算法,怎么进行模型选择的问题,以及偏差和方差的问题。这些诊断法能帮助我们进行一些判断,哪些方法可能有助于改进学习算法的效果,而哪些可能是徒劳的:

  • 增加训练样本:让拟合想过更好,更符合现实,解决高方差;
  • 减少特征数量:模型不会过于复杂,解决高方差;
  • 增加特征数量:让模型变复杂,解决高偏差;
  • 增加多项式特征:当于增加特征向量,解决高偏差;
  • 减少正则化程度eq?%5Clambda :自由发挥,解决高偏差;
  • 增加正则化程度eq?%5Clambda :会压制eq?w,解决高方差。

0674763c37334b0292333aff8bf4290d.png

则解决高偏差的方法为: 复杂模型(增加特征向量);减少eq?%5Clambda 。

解决高方差的方法为:增加训练集;简化模型(减少特征向量);增大eq?%5Clambda

5.6 偏差或方差和神经网络(Bias/ Variance and Neural Networks)

在神经网络之前,拟合模型必须权衡复杂性,也就是多项式的度或正则化参数,使偏差和方差都不太高。从前面几节的例子可知,高偏差和高方差都是不好的,它们损害了算法的性能,所以必须在这两个不好的东西之间找一个折中。

0edc612323bb42e2b9a4922233fa2a38.png

神经网络之所以如此成功,其原因之一是因为神经网络关于大数据的想法或者希望拥有大的数据集,它给了我们一种新的方法用来解决高偏差和高方差问题。在大型的神经网络使用小型或中型数据集训练时,是一个低偏差机器,则把神经网络做的足够大,就几乎总能够很好地适应训练集,只要训练集不是很大,则这样提供了一个方法不用在偏差和方差之间进行权衡了。

如下图,首先在训练集上训练算法,问它在训练集上做得好吗?测量训练误差eq?J_%7Btrain%7D%28%5Cvec%7Bw%7D%2Cb%29 看看它在基于人类表现基准是否高。如果它做得不好,则存在高偏差。然后减少偏差的一个方法就是使用更大的神经网络,要么是更多的隐藏层,要么是每层更多的隐藏单元。以此循环,直到训练误差与期望的目标误差水平大致相当。

然后问它在验证集上做得好吗?测量验证误差eq?J_%7Bcv%7D%28%5Cvec%7Bw%7D%2Cb%29 是否高。如果它做得不好,则存在高方差。然后减少方差的一个方法就是获得更多的数据,回去重新训练模型,检查它在训练集上是否表现良好。知道它能在验证集上表现良好。

9354c477727e40a496ef31bb091a8fad.png

虽然更大的神经网络确实会减少偏差,但是计算同时也变得更昂贵,这也引起了传统计算机的革新,提升GPU性能对加快神经网络也非常有用。

一个正则化选择得当的大型神经网络通常会做得和较小的一样好或更好,添加正则化代码如下:

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.regularizers import L2

model = Sequential([
        Dense(25, activation='relu', kernel_reregularizer=L2(0.01)),
        Dense(15, activation='relu', kernel_reregularizer=L2(0.01)),
        Dense(1, activation='sigmoid', kernel_reregularizer=L2(0.01))
])

6 机器学习发展过程(Machine Learning Development Process)

6.1 机器学习的迭代循环(Iterative Loop of ML)

机器学习的迭代循环包含以下几个部分:

  • 选择结构:首先要决定系统的总体体系结构是什么,需要选择什么样的机器学习模型、使用什么样的数据、选择超参数等;
  • 训练模型:根据选择决定好的结构,然后进行实现并训练一个模型;
  • 诊断:当第一次训练一个模型时,可能不会达到我们的预期,所以需要实现或查看一些诊断,例如查看算法的偏差和方差以及进行误差分析,根据诊断的结果再进行选择新的结构,以此迭代循环,直到得到想要实现的预期。

5bc69c05846945feb427992c8ae480d5.png

下面是一个垃圾邮件分类器算法的例子。为了解决这样一个问题,其中一种方法是训练一种监督学习算法,其中输入特征向量eq?x 是电子邮件的特征值,输出标签eq?y 是1或0,取决于它是否是垃圾邮件。我们可以选择以英语或其他字典中的前一万个单词为例,用它们来定义特征值eq?x_%7B1%7D%2Cx_%7B2%7D%2C...%2Cx_%7B10000%7D,根据这些词是否有在邮件中出现,来获得我们的特征向量(出现为1,不出现为0):

138cbbf55a0547fe9179fffba79dfe1e.png

 通过上述方法训练好初始模型之后,如果它不像你希望的那么好,可以通过以下方法来改进学习算法的性能:

  • 收集更多数据
  • 基于电子邮件路由开发更复杂的特征
  • 从电子邮件正文中定义更复杂的特征
  • 设计检测拼写错误的算法

6.2 误差分析(Error Analysis)

假设某一次垃圾邮件分类器算法模型执行了500个实例的验证集,最后得出算法错误地分类了100给。误差分析要做的既是检验交叉验证集中我们的算法产生错误预测的所有邮件,看是否能将这些邮件按照类分组。例如医药品垃圾邮件、故意拼写错误垃圾邮件、不寻常电子邮件路由、密码窃取或网络钓鱼电子邮件、嵌入式图像垃圾邮件等,一个电子邮件可能同时为多种类别。但是假如验证集特别大,误差数量也特别多,这样就可能根本没有那么多时间手动查看进行误差分析,可以通过随机抽取的方法来查看一部分。

85475683784f4ac696985f9931a79bca.png

在查看完后,看分类器对哪一组邮件的预测误差最大,并着手优化。 从出现次数最多的情况开始着手优化,思考怎样能改进分类器。 误差分析并不总能帮助我们判断应该采取怎样的行动。有时我们需要尝试不同的模型,然后进行比较,在模型比较时,用数值来判断哪一个模型更好更有效,通常我们是看交叉验证集的误差。

6.3 数据添加(Adding Data)

专项的添加需要的数据,比一味的添加各种数据更加有效,从而知道怎么寻找方法来改进代码。

其中一种方法是数据增强(Data augmentation),用已有的例子去构造新例子,例如旋转、放大缩小、改变图像对比度、扭曲图像等:

2ff3a15536b04a1fa6baf25964488b18.png

构造丰富的数据库,让机器学习的更加稳健:

c49dbc7da1ce49cc95857e9ab5d57314.png

在语音识别中,可以通过对音频进行叠加与加噪,来构造丰富的数据库,人为地增加训练数据的大小:

b456bccd3a1c4773accb4a9eacbcaa99.png

对数据所做的变形和扭曲应代表测试集中的噪声或失真类型,从而对数据进行数据增强的有用方法,而不是在数据中添加纯粹随机的无意义的噪声,这样通常是没有那么大帮助的:

4fa26243964940ca9fcdb3a528b2f79a.png

还有一种技术是数据合成(Data synthesis),从零开始创造全新的例子。

OCR是光学字符识别,指的是让计算机自动读取图像中出现的文本。

7a26e69d895d45a981c84785aa9f6998.png

训练OCR算法从图像中读取文本的关键是能够看到其中小的图像,认出其中的字符。为这项任务创建人工数据的一种方法是在文本编辑器中键入随机文本然后截取它,再使用不同颜色不同对比度和非常不同的字体,从而生成合成数据,这可以为训练OCR算法任务生成大量的图像或示例,生成数据集可以减少处理数据花费的时间:

481c279c74f3488c9cef03f287a29eaa.png

机器学习系统或人工智能系统包括实现算法或模型的代码以及训练算法的数据。有的专注于改进代码,有的算法已经够好了,就要在数据上下功夫。

677d8261774544e8a97fb4d7638beef6.png

6.4 迁移学习(Transfer Learning)

但是也有一些应用程序没有那么多数据或者很难得到更多的数据,则需要运用迁移学习技术,使用其他任务的数据,以提升该学习算法的性能。

假设想要识别手写数字0到9,但是没有那么多手写数字的标记数据,但是这时有一个很大的百万级别的数据集包含一千个不同类别,则可以让神经网络使用这个数据集来进行预训练(Pretraining),最终学习到了神经网络每层的参数eq?w%2C%5Cvec%7Bb%7D ,然后应用迁移学习,复制这个神经网络,并保存除输出层外的参数eq?w%2C%5Cvec%7Bb%7D ,再将输出层变为0到9共十个单元的输出,然后再进行微调(Fine tuning),此时微调神经网络参数有两种选择:

  1. 只训练输出层的参数,保存前面几层的参数eq?w%2C%5Cvec%7Bb%7D ,使用梯度下降算法或Adam算法更新输出层参数eq?w%2C%5Cvec%7Bb%7D ,降低代价函数。
  2. 训练所有的参数,所以的参数eq?w%2C%5Cvec%7Bb%7D 都将被初始化。

对于小一些的神经网络,选项1可能会更好一点,选项2则所有的神经网络都合适。当预训练的数据集很大,而自己的数据集较小时,效果往往会更好。

6e3f8699347b4a558b73611fbd218f99.png

神经网络的早期层基本上都是进行一些边,角落还有基本图形的处理。因此在不同的数据集上其实是有共通性的。但是迁移学习的一个限制是图像类型eq?x必须与预训练的图片类型相同,即图片尺寸相同,且图像识别系统不能拿去识别语音。

0fe696bcab784c52be861eacbcf79ff5.png

6.5 机器学习的完整周期(Full Cycle of A Machine Learning)

机器学习整个项目的完整周期包括:

  • 确定计划:确定要解决什么样的问题,实现预期目标;
  • 收集数据:确定数据的来源,收集数据,然后定义标签;
  • 模型训练:训练模型、误差分析和迭代改进,如果模型训练不够理想,可能需要回到第二步重新进行数据收集;
  • 模型部署:部署、监控、维护和更新系统,如果在模型部署时发现与训练的效果有较大偏差,就可能需要回到第三步,甚至第二步。

673a886a333741e98ab09c24d1e16cda.png

关于第四步部署,首先,要将神经网络部署到一个推理服务器上。然后,如果目前已经实现了一个移动应用程序,例如一个社交应用程序,那么当用户与程序进行交谈时,移动应用程序就可以进行API的调用,将录制的音频传给服务器,服务器接收到数据,并在神经网络上运行获得结果,再将结果传输给手机app。

41295b09bcc7492fb250b5cd1c0d66e1.png

根据用户规模,可能需要不同程度的软件工程,来帮助实现以下任务:

  • 维护并保持模型的效率
  • 扩展功能
  • 记录用户数据
  • 对系统进行检测
  • 模型更新

6.6 公平、偏见与伦理(Fairness, Bias, and Ethics)

在建立机器学习系统时,要考虑确保系统是合理公平没有偏见的。

关于深度学习,我们必须避免出现类似以下的问题

  • 歧视女性的招聘工具
  • 更倾向于将深色肤色的人识别为罪犯的人脸识别系统
  • 偏见和歧视亚裔的银行借贷
  • 强化负面刻板印象的毒性反应
  • 社交媒体深度学习算法加速虚假消息传播,引起恐慌,引导公众舆论
  • 利用深度学习技术制作虚假消息,实施欺诈

我们应该在确定计划时对可能出错的事情进行预测,减少这些出错事情发生的概率。其次在部署模型前对系统进行审计,对其可能产生的负面影响以及法律风险进行评估并制定售后方案。最后,在部署后监控可能出现的危害。

在学习过程中也不要掉以轻心,深度学习是一种工具,在使用时一定不要将其使用在危害社会的地方上。

总结

通过本周学习,了解了多标签分类是用来处理处理同时预测多个标签的任务及其应用场景;高级优化方法学习到Adam算法,相比梯度下降算法能够加速收敛、减小震荡并且能够自适应学习率等优点;还了解了卷积层是卷积神经网络(CNN)中的核心组件,主要用于处理图像及其他网格数据,能够加快计算速度。

了解了如何评估和选择模型。分割数据集为训练集、验证集和测试集,以便进行模型评估。根据问题类型选择合适的模型,使用交叉验证来评估不同超参数设置的性能。在训练集上训练模型;在未见过的测试集上评估模型的性能;在数据集上对模型进行测试,评估其泛化能力。

了解到偏差和方差是机器学习中评估模型性能的重要概念,二者共同影响模型的泛化能力。在模型选择和训练中,偏差和方差通常呈现出一种权衡关系。降低偏差往往会增加方差,反之亦然。理想情况下,通过适当的模型选择和调优策略,可以在两者之间找到一个合理的平衡,使得模型在训练集、验证集、测试集上的表现都比较好,从而提高模型的泛化能力。

了解到机器学习的迭代循环包括选择结构、训练模型和诊断。误差分析主要用于评估和理解模型的性能。数据添加有数据增强和数据合成两种方法,可以有效地管理和利用新增的数据,提升数据分析和模型的准确性。迁移学习技术是使用其他任务的数据,以提升该学习算法的性能。认识到机器学习的完整周期包括确认计划、收集数据、模型训练和模型部署。

最后,认识到深度学习目前面临的一些公平、偏见和伦理问题,警示我们在学习过程中也不要掉以轻心,深度学习是一种工具,在使用时一定不要将其使用在危害社会的地方上。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值