1. 监督学习和无监督学习
监督学习 ( Supervised Learning
) 和无监督学习 ( Unsupervised Learning
) 是在机器学习中经常被提及的两个重要的学习方法。
假如有一堆由苹果和梨混在一起组成的水果,需要设计一个机器对这堆水果按苹果和梨分类,但是这个机器现在并不知道苹果和梨是什么样的,所以我们首先要拿一堆苹果和梨的照片,告诉机器苹果和梨分别长什么样;经过多轮训练后,机器已经能够准确地对照片中的水果类别做出判断,并且对苹果和梨的特征形成自己的定义;之后我们让机器对这堆水果进行分类,看到这堆水果被准确地按类别分开。这就是一个监督学习的过程。
如果我们没有拿苹果和梨的照片对机器进行系统训练,机器也不知道苹果和梨长什么样,而是直接让机器对这一堆水果进行分类,则机器能够根据自己的“直觉”将这一堆水果准确地分成两类。这就是一个无监督学习的过程,说明机器自己总结出了苹果和梨的特征,该过程看起来更贴近我们所设想的人工智能技术。
1.1 监督学习
监督学习定义:
提供一组输入数据和其对应的标签数据,然后搭建一个模型,让模型在通过训练后准确地找到输入数据和标签数据之间的最优映射关系,在输入新的数据后,模型能够通过之前学到的最优映射关系,快速地预测出这组新数据的标签。
在实际应用中有两类问题使用监督学习的频次较高,这两类问题分别是回归问题和分类问题:
- 回归问题 (
Regression
)
回归问题就是使用监督学习的方法,让我们搭建的模型在通过训练后建立起一个连续的线性映射关系,主要有以下两点:
- 通过提供数据训练模型,让模型得到映射关系并能对新的输入数据进行预测;
- 我们得到的映射模型是线性连续的对应关系;
应用的机器学习方法为线性回归。
- 分类问题(
Classfication
)
分类问题就是让我们搭建的模型在通过监督学习之后建立起一个离散的映射关系。分类模型和回归问题在本质上有很大的不同,它依然需要使用提供的数据训练模型让模型得到映射关系,并能够对新的输入数据进行预测,不过最终得到的映射模型是一种离散的对应关系。
应用的机器学习方法为逻辑回归。
逻辑回归(Logistic Regression
)是机器学习一个最基本也是最常用的算法模型。与线性回归不同的是,逻辑回归主要用于对样本进行分类
。
因此,逻辑回归的输出是离散值。对于二分类问题,通常我们令正类输出为 1,负类输出为 0。例如一个心脏病预测的问题:根据患者的年龄、血压、体重等信息,来预测患者是否会有心脏病,这就是典型的逻辑回归问题。
1.2 无监督学习
无监督学习定义:
提供一组没有任何标签的输入数据,将其在我们搭建好的模型中进行训练,对整个训练过程不做任何干涉,最后得到一个能够发现数据之间隐藏特征的映射模型,使用这个映射模型能够实现对新数据的分类,这就是一个无监督学习的过程。无监督学习主要依靠模型自己寻找数据中隐藏的规律和特征,人工参与的成分远远少于监督学习的过程。
使用无监督学习实现分类的算法又叫作聚类。这里需要特别注意和有监督学习里的分类的区别:
- 分类问题是我们已经知道了有哪几种类别;
- 而聚类问题,是我们在分析数据之前其实是不知道有哪些类别的。
即分类问题是在己知答案里选择一个,而聚类问题的答案是未知的,需要利用算法从数据里挖掘出数据的特点和结构。
1.3 半监督学习
半监督学习( Semi-Supervised Learning
,SSL)是模式识别和机器学习领域研究的重点问题,是监督学习与无监督学习相结合的一种学习方法。半监督学习使用大量的未标记数据,以及同时使用标记数据,来进行模式识别工作。当使用半监督学习时,将会要求尽量少的人员来从事工作,同时,又能够带来比较高的准确性,因此,半监督学习目前正越来越受到人们的重视。
在此学习方式下,输入数据部分被标识,部分没有被标识,这种学习模型可以用来进行预测,但是模型首先需要学习数据的内在结构以便合理的组织数据来进行预测。
1.4 强化学习
又称再励学习、评价学习,是一种重要的机器学习方法,在这种学习模式下,输入数据作为对模型的反馈,不像监督模型那样,输入数据仅仅是作为一个检查模型对错的方式,在强化学习下,输入数据直接反馈到模型,模型必须对此立刻作出调整。常见的应用场景包括动态系统以及机器人控制等。常见算法包括 Q-Learning 以及时间差学习(Temporal difference learning)。
2. 欠拟合和过拟合
可以将搭建的模型是否发生欠拟合或者过拟合作为评价模型的拟合程度好坏的指标。
欠拟合和过拟合的模型预测新数据的准确性都不理想,其最显著的区别
- 拥有欠拟合特性的模型对已有数据的匹配性很差,不过对数据中的噪声不敏感;
- 而拥有过拟合特性的模型对数据的匹配性太好,所以对数据中的噪声非常敏感。
2.1 欠拟合
在解决欠拟合问题时,主要从以下三方面着手:
-
增加特征项:
在大多数情况下出现欠拟合是因为我们没有准确地把握数据的主要特征,所以我们可以尝试在模型中加入更多的和原数据有重要相关性的特征来训练搭建的模型,这样得到的模型可能会有更好的泛化能力。
-
构造复杂的多项式:
这种方法很容易理解,我们知道一次项函数就是一条直线,二次项函数是一条抛物线,一次项和二次项函数的特性决定了它们的泛化能力是有局限性的,如果数据不在直线或者抛物线附近,那么必然出现欠拟合的情形,所以我们可以通过增加函数中的次项来增强模型的变化能力,从而提升其泛化能力。
-
减少正则化参数:
正则化参数出现的目的其实是防止过拟合情形的出现,但是如果我们的模型已经出现了欠拟合的情形,就可以通过减少正则化参数来消除欠拟合。
2.2 过拟合
解决的过拟合问题,则主要从以下三方面着手:
-
增大训练的数据量:
在大多数情况下发生过拟合是因为我们用于模型训练的数据量太小,搭建的模型过度捕获了数据的有限特征,这时就会出现过拟合,在增加参与模型训练的数据量后,模型自然就能捕获数据的更多特征,模型就不会过于依赖数据的个别特征。
-
采用正则化方法:
正则化一般指在目标函数之后加上范数,用来防止模型过拟合的发生,在实践中最常用到的正则化方法有 L0 正则、L1 正则和 L2 正则。
-
Dropout方法:
Dropout
方法在神经网络模型中使用的频率较高,简单来说就是在神经网络模型进行前向传播的过程中,随机选取和丢弃指定层次之间的部分神经连接,因为整个过程是随机的,所以能有效防止过拟合的发生。
3. 后向传播
深度学习中的后向传播主要用于对我们搭建的模型中的参数进行微调,在通过多次后向传播后,就可以得到模型的最优参数组合。
深度神经网络中的参数进行后向传播的过程其实就是一个复合函数求导的过程。
复合函数对各个变量求导的值就作为后向传播的微调值。
4. 损失和优化
深度神经网络中的损失用来度量我们的模型得到的预测值和数据真实值之间的差距,也是一个用来衡量我们训练出来的模型泛化能力好坏的重要指标。
模型预测值和真实值的差距越大,损失值就会越高,这时我们就需要通过不断地对模型中的参数进行优化来减少损失;同理,预测值和真实值的差距越小,则说明我们训练的模型预测越准确,具有更好的泛化能力。
二分类问题的解决过程中计算模型的真实值和预测值之间损失值的方法有很多,而进行损失值计算的函数叫作损失函数;
同样,对模型参数进行优化的函数也有很多,这些函数叫作优化函数。
4.1 损失函数
列举三种在深度学习实践中经常用到的损失函数,分别是均方误差函数、均方根误差函数和平方绝对误差函数。
- 均方误差函数
均方误差(Mean Square Error
,简称 MSE
)函数计算的是预测值与真实值之差的平方的期望值,可用于评价数据的变化程度,其得到的值越小,则说明模型的预测值具有越好的精确度。均方误差函数的计算如下:
M S E=\frac{1}{N} \sum_{i=1}^{N}\left(y_{\mathrm{true}}^{i}-y_{\mathrm{pred}}^{i}\right)^{2}
其中,ypred 表示模型的预测值,ytrue 表示真实值,它们的上标 i 用于指明是哪个真实值和预测值在进行损失计算。
- 均方根误差函数
均方根误差(Root Mean Square Error
,简称 RMSE
)在均方误差函数的基础上进行了改良,计算的是均方误差的算术平方根值,其得到的值越小,则说明模型的预测值具有越好的精确度。均方根误差函数的计算如下:
R M S E=\sqrt{\frac{1}{N} \sum_{i=1}^{N}\left(y_{\text { true }}^{i}-y_{\text { pred }}^{i}\right)^{2}}
3. 平均绝对误差函数
平均绝对误差(Mean Absolute Error
,MAE
)计算的是绝对误差的平均值,绝对误差即模型预测值和真实值之间的差的绝对值,能更好地反映预测值误差的实际情况,其得到的值越小,则说明模型的预测值具有越好的精确度。平均绝对误差函数如下:
M A E=\frac{1}{N} \sum_{i=1}^{N}\left|\left(y_{\text { true }}^{i}-y_{\text { pred }}^{i}\right)\right|
4.2 优化函数
在实践操作中最常用到的是一阶优化函数,一阶优化函数在优化过程中求解的是参数的一阶导数,这些一阶导数的值就是模型中参数的微调值。
梯度其实就是将多元函数的各个参数求得的偏导数以向量的形式展现出来,也叫作多元函数的梯度。
例如,三元函数 f(x,y,z) 的梯度为:
\left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z}\right)
5. 计算图
每次迭代训练,神经网络模型主要分成两个步骤:正向传播( Forward Propagation
)和反向传播(Back Propagation
)。
正向传播就是计算损失函数过程,反向传播就是计算参数梯度过程。
庞大的神经网络,如何有效地进行正向传播和反向传播,如何计算参数梯度?我将通过介绍计算图( Computation graph
)的概念,来帮大家轻松理解整个过程。
举个简单的例子,输入参数有三个,分别是 a、b、c,损失函数可表示成 J(a,b,c)=(2a+b)c。令 a = 3,b = 4,c = 5,对应的 J = (2x3+4)x5=50。
5.1 正向传播
正向传播过程,我们将 J 的表达式进行拆分,例如使用 u = 2a,v = u + b,J = vc。拆分后的每个单运算都构成一个 “ 节点 ”,如下图中的矩形方框所示。下面的这张图就是计算图。该计算图中包含了三个节点,分别对应 u = 2a,v = u + b,J = vc。这样,我们就把正向传播过程进行了拆分,每个节点对应一个运算。
5.1 反向传播
反向传播过程,这部分是最重要也是最难的部分。J 如何对参数 a、b、c 求导?方法是利用偏导数的思想,分别依次对各个节点 J、v、uJ、v、u 求导,然后再顺序对各参数求导。整个过程如下图红色箭头所示,与黑色箭头方向(正向传播)正好相反。
以上就是利用计算图对各参数求导的整个过程。
这个例子非常简单,参数很少,损失函数也不复杂。可能我们没有明显看到计算图在正向传播和反向传播的优势。但是,深度学习模型中,网络结构很深,光是参数就可能有数十万、百万的,损失函数也非常复杂。
这时候,利用计算图中的节点技巧,可以大大提高网络的训练速度。值得一提的是现在很多的深度学习框架,例如 PyTorch
和 TensorFlow
都是利用计算图对参数进行求导的。
参考资料:
https://gitbook.cn/gitchat/column/5b447b698b5d4b11e880d287/topic/5b447e688b5d4b11e880d42f