一、概述
下图是较简化的机器学习平台架构,概括了机器学习平台的主要功能和流程。本章会进行简要介绍,在功能章节再展开详述。机器学习最主要的三个步骤可概括为:数据处理、建模以及部署。
-
数据处理,即所有和数据相关的工作,包括存储、加工、采集和标记几大主要功能。前三者与大数据平台几乎一致,标记部分是机器学习平台所独有。数据存储较好理解,要根据存取的特点找到合适的存储系统。数据加工,也被称为ETL(Extract,Transform,Load),即将数据在不同的数据源间导入导出,并对数据进行聚合、变形、清洗等操作。数据采集,即从外部系统获得数据,包括通过网络爬虫来采集数据。数据标记,是将人类的知识附加到数据上,产生样本数据,以便训练出模型能对新数据推理预测。
-
建模,即创建模型的过程,包括特征工程、试验、训练及评估模型。特征工程,即通过数据科学家(也称为算法工程师)的知识来挖掘出数据更多的特征,将数据进行相应的转换后,作为模型的输入。试验,即尝试各种算法、网络结构及超参,来找到能够解决当前问题的最好的模型。模型训练,主要是平台的计算过程,好的平台能够有效利用计算资源,提高生产力并节省成本。
-
部署,是将模型部署到生产环境中进行推理应用,真正发挥模型的价值。部署这个词本身,可以仅仅代表将模型拷贝到生产环境中。但计算机软件的多年发展证明,提供一个好的服务需要考虑多种因素,并通过不断迭代演进,解决遇到的各种新问题,从而保持在较高的服务水平。
-
对平台的通用要求,如扩展能力,运维支持,易用性,安全性等方面。由于机器学习从研究到生产应用都还处于快速发展变化的阶段,所以框架、硬件、业务上灵活的扩展能力显得非常重要。任何团队都需要或多或少的运维工作,出色的运维能力能帮助团队有效的管理服务质量,提升生产效率。易用性对于小团队上手、大团队中新人学习都非常有价值,良好的用户界面也有利于深入理解数据的意义。安全性则是任何软件产品的重中之重,安全漏洞是悬在团队头上一把剑,不能依靠运气来逃避问题。
这里,不得不再分辨一下人工智能、机器学习、深度学习的含义,以便文中出现时,读者不会混淆。
-
人工智能,是人们最常听到的说法。在不需要严谨表达时,一般都可以用这个词来表达一些不同以往的"智能"应用。而实际上,程序员写的每一行逻辑代码都是"人工智能",每一个软件都饱含了"人工智能",不是"人类智能"。如果要严谨的表达,"人工智能"和"软件"并没有什么区别,也不表达什么意义深刻的"智能"革新产品。
但如果遵循普适的理解,那么"人工智能"一定是得有一些新奇的、超越以往的"人工智能"的东西,才能配得上这个词。比如,以往计算器(注意,不是计算机,是加减乘除的计算器)刚出现时,它就是新奇的事物,超越了人类的认知。在那个时刻,"计算器"就代表了"人工智能"的最高水平,是当之无愧的"人工智能"产品。
那么,什么时候适合用"人工智能"这个词汇呢?如果别人在用这个词汇说明什么,那就跟着用就好了,不必过于严谨。如果觉得有什么超越以往的"智能"的事物,那就用"人工智能"来介绍它。放之当下(2018年),图像中识别出物体、语音中识别出文本、自动驾驶等等就可以称为"人工智能"了(本文也没少用)。但电灯能感应到人后自动点亮,就不足以说是"人工智能"了。
-
机器学习。这是专业词汇,表达的是具有"学习"能力的软硬件产品,与程序员写就的代码相区别。可以认为,机器学习模型是一个函数,有输入输出,它的逻辑是数据驱动的,核心逻辑在数据中,不在代码中。
机器学习的"学习过程",如果也用函数来类比,那么就是首先给模型传入输入,获得输出。然后将模型的输出与期望的输出(即样本数据中的标记结果)进行比较。并根据比较结果来更新模型中的数据,以便下一次的模型输出能够与期望结果更接近。这个过程,和人学习时的题海战术很类似。
由此看出,机器学习的学习过程是机器直接学习规律,改进数据,逐渐形成逻辑。而不是先有人类学习规律后,再写成代码。故称之为"机器学习"。
-
深度学习。这是机器学习的子领域,但带来了非常大的变革,因此成为了流行的词汇。从字面上解释,所谓深度学习,即在机器学习时,数据组织成了多层次的、有"深度"的网络。传统成功的机器学习算法一般是三层,而深度学习能够实现多达上千层的网络。层次越多,可以认为机器学习模型就能越"聪明",越有"智能"。
深度学习成功的解决了大量和人类认知相关的问题,如:图像中识别物体、物体位置、人脸,语音中更精确的识别文字,文字中翻译、理解含义等。一方面,将机器学习模型的效果大大提升,另一方面,反而降低了机器学习模型应用的难度,让更多的人能够参与进来。最近的一次"人工智能"热潮,也是深度学习所带来的。
二、功能
机器学习平台上最重要的三个功能为:数据处理、建模、部署(也可称为推理)。每一个都可自成体系,成为一个独立的平台。本章从功能角度来描述机器学习平台,给读者以完整的认识。在不同的使用场景下,只需要部分功能,可删可减,不需要面面俱到。
比如,采用预构建的人工智能云服务时,在建模、部署上并不需要投入,主要精力会在数据处理上。再比如,对于以研究为主的团队来说,利用公开数据集进行模型评估等工作,不需要数据处理,也不需要部署。甚至对于个人研究者,强大的平台也不是必须的,手工作坊就能满足需求。
再比如,团队需要比较强大的平台。虽然说工欲善其事必先利其器,但是,常常是业务需求生死攸关的情况,相比之下提升平台从而提高生产力的工作,还没到不做不可的时候。这时候,平台的功能如果不能产生立竿见影、显著的成效,可以缓一缓,先实现投入产出较高的功能,待以后再增量开发或重构。如何很好的平衡开发投入,是艺术也是持续的话题,这里就不展开了。
在建设平台时,要注意合理利用现有的成果。比如,一些在发展初期的平台,其实已经解决了核心需求,可以直接拿来用。还有一些大数据平台,通过改造也能很好的解决机器学习的计算问题。再不济,多使用开源的小模块,在系统中减少一些重复开发的工作。
总之,平台对服务稳定性、时效性、生产力、成本等各方面有很大的价值,但建设平台不是一朝一夕的事情,也没有一个平台能满足各种需求。比如关系型数据库经过了多年的成熟发展,除了流行的几种数据库外,也不断的有满足新需求的新数据库出现。如,理论容量无限的分布式关系数据库,还有不少大企业根据自己的应用情况开发的高性能数据库系统,以及兴起的各种NoSQL数据库。在使用数据库时,不少团队会组合多种数据库来满足需求。在建设机器学习平台时也如此,除了用已有的平台外,可能还需要自己搭建一些周边的支持系统。
数据
机器学习的本质即通过数据来理解信息,掌握知识。因此,数据是机器学习的知识来源,没有数据,计算机就无处学习知识,巧妇难做无米之炊。绝大部分机器学习系统需要样本数据,并从而进行学习。对于Alpha go这样的强化学习系统,数据全部从规则中生成,则不需要外部的数据。自动驾驶虽然也涉及到强化学习的部分,却需要与实际环境交互的数据,数据的收集难度就更高了。
人类文明早期就开始了数据的利用。结绳记事的信息中,就有相当一部分是产量等数据信息。前些年流行的大数据系统更是将数据的作用进一步发挥出来,并产生了丰富、成熟的分布式存储系统、数据加工流程、数据采集等平台和工具。机器学习平台可直接重用这些大数据平台中的工具。数据标记是机器学习特有的数据需求,数据标记就是在数据上加上人类知识,形成样本数据的过程。
数据的建设上要根据需求来定。如,强化学习不需要数据采集系统;小数据量的业务也不需要强大的分布式存储系统;企业数据已经有了强大的数据加工能力,尽量不要再建立新的数据加工流水线。
数据采集
数据采集,即将系统外部的数据导入到机器学习平台中。包括企业内部的数据导入,企业间的数据交换,以及通过网络爬虫抓取数据等。
对接
对于企业内部的机器学习应用,可充分挖掘内部数据的潜力。内部数据一般已有较成熟的数据解决方案,可尽量借用现有功能,尽量通过已有的功能来做数据加工、整理。
安全
对于跨数据中心、跨安全域的数据传输,要注意保护接口安全。不能假设外部人员不知道接口地址、规范,就能幸运的一直安全下去。要通过威胁建模来分析数据接口的受攻击面,找出解决方案,从而减小数据的泄露风险。不仅要对数据传输通道加密,增加认证、授权功能,还要从流程上保证密钥等关键数据的安全性,发生泄露后还要有预案能快速、平稳的更新密钥。
网络瓶颈
跨数据中心传输大量数据时,网络通常是瓶颈。遇到瓶颈时,除了增加投入,提升带宽外,还可以从技术方面进行优化。首先看看传输的数据是否还有压缩空间,其次可重新审查一下传输的数据是否都是需要的,有没有可以去掉的部分。在有的系统中,某些数据的实时性要求不强,可以在收集数据方进行细粒度的缓存,减少数据的重复传输。
除此之外,还要注意数据传输过程是否会占用大量带宽,对双方的其它业务系统的网络延迟,带宽等产生负面影响。这时,可考虑错峰传输数据,在非业务高峰期进行数据传输,或者隔离数据采集的带宽。
网络爬虫
网络爬虫,即从互联网获取网页,并从中抽取信息。随着互联网的发展,网络中的数据越来越多,网络爬虫也得以发展成熟。在使用网络爬虫抽取数据时,要注意遵守相关的法律法规,互联网协议,以及道德规范。
如果被抓取方没有提供专门的数据接口,网络爬虫的数据采集效率会相对较低,且易受页面改动的影响,抓取失败。这种情况下,首先要通过人工分析确定目标网站的页面级联关系,页面结构等信息。然后来制定爬取逻辑,并抽取出需要的数据。在爬取网页时,如果爬取速度过快,有可能会影响到目标网站的正常访问。不仅影响目标网站的业务,也会影响数据爬取过程。所以要规划好一定的爬取速度。同时,应该有警报机制,对抓取中的异常预警,及时改进爬虫。
有的网站信息量较大,前来爬取数据的也较多,通常会有一定的反爬虫策略。反爬虫策略主要分成两个阶段:
-
检测。有的网站会检查请求的数据格式,可以发现明显是网络爬虫的情况。还有的网站会对每个IP和cookie等的访问频率做分钟、小时级统计,超过一定阈值后,即视为网络爬虫。对于流行的搜索引擎,还会采用机器学习,对网络爬虫的行为建模,能更有效的检测到网络爬虫。
-
应对。检测到网络爬虫后,接下来就会采取不同的应对策略。简单的直接封禁IP或网段,但一般会过期解禁。还有的会采用图片验证码等方式,确认是人类还是爬虫在访问,从而决定是否展示关键数据。还有的会对网络爬虫返回缓存的假数据,来影响爬虫结果。
还有的情况,并不检测是否是网络爬虫,直接对关键数据进行保护。如电子商务网站将商品价格用图片显示,增加数据分析的难度。还有的采用自定义字体,将ascii编码映射到不同的字符上。
另外,有的网站会建立白名单,允许一部分合作伙伴采集数据,白名单内的网站会采取不同的检测、应对方法,甚至不做检测。
因此,网络爬虫在设计中要考虑以上因素,确定合理的爬取策略。如通过代理服务器来更换IP。严格模仿网站请求发送数据,或通过浏览器内核来生成数据请求。利用机器学习或人工服务,来识别图片中的信息等等。
网络爬虫应用已经非常广泛了,可以评估一下已有的软件,找到适合自己的方案。
隐私保护
保护客户隐私是企业数据处理时不可忽视的一环,每次将数据传输到新环境都会增加数据泄露的风险。此时,一方面应仔细分析新系统的安全性,另一方面要避免将与建模无关的数据采集到机器学习平台中。如果机器学习过程需要一些隐私数据,如地址、电话等,应进行脱敏处理。从而减小数据泄露后产生的影响。
不少机器学习推理应用中,能获得用户的真实数据。使用真实数据,能够弥补测试数据集和真实数据集的差异,训练出更精准的模型。与此同时,要让用户充分知情,注意保护用户隐私,不要滥用数据。
数据存储
机器学习平台的整个流程中几乎都会产生数据。除了采集阶段的原始数据外,还有加工过的中间数据,训练好的模型,用户数据等等。对各类数据要考虑不同的需求,选择不同的数据存储方案。
数据存储的方案很多,在速度、容量、可靠性等各方面的性能上都能做到很高的水准。但每项指标的提升,都意味着成本的增加。在数据存储方案上,不能盲目追求性能,要量力而行。选择对的,而不是贵的。
可靠性
可靠性即数据是否能在极端情况下正常使用,不会丢失。实际上,任何系统都不能保证在任何极端情况下都能正常使用。只能通过不断的演进来避免常见问题,从而搭建出可靠性不断逼近100%的可靠系统。
提升可靠性的常见方法,即进行数据冗余,对整个系统都避免单点依赖产生的风险。从网络、电力来源、主机、硬盘的各个方面都保证一个设备坏了之后,不影响整个服务。对硬件上的冗余方法不再详述,此处只讨论软件解决方案。
软件上的可靠性,其实主要依赖于数据的复制备份来实现。说起来简单,但具体的实现上却比较复杂。根据保障的场景不同,主要分为两种情况:
-
高可用。即出现问题后,系统只允许丢失秒级的数据,而且要在数秒之内恢复。由于要求响应时间很快,所以高可用一般都在同一个数据中心,甚至相邻的机架上实现。数据会在不同的服务器间进行高速复制,及时保证有两三份或者更多的数据存在,并且几秒钟就检测一下服务器的可访问性,随时准备将不可达服务器从集群中剥离。高可用一般用于解决机器的故障问题。虽然一台服务器故障的故障概率比较低,但在机房中成千上万台服务器时,几乎每天都会有服务器坏掉。通过高可用集群,偶发的服务器物理损坏几乎不影响系统的使用。
-
灾备。即出现灾难性问题后,系统仅丢失分钟级的数据,且要在十分钟或一小时内恢复服务。常见的灾难性问题包括地震、强烈天气、火灾等极端事件。由于要防止地震等地区性问题,灾备需要两个数据存储位置相距800公里以上。为了保证灾备的效果,灾备的数据中心之间也会进行持续的数据复制。为了提高资源的利用率,进行灾备的数据中心可能也要承担业务工作,数据中心之间的数据同步传输是双向的。这样虽然增加了系统设计上的复杂性,但可提高资源的利用效率。
分布式文件系统是比较流行的保障数据存储可靠性的方案。有的分布式文件系统不仅能提供高可用,还能提供灾备的解决方案。
一致性
一致性即数据从各个方面来看,信息都是一致的。可分为两个层面来讨论:
-
数据备份。在提高可靠性的分布式系统中,每份数据都有两到三份。系统在不断的保持各份数据都是一致的。当服务器出现故障时,就有可能出现几份数据不一致的情况。这时候,可取其中的某一份作为主数据,从这份数据来重新创建备份。这样有一定的概率会丢失数据,但保证了数据的一致性。在出现这种情况时,要以一致性优先,无论如何都要保证分布式系统备份数据间的一致,否则潜在的问题会更多。
-
冗余信息。在不少系统中,因为性能、历史遗留问题等原因,会存在一定的数据冗余。一般会在数据更新时逐步刷新这些信息。当数据正在更新时出了问题,就有可能产生数据的不一致。传统的关系型数据库通过事务来处理这类问题,将前面更新的一半内容恢复还原。如果系统中不支持事务,或在分布式业务系统中,就需要设计一个可靠的同步机制来实现类似的恢复还原的功能。
比如,银行系统中要完成跨行转账,需要从一个账户中扣除金额,再给另一个账户增加金额。其中涉及到的系统包括双方银行,中间的支付系统,甚至更多的系统。其中要通过多种同步、超时、重试的机制来保障账户金额的一致性,并尽量保证交易的成功进行。又比如,系统中可能会有些缓存信息。当原始信息刷新后,依赖于业务需求,缓存信息也需要一定的更新策略,要么即时刷新,要么定时刷新。
要保持数据的一致性就会牺牲访问速度,不是所有的数据都需要一致性。这要根据业务的形态来决定。一般来说,如果业务没有要求,就尽量保证访问速度,提高系统响应能力。
访问速度
根据业务的不同,有的数据可能经常写入很少读取,有的则相反。还有的数据存取的时候需要越快越好,而有的数据则对速度不敏感。如,备份数据几乎都是写入,且对读取时的延迟不敏感。而机器学习中的学习参数则需要在内存中保障最快的读取速度。当机器学习模型在推理应用时,对于模型只有读取需求,不需要写入。访问速度和一致性、可靠性的需求都有所冲突,鱼和熊掌不能兼得。
数据访问从CPU寄存器、缓存到内存、网络、磁盘、物理距离,数据延迟的数量级逐步增加。(见下表)同时,每单位容量的价格也随之快速下降。
存储类型 | 读取速度 |
---|---|
CPU寄存器 | 0.3纳秒 |
CPU一级缓存 | 1纳秒 |
CPU二级缓存 | 10纳秒 |
内存 | 100纳秒 |
高速网卡(1G) | 10,000纳秒 |
固态硬盘 | 1,000,000纳秒(1毫秒) |
传统磁盘 | 20,000,000纳秒(20毫秒) |
从中国到美国往返的理论极限(光速) | 100,000,000纳秒(100毫秒) |
在实际应用中,数据库、分布式文件系统等,由于要处理更多的通用问题,或数据规模较大,同时要保证可靠性、一致性,并不能达到上面的理论速度。通常会慢一个或数个数量级。传输数据用的光纤,达不到理论光速。
另外,访问速度应该从整个系统来计算,有时存储本身并不是瓶颈。比如通过各个组件的运算,最终需要两秒钟才能返回结果。可以看出,通过存储也很难提升其速度。只能从算法、流程上来提升,如增加缓存等(这也意味着产生一致性问题)。
版本控制
版本控制,即哪个版本的数据会被使用。在业务数据处理时,会经常产生新的数据。在多种场景下都需要对新数据进行版本控制。
在新数据写入完毕前,不应该可读取,否则会读取到部分数据。在写入完成后,应尽快允许读取,这样能够拿到最新的结果。如果有缓存时,在数据更新后,可能需要触发缓存同步更新。
在新数据中发现问题时,在某些场景下,应该允许切换回旧数据。这部分功能和业务结合紧密,因此通常需要自己实现相关功能。
数据加工
数据加工通常可称为ETL(Extract, Transform, Load),即将数据导出、转换、加载(可称为保存)。总之,数据加工可以抽象为数据的导入导出和形态的转换,描述了数据加工的通用流程。成熟的ETL系统会提供大量的组件适配不同的数据源,以及丰富的数据变换操作,并解决了很多稳定性相关的问题。使用这样的ETL系统,能够达到事半功倍的效果。
在数据加工过程中,有可能需要多次ETL的数据加工才能得到最终需要的数据。这时,系统需要在完成前置的ETL任务后,触发下一轮的ETL任务。要考虑到上一节中提到的数据一致性、可靠性造成的延迟,防止下一轮ETL没有在最新的数据上运行,或因为找不到数据而出现错误。
导入导出
导入导出,即将数据从各种异构的数据源中导出,并导入到另一个目的数据源中。导入导出的主要功能是支持关系型数据库、NoSQL数据库、json、csv、内存、web api、程序结构体等各种形式的接口,能将数据无缝的在各种数据源中导入导出。各种数据源之间的数据结构并不一定能一一映射,如有的NoSQL能够存储树形结构的数据,而关系型数据库只能存储二维的数据表。
在导入导出过程中,可以对数据进行过滤、映射,可以选择出部分数据列,也可以增加查询条件,选择出部分数据条目。在导入时可以将不同名的数据列进行映射改名。
转换
在数据平台中,数据转换是核心功能之一。常用的SQL、Map Reduce等都是对数据的转换。数据转换可以串联起来,对数据进行多次处理。也可以并联起来,将两个数据源合并,或一份数据输出两种形态的数据。
将数据转换从导入导出中单独抽象出来,不必关心源数据存放在哪里,支持什么样的操作。所有的操作都会在ETL的转换过程中完成。大大方便了异构数据的处理,在数据需求非常多、数据源复杂的场景下,对效率提升非常高。但是,通过通用的转换流程处理数据,就不能使用数据源里原生的数据处理过程,在某些场景下数据转换效率会大幅降低。
通过组合不同的数据转换方式,能完成绝大部分的数据转换操作。在一些通用数据转换组件无法完成操作,或者效率太低的情况下,可以实现接口写出专用转换组件。数据转换的主要种类如下。
-
单条数据内的变化。
-
树形结构的调整。这种转换可以进行移动、复制、增加、删除树形结构内的节点,以及改名等操作。还可以将树形结构扁平化为只有一层节点。这样变化后,可以将键值对导入到关系型数据库中。机器学习中,大部分数据也是像关系型数据库一样的键值对,而不是树形结构。
-
字段计算。在机器学习中,要对NULL值赋值,或者通过正则表达式来抽取出信息。这些都通过修改字段值,或增加新的计算字段来实现。
-
-
数据打包拆包。在数据处理流程中,有些操作通过批处理效率会更高。这时需要将多条数据打包成一条,以便后面的流程可以进行批量操作。完成批量操作后,再拆成多条数据。
-
分拆单条数据。树形结构中包含的数组,如果要在接下来的数据中单独处理则需要将数组分拆成多条数据。分拆后的数据,还可能需要包含原始数据的某些字段。
-
聚合多条数据。聚合可以统计唯一键、进行求和等操作。如果聚合的数据量非常大,有可能需要外存来缓存。
-
跨语言互操作。有时候ETL工具本身的语言和用户使用的目标语言不一致。可通过互操作接口来调用用户代码,如通过网络接口序列化数据。这样用户可以用目标语言写出业务相关的转换组件,集成到ETL工具中。
-
数据流的合并与分支。如果多种数据需要合并,则可通过数据流的合并操作来进行。数据流合并,从独立的数据导出操作开始,在某一步中合并起来。或者在数据转换过程中,根据主键查询出新的数据后,直接合并。如果数据需要同时输出两种格式,如原始数据与聚合内容都需要输出,则可以在中间对数据进行分支,通过两条流水线来分别处理。
-
定制化。如果原生的转换组件不足以处理复杂的业务逻辑,或者为了提高处理效率。可以实现转换组件的接口实现定制的逻辑。
校验与清洗
大数据中异常数据是常见问题,大数据通常只进行一些聚合操作,少量的异常数据可以忽略不计。在机器学习应用中,所有数据都会影响模型的计算结果,在某些算法下,异常数据会对模型效果有非常大的影响。所以要对数据进行校验和修复,将异常数据在数据处理过程中过滤掉。对于常见的数据异常,要从数据源头调研,检查数据来源上是否有缺陷,并进行修复。
数据清洗是对数据进行修正。有些数据虽然不属于数据异常,但不利于机器学习。要么将数据标准化,要么忽略掉这类数据。比如,数值列中的空值,可能需要替换为零;在自然语言处理中,如果文本只有一两个字,基本没法生成有意义的模型,可直接忽略掉整条数据;有些空白字段可以训练一个小的机器学习模型来预测、填充,转换成正常数据。
可视化
平台的核心目标是提高生产力。如果将提高生产力分解开来,其中很重要的方法就是降低学习成本,节约日常操作时间。可视化是降低学习成本,节约操作时间的重要方法。
数据处理过程可以完全是代码,也可以用json文件一样的配置方法来实现。使用配置来实现,就能很容易的接入各种系统,实现可视化。可视化后,一些数据的导入导出工作还可以交给非开发人员使用,节约沟通交流的时间。这也会让新人更容易上手,更快形成生产力。数据的可视化也能让人对数据处理过程有直观的感觉,甚至能发现一些数据处理中的错误。
样本数据
样本数据包含了数据以及从数据中期望得到的知识,也称为标记数据。有监督学习(supervised learning)必须有样本数据才能训练出模型,从而将知识应用到新数据中。虽然从机器学习的分类上来看还有无监督学习、强化学习等不需要样本数据的场景。但有监督学习的应用更为广泛。
数据标记的过程是机器学习中,将人类知识赋予到数据上的过程。有了好的标记数据,才能训练出好的模型。如果标记数据的质量不高,会直接影响到训练出的模型质量。比如,人类的标记数据正确率在90%,那么模型的理论最好成绩也不会高于90%。
标记后的样本数据是团队独有的财富。它的价值不仅在于标记人员投入的时间、经济成本,也在于独有的样本数据带来的模型效果的提升。模型丢了可以重新训练,样本数据丢了,重新标记的时间成本和机会成本可能无法承受。因此,一方面要做好数据备份等工作,防止数据丢失,另一方面还要做好内部、外部的保密工作,防止样本数据泄露。
一般的数据标记方法是让有一定背景知识的人来标记,然后将数据和标记结果及其关联保存起来。训练时,会将数据和标记结果同时输入机器学习模型中,让模型来学习两者间的关系。数据标记方法的复杂程度不一,如:
-
图片分类,即给定一张图片,对其进行分类。标记方法比较简单,给每张图片进行分类即可,标记速度也比较快。如工业应用中经常要检测流水线上是否有次品。可让人来判断成品、次品图片,然后点击相应的分类,或者将图片放入不同分类的文件夹即可。
-
文本分类,即给定一段文本,判断它的分类。如:正面评价、负面评价、不相关评价、中性评价、垃圾广告等。这种数据的标记需要标记者通读文本,并领会其中的含义,也比较简单。在舆情监测领域有广泛的应用。
-
目标检测,即给定一张图片,将其中需要检测的目标标示出来,并进行分类。这种标示方法有两种,一种是用矩形框将目标标示出来;另一种需要将目标的每个像素都标示出来。可以看出,这两种标记方法的工作量都大于前面两种标记任务,标记像素更需要大量的时间才能标记得非常准确。自动驾驶领域,就需要对行人、车辆、道路标识等信息标记其位置。
-
语音识别,即将音频转换为文字。虽然这类数据已经较多,但仍然不能满足需求。如诗词、方言、特定噪音下的数据等都需要人工标记来丰富数据。语音识别应用非常广泛,最常见的就是对视频、音频内容自动生成字幕。
除了人工标记,有些领域可以利用已有数据来形成样本数据。如机器翻译可以利用大量已有的双语翻译资料。但机器翻译一般是逐句翻译,所以还要找出双语句子对。如果需要的应用领域没有足够的双语资料,翻译效果也会受影响。
数据使用
在机器学习中,数据的使用上也有基本的原则。一般说来,会将数据按比例随机分成三组:训练集、验证集、测试集。
-
训练集用来在训练中调整模型中的参数,使模型能够拟合出最佳效果。通常,训练集在所有数据中占的比例最高,大部分数据都用来进行训练。
-
验证集用来在每轮拟合之后评估拟合效果。有的训练过程会在数据达到了一定的性能后停止训练,这就是用验证集来评估的。通过在验证集上进行推理预测,能够实时的了解模型当前的训练进度。可以了解训练是否在收敛,收敛的速度如何等信息。
在有些训练过程中,验证集不是固定的集合。在每轮训练前,将数据随机分配至训练集和验证集。这样,参与模型训练过程的数据规模就更大了。
-
测试集用于最终模型准备发布之前的评估。测试集就像最终考试一样,一般对一个模型只用一次,甚至对于一些训练结果不好的模型不使用。测试集用来解决模型的过拟合问题。过拟合,即模型只能很好的预测训练时使用的数据,对实际数据预测效果会明显打折扣。因此,在模型训练过程中要严格限制测试集的使用次数,否则,它和验证集就没有区别,无法发现过拟合的问题。
标记工具
标记工具提供了用户界面,帮助数据标记人员高效的标记数据。根据不同的标记任务,标记工具的用户界面会有所不同,但后面的处理流程是相似的。标记工具最重要的任务是提升生产力,让标记人员的时间花在知识推理上,而不是操作工具、等待工具响应中。
标记工具的用户界面开发过程并不复杂,开发成本也不高。只要遵循基本的用户体验设计方法,以生产力为目标,就能做出易用、高效的标记工具。因此,几乎每个团队、平台都会开发自己的标记工具。
标记工具要紧密结合到整个数据处理过程中,从源数据到标记后数据的存储。除了要做好备份外,标记后的样本数据要融入整个数据流水线,尽快将标记的数据投入到模型训练中,让新数据尽早发挥作用。
在线标记
用户数据收集的过程从产品设计实现,到后端数据处理的整个流程。有的场景下,用户不仅会提供数据,还会提供数据标记,从而能够减少标记数据上的投入。将这些标记数据及时补充到样本数据中,随着用户的使用,产品就会越来越好。
如,在搜索引擎中,排名第一的结果是模型计算出的第一个结果,接下来的结果相关性依次降低。而用户第一次点击的结果,则是用户标记的相关度最高的结果。因此,可以将用户的搜索关键词、第一次点击的结果保存下来作为样本数据,用于模型的下一轮训练。通过不断的迭代训练,用户就会感觉到搜索引擎越来越聪明,排在前面的结果就有自己想要的。
外包
标记工作比较枯燥,如果长时间进行数据标记工作,人会感到厌烦。如果需要的样本数据量很大,团队人手不够,或者要解决其它更重要的事情,又或者标记数据的工作不是持续性的,没必要组建自己的标记团队。这时,外包数据标记工作是个很好的选项。随着机器学习的火热,数据标记工作已经逐步标准化。一些被称为"数字富士康"的公司,有成百上千人的团队专门进行数据标记工作,还有流程来保证标记质量的稳定。
外包数据标记工作时,最重要的是要保证标记结果的质量。虽然成熟的外包团队能够很好的控制质量,但对于业务相关的知识可能并不熟悉。需要团队悉心教导、传授知识,才能保证数据标记结果的质量。
众包
众包也是一种将工作外包的方式,不同点在于是将任务直接包给个人,而不是公司。个人与项目的耦合也非常松散,完全按照工作量计费。众包的优势在于经济成本低廉,一旦运营好了,横向扩充标记速度非常容易。有一些公益性质的众包项目,人们甚至愿意免费参与。众包的技巧在于管理。通过合理的架构、结果评估以及激励方式,就能得出好的结果。
比如,ImageNet是一个众包的图片数据集,标注了1400万张图片的两万多个分类,以及超过100万张图片的边框。基于ImageNet的大赛让图像认知领域得到了长足的发展,对深度学习的发展起到了至关重要的推动作用。
一些数据标注的众包平台可以直接使用,能够节省众包的管理成本和风险。但是,平台的质量参差不齐,需要认真的评估。
其它方法
如果实在找不到更多标记数据,可以通过一些机器学习中独特的方法来增加数据。这些方法虽然效果有限,但也有一定的价值。
-
数据增广(Data Augmentation)。主要应用于图像领域,可通过往图片中增加噪点数据,翻转、小角度旋转、平移、缩放等方法将一张图片变为多张图片。从而增加样本数据总量。
-
迁移学习(Transfer Learning)。可用于深度学习的多层网络中。在其它某个有丰富样本数据的领域先训练出较高质量的模型。然后将其输出端的一些隐藏层用本领域的样本数据重新训练,则可以得出较好的效果。一些图片分类的云服务,有的通过这种方法来基于用户上传的少量图片进行学习、分类,得到性能不错的模型。
-
半监督学习(Semi-supervised Learning)、领域自适应(Domain Adaptation)等其它方法。