一.机器学习的基本概念
机器学习(Machine Learning):让机器具备一个找函数的能力,从而让机器实现诸如:语音识别(Speech Recognition),图片识别(Image Recognition)等功能
在机器学习的大家庭中,有两种主要的学习方法:监督学习和无监督学习。
监督学习(Supervised Learning):
监督学习是一种基于标签的学习方法,其中训练集数据包括输入特征向量和对应的输出标签。
监督学习的类别:
- 回归(Regression):预测连续的具体数值,
- 分类(Classification):预测离散的数值函数由已有的选项(类别),选择一个合适的作为输出,分类的选项可以有两个或者多个如:分别邮件是否是垃圾邮件,下围棋是在整个棋盘中选择一个合适的位置输出
案例学习—以视频的点击次数预测为例:
Step1:写出一个带有未知参数的函数
在这里,我们假定这个函数是:
y = b +wx
其中:y是要预测的内容,在这里是这个视频今天点击的人数;x是这个视频前一天点击的人数;b和w是未知数,它们是需要我们通过数据去找出来的。
你可能有疑问,为什么这里我们这么肯定y(今天的点击次数)和x(前一天的点击次数)呈线性关系呢?事实上,我们并不确定线性关系一定成立,我们只是通过在“视频点击”这个领域的相关知识猜测它们可能呈线性关系(这个猜测可能并不靠谱,我们只是为了了解模型举个例子)。这个猜测往往来自于对我们要研究的问题的本质上的了解,我们称之为领域知识(domain knowledge)
对于y=b+wx,相关定义:
- b和w是未知的,这种带有未知参数(parameter)的函数我们称之为模型(model),特征x是这个函数里已知的,它来自于我们获得并输入的信息。
- w和b是未知的参数,w称为权重(weight),b称为偏置(bias)
Step2:定义损失(Loss)
损失也是一个函数,我们假定损失函数为L(b,w),它的输入为模型y=b+wx的参数b和w;
损失函数输出的值代表模型的优劣:b和w不同时,Loss值越低,模型越好;Loss值越高,模型越差;
我们如何计算Loss值呢?
我们假定某天视频的点击量为y,我们通过模型预测出来的值为$y2$,那么我们把真实值y1称为标签(Label),e=|ŷ–y|为真实值和预测值差值的绝对值,我们把每天的$e$加起来再除以天数,就得到了损失L。
对于同一组参数b和w,对应的L越大,这组参数就越不好。
注:对于计算实际值和预测值的差距的计算方法,有很多种,例如:
- 平均绝对误差(Mean Absolute Error,MAE):e = |ŷ − y|
- 均方误差(Mean Squared Error,MSE):e = (ŷ− y)2
【交叉熵(cross entropy):通常在分类问题中,作为Loss函数被使用】
误差表面(error surface):
(注:该图来自于书籍《深度学习详解》)
我们分别以w和b为横纵坐标做出上图,越偏蓝色系,说明损失越小,带表$w$和b这组参数比较好;越偏红色系,说明损失越大,代表w和b这组参数比较差。
上面这幅图所展示的等高线就被称为误差表面。
下图更加的直观:
注:该图来自于吴恩达机器学习
Step3:解一个最优化问题
解一个最优解问题,就是找出w和b,使得损失L最小。
梯度下降
梯度下降本质上就是通过函数的导数来寻找函数最小值的方法,其目的是为了找到一个自变量,使得函数值最小。
在二维图中,
从w0开始,一直到找到两个箭头所指的地方,可以理解为梯度下降的过程
在三维图中,我们能更清晰的明白梯度下降的特点和局限性,
我们看到,因为起始点的不同,导致出现的局部最优解出现不同,而其中使得损失值最小的我们称之为全局最优解,这是梯度下降的特点之一,也是它的一个问题。
梯度下降的公式为:
其中,我们称ą为学习率(learning rate),学习率越大,梯度下降时,每次迈出的步子就很大,也就是每次参数更新就会量大,学习可能就比较快;如果 ą设小一点,参数更新就很慢,每次只会改变一点点参数的数值。
注:学习率是一个由我们自己设定的值,不是机器自己找出来的,我们把这种值成为超参数(hyperparameter)
step1,step2,step3我们称作为训练(training)
二.线性模型
2.1线性模型的定义
线性模型得定义如下:
其中,w直观的表达了各属性在预测中的重要性,所以线性模型有很好的可解释性(comprehensibility),如:
我们可以很清楚的看到每个属性对结果的重要性。
如上图,对于我们举的案例,我们可以看到,每隔7天,数据会进行一次”循环“(这可能是由各种原因造成的,我们归咎于领域知识),那么意味着实际上点击视频得次数应该和7天的数据有关系,即我们应该认为:
很明显,这是一个典型的线性模型。
当所预测的数据y和变量x之间的关系很复杂时,一个单一的线性模型就无法表示这么复杂的关系,这是线性模型本身所造成的限制,我们把这种限制称为模型的偏差(Model Bias)
如下图,我们无法通过改变b和w来使简单的蓝色的线变成复杂的红色的线,这是线性模型本身的限制。
2.2分段线性曲线&sigmoid函数
那么我们怎么表示稍微复杂一些的模型呢?
在属性/变量只有一个时(即x1):
我们首先来看两个定义:
- Hard Sigmoid 函数:
类似于上图这种:当输入的值,当 x 轴的值小于某一个阈值(某个定值)的时候,大于另外一个定值阈值的时候,中间有一个斜坡。所以它是先水平的,再斜坡,再水平的的函数我们称作Hard Sigmoid函数
- Sigmoid 函数:
如上图,Sigmoid函数是为了来拟合Hard Sigmoid函数的,它的式子一般为:
那么,从分段函数的知识,我们可以知道,复杂一点的模型可以由:常数+一系列Hard Sigmoid函数组成,而Hard Sigmoid函数又可以由Sigmoid函数来拟合,我们就可以写出更加复杂,具有弹性的模型了。
细节补充:
- 那么当我们的目的模型有着平滑的曲线时,我们应该如何处理呢?
如下图,我们可以发现,足够多的Hard Sigmoid函数可以拟合成一个平滑的曲线:
- 在Sigmoid函数中,b,c,w分别对函数图形有着什么影响呢?
w:作为权重,w的变化影响图像的斜率
b:作为偏差,b的变化影响使图像左右移动
c:改变函数值的大小,使函数值变大/变小
2.当属性/变量符合普遍情况时:
上图对后一最后一个等式就是普遍情况下的式子,我们这样理解它:
Wij代表着第i个Sigomoid函数中的属性之一Xj的权重。
我们举一个具体的例子说明:
在上图的条件下:
如上图,我们把y分解为r1,r2,r3(分别代表三个Sigmoid函数对应的表达式),由图可以得到:
我们用矩阵来表示:
简化为:
Sigmoid 的数量是由自己决定的,而且 Sigmoid 的数量越多,可以产生出来的分段线性函数就越复杂。Sigmoid 越多可以产生有越多段线的分段线性函数,可以逼近越复杂的函数。Sigmoid 的数量也是一个超参数。
所求得的r就是下图蓝色虚线框内的内容:
我们就可以明显的看出:r1,r2,r3分别通过各自的sigmoid函数得到a1,a2,a3
我们用σ表示sigmoid函数,我们可以写成:
a = σ(r)
最后,我们把a1,a2,a3分别乘以对应的c1,c2,c3,再整体加上一个b,就可以得到y:
用线性代数的知识可以对上图的内容进行一定程度的简化:
以上推导总结如下:
2.3Loss的计算
我们定义一个概念θ:
x 是特征,绿色的 b 是一个向量,灰色的 b 是一个数值。W, b, cT, b是未知参数。把这些东西通通拉直,“拼”成一个很长的向量,我们把 W 的每一行或者是每一列拿出来。无论是拿行或拿列都可以,把 W 的每一列或每一行“拼”成一个长的向量,把 b, cT, b” 拼” 上来,这个长的向量直接用 θ 来表示。所有的未知的参数,一律统称 θ。
注:sigmoid函数的个数由自己决定,是一个超参数
我们由之前的知识知道,L(w,b)是一个参数为w和b的模型的损失函数,而对于我们刚刚推导出来的模型,参数太多了,所以我们定义了一个向量θ来包含所有参数,这样,L(θ)就是我们要找的向量,而计算Loss本身的方法与仅有两个参数w和b时的方法一致。
概要流程如下图:
2.4优化(Optimization)
这里的优化就是Step3的解一个最优问题,就是找到一个θ,使Loss最小,这个θ我们记为θ∗。
一开始我们随机选择一个θ0,接下来计算每一个未知的参数对 L 的微分,得到向量 g,(这个向量我们称为梯度)即可以让损失变低的函数,如下图所示:
然后更新(实际上和两个参数的操作方法没有区别):
总结如下图:
但是在实际的优化中,我们更倾向于一批一批的进行:
我们假设共有N笔数据,把这N笔数据随机分成一个一个的批量(Batch),每个批量里有B笔数据,本来我们是拿每一笔数据进行Loss的计算,现在我们拿每一个批量的数据进行Loss的计算。
也就是把每一个批量当作一条数据进行计算,如下图:
可见,我们并不是拿每一条数据的L来算梯度,而是拿每一个批量的L1,L2,L3来计算梯度,把我们数据集里的所有的批量都看过一次,我们叫做一个回合(epoch),每一次更新参数,我们叫做一次更新。
我们举例来说明:
1:现在我们有10000笔数据(N=10000),批量的大小是10(B=10),那么10000个样本(example)形成了1000个批量;那么在一个回合(epoch)里,更新了1000次参数。
2:假设有1000个数据,批量大小(batch size)设为100,那么我们知道一共有10个批量,则在一个回合(epoch)中,更新了10次参数
2.5模型变形
我们既可以把Hard sigmoid函数变成sigmoid函数,也可以用**两个修正线性单元(Rectified Linear Unit 简写为:ReLU)来表示;
ReLU的图像:
表现为一条直线+一条斜线
如下图,两个ReLU才可以合成一个Hard sigmoid函数
我们要合成i个Hard sigmoid函数,就需要2i个ReLu,如下图:
在机器学习中,Sigmoid和ReLU称为激活函数(activation function)。
当然,激活函数不仅仅只有sigmoid和ReLU,只是我们常常用到这两个函数。同时,相比于拟合Hard sigmoid的Sigmoid函数,ReLu的效果要更好一些。
我们可以继续改模型,如下图:
由前面的内容,我们知道:从 x 变成 a,就是把 x 乘上 w 加 b,再通过Sigmoid 函数(或者ReLU)把x变成a,同样的事情再反复地多做几次。 所以可以把 x 做这一连串的运算产生 a,接下来把 a 做这一连串的运算产生 a′。反复地多做的次数又是另外一个超参数。注意,w, b 和 w′, b′ 不是同一个参数,是增加了更多的未知的参数。
对于以上的推导,我们有定义:
- Sigmoid 或 ReLU 称为神经元(neuron),很多的神经元称为神经网络(neural network)2. 每一排称为一层,称为隐藏层(hiddenlayer),很多的隐藏层就“深”,这套技术称为深度学习。在下图中可以直观的看到:
过拟合:
在训练集上表现良好,但是在测试集上表现反而变差,这种情况就是过拟合(overfitting)
过拟合(over fitting):当学习器把训练样本学的“太好”了的时候,很可能把训练样本自身的一些特点当作了所有潜在样本都会具有的一般特质,这样就会导致泛化性能下降,这种现象在机器学习中被称为“过拟合”,与之相对的是欠拟合(underfitting),这是指对训练样本的一般性质尚未学好。
三. 实践方法论
首先,我们大概的了解机器学习的一个流程:
在这个过程中,可能会出现一些问题导致预测结果出现较大的误差,我们接下来一一描述它们。
3.1模型偏差(model bias)
如果我们选择的模型太过于简单:
假设我们选择一个f(x)的模型,再带入所有可能的参数后得到的所有解,我们将这些解放在下图的蓝色的集合里,由于我们选择的f(x)模型太过于简单,导致即使是整个集合里Loss最小的θ也达不到我们对Loss的要求。(按照李宏毅老师的玩笑话就是“Loser里面最成功的还是Loser”)
为了解决这个问题,我们可以:
- 加入新的特征
- 深度学习,增加更多的灵活性
3.2优化问题
Loss大,不一定是模型的问题,还有可能是优化的时候出了问题。
例如:我们使用梯度下降的方法进行优化,就有可能找到局部最优解,而非全局最优解。
我们选取的模型所给出的结果里确实存在一个θ使得Loss最小,但我们的优化却出了问题,导致我们没有找到它。
3.3判断问题
我们怎么判断是模型偏差还是优化问题呢?
一个方法是通过比较不同的模型来判断,我们以下图为例:
我们先看训练数据:56层的误差反而比20层的误差大,这对于训练数据来说不可思议,所以只有可能是优化问题;那么为什么不是过拟合呢?因为过拟合是指训练数据的学习很好,但是测试集的时候效果反而不尽人意的现象,在这里,再学习训练数据时,56层竟然比20层低,说明不是过拟合的问题。
我们再看测试数据:我们看到56层的Loss比20层高,我们可能认为是过拟合的问题,但是我们由训练数据得知并非过拟合,而是优化问题。
总结:1. 我们可以先训练一些小的,浅的模型,它们一般来说不会出现优化的问题,然后我们训练一些深的模型
- 如果深的模型跟浅的模型比起来,深的模型明明灵活性比较大,但损失却没有办法比浅的模型压得更低代表说优化有问题,梯度下降不给力,因此要有一些其它的方法来更好地进行优化。
3.4为什么会有过拟合现象出现呢?
我们举一个极端的例子:
假设某个机器学习训练出来一个如下图一样废物的模型:
我们可以知道:在训练集里面,Loss=0;但是在测试集里面,Loss肯定会大的不可思议。
我们再举一个例子:
我们让输入是横轴x,输出是纵轴y;我们可以看到,因为训练数据太少了(就三个),导致可能出现在训练集Loss很小的,但是在测试集Loss很大的模型。
解决过拟合的办法:
- 增加训练集,这种方法我们称为数据增强(data augmentation)。
数据增强就是根据对问题的理解创造出新的数据,比如在图像识别中,我们可以把图片进行左右转换,放大图像的某一部分等等;但是数据增强是我们一般不进行一些奇怪的操作,比如说颠倒图像
2. 给模型一些限制,让模型不要有过大的灵活性。![](https://i-blog.csdnimg.cn/direct/34b7fdeeddb64ba2a586c5a3c06c8b8d.png)
模型限制不能太大,否则会有模型偏差的问题:
我们已经学习过的神经网络我们称之为全连接网络(full-connected network),是一种比较灵活的架构;而卷积神经网络(Convolutional Neural Network,CNN)是一种比较有限制的架构。
全连接神经网络,可以找出来的函数所形成的集合其实是比较大的,CNN 所找出来的函数,它形成的集合其实是比较小的,其实包含在全连接网络里面的
其他的限制灵活性的方法:
- 用比较少的特征
- 早停(early stopping)
- 正则化(regularization)
- 丢弃法(dropout method)
随着模型越来越复杂,训练损失越来越小;但是测试损失却会先减小后增大(也就是出现了过拟合现象),如下图:
对于模型的选择,太简单的会出现模型偏差,太复杂的会出现过拟合,要找到中间那个恰到好处的模型是有难度的
3.5交叉验证
一个比较合理的选择模型的方法:
把训练的数据随机分成两部分,一部分称为训练集(training set),另一部分称为验证集(validation set)。
如:90%的数据作为训练集,10%的数据作为验证集,在训练集上训练出来的模型用验证集去衡量。
交叉验证法(cross validation):
一个比较直观简单的图解:
3.6不匹配(Mismatch)
不匹配:训练集和测试集的分布不一样。
不匹配和过拟合是不同的:过拟合可以通过限制模型,数据增强的等手段改善,而不匹配是因为测试集和训练集的分布不一样导致的,只有通过改变训练集和测试集本身才能改善。
如上图:训练数据和测试数据完全是两个画风,也就是二者分布不一样,造成了不匹配的问题。
注:该笔记所展示的图片来自于李宏毅《机器学习/深度学习》课程和对应书本,有少量来自周志华《机器学习》一书中的补充
版权归原作者 珈百列 所有, 如有侵权,请联系我们删除。