号的选择的excel数字自动排序号很关键 玩起来排序非常地方便

关于作者:小一一北京大学在讀硕士,研究方向为深度模型压缩加速个人主页:http://yanjoy.win

在神经网络方面,早在上个世纪末Yann LeCun 等人已经使用神经网络成功识别了邮件上的手写郵编。至于深度学习的概念是由 Geoffrey Hinton 等人首次提出而在 2012 年,Krizhevsky 等人采用深度学习算法以超过第二名以传统人工设计特征方法准确率 10% 的巨大领先取得了 ImageNet 图像分类比赛冠军。

此后的计算机视觉比赛已经被各种深度学习模型所承包这些模型依赖于具有数百甚至数十亿参数的深度网絡,传统 CPU 对如此庞大的网络一筹莫展只有具有高计算能力的 GPU 才能让网络得以相对快速训练。

如上文中比赛用模型使用了 1 个包含 5 个卷积层囷 3 个完全连接层的 6000 万参数的网络通常情况下,即使使用当时性能顶级的 GPU NVIDIA K40 来训练整个模型仍需要花费两到三天时间对于使用全连接的大規模网络,其参数规模甚至可以达到数十亿量级

当然,为了解决全连接层参数规模的问题人们转而考虑增加卷积层,使全连接参数降低随之带来的负面影响便是大大增长了计算时间与能耗。

对于具有更多层和节点的更大的神经网络减少其存储和计算成本变得至关重偠,特别是对于一些实时应用如在线学习、增量学习以及自动驾驶。

在深度学习的另一端即更贴近人们生活的移动端,如何让深度模型在移动设备上运行也是模型压缩加速的一大重要目标

Krizhevsky 在 2014 年的文章中提出了两点观察结论:卷积层占据了大约 90-95% 的计算时间和参数规模,有较大的值;全连接层占据了大约 5-10% 的计算时间95% 的参数规模,并且值较小这为后来的研究深度模型的压缩与加速提供了统计依据。

┅个典型的例子是具有 50 个卷积层的 ResNet-50 需要超过 95MB 的存储器以及 38 亿次浮点运算在丢弃了一些冗余的权重后,网络仍照常工作但节省了超过 75% 嘚参数和 50% 的计算时间。

当然网络模型的压缩和加速的最终实现需要多学科的联合解决方案,除了压缩算法数据结构、计算机体系结構和硬件设计等也起到了很大作用。本文将着重介绍不同的深度模型压缩方法并进行对比。

综合现有的深度模型压缩方法它们主要分為四类: 

基于参数修剪和共享的方法针对模型参数的冗余性,试图去除冗余和不重要的项基于低秩因子***的技术使用矩阵/张量***来估计深度学习模型的信息参数。基于传输/紧凑卷积滤波器的方法设计了特殊的结构卷积滤波器来降低存储和计算复杂度知识蒸馏方法通過学习一个蒸馏模型,训练一个更紧凑的神经网络来重现一个更大的网络的输出 

一般来说,参数修剪和共享低秩***和知识蒸馏方法鈳以用于全连接层和卷积层的 CNN,但另一方面使用转移/紧凑型卷积核的方法仅支持卷积层。

低秩因子***和基于转换/紧凑型卷积核的方法提供了一个端到端的流水线可以很容易地在 CPU/GPU 环境中实现。

相反参数修剪和共享使用不同的方法如矢量量化,二进制编码和稀疏约束来執行任务这导致常需要几个步骤才能达到目标。

▲ 表1:不同模型的简要对比

关于训练协议基于参数修剪/共享、低秩***的模型可以从預训练模型或者从头开始训练,因此灵活而有效然而转移/紧凑的卷积核和知识蒸馏模型只能支持从零开始训练。

这些方法是独立设计和楿辅相成的例如,转移层和参数修剪和共享可以一起使用并且模型量化和二值化可以与低秩近似一起使用以实现进一步的加速。

不同模型的简要对比如表 1 所示。下文针对这些方法做一简单介绍与讨论

根据减少冗余(信息冗余或参数空间冗余)的方式,这些参数修剪囷共享可以进一步分为三类:模型量化和二进制化、参数共享和结构化矩阵(structural matrix)

网络量化通过减少表示每个权重所需的比特数来压缩原始网络。Gong et al. 对参数值使用 K-Means 量化Vanhoucke et al. 使用了 8 比特参数量化可以在准确率损失极小的同时实现大幅加速。

Han S 提出一套完整的深度网络的压缩流程:首先修剪不重要的连接重新训练稀疏连接的网络。然后使用权重共享量化连接的权重再对量化后的权重和码本进行霍夫曼编码,以进一步降低压缩率如图 2 所示,包含了三阶段的压缩方法:修剪、量化(quantization)和霍夫曼编码

修剪减少了需要编码的权重数量,量化和霍夫曼编碼减少了用于对每个权重编码的比特数对于大部分元素为 0 的矩阵可以使用稀疏表示,进一步降低空间冗余且这种压缩机制不会带来任哬准确率损失。这篇论文获得了 ICLR 2016 的 Best Paper 

在量化级较多的情况下准确率能够较好保持,但对于二值量化网络的准确率在处理大型 CNN 网络如 GoogleNet 时会夶大降低。另一个缺陷是现有的二进制化方法都基于简单的矩阵近似忽视了二进制化对准确率损失的影响。

网络剪枝和共享起初是解决過拟合问题的现在更多得被用于降低网络复杂度。

他们的研究表明这种剪枝方法的精确度比基于重要性的剪枝方法(比如 Weight Decay 方法)更高這个方向最近的一个趋势是在预先训练的 CNN 模型中修剪冗余的、非信息量的权重。

在稀疏性限制的情况下培训紧凑的 CNN 也越来越流行这些稀疏约束通常作为 l_0 或 l_1 范数调节器在优化问题中引入。 

剪枝和共享方法存在一些潜在的问题首先,若使用了 l_0 或 l_1 正则化则剪枝方法需要更多嘚迭代次数才能收敛,此外所有的剪枝方法都需要手动设置层的超参数,在某些应用中会显得很复杂

▲ 图3:剪枝和共享

该方法的原理佷简单:如果一个 m×n 阶矩阵只需要少于 m×n 个参数来描述,就是一个结构化矩阵(structured matrix)通常这样的结构不仅能减少内存消耗,还能通过快速嘚矩阵-向量乘法和梯度计算显著加快推理和训练的速度 

这种方法的一个潜在的问题是结构约束会导致精确度的损失,因为约束可能会给模型带来偏差另一方面,如何找到一个合适的结构矩阵是困难的没有理论的方法来推导出来。因而该方法没有广泛推广

一个典型的 CNN 卷积核是一个 4D 张量,而全连接层也可以当成一个 2D 矩阵低秩***同样可行。这些张量中可能存在大量的冗余所有近似过程都是逐层进行嘚,在一个层经过低秩滤波器近似之后该层的参数就被固定了,而之前的层已经用一种重构误差标准(reconstruction error criterion)微调过这是压缩 2D 卷积层的典型低秩方法,如图

▲ 图4:压缩2D卷积层的典型低秩方法

使用低阶滤波器加速卷积的时间已经很长了例如,高维 DCT(离散余弦变换)和使用张量积的小波系统分别由 1D DCT 变换和 1D 小波构成

学习可分离的 1D 滤波器由 Rigamonti 等人提出,遵循字典学习的想法Jaderberg 的工作提出了使用不同的张量***方案,在文本识别准确率下降 1% 的情况下实现了 4.5 倍加速

低阶逼近是逐层完成的。完成一层的参数确定后根据重建误差准则对上述层进行微調。这些是压缩二维卷积层的典型低秩方法如图 2 所示。

按照这个方向Lebedev 提出了核张量的典型多项式(CP)***,使用非线性最小二乘法来計算Tai 提出了一种新的从头开始训练低秩约束 CNN 的低秩张量***算法。它使用批量标准化(BN)来转换内部隐藏单元的激活一般来说, CP 和 BN***方案都可以用来从头开始训练 CNN 

低秩方法很适合模型压缩和加速,但是低秩方法的实现并不容易因为它涉及计算成本高昂的***操作。另一个问题是目前的方法都是逐层执行低秩近似无法执行全局参数压缩,因为不同的层具备不同的信息最后,***需要大量的重新訓练来达到收敛

虽然目前缺乏强有力的理论,但大量的实证证据支持平移不变性和卷积权重共享对于良好预测性能的重要性

使用迁移卷积层对 CNN 模型进行压缩受到 Cohen 的等变群论(equivariant group theory)的启发。使 x 作为输入Φ(·) 作为网络或层,T(·) 作为变换矩阵则等变概念可以定义为:

即使用變换矩阵 T(·) 转换输入 x,然后将其传送至网络或层 Φ(·)其结果和先将 x 映射到网络再变换映射后的表征结果一致。注意 T 和 T' 在作用到不同对象時可能会有不同的操作根据这个理论,将变换应用到层次或滤波器 Φ(·) 来压缩整个网络模型是合理的

这种方法仍有一些小问题解决。艏先这些方法擅长处理广泛/平坦的体系结构(如 VGGNet)网络,而不是狭窄的/特殊的(如 GoogleNetResidualNet)。其次转移的假设有时过于强大,不足以指导算法导致某些数据集的结果不稳定。

利用知识转移(knowledge transfer)来压缩模型最早是由 Caruana 等人提出的他们训练了带有伪数据标记的强分类器的压缩/集成模型,并复制了原始大型网络的输出但是,这项工作仅限于浅模型

后来改进为知识蒸馏,将深度和宽度的网络压缩成较浅的网络其中压缩模型模拟复杂模型所学习的功能,主要思想是通过学习通过 softmax 获得的类分布输出将知识从一个大的模型转移到一个小的模型。 

Hinton 嘚工作引入了知识蒸馏压缩框架即通过遵循“学生-教师”的范式减少深度网络的训练量,这种“学生-教师”的范式即通过软化“教师”的输出而惩罚“学生”。为了完成这一点学生学要训练以预测教师的输出,即真实的分类标签这种方法十分简单,但它同样在各种圖像分类任务中表现出较好的结果 

基于知识蒸馏的方法能令更深的模型变得更加浅而显著地降低计算成本。但是也有一些缺点例如只能用于具有 Softmax 损失函数分类任务,这阻碍了其应用另一个缺点是模型的假设有时太严格,其性能有时比不上其它方法

深度模型的压缩和加速技术还处在早期阶段,目前还存在以下挑战: 

  • 依赖于原模型降低了修改网络配置的空间,对于复杂的任务尚不可靠;

  • 通过减少神經元之间连接或通道数量的方法进行剪枝,在压缩加速中较为有效但这样会对下一层的输入造成严重的影响;

  • 结构化矩阵和迁移卷积滤波器方法必须使模型具有较强的人类先验知识,这对模型的性能和稳定性有显著的影响研究如何控制强加先验知识的影响是很重要的;

  • 知识精炼方法有很多优势,比如不需要特定的硬件或实现就能直接加速模型个人觉得这和迁移学习有些关联。 

  • 多种小型平台(例如移动設备、机器人、自动驾驶汽车)的硬件限制仍然是阻碍深层 CNN 发展的主要问题相比于压缩,可能模型加速要更为重要专用芯片的出现固嘫有效,但从数学计算上将乘加法转为逻辑和位移运算也是一种很好的思路

TensorFlow 支持的是一种静态图,当模型的参数确定之后便无法继续修改。这对于逐阶段、分层的训练带来了一定的困难相比之下,Pytorch 使用了动态图在定义完模型之后还可以边训练边修改其参数,具有很高的灵活性这也是深度学习未来的发展方向。

目前的开发者版本 nightly 中TensorFlow也开始支持动态图的定义,但还未普及 因此在选择上,科研和实驗优先用 Pytorch工程和应用上可能要偏 TensorFlow。 

其中 K-Means 是一种简单有效而较为快速的方法了在个人电脑上,由于训练网络参数规模较小因而无法体現出其运算时间。在对 VGG 这样大型的网络测试时发现对于 256 个聚类中心,在 fc 的 4096?4096 维度的全连接层进行聚类时耗时超过 20 分钟(没有运行完便停止了),严重影响了算法的实用性

目前的解决办法是抽样采样,如对 1% 的参数进行聚类作为整体参数的聚类中心这样操作后聚类时间能缩短到 5 分钟以内。 

有没有一个更加简便的方法呢对于训练好的一个模型,特别是经过 l2 正则化的其参数分布基本上可以看作是一个高斯分布模型,对其进行拟合即可得到分布参数

这样问题就转化为:对一个特定的高斯分布模型,是否能够根据其参数直接得到聚类中心

如果可以,那这个聚类过程将会大大缩短时间:首先对权重进行直方图划分得到不同区间的参数分布图,再由此拟合高斯函数最后鼡这个函数获得聚类中心。这个工作需要一定的数学方法这里只是简单猜想一下。

我们日常说道的数据压缩是根据信源的分布、概率進行的,特别是通过构建字典来大大减少信息冗余。

这套方法直接使用在模型上效果往往不好。一个最重要的原因就是参数虽然有着媄妙的分布但几乎没有两个相同的参数。在对 Alexnet 进行 gzip 压缩后仅仅从 233MB 下降到 216MB,远不如文本以及图像压缩算法的压缩率因此传统方法难以解决深度学习的问题。 

剪枝量化虽好但其问题也是传统压缩所没有的,那就是重训练所带来的时间成本这个过程就是人为为参数增加條件,让网络重新学习降低 loss 的过程因此也无法再重新恢复成原始的网络,因为参数不重要重要的是结果。

这个过程和训练一样是痛苦而漫长的。又因为是逐层训练一个网络的训练时间和层数密切相关。

Mnist 这种简单任务512?512 的权重量化重训练,由最开始的 8s 增加到 36s增加叻约 4 倍时间(不排除个人代码优化不佳的可能)。如果在 GPU 服务器上Alex 的时间成本可能还是勉强接受的,要是有 GoogleNetResNet 这种,真的是要训到天荒哋老了

实现过程中,有很多操作无法直接实现或者没有找到简便的方法,不得不绕了个弯子确实会严重降低性能。

目前机器学习红遍全球男女老尐都在学机器学习模型,分类器神经网络和吴恩达。你也想成为一份子但你该如何开始?

今天小编推荐这本《Python机器学习》教你快速入門

   如果想了解更多Python的伙伴或者小白中有任何困难不懂的可以加入我的python交流学习QQ群:,多多交流问题互帮互助,群里有不错的学习教程囷开发工具资源分享

从出生的那天起,我们就一直在学习中度过随着逐渐的成长,开始学习如何走路;通过倾听周围人的谈话学习並尝试模仿;通过学习不同单词的意思,使得在需要时懂得该如何进行表达;同时也开始区分事情的好坏例如,在第一次靠近火源时會因灼热而后退,从而明白要与火源保持一定的距离

那么,现在思考一下计算机的工作原理计算机可以在1s内遵循人类的指示处理数百萬条指令,并返回结果;它可以执行人类描述的任务但是却不能自行决定。

而机器学习此时就可以发挥作用了如果给予计算机像人类┅样的思考能力,那会发生什么呢可以用计算机能理解的方式给出每一天的任务令其进行计算,还可以建立一些模型来帮助计算机在将來采取行动

人类从经验中学习知识,计算机则遵循指令执行任务然而,其实还可以直接向计算机提供经验让其学习并为行动做准备目前我们是以结构化的方式定义经验。因此我们将计算机从数据(经验)中进行学习的过程称为机器学习(Machine Learning)。

以买香蕉为例你的母親需要你去市场上买一些香蕉,同时她告诉你鲜***的香蕉很好吃你到一个水果商那里,开始按照母亲的建议挑选香蕉你买了20根香蕉後就回家了,然而回家后你注意到有些香蕉的味道并不像其他的那样好事实上,有5根香蕉是坏的你逐个拿起香蕉并开始作出假设。 20根馫蕉中有12根大香蕉和8根小香蕉这8根小香蕉都很美味,但是大香蕉就不一样了在12根大香蕉中有5根味道不如预期。

你已经掌握了挑选香蕉嘚知识第二天,当你到达市场时注意到有个水果商在打折出售香蕉,这些香蕉和昨天的不同它们的皮带有一些绿色。从这里买完香蕉回到家后根据之前的经验将每一根香蕉分为好与坏,会发现大的绿色香蕉很好吃但是小的绿色香蕉的味道不如其他的好。这样你僦学会了新规则。

你开始将自己看作是香蕉专家有一天,你不得不去另一个城市参加表亲的婚礼现在你惊讶地发现这里所有的香蕉都佷小,但是味道却都很好在这里你了解到来自这个区域的香蕉是畅销商品。

现在你确实已经是一名专家了但如果你的姐姐很长时间没囿回家了,并且她喜欢石榴而讨厌香蕉你要怎么办呢?为了找到美味的石榴你需要重新开始你的学习。

现在这个任务就可以由机器学***负责指引计算机完成了可以使用数据点的形式向计算机提供知识。数据点的属性称为特征(Feature)这里的特征是香蕉的大小(小、中、夶)、颜色、产地等。输出(Output)就是味道(好或者坏)将这些数据输入到机器学习程序中,就可以让计算机学习如何区分香蕉的好与坏

机器学习算法是一种根据经验来给予你决策能力的智能算法。

Python在数据科学家中是非常受欢迎的编程语言

  • 第一,它免费且易学不必为叻小任务而浪费大量注意力;

  • 第二,它是面向对象的语言这也是其被大型开发者社区支持的原因;第三,巨大的开源库支持 Python具有相当數量的开源库,能够更迅速地实现数据科学和机器学习解决方案而无须从头开始编写每一个算法。像Pandas、 scikit-learn、 SciPy、 NumPy、 Keras这样的库对于快速实现机器学习算法非常有用

首先,通过一个例子了解如何使用编程语言来解决现实世界的问题

假设举办一个聚会。你为每个进入聚会的人分配一个唯一的1~100之间的号码现在聚会结束了,你宣布了一个消息

“会从1~200之间获取一个随机数。如果有两个人的号码之和与这个excel数字洎动排序号相等就会奖励这两个人。”

现在了解到已经向x个人分配了号码。如何确定能否给其中两个人奖励呢

可以尝试使用Python来解决這个问题。首先从列表中获取输入数据。

现在选择一个随机数并将其存储在一个变量中

 

为了解决这个问题,必须先对数据进行排序茬Python列表中排序很简单,可以通过sort函数来完成

 

通过上述语句,将排序后的excel数字自动排序号赋值给变量现在使用两个指针:一个指向开始處(前指针);另一个指向结束处(后指针)。检查两指针所指变量的和如果和小于给定值(意味着当前的总和小于所需的总和),前指针向前移动一步并再次检查;如果和大于给定值(意味着当前的总和大于所需的总和)将后指针向后移动一步并再次检查。无论在任哬位置如果当前的总和等于要求的总和,便可以说存在两个人的数值之和与给定的数值相同,需要给予奖励;如果两个指针相交并且仍然没有达到所需的总和则可以声称并不存在两个人的数值之和与给定的数值相等。

以下是完整的解决方案

 

为获得所需***,必须向函数传递排序列表和给定的数值(即两数值的期望和)

 

即使现在不能理解此代码,也不要担心接下来我们还会对这段代码进行解析,並介绍程序设计语言的基本原理

机器学习不仅仅是一种简单的算法,还可以将其放在其他任何地方以获得奇妙的结果机器学习是一个從定义数据开始,最终获得一定准确率的模型的过程

机器学习的过程从定义一个商业问题开始。机器学习的需求是什么这个任务真的需要高级的预测算法来解决吗?

问题定义是非常重要的它提供了更正式地思考解决方案的方向。它基本上处理两个问题

这个问题涵盖叻问题的定义,并使问题变得更加正式假设我们想要确认图像中是否包含人。

现在定义这个任务将其分为任务(T)、经验(E)和性能(P)。

  • 任务(T):根据图像中是否包含人对图像进行分类

  • 经验(E):带有是否包含人的标签的图像。

  • 性能(P):错误率在所有的分类圖像中,错误预测的百分比是多少错误率越低,准确率越高

B.为什么这个问题需要解决方案?

这个问题更侧重于商业方面它包括解決问题的动机和益处。

假如你是一个研究者希望解决某个问题并发表论文,使之成为他人解决问题的基准这可能就是你的动机。

关于伱的问题其他需要确定的是在没有安全措施的情况下,夜间在银行的自动取款机上是否有人类活动(假设所要解决的问题与自动取款机嘚安全有关)

还需要定义可以使用此解决方案的场景。这是一个通用型的解决方案还是为特定任务(ATM传感器中的检测人员)所设计的呢?解决方案的失效日期是什么时候(它是终身的还是在特定的期限内)

在定义问题之后,开始进行数据采集收集数据有多种不同的方式,如果想把评论与评级联系起来就要从抓取网站开始。为了分析Twitter数据并将其与情感联系起来就要从Twitter提供的API入手,收集标签数据或鍺与某个公司相关联的数据市场调查人员通过创建不同的调查表格,并将其放在网站上来收集数据对于像Amazon、 Facebook这样拥有众多用户的公司,其数据是巨大的而根据问题的不同,还需要收集数据和标签假设要建立一个新闻分类器,将新闻划分为体育新闻、市场新闻和政治噺闻因此,收集到的每一条新闻都需要一个与之相关的标签通过这些数据可以构造机器学习的分类器。

正确的数据是解决机器学习问題的关键即使是基本算法,高质量的数据也会产生令人满意的结果

在采集数据之后,需要专注于数据准备收集的数据要准备成机器學习算法所能使用的格式。算法不是魔术表演数据必须以正确的形式输入到机器学习算法中才能获得结果。根据算法库的不同算法可鉯适应不同类型的输入格式。

数据准备是从数据选择开始的并不是收集到的每个数据都对问题的解决有帮助。假设你正在分析服务器上嘚日志在每个用户活动之后会生成许多与系统相关的信息,如果正在预测的是营销活动的市场反应那么这个日志可能就不起作用了。所以基于所要解决的问题,应将无关数据从之后的操作中删除

在更高层次的基础上识别数据后,需要对数据进行转换或预处理使之能更好地应用于机器学习算法。以下是数据预处理过程中的一些过程

  • 清理(Cleaning):数据可能含有需要移除的错误。假设数据中缺少某些属性的数值由于目前并没有适合的算法能够处理值缺失问题,因此可以用一些值(数值的均值/中值和分类值的默认值)代替缺失值如果數据包含敏感信息,如电子邮件的ID和用户的联系号码则需要在与团队共享数据之前删除数据中的敏感信息。

  • 格式化(Formatting):算法需要预定義格式的数据基于Python机器学习库的要求,采用Python列表的形式表示数据一些实时的机器学习库使用的是JSON格式的数据,而Excel文件使用CSV格式的数据根据使用工具或技术的不同,需要对数据进行格式化使其满足使用工具或技术对数据格式的要求。

  • 采样(Sampling):并非所有的数据都是有鼡的一些在模型中存储数据的算法很难实时生成预测,可以从数据中删除类似的实例如果是分类模型,可以按照标签进行等比例采样

  • ***(Decomposition):***会使得一些特征更加有用。以数据库中的日期属性为例可以把日期***成日、月、年,还可以创建诸如周末或工作日、季度、闰年或日期等特征使其在预测中更有用。

  • 缩放(Scaling):不同的属性遵循不同的单位和值假设通常以厘米为单位测量一个人的身高,而对于一些数据可能是以英寸为单位。所以需要先将其换算成厘米。另外一个属性的高/低值可能会影响到其他属性。例如有3个特征如人的年龄、体重和年收入,现在希望根据它们预测医疗保险计划如果直接使用这些数据,模型将高度依赖于工资因为工资的數值远远高于其他属性的值。所以需要对每个属性的值进行缩放,调整为[0,1]或[-1,1

这个过程也称为特征处理(Feature Processing)它包括特征选择、预处理以忣将其转换为对于机器学习算法有益处的格式。

4.数据分割——训练数据和测试数据

机器学习算法的目标是对未知的新数据进行预测我們使用训练数据来建立模型。在训练数据时算法将逐渐减少训练的误差。但是不能将训练数据的准确率(Accuracy)视为广义的准确率,其原洇在于该算法可能会记住实例并对其进行相应的分类所以,为了评估生成的模型需要将数据分为训练数据和测试数据。利用训练数据進行算法训练利用测试数据来计算生成模型的最终准确率。测试数据并不参与算法训练

一般将60%~80%的数据作为训练数据,剩余的部分作為测试数据所以,在测试数据中获得最好结果的模型可以作为目标模型

我们从一组机器学习算法开始,并将训练数据的特征应用到算法中算法选择依赖于问题的定义。如果从电子邮件中收集数据并将邮件分为垃圾邮件或非垃圾邮件,则这时所需要的算法是在输入变量后输出相应的结果(垃圾邮件或者非垃圾邮件)这类算法称为分类(Classification)算法(如决策树、朴素贝叶斯、神经网络等)。如果想预测某┅任意连续变量(如预测即将到来的季度销售量)则使用回归(Regression)算法(如线性回归、核回归等)。如果所解决的问题并没有相关的任哬输出或反应则可以使用聚类(Clustering)算法,根据它们的特性对其分组每种类别中都有大量的算法,我们将在后续的章节中给出示例

在選择算法之后,开始训练模型训练模型是在训练数据集上进行的,大多数算法的权值/参数在训练开始时都是随机分配的并在每次迭代Φ加以改进。算法训练过程中在训练数据集上多次运行以产生结果,如图1.1所示例如,在线性回归的情况下算法在开始时随机放置分離线,在每次迭代之后不断地改进自身(也就是移动分离线)

利用训练数据生成最佳算法后,在测试数据集上对算法的性能进行评估測试数据集并不能参与算法训练,因此测试数据并不能影响算法的决策

在选择正确的算法后,可以尝试对其进行改进以获得更好的性能每个算法都有不同的参数设置方式,可以对其进行配置从而更改算法性能这称为参数调整(Parameter Tuning)。例如可以改变算法学习的速率(学习率)来提高算法性能这些参数称为超参数(Hyper Parameter)。对于机器学习来说参数调整更像是一门艺术。

上述所有步骤完成之后就可以获得在訓练集上训练生成,并在测试集上完成评估的模型现在可以使用这个模型来预测新数据的值。对于生产环境可以将模型部署到服务器,并通过API接口使用模型的预测功能当然,这个模型并不总一样的每当获得新数据时,都要将上面所列出的步骤重新进行一遍以改进模型的性能。

因此在机器学习中,从问题开始最后以一个解决问题的预测算法结束。

通过下面的问题我们开始尝试了解机器学习算法是如何解决问题的。

假设你需要购买一栋房子现在开始查看市场上正在出售的房屋,并据此核对你的预算你对将要购买的房子有多個要求,首先就是房子的面积

在图1.2的情景中,你先考查了一栋600平方英尺(约56m2)的房子价格是220 000英镑(约1 942 578元)。这个房子的确很不错但昰它并不满足你的要求——你将和你的家人一同居住,而这个房子面积太小并不能让每个人都住得舒适。所以你继续研究并找到一栋1700岼方英尺(约158m2)的房子,价格是730 000英镑(约6 445 827元)这个房子满足你的要求,但是它的价格有些超出你现在的预算——你的预算与小面积房子嘚价格相比要高一些但也不像大房子的价格那么高。然而只有当你与业主或代理人见面并提交详细资料后,才能得到房子的实际价格但是你并不想与每一个业主或者代理人见面。

 在二维(2D)平面上分析一下你所考查的两个属性如图1.3所示。

现在你在城市里闲逛,找箌一栋面积在这两栋房子之间的房子

这栋新房子的面积大约有1 250平方英尺(约116m2),但你还不知道价格所以,你想预测房子的价格看其昰否符合预算和要求。

将新房子的信息放在同一个二维平面上试着预测这个房子的价格,如图1.4所示

 为了预测房屋的价格,将设置一条苻合已知结果(即房屋价格和房屋面积)的直线这里得到了如图1.5所示的一条直线。

通过这条直线可以预测出1250平方英尺(约116m2)的房子的價格是475 000英镑(约4 194 202.5元)。所以我们得到了一条根据房子面积来预测房子价格的直线,这种技术称为线性回归(Linear Regression)可以把这种技术理解为茬现有数据点上寻找最佳直线。

比如计算3个点到直线距离之和的最小值。首先随机选择一条线,直线上方有A、B、C共3个点如图1.6所示。

 嘫后计算每个点到直线的距离,如图1.7所示

 可以得到总距离是a+b+c。现在移动直线的位置(向下移动)并再次计算点到直线的距离,如图1.8所示

 改变了线的位置,但总距离a+b+c增加了显然,这不是我们想要的结果让我们将直线朝另一个方向(向上移动)移动,如图1.9所示

 这條直线(见图1.9)比第一条直线(见图1.7)要更符合要求。现在移动这条线并试着重复进行同样的步骤。最终通过这种方式结束直线的选择从而确定直线位置,如图1.10所示

对于给定的3个点(A、 B、 C)来说,图1.10所示的直线是最符合条件的在这里取3个点到直线的非负距离,找到這条线的方法称为梯度下降法

有时在所有数据点上拟合一条直线并没有多大意义。现在思考图1.11所示的点集

 如果尝试使用线性回归技术來拟合一条直线,它看起来如图1.12所示

 很明显,这条线不适合用来预测相反,可以用图1.13所示的曲线来对数据建模

这就是所谓的多项式囙归(Polynomial Regression) —— 因为其参数是多项式。

再来看另一个例子例如有一个售鞋网站,其中包含来自不同公司的各种鞋子可以通过其网上商店訂购鞋子。鞋子成功交付后公司将发送电子邮件获取顾客的反馈。顾客在评论区内留言其中有些评论是正面的,有些评论则是负面的

该公司每天销售数千双鞋,需要跟踪每一个评论并采取相应的行动如果顾客评论说鞋子质量不佳,则需向生产商询问有关产品的质量問题;有些鞋子反响很好则最好将它们放在网站的首页。

为了解决这个问题首先需要从一组顾客评论开始,将每个评论分为负面评论戓者正面评论下面给出部分示例。

A1:质量不错!我很喜欢这双鞋子

A3:给我爸爸买的,他很喜欢

B1:材质不好,不适合

B2:很不喜欢这個产品,包装也很不好

B3:千万不要买这个产品。

分析示例中的正面评论和负面评论会发现,如果评论中包含“喜欢”这个词那么它哽可能是一个正面评论。因此创建这条规则并检查所有数据集,会发现60%的正面评论中包含“喜欢”这个词;另一方面只有10%的负面评论Φ包含“喜欢”这个词。

同样其他词语所占的比例如表1.1所示。

因此对于将来可能获得的评论,根据其所包含的词的复合概率可以判萣该评论是正面评论还是负面评论,这就是朴素贝叶斯分类器(Na?ve Bayes Classifier)

再列举一个向不同的人推荐杂志的例子。假设已经记录了用户的年齡、性别、位置以及他们阅读的杂志类型表1.2所列为记录的数据。

 现在通过对这些数据进行观察,可以发现小于15岁的人喜欢阅读儿童杂誌根据其制作一个节点和它的决策,如图1.14所示每个圆节点表示决策节点,图的边缘(箭头)则表示相应的决策每个矩形节点表示通過图分支之后采取的决策。

因此可以说每个年龄小于或等于15岁的人都有可能阅读儿童杂志。现在再来处理大于15岁的读者的分支

现在,苐二个观察特征是男性他们喜欢阅读政治杂志。为其创建相同的决策节点和分支如图1.15所示。

 接下来需要看一下年龄在15岁以上的女性嘚选择。还有一个信息可以利用——地区因此,可以说来自美国的女性喜欢阅读体育杂志,而其他地区的女性则喜欢商业杂志在这裏形成的节点如图1.16所示。

正确地对每个数据点进行分类这个过程中形成了决策树。可能存在多种创建决策树的方法根据现有的数据,這些方法可以做出正确的预测

图1.17所示的这棵树对数据进行了准确的分类。

再来举另一个例子有几个人每年申请贷款,银行根据他们的收入和贷款额从而决定是否对其提供贷款目标是向那些在规定时间内偿还债务,且没有任何违约的人提供贷款

如果一个人月收入是20 000美え,他申请了100 000美元的贷款银行根据他的收入来源可以批准贷款;如果一个人月收入是3 000美元,他申请了600 000美元的贷款则银行可能会早早地拒绝他。

因此银行基于以往违约者的历史创建了一个数据,如图1.18所示红点表示银行拒绝受理的申请,绿点表示银行批准的申请横坐標是请求的贷款额度,纵坐标是月收入

 现在,一个月收入10 000美元的人想要贷款300 000美元银行是否会给予批准呢?可以通过一条直线来分割数據如图1.19所示。

根据上面的直线可以预测银行将同意月薪20 000美元的人申请300 000美元的贷款申请。

现在已经有一条合适的直线来分割现有的数據点。我们使用的算法(梯度下降法)与在线性回归过程中使用的算法相同在这里,目标变量是类别而不是在线性回归情况下连续的预測值这种技术称为逻辑回归(Logistics Regression)

现在银行来了一位新的经理,他要检查所有记录他认为银行批准或拒绝贷款申请的参数是荒谬的,一些像10 000美元或20 000美元的贷款申请并没有风险银行可以同意这部分贷款申请。所以他改变了规则和数据,如图1.20所示

 显然,仅仅使用一條直线并不能将红点和绿点分开既然这样,那使用两条直线呢如图1.21所示。

与一条直线相比使用两条直线可以将红点和绿点分开。这種技术被称为神经网络(Neural Network)神经网络是基于大脑中的神经元的概念提出的。大脑中的神经元收集信息并将其传递给其他神经元简单来說,就是基于先前神经元的输入下一个神经元接收要求并决定输出,它还将信息传递给其他神经元最后,通过处理不同的神经元大腦做出决定。

这个概念可以用下面的模型(见图1.22)来理解在这个模型中,两个神经元通过使用不同的假设建立模型并且将它们的发现發送给另一个神经元。根据收集到的信息输出神经元做出决策。

 在处理数据时对于一条分割数据点的直线,可能有不同的选择如图1.23所示的两个例子。

 与直线1相比直线2的边距更大,其在分割数据方面似乎更好如图1.24所示。

现在我们要寻找最佳分割路线而梯度下降并鈈能解决这个问题,需要线性优化才能实现这种技术被称为最大间隔分类器或支持向量机(Support Vector Machine, SVM)

在现实世界中,数据并不能完全分割開它可能会如图1.25所示的那样。

 所以不能通过一条直线就把红点和绿点分开。但是如果通过一个平面来区分红点和绿点就可以用一个汾类器对它们进行分类。创建一个新的维度并用这个平面来分割红点和绿点如图1.26所示。

现在使用一个新的维度将红点和绿点分开这种技术被称为核函数(Kernel Trick)

真实的数据非常复杂而且有很多维度。带有支持向量机分类器的核函数可以用来解决这些复杂的问题

现在来看另一个问题。如图1.27所示有一家杂货店A2A。他们提供***送货服务每当接到***时,他们就会将地址发送给派送员派送员会赶赴送货哋点并交付商品。他们设法将办公室设在城市的中心以便为越来越多的人及时提供服务。

这里的点代表A2A的服务需求现在他们意识到,這种一个配送中心处理所有的需求的做法并不明智于是,他们决定在城市中开设4个配送中心依照不同地区来接受需求并提供服务。

因此为了解决这个问题,首先可以随机地添加4个配送中心并给予其商品派送需求如图1.28所示。

 显然这不是配送中心的最佳分配位置。接丅来将每个点移动到分类点的中心。然后将所有点分类到最近的配送中心,并将配送中心的位置移动到之前的分类中心经过多次迭玳,将得到图1.29所示的分配位置

因此,每个点的分配都是基于点到中心的距离这种技术称为K-均值聚类(K-Means Clustering)

也可以使用另一种方法进行聚类把所有的点看作是独立的集群,而不是首先将它们分组到集群中再对其进行重新分配然后,将两个最近的点进行分组形成一个簇。一直这样操作直到出现较大的距离或者形成最小数量的簇。这种技术称为层聚类(Hierarchical Clustering)

  如果想了解更多Python的伙伴或者小白中有任何困難不懂的可以加入我的python交流学习QQ群:,多多交流问题互帮互助,群里有不错的学习教程和开发工具资源分享

参考资料

 

随机推荐