我想用代码编写一个游戏的人物模型,需要学习什么语言

任何机器学习系统复杂到一定程喥都会包含一个临时开发的、不合规范的、充满错误的、运行速度很慢的、只有一半功能的编程语言实现。(格林斯潘第十定律)

我们佷高兴看到机器学习大爆发以及机器学习模型的复杂度和用来构建模型的框架。越来越多的顶尖模型更多地涉及到编程问题通常它们需要支持循环和递归等编程结构,这给创建它们的工具(编程语言)带来了一些有趣的问题

尽管机器学习没有专用的语言,但有的机器學习框架(如 TensorFlow)在 Python API 下高效地创建了「新语言」而一些系统(如 PyTorch)重新使用 Python 作为建模语言。我们想问的是需要为机器学习定制新语言吗?如果需要为什么?更重要的是未来完美的机器学习语言可能是什么样子?

隐藏在机器学习系统后的语言

TensorFlow(TF)已经算是着一种「编程語言」了因为在这个框架下我们完全可以使用它所提供的类和对象编写一个模型。大家使用 Python 和 TF 库进行编程因此这个结论似乎有点令人驚讶。但是TF 要求你在其内部语言内使用 Python 代码构建表达式树,然后 TF 再进行评估

事实上,你可以用任何语言进行「懒惰的」TensorFlow 风格编程如丅面的 JavaScript 代码,就在这种风格中实现了一个小功能(add):

 

这里我们进行的是元编程(metaprogramming)——编写写代码的代码。上例中源语言和目标语訁是一样的(JavaScript),它们也可以是不同的语言(如在处理 C 语言的 C 预处理器中)我们也可以使用数据结构(AST)来代替字符串,原则是一样的在 TensorFlow 中,Python 是元语言我们使用 TF 这种基于静态计算图的语言编写程序。如果你不信想一下

TensorFlow 和类似工具的呈现方式是「库」,但它们是极其鈈寻常的库大部分库提供一套简单的函数和数据结构,而不是全新的编程系统和运行时(runtime)

创建新语言的核心原因非常简单:ML 研究需偠极高的算力,简化建模语言可以使添加特定的优化和特征变得简单训练模型要求极高的硬件支持、合适的数值、低解释器开销和多种並行化。通用语言如 Python 勉强可以提供这些特征但 TensorFlow 可以无缝处理它们。

不过有一个障碍这些优化依赖于简单化的假设(ML 模型不是递归的,戓不需要自定义梯度)这使得将这些优化或应用部署到小型设备变得简单。不幸的是对于工程师来说,模型复杂度目前出现直线上升嘚趋势而研究者享受破坏这些假设的过程。现在模型要求条件分支(比较简单)、重复循环(没有那么简单但也不是不可能)、递归树(几乎不可能)在 ML 的很多分支,包括神经网络和概率编程中模型越来越像程序,包括推断其他程序的程序(如程序生成器和解释器)且具备不可微组件,如蒙特卡罗树搜索构建提供完全灵活性且达到顶尖性能的运行时非常困难,但是最强大的模型和突破性的结果需偠这二者使用机器学习和复杂树结构数据需要可微且递归的算法。


该方法的另一个缺陷是目前需要上面讨论的元编程。构建和评估表達树对程序员和编译器都是额外的负担很难进行推断,因为现在代码有两个执行时间每个具备不同的语言语义(language semantics),逐步调试等操作將变得更加困难这可以通过为新的运行时创建语法来解决,但是其工作量不亚于创建全新的编程语言

机器学习模型开始需要编程语言嘚全部力量,Chainer 和其他人率先使用「define-by-run」方法该方法中 Python 程序本身就是模型,使用运行时自动微分(AD)作为导数从易用性的角度来看这种方法很有意思:如果你想要一个进行树运算的递归模型,只需要写下来让 AD 来施展它的魔力!我们很难不高估这种感觉,使用新的无障碍方法对于研究来说是宝贵的

但是,让 Python 满足机器学习的复杂计算要求比你想象的还要难得多大量研究开始开发快速语言(如 PyTorch),但并没有加快 Python 的速度Python 的语义使它很难提供模型级别的并行化,或者为小型设备编译模型

MXNet Gluon 正在探索利用二者,至少在一定程度上其想法是将基礎的动态自动微分和生成可优化「静态子图」的代码追踪方法联系起来。不幸的是这只是把不相关的实现和 API 混在一起而已。这种方法也受限制MXNet 不仅使用它的图来做 kernel 级别的优化,还用于高级别的图调度(graph scheduling)如在多个 GPU 上分割模型。此外目前尚不明确这些混合如何对此进荇处理。

适合机器学习的语言是什么样的

很少有其它领域像机器学习一样有语言级的设计需求,但在形式化推理或集群计算等领域量身定制的语言已经证明它们是高效的解决方案。同样我们希望看到新的或现有的语言能完美地支持机器学习所需要的数值计算、自动微汾计算、并行计算和概率计算等能力。

当前机器学习语言一个明显的挑战是在性能方面难以取得一致性即早期的混合方法需要更多的开發工作。我们期待未来的机器学习语言将支持任意混合的方法(即静态计算图内可能混合了其它动态或静态计算图)并且在编译动态代碼时能更好地部署。理想情况下这种新型语言将只有单个灵活的「计算图格式」。这种计算图格式应该有一种语法和静态描述的方法以表示动态的行为换句话说,它应该看起来更像一个标准的编程语言

可编程语义将达到新的灵活性水平,并且它可以通过类似宏(Macros)的特征实现这将允许通过指定代码应该有怎样的纯数据流语义,而在核心系统的顶部构建像多 GPU 训练那样的特征此外,它也能允许概率编程语言所需要的各种编程操作或 NLP 模型中常需要手动实现的向量化或批量化等。

与编程语言社区一样机器学习工程师非常关注传统的自動微分领域。机器学习语言可以从真正实现一阶导的语言中获取灵感与经验这样的语言可以很容易将符号与运行时(runtime)技术结合在一起,将正向与反向模式的自动微分技术混合在一起所有这些都不会导致性能上的损失。

ML 研究将需要越来越强大的类型系统(type systems)、用户自定義类型和更多的扩展手段目前在英伟达 GPU 上对阵列式支持的硬编码已经足够了,但像前沿的稀疏机器学习新型 TPU、Nervana 和 FPGA 等面向机器学习模型蔀署的硬件都需要更高的灵活性。

若目前存在添加新型硬件支持或新型数据表征的新型语言那么用户可以简单地通过高级代码,而不需偠改变原来的系统就能添加硬件支持或数据表征方式当然,我们期望机器学习语言能从现有的数值计算语言中获取灵感因为这些语言巳经能很好地处理特定的任务了。

此外机器学习工程师对传统的软件工程问题越来越感兴趣,例如在维护和扩展生产系统等方面机器學习编程模型使得在组件之间更难以创建接口,对模型的重训练可以轻松地实现向后兼容机器学习语言可以像常规语言一样将这些问题嘚解决方案结合起来,但这仍然是一个开放性问题


软件工程 2.0?(图片来自 XKCD)

任何新语言共同面临的问题就是它们都需要一套新的库和生態系统从而让人们编写的代码能够不断从中获得支援。例如:如果选择不重用 Python 的生态系统TensorFlow 开发者们需要为图语言中的图像处理和文件 IO 等任务重新写库,在这一部分做出巨大贡献的项目是 SciPy这可能是我们快速发展的唯一出路,机器学习参与者们也不能从更为广泛的 HPC 和数学社区中分裂出去一个理想条件下的机器学习生态系统是理想的数学生态系统,这些社区之间的合作将使所有人的力量都获得倍增

我们期待新的发展来自各个维度。Graph IR 和 XLA、ONNX、NNVM 等格式正在变得前所未有的复杂同时也在受到传统语言设计的启发,甚至可能会出现表面语法以荿为完整意义上的编程语言。TensorFlow XLA 已经开始面向专用编译器堆栈发展现在包含 TVM、DLVM、myelin,以及其它正在进行的工作除此之外,像 PyTorch JIT、Gluon 和 Tangent 正努力使 Python 夲身成为更好的建模语言尽管这项任务面临的挑战很大。在刚刚把机器学习归类为数值编程语言问题后我们在 Julia 社区中看到了解决这些語言级别问题的极好的基础,开发者们正在持续推动像 Knet、Flux、Cassettle、CUDAnative、DataFlow.jl 等工具的发展

结论:机器学习推理工具

机器学习模型已经成为极度泛化嘚信息处理系统,被用于进行越来越高级、越来越复杂、抽象的任务;循环、递归、高阶模型、甚至堆栈机和语言解释器全部都可以以基夲组建的组合形式来实现机器学习是一种新的编程范式,尽管对于初学者来说其中含有太多的数值、可微分和并行化对于任何工程领域,这些可用工具都会对未来工作的质量和范围产生深远影响

所有这些都预示着机器学习系统的设计者们面临着非常大的挑战。尽管如此我们还有一些好消息:如果有一方面仍未解决的话,过去的几十年里计算机语言的研究者们已经深入讨论了同样的问题。为了深入探知这一领域的全部机器学习和编程语言社区需要通力合作,所以真正的挑战是整合这两个群体之间不同的专业知识。

我们能否建立起一套面向数学、衍生和并行同时又不牺牲传统编程思想优势的新语言工具?这将是未来十年里计算机语言领域里人们面临的主要问题

【IT168 资讯】这个内容是一个分步指喃指导如何在20分钟内使用机器学习(最终达到97%的准确率)建立语言检测模型。

语言检测对机器学习来说是一个很好的用例更具体地说,就昰用于文本分类给定来自电子邮件、新闻文章、语音到文本功能的输出或其他任何地方的文本,语言检测模型会告诉您它是什么语言

這是快速对信息进行分类和排序并应用特定语言的附加工作流程层的好方法。例如如果要对Word文档应用拼写检查,则首先必须为正在使用嘚字典选择正确的语言否则,你会发现拼写检查器给出的***是错误的

其他用例可能包括将电子邮件路由到位于正确地理位置的客户垺务部门,将正确的字幕或隐藏式字幕应用于视频或对正在分析的文本应用其他语言特定的文本分类。

看到这你应该很清楚语言检测嫃的很有用,让我们继续谈谈如何快速完成任务

它基本上是一个带有英文、法文和西班牙文样本的.csv。目标是看看是否可以训练机器学习模型来理解这些语言之间的差异然后再给出一些新的文本的同时,预测它所使用的语言

所以这儿做的第一件事就是把一个机器学习模型构建器,在Docker容器中运行它有一个简单的API。这花了不到一分钟

然后,克隆并下载了这个方便的工具使您可以轻松地在计算机上用文夲文件对它进行训练,这花了一分钟左右的时间

下一步是将CSV转换为文本文件,以便可以轻松地训练Classificationbox

一个老道的开发人员可以跳过这一步,只解析CSV文件并直接从那里对分类框进行API调用。

以下是作者写的一些不太好的Go代码

运行此脚本后,硬盘上的文件夹会以不同的语言命名并且每个文件夹内都有包含语言样本的文本文件。花了大约10分钟来编写脚本并运行它

有趣的部分要开始了。Classificationbox已启动并运行然后峩们在语言文件夹的父目录上运行imgclass。花费大约3秒钟时间:

2.将20%的样本分成验证集

3.用训练集训练分类箱

4.使用验证集进行验证

97%!这对于只花20分钟训練语言检测机器学习模型来说是非常好的

需要注意的一件重要的事情是类不平衡。每个类都有不同数量的样本他们不遵循训练模型的朂佳实践。理想情况下每个类中都有相同数量的例子。

关键是机器学习最适合实验。强烈建议大家尝试使用Machine Box或其他工具给定一个好嘚数据集,创建自己的机器学习/分类模型其实没那么难

Machine Box将最先进的机器学习功能置于Docker容器中,因此开发人员可以非常快速地将自然语言處理、面部检测、对象识别等轻松集成到您自己的应用程序中

它们是按比例构建的,所以当你的应用程序真正起飞时只需在水平方向仩添加更多盒子,即可无限扩展当然,它比任何云服务都便宜(而且它们可能会更好)并且您的数据也不会离开基础架构。

参考资料

 

随机推荐