机器学习是一个跟“大数据”一样近几年格外火的词汇。我们在了解深度学习之前,还是有必要了解和认识机器学习这个词的。机器学习究竟是一个什么过程或者行为呢?
机器学习——我们先想想人类学习的目的是什么?是掌握知识、掌握能力、掌握技巧,最终能够进行比较复杂或者高要求的工作。那么类比一下机器,我们让机器学习,不管学习什么,最终目的都是让它独立或至少半独立地进行相对复杂或者高要求的工作。我们在这里提到的机器学习更多是让机器帮助人类做一些大规模的数据识别、分拣、规律总结等人类做起来比较花时间的事情。这个就是机器学习的本质性目的。
在人类发展的历史长河中,机器逐步代替人的生产工作是一个不可逆转的趋势——从原始人的刀耕火种,氏族部落大量原始人共同使用极为原始的工具共同狩猎,到后来随着生产力发展和工种分化的不断相互刺激,越来越多的工具出现,代替了原本生产所需要的众多人工。
在近现代,尤其是第一次和第二次工业革命之后,化石能源驱动的高能量的机器再一次在更多的领域取代人力、畜力,大大改善了人类的生产效率。
在信息革命之后,随着计算机的计算能力增强,以及在计算机算法领域新理论、新技术的逐渐发展,机器也逐渐代替人,参与到更多的带有“一定的智能性”的信息分拣与识别的工作中来。这里面我们着重要提一下这个“一定的智能性”。
算法这种东西在最初出现的时候是一种确定性的机器指令执行序列,也就是说,机器需要怎么做是早在程序一开始就设定好的。虽然说在程序执行的过程中可以依靠有限的参数对程序执行过程所涉及的对象、执行次数、执行分支条件等进行设定,但是基本行为逻辑已经大抵确定。在这个过程中,机器——计算机是非常被动的,它老老实实地严格执行程序员赋予它的指令执行序列,没有任何“学习”的行为。这也没办法,因为最开始的图灵机模型在设计的时候就是期望计算机以这种方式工作的。
而机器学习这个领域的思路就与刚才我们所说的这样一个形式有很大的区别。我们以有监督学习的过程为例,例如有一个分类器,可以将输入的邮件分拣为“普通邮件”和“垃圾邮件”两个类别。但是对于垃圾邮件的判断标准不是在程序运行伊始给出的,而是在给予分类器大量垃圾邮件后,由分类器对垃圾邮件样本的各种特征进行统计和归纳,进而得到的。
在这个训练过程中,给予分类器的大量被标注为垃圾邮件的邮件,称为训练样本(training sample)。分类器对垃圾邮件样本的特征进行统计和归纳的过程称为训练(traning)。总结出的判断标准,我们称为分类模型。与此同时,我们还会拿其他一些“普通邮件”和“垃圾邮件”给予分类器,让它尝试根据刚刚总结好的分类模型进行分类,看看它分类的正确性是否确实具有泛化性(generalization),这个步骤我们称为验证(validation)。这个过程主要是为了验证从训练样本中归纳总结出来的数据关系是否能够迁移。在此之后,我们还会使用一定量的“普通邮件”和“垃圾邮件”去测试(testing)这个模型的识别能力,看看是不是在我们业务允许的范围内。这是一个基本完整的有监督学习(supervised learning)的学习过程。
其他的有监督学习的场景也极为类似,都是基于训练样本做训练和使用验证数据集验证。在这个过程中我们不难看出,最后整个分类器工具投入生产环境对外提供服务的工作方式不是我在程序里事先写好的,而是先对给予的样本进行总结得出分类规则(标准),之后根据这个规则进行分类操作。这是一个非常形象的“机器学习”的过程,它在这个过程中自己学会了怎么样进行正确地区分事物。这是不是很有趣呢?
机器学习从学习的种类来说,最常见的我们习惯分作两种,一种叫无监督学习(unsupervised learning),一种叫有监督学习(supervised learning)。所谓“无监督学习”,是指人们在获得训练的向量数据后在没有标签的情况下尝试找出其内部蕴含关系的一种挖掘工作,这个过程中使用者除了可能要设置一些必要的超参数(hyper-parameter)以外,不用对这些样本做任何的标记甚至是过程干预;“有监督学习”与此不同,每一个样本都有着明确的标签,最后我们只是要总结出这些训练样本向量与标签的映射关系。所以这在这两种方式下,处理的逻辑有很大的区别,初学的朋友需要格外注意。
一、聚类
聚类(clustering)是一种典型的“无监督学习”,是把物理对象或抽象对象的集合分组为由彼此类似的对象组成的多个类的分析过程。
聚类这种行为我们不要觉得很神秘,也不要觉得这个东西是机器学习所独有的,恰恰相反,聚类的行为本源还是人自身。我们学习的所有的数据挖掘或者机器学习的算法或者思想的来源都是人类自己的思考方式,只不过我们把它教给机器代劳,让机器成为我们肢体和能力的延伸,而不是让它们替我们做创造和思考。
聚类是一种什么现象呢?我们人类在认识客观世界的过程中其实一直遇到容量性的问题,我们遇到的每一棵树、每一朵花、每一只昆虫、每一头动物、每一个人、每一栋建筑……每个个体之间其实都不同,有的差距还相当大。那么我们人在认知和记忆这些客观事物的过程中就会异常痛苦,因为量实在是大到无法承受的地步。
因此人类才会在“自底向上”的认识世界的过程中“偷懒”性地选择了归纳归类的方式,注意“偷懒”的这种方式是人类与生俱来的方法。
小时候,我们被父母用看图说话的方式来教咿呀学语就有过类似的体会了,图片上画了一只猴子,于是我们就认识了,这是一只猴子;图片上画了一辆汽车,于是我们就了解了,这是一辆汽车……当我们上街或者去动物园的时候再看,猴子也不是画上的猴子,而且众多猴子之间也长得各式各样,每个都不同,我们会把它们当成一个一个的新事物去认识吗?我们看汽车也同样,大小、颜色、样式,甚至喇叭的声音也是形形色色、五花八门,它们在我们眼里是一个个新的事物吗?不,它们都还是汽车。这些事物之间确实有所不同,但是它们给我们的认知带来了很大的困扰吗?并没有。我们无论如何也不会把猴子和汽车当成一类事物去认知的,猴子彼此之间是不同,但是体格、毛发、行为举止,种种形态让我们认为这些不同种类的猴子都还是猴子一个大类的动物,别说是和汽车混为一谈,就是跟狗、马、熊这些哺乳动物也能轻易地分开。
人类天生具备这种归纳和总结的能力,能够把认知的相似事物放到一起作为一类事物,它们之间可以有彼此的不同,但是有一个我们心里的“限度”,只要在这个限度内,特征稍有区别并无大碍,它们仍然还是这一类事物。
在这一类事物的内部,同样有这种现象,一部分个体之间比较相近,而另一部分个体之间比较相近,我们人还能够明显认知到差别,那么大类别又可以细分为小类别进行认知。比如汽车直观从样子上可以分成小轿车、卡车、面包车等种类,虫子们也被人轻易地从外形上区别为飞虫、爬虫、毛毛虫……
在没有人特意教给我们不同小种群的称谓与特性之前,我们自然具备的这种凭借主观认知的能力——特征形态的相同或近似的划在一个概念下,特征形态不同的划在不同概念下,这本身就是“聚类”的思维方式。
比较常用的聚类算法有K-Means、DBSCAN等几种,基本思路都是利用每个向量之间的“距离”——空间中的欧氏距离或者曼哈顿距离,从远近判断是否从属于同一类别。假如有三个一维样本:一个180、一个179、一个150,如果这三个向量要分成两类的话,应该是180和179这两个分在一个类别,150是另一个类别。因为180和179的距离为1,而150距离180与179分别为30和29个单位——非常远,就是从肉眼感官上来看也是这样。用机器来做学习的话,它也能够通过算法自动去感知到这些向量之间的距离,然后将那些彼此之间靠得近的分在一起,以区别于其他类簇。
在用机器做聚类学习的时候,我们每种算法都对应有相应的计算原则,可以把输入的各种看上去彼此“相近”的向量分在一个群组中。然后下一步,人们通常更有针对性地去研究每一组聚在一起的对象所拥有的共性以及那些远离各个群组的孤立点——这种孤立点研究在刑侦、特殊疾病排查等方面都有应用。
在这个过程中,从获得到具体的样本向量,到得出聚类结果,人们是不用进行干预的,这就是“非监督”一词的由来。
二、回归
回归是一种解题方法,或者说“学习”方法,也是机器学习中比较重要的内容。
回归的英文是regression,单词原型regress的意思是“回退,退化,倒退”。其实regression——回归分析的意思是借用里面“倒退,倒推”的含义。简单说就是“由果索因”的过程,是一种归纳的思想——当我看到大量的事实所呈现的样态,我推断出原因或客观蕴含的关系是如何的;当我看到大量的观测而来的向量(数字)是某种样态,我设计一种假说来描述它们之间蕴含的关系是如何的。
在机器学习领域,最常用的回归有两大类——一类是线性回归,一类是非线性回归。
所谓线性回归,就是在观察和归纳样本的过程中认为向量和最终的函数值呈现线性的关系。而后设计这种关系为:
y=f(x)=wx+b
这里的w和x分别是1×n和n×1的矩阵,wb则指的是这两个矩阵的内积。具象一点说,例如,如果你在一个实验中观察到一名病患的几个指标呈现线性关系(注意这个是大前提,如果你观察到的不是线性关系而用线性模型来建模的话,会得到欠拟合的结果)。拿到的x是一个5维的向量,分别代表一名患者的年龄、身高、体重、血压、血脂这几个指标值,y标签是描述他们血糖程度的指标值,x和y都是观测到的值。在拿到大量样本(就是大量的x和y)后,我猜测向量(年龄,身高,体重,血压,血脂)和与其有关联关系的血糖程度y值有这样的关系:
那么就把每一名患者的(年龄,身高,体重,血压,血脂)具体向量值代入,并把其血糖程度y值也代入。这样一来,在所有的患者数据输入后,会出现一系列的六元一次方程,未知数是w1 ~w5 和b——也就是w矩阵的内容和偏置b的内容。而下面要做的事情就是要对w矩阵的内容和偏置b的内容求出一个最“合适”的解来。这个“合适”的概念就是要得到一个全局范围内由f(x)映射得到的y和我真实观测到的那个y的差距加和,写出来是这种方式:
怎么理解这个Loss的含义呢?右面的 表示加和,相当于做一个一个循环,i是循环变量,从1做到n,覆盖训练集当中的每一个样本向量。加和的内容是wxi +b和yi 的差值,每一个训练向量xi 在通过我们刚刚假设的关系f(x)=wx+b映射后与实际观测值yi 的差距值。取绝对值的含义就是指这个差距不论是比观测值大还是比观测值小,都是一样的差距。将全局范围内这n个差距值都加起来,得到所谓的总差距值,就是这个Loss的含义。那么显而易见,如果映射关系中w和b给的理想的话,这个差距值应该是0,因为每个x经过映射都“严丝合缝”地和观测值一致了——这种状况太理想了,在实际应用中是见不到的。不过,Loss越小就说明这个映射关系描述越精确,这个还是很直观的。那么想办法把Loss描述成:
Loss=f(w,b)
再使用相应的方法找出保证Loss尽可能小的w和b的取值,就算是大功告成了。我们后面会讲计算机怎么来求这一类的解——放心,有办法的,即便不用联立解方程。一旦得到一个误差足够小的w和b,并能够在验证用的数据集上有满足当前需求的精度表现后就可以了。例如,预测病患的血糖误差是取误差平均小于等于0.3为容忍上线,训练后在验证集上的表现是误差平均为0.2,那就算是合格了。
请注意,在传统的机器学习中回归、分类这些算法里都有一个要把获取到的数据集分成训练集和验证集的过程。用训练集数据来做训练,归纳关系;用验证集数据来做验证,避免过拟合现象。如果你不太明白过拟合是什么意思也没关系,后面我们会讲的,不必着急。数据集的划分三七开也可以,二八开也没什么不行,现在生产环境中大致用的都是这样一种比例,反正训练集一定用数据多的那部分。
由于这种假设中输入的x向量与标签值y是一种线性关系y=f(x)=wx+b,所以才叫做线性回归。最常见的形式是y=f(x)=ax+b这种形式,也就是x是一个一维向量,w也是一个一维向量的情况。如果是呈现其他关系(比如指数关系、对数关系),那么这种时候你用线性回归去做拟合会发现它的损失函数非常大,在验证集上表现出来的误差也非常大,这是一种欠拟合现象,我们后面同样会讲,大家先记住这样一个名词。
非线性回归类中,在机器学习领域应用最多的当属逻辑回归。它和线性回归都叫回归,但是逻辑回归看上去更像分类。我们先在回归这一节提一下这种回归的工作方式。与前面我们说的线性回归不同,在这种模型中观察者假设的前提是y只有两种值:一种是1,一种是0,或者说“是”或“否”的这种判断。
这里面的wx+b和前面线性回归中所说的wx+b是一个概念,都是指一个w矩阵和x做了内积再和偏置b做了加和。如果设z=wx+b,那么这个回归的分类模型表达式就可以改写为:
函数图像为:
横轴是z,纵轴是y,一个多维的x经过这样两次映射,最后投射在y上是一个取值只有1和0二项分布。也就是我们前面说的产生了一个“是”或“否”的分类。
训练的过程跟普通线性回归也是一样的,只不过损失函数的形式不同。但是,它的损失函数的含义仍旧是表示这种拟合残差与待定系数的关系,并通过相应的手段进行迭代式的优化,最后通过逐步调整待定系数减小残差。逻辑回归的表达式的定义本源是来自于伯努利分布(注:伯努利分布,P(n)=pn (1-p)1-n 。)的,后面我们也会有相对详细的说明,这里先做一个感性认识。
三、分类
分类是机器学习中使用的最多的一大类算法,我们通常也喜欢把分类算法叫做“分类器”。
这个说法其实也非常形象,在我们看来,这就是一个黑盒子,有个入口,有个出口。我们在入口丢进去一个“样本”,在出口期望得到一个分类的“标签”。比如,一个分类器可以进行图片内容的分类标签,我们在“入口”丢进去一张老虎的照片,在“出口”得到“老虎”这样一个描述标签;而当我们在“入口”丢进去一张飞机的照片,在“出口”得到“飞机”这样一个描述标签,这就是一个分类器最为基本的分类工作过程。
一个分类器模型在它诞生(初始化)的时候其实是不具备这种功能的,只有通过给予它大量的图片以及图片所对应的标签分类,让它自己进行充分地总结和归纳,才能具备这样一种能力。
在刚刚看到的逻辑回归这种方式中,我们已然看到了一些端倪。逻辑回归和普通的线性回归不同,它的拟合是一种非线性的方式。而最终输出的“标签值”虽然是一种实数变量,而最终分类的结果却期望是一种确定的值“是”(1)或“不是”(0)。其他各种分类器的输出通常也是离散的变量,体现出来也多是非线性的分类特点。
我们在编写代码教会分类器怎么做学习的时候,其实是在教它如何建立一种输入到输出的映射逻辑,以及让它自己调整这种逻辑关系,使得逻辑更为合理。而合理与否的判断也非常明确,那就是召回率和精确率两个指标——召回率指的是检索出的相关样本和样本库(待测对象库)中所有的相关样本的比率,衡量的是分类器的查全率。精确率是检索出的相关样本数与检索出的样本总数的比率,衡量的是分类器的查准率。
具体来说,譬如有一个1000个样本的训练集,是1000张照片,里面有200张是猫,200张是狗,600张是兔子,一共分成三类。我们将每个照片向量化后,加上标签:
·“猫”——“0”;
·“狗”——“1”;
·“兔子”——“2”。
这相当于一个x和y的对应关系,把它们输入到训练集去训练(但是这个地方的标签0、1、2并不是实数定义,而是离散化的标签定义,通常习惯用one-hot独热编码的方式来表示)。经过多轮训练之后,分类器将逻辑关系调整到了一个相对稳定的程度,然后用这个分类器再对这200张猫,200张狗,600张兔子图片进行分类的时候,发现:
200张猫的图片中,有180张可以正确识别为猫,而有20张误判为狗。
200张狗的图片可以全部正确判断为狗。
600张兔子的图片中,有550张可以正确识别为兔子,还有30张被误判为猫,20张误判为狗。
你可不要觉得奇怪,在所有的机器学习或者深度学习训练的工程中,误判率几乎是没有办法消灭的,只能用尽可能科学的手段将误判率降低。不要太难为机器,其实人都没办法保证所有的信息100%正确判断,尤其是在图片大小、图片清晰程度、光线明暗悬殊的情况下,不是吗?那就更别说机器了,它更做不到。
我们还是来解释召回率和精确率的问题。就刚才这个例子来说,一共1000张图片中,200张是猫,但是只能正确识别出180张,所以猫的召回率是180÷200=90%,600张兔子中正确识别550张,所以兔子的召回率是550÷600≈91.7%。而在1000中图片中,当我检索狗的时候会检索出240张狗的图片,其中有200张确实是狗,有20张是被误判的猫,还有20张是被误判的兔子,所以240张狗的图片中正确的仅有200张而已,那么狗的精确率为200÷240≈83.3%。怎么样,这两个概念不难理解吧。
分类的训练过程和回归的训练过程一样,都是极为套路化的程序。
第一,输入样本和分类标签。
第二,建立映射假说的某个y=f(x)的模型。
第三,求解出全局的损失函数Loss和待定系数w的映射关系,Loss=g(w)。
第四,通过迭代优化逐步降低Loss,最终找到一个w能使召回率和精确率满足当前场景需要。注意,这里尤其指在验证数据集上的表现。
大家请注意这4个步骤,我们从前面最简单的机器学习的例子中已经总结出来一个最为有概括性的科学性流程。这种流程广泛使用,并且在其他机器学习的场景中也是可以顺利落地的。
分类器的训练和工作过程就是这个样子了,听起来分类器的工作过程非常简单,但是要知道人的智能行为其实就是一种非常精妙或者称为完美的分类器。他能够处理极为复杂、极为抽象的输入内容——不管是文字、声音、图像,甚至是冷、热、刺痛感、瘙痒感这种难以名状的刺激,并且能够在相当短的时间内进行合理的输出——例如对答、附和、评论,抑或是尖叫、大笑等各种喜怒哀乐的反应与表现。从定义的角度上来说,人其实就是一种极为复杂的且极为智能的分类器。而我们在工业上使用的分类器则通常是非常片面的,只研究一种或几个事物的“专业性”的分类器,这和我们人类的分类能力区别就太大了。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/91806.html