本文共 5095 字,大约阅读时间需要 16 分钟。
目录
在机器学习中,很多时候,任务是尝试创建一种能够根据一些输入数据给出特定结论的算法,并且该结论应基于一些较早收集的数据。此类任务的一个简单示例可能是找到学生学习考试所需的最少精力。例如,如果我们有7位学生的数据:学习时间和考试成功率(一个流行的例子:-)
计算机程序应该计算出最短的学习时间来通过考试。
好。那只是一个例子。我不想打扰这些简单的事情(无论如何:解决方案应该在6.9小时左右)。
我认为,对于此类任务,有三种可能很有趣的重要算法:
1、逻辑回归
2、反向传播
3、支持向量机
第四个是以上两个中的中和。
4、梯度下降
四种算法都具有相同的功能:回答上述问题。但是他们这样做的方式是不同的,他们可以提供的答案也不同。一些比较非常有趣。
应用它们的过程都是相同的:使用具有一些输入特征x1,x2,x3等的现有数据集,以及稍后应猜测的属性y,并训练软件来识别输入特征并猜测属性正确。培训是针对所有人进行的迭代过程。
我实现了这三种算法,并使用它们处理了鸢尾花(Iris)数据集以进行比较。
鸢尾花(Iris)数据集是处理此类问题的流行数据集。这是一个非常不错的数据集,包含150个鸢尾花的特征数据:它的花的大小。
它在一行中包含以下信息:
这个想法是根据花朵的大小来猜测正确的花朵类别。
对于每种算法,我都实现了训练应用程序和测试应用程序。我将150个样本分成135个样本进行训练,将每朵花中的5个样本进行测试。我知道,仅15个用于测试的样本并不过分。但是我认为这足以理解:-)
但首先,对算法进行一小段介绍:
梯度下降是一种算法,它试图近似一个函数,例如:
到给定的一组数据样本(x1,x2,x3…,y)上。根据所需的输出,近似函数可以是线性或多项式,也可以是可微函数。通过这种近似,它可以猜测属性y未知的另一个数据样本(x1,x2,x3…,?)的属性y。它以这种形式主要用于猜测实际值作为数据样本的属性。例如,如果我们有一些酒的特征数据,例如酒精含量,糖含量,酸度……并且该属性的质量等级介于1到10之间,则可以使用梯度下降算法来解决。
逼近函数f(x)应该与属性y尽可能匹配。因此,可以通过计算所有训练样本的偏差来使f(x)与属性相关,例如:
该偏差通常称为优化成本,它是对近似质量的验证。它越小,近似值越好。该成本应最小化,这可以通过梯度下降算法来完成。因此,建立了成本函数的梯度,并且从一个随机点开始,只要该梯度不为0,算法就会沿该梯度递减。移动是通过相对较小的步长来完成的:即所谓的学习率。这个学习率对收敛行为的影响很大。如果太大,算法将开始振荡,并且永远找不到最小值。如果它太小,该算法将入睡并且永远不会达到最小值。通常,它应该更小,必须处理更多的数据样本。
(有关梯度下降算法的详细说明,请参见。)
逻辑回归是一种基于梯度下降(Gradient Descend)算法的算法,但其目的是逼近具有数字输出0或1的函数。其输出是概率。与梯度下降(Gradient Descend)相似,它尝试近似一个函数,例如:
但是,此函数被输入到所谓的触发函数中,该函数通常是Sigmoid函数。
该g(x)用于优化,并且应尽可能匹配属性y(值0或1)。现在,通过计算所有训练样本的偏差来使g(x)与属性相关,例如:
对于较大的负输入值,S形函数为0,对于较大的正输入值,S形函数为1。
sigmoid函数的形状
它将近似值的输出转换为介于0和1之间的概率,对于y = 0,该概率小于0.5;对于y = 1,该概率大于0.5。逻辑(Logistic)回归用于猜测数字属性(请参见以获得详细说明)。
要使用逻辑回归处理鸢尾花(Iris)数据集,首先必须将任务分为三个部分:
该算法应首先检查数据样本是否属于Iris Versicolor类。如果不是,则应检查样品是否属于Iris Setosa,如果不是,则应最终检查是否属于Iris Virginica。看起来像:
这意味着我们必须训练3个设置并获得3个参数集,这些参数集可以轻松地从训练应用程序复制到测试应用程序中。好的,可以跳过最后一步,但是我认为这是一个不错的网络。:-)
需要注意的重要一点:最后一个结的输出为“No Iris Virginica”。这些数据永远不会激活。该算法只能区分训练有素的类别,并且由于不包括三个花中没有一个的类别,因此该算法永远不会将样本分类为这三个类别中的一个。
我们首先必须确定要使用的近似函数。由于花朵的测量仅在特定范围内适合一个特定的花朵类别,因此对于每个特征,近似函数应为二阶多项式,例如:
为了进行培训,我准备了三个数据集。一个用于第一个类,一个用于第二个类,最后一个类。
有了这些,我得到了以下参数:
Iris Versicolor
132772次迭代后的成本为0.0166。
Iris Setosa
5148次迭代后的成本为0.00046
Iris Virginica
8653次迭代后的成本为0.0116
通过在测试应用程序中实现这些参数,可以以91%的平均概率识别出全部15个测试数据样本都是正确的,并且每次训练结果的成本都相对较小,非常酷。
逻辑回归处理具有一个线性或多项式函数和一个触发函数的近似函数。反向传播处理由多个触发函数及其输入函数组成的复杂函数网,通常是前一层所有结的总和乘以一个线性因子:神经网络。该网络包含多个层:输入层采用一个数据样本的特征,一个或多个隐藏层包含逼近函数(包括触发器),输出层将结果传输到外部世界。这样就形成了多个结的网,通常,从一个层的每个结到下一层的每个结都有一个连接,每个连接都象征着每个结的后续结的输入函数,除了输入结,
具有2个隐藏层的神经网络
反向传播主要用于通过数字输出近似更复杂的功能。对于每个数据样本,它首先在网络中从左到右运行,并计算一个样本的输出值。然后,它从右到左运行,并根据其输出的偏差为该样本计算网络中参数的校正。这两个过程称为正向传播和反向传播,它们是针对每个数据样本执行的,并且在这样的循环结束时,通过所有这些校正的平均值来校正参数,并重复循环直到达到最小偏差为止。
(有关该算法的详细说明,请参见。)
为了处理鸢尾花(Iris)数据集,我建立了如下神经网络:
具有四个输入,一个隐藏层和两个输出,它们以二进制形式给出花朵类别的编号,例如:
Iris-setosa => output 1 = 0 ; output 2 = 0Iris-versicolor => output 1 = 1 ; output 2 = 0Iris-virginica => output 1 = 1 ; output 2 = 1
基本上,仅使用一个输出并训练3种不同的设置是可能的。但是,使用更多的输出,反向传播算法效果更好。
使用此设置,我可以一次处理整个数据集。我只需要为培训设置两个输出即可。
使用此设置,反向传播算法将计算值:
与:
在固定的60000次迭代后,成本= 0.0145854。
我在测试应用程序中对它们进行了硬编码,所有15个测试样本均被识别为正确的,平均概率为98%。这比逻辑回归算法要好得多。
支持向量机不同于上述算法。它不是近似函数,而是对数据进行分类。在一个非常简单的示例:如果有包含功能x1,x2和所述属性y为1且为-1的数据集,支持向量机尝试在y = 1的数据样本和y = -1的数据样本之间画一条线,如下所示:
在此样本图像上,红色点是y = -1的点,蓝色点是y = -1的点。黑线是分隔线。此外,还有两条灰色边距线。这3条线的放置方式应使边界线之间没有点,并且边界线之间的距离应尽可能大(向量uv的长度)。好的,这是一个非常简单且不常见的示例。但是支持向量机算法能够解决更多复杂的任务。在多维情况下,它不是在样本之间放置一条直线而是一条超平面。
原则上,支持向量机计算向量W和每个数据样本产生的偏移b:
常数b将属性y乘以W和x的点积,其中x是所有输入要素的向量。
现在,通常情况比上图中显示的情况更为复杂。输入要素包含更多尺寸,并且分隔不能通过直线进行。支持向量机算法可以处理多维情况,并且实际上可以弯曲分隔线或超平面,因此使用了所谓的内核技巧。
(有关该算法的详细说明,请参见。)
有几种不同的方法可以解决支持向量机的优化问题。我实现了John C. Platt的顺序最小优化算法。这是最简单的方法之一,而且效果很好。
当支持向量机在一种设置中将数据分为两类时,必须将任务分成两部分。首先,我想对数据样本是否属于Iris Setosa类进行分类。如果不是,我想对它是否属于Iris Versicolor类进行分类,如果不是,则归为Iris Virginica类。因此,我必须准备两个数据集进行培训。支持向量机需要将属性y的值设置为1或-1。因此,对于第一个训练数据集,我必须为Iris-Setosa类的所有数据样本设置属性= 1,为所有其他样本将属性设置为-1,第二个数据集仅包含Iris Versicolor和Iris Virginica的数据样本以及Iris Versicolor类获得属性= 1,其余所有属性为0 -1。
由于可以得到很多支持向量作为培训的输出,因此我不能仅仅将它们从培训应用程序复制粘贴到测试应用程序。因此,它们是通过.Json文件传输的。第一个分类在6次迭代后产生10个支持向量,第二个分类在15次迭代后产生38个支持向量。
使用这些参数,所有测试样品都被认为是正确的。这里没有可能性。但是分离质量的衡量标准是f(x)的值。此值不应介于1和-1之间。这就是目标。但这在大多数情况下可能无法实现。因此,如果值不太接近0。测试应用程序在-0.6周围找到三个值。很好 :-)
这三种算法的结果看起来都很简单明了。但这可能会误导一点。这三种算法都从一个特定的点开始,以迭代过程逼近其结果。他们正在寻找功能的最小值。此功能的复杂性对所有人而言都不尽相同,它们不仅会立即找到最佳结果。对于所有参数而言,开始参数的设置和迭代参数的微调都不是那么简单。
梯度下降算法使用或多或少的简单逼近函数。但是有人说,梯度下降算法收敛速度不是太快,而且容易振荡。我说,可以通过稍微不同的实现来避免很多情况。根据文献,逼近函数的偏移量在更新所有其他值的同时在同一个循环中更新。这相互影响,并使算法易于振荡。如果单独处理偏移量,则该算法收敛速度更快,并且振荡似乎更少(请参见)。这使得梯度下降算法成为解决许多问题的一种有趣的方法。
反向传播算法在机器学习中非常理想。但是它通常由一个以上的以S形函数形式存在的触发器函数组成。每一个这样的结都会给近似函数带来更多的复杂性和局部最小值。这意味着神经网络包含的结越多,算法越有可能悬挂在局部最小值而不是找到我们正在寻找的全局最小值。这使得很难为迭代设置最佳起点并找到全局最小值。这就是触发器的输入函数通常只是前面的结的线性乘法而不是多项式的总和的主要原因。这将给系统带来更大的复杂性。反向传播是一种非常强大的算法,但运行起来并不容易。
支持向量机算法是一种复杂而智能的算法。但是其成功很大程度上取决于正确选择和设置所使用的内核功能。如果对算法进行了微调,则可以输出大量的支持向量。因此,始终值得花一些时间为它找到最佳设置。利用鸢尾花(Iris)数据,它可以非常快速地收敛。并非总是如此。如果有许多数据样本和许多输入功能,再加上复杂的内核功能,则可能要花费一些时间才能完成计算。
相互比较,梯度下降算法无疑是最简单的解决方案(我喜欢:-)。但是,并不是每个数据集都可以由数学函数来近似,因为梯度下降算法(或反向传播)可以做到这一点。并不是每个数据集都可以通过支持向量机进行分类。因此,可能总是需要反复试验和微调。
这三种算法不能仅仅馈送一些数据,而是可以运行并产生有用的结果。它们都需要用户注意。但这正是使人工智能领域着迷的原因。在开始人工智能之前,总会需要一些人类智能。:-)
转载地址:http://idwhj.baihongyu.com/