在过去的十年中,深入学习模型已经证明在愿景,演讲和语言中表现了各种机器学习任务。在Uber,我们正在使用这些模型进行各种任务,包括客户支持,对象检测,改善地图,优化聊天沟通,预测,防止欺诈.
许多开源库,包括TensorFlow,PyTorch,CNTK,MXNET,链在其他方面,已经实现了构建此类模型所需的构建块,从而实现了更快且更少出错的开发。这反过来又推动了机器学习研究社区和行业从业者采用此类模型,从而在建筑设计和工业解决方案方面取得了快速进展。雷竞技是骗人的
在超级人工智能,我们决定避免重新发明轮子并开发基于强大的基础开源库的顶部建立的包。为此,在2017年我们发布了烟花,建立了深度概率编程语言PyTorch,并继续在开源界的帮助下改善它。由优步创建的另一个主要开源AI工具是Horovod的框架LF深度学习基础允许深度学习模型在多个gpu和多台机器上进行分布式训练。
扩展我们的承诺,使深度学习更容易获得,我们正在释放路德维希,一个开源的深度学习工具箱构建在TensorFlow这允许用户在不编写代码的情况下训练和测试深度学习模型。
路德维希它的独特之处在于帮助非专家更容易理解深度学习,并为有经验的机器学习开发人员和研究人员提供更快的模型改进迭代周期。雷竞技是骗人的通过使用Ludwig,专家和研究人员可以简化原型过程,简化雷竞技是骗人的数据处理,从而专注于开发深度学习架构,而不是数据争吵。
路德维希
在过去的两年里,我们在Uber内部在内部开发了Ludwig,以简化并简化应用项目中的深度学习模型,因为它们通常需要不同的架构和快速迭代的比较。我们目睹了它的价值,包括我们的几个项目,包括我们的项目顾客痴迷票务助理,信息提取从驾驶执照,在司机合作伙伴和骑手之间的对话期间识别感兴趣点,食物交付时间预测等等。出于这个原因,我们决定将其释放为开源,因为我们认为目前没有其他解决方案,具有相同的使用和灵活性。
我们最初将Ludwig设计为一个通用工具,用于在处理新的应用机器学习问题时简化模型开发和比较过程。为了做到这一点,我们从其他机器学习软件中汲取了灵感Weka和MLlib即直接使用原始数据并提供一定数量的预建模型;从咖啡,定义文件的声明性;从scikit-learn,它的简单编程API。这种影响的混合使它成为一个非常不同于通常的深度学习库的工具,后者提供张量代数原语和很少的其他实用程序来编码模型,同时使它比其他专业库更通用PyText,StanfordNLP,allennlp.,和OpenCV..
Ludwig提供一组模型架构,可以组合在一起,以创建给定用例的端到端模型。作为一个类比,如果深入学习图书馆提供建筑物,使您的建筑物制作,Ludwig将提供建筑物制作您的城市,并且您可以在可用的建筑物中选择或将您自己的建筑添加到可用的建筑物中。
我们在工具箱中融入的核心设计原则是:
- 不需要编码:训练一个模型并使用它来获得预测,不需要编码技巧。
- 普遍性:一种新的基于数据类型的深度学习模型设计方法,使工具可用于许多不同的用例。
- 灵活性:有经验的用户对建模和培训有广泛的控制,而新手会发现它很容易使用。
- 可扩展性:易于添加新的模型架构和新的特性数据类型。
- 易懂:深入学习模型内部人员通常被认为是黑匣子,但我们提供了标准的可视化,以了解他们的性能并比较他们的预测。
Ludwig允许用户通过提供一个包含数据的表格文件(如CSV)和一个指定表格文件中哪些列是输入特性,哪些是输出目标变量的YAML配置文件来训练深度学习模型。配置文件的简单性支持更快的原型设计,可能会将编码时间减少到几分钟。如果指定了多个输出目标变量,Ludwig将执行多任务学习,学习同时预测所有输出,这通常需要定制代码。
特别是,模型定义可以包含额外的信息预处理信息对于数据集中的每个特征,每个特性使用哪个编码器或解码器,每个编码器和解码器的架构参数,以及训练参数。预处理、训练和各种模型体系结构参数的默认值是根据我们的经验或从学术文献中选择的,允许新手轻松地训练复杂的模型。同时,在模型配置文件中分别设置它们的能力为专家提供了充分的灵活性。每个经过路德维希训练的模型都被保存下来,并可以在以后加载,以获得对新数据的预测。例如,可以在服务环境中加载模型,以在软件应用程序中提供预测。
路德维希引入的主要新思想是特定数据类型的编码器和解码器的概念,这将产生高度模块化和可扩展的体系结构:支持的每种数据类型(文本、图像、类别等)都有特定的预处理功能。简而言之,编码器将原始数据映射到张量,而解码器将张量映射到原始数据。
通过这种设计,用户可以访问组合器(体系结构的粘合组件),组合来自所有输入编码器的张量,处理它们,并返回用于输出解码器的张量。比如路德维希的默认concatCombiner连接不同编码器的输出,通过完全连接的层传递它们,并为输出解码器提供最终的激活作为输入。其他组合器可用于其他用例,并且可以通过实现简单的函数接口轻松添加更多组合器。
通过组合这些特定于数据类型的组件,用户可以在各种各样的任务上创建路德维希训练模型。例如,通过组合文本编码器和类别解码器,用户可以获得文本分类器,而组合图像编码器和文本解码器将使用户能够获得图像字幕模型。
每个数据类型可能有多个编码器和解码器。例如,文本可以用卷积神经网络(CNN)、循环神经网络(RNN)或其他编码器进行编码。然后,用户可以在模型定义文件中直接指定使用哪一个及其超参数,而不需要编写任何一行代码。
这种多功能和灵活的编码器解码器架构使得不太经验丰富的深度学习从业者培训模型以获得多样化的机器学习任务,例如文本分类,对象分类,图像标题,序列标记,回归,语言建模,机器转换,时间序列预测和问题回答。这使各种使用案例适用于缺乏经验的从业者,并且允许在一个域中遇到的用户来接近新域。
目前,Ludwig包含二进制值、浮点数、类别、离散序列、集、包、图像、文本和时间序列的编码器和解码器,以及加载一些预先训练过的模型(例如单词嵌入)的能力,但我们计划在未来的版本中扩展支持的数据类型。
除了可访问性和灵活的体系结构之外,Ludwig还为非程序员提供了额外的好处。Ludwig集成了一组命令行实用程序,用于训练、测试模型和获得预测。为了进一步提高易用性,工具箱提供了一个可编程的API,允许用户用几行代码训练和使用模型。
此外,它还包括一套其他工具,用于评估模型,通过可视化比较它们的性能和预测,并从中提取模型权重和激活值。
最后,能够在多个gpu上本地训练模型,并通过使用Horovod是一个开源分布式训练框架,使得可以迭代模型并快速获得结果。
使用路德维希
为了更好地理解如何在现实世界的应用程序中使用Ludwig,让我们用工具箱构建一个简单的模型。在本例中,我们创建一个模型,该模型根据书名、作者、描述和封面预测图书的类型和价格。
训练模型
我们的书籍数据集如下所示:
| 标题 | 作者 | 描述 | 封面 | 类型 | 价格 |
| 机器人会梦见电子羊吗? | 菲利普•k•迪克 | 到2021年,世界大战已经造成数百万人死亡,导致整个物种灭绝,人类离开地球。... | path-to-image / do-android-cover.jpg | 科幻 | 9.32 |
| 战争与和平 | Leo Tolstoy. | 战争与和平主要集中在1812年拿破仑入侵俄国的故事上,并以文学中最著名的三个人物为主线…… | path-to-image / war-and-peace-cover.jpg | 历史 | 5.42 |
| 玫瑰的名字 | Umberto Eco | 1327年,巴斯克维尔的威廉兄弟被派去调查一家富有的意大利修道院,那里的修士被怀疑有异端邪说 | 路径到图像/名称 - rose-pock.jpg | 历史 | 16.99. |
| ... | ... | ... | ... | ... | ... |
为了学习一个使用标题、作者、描述和封面列的内容作为输入来预测类型和价格列中的值的模型,模型定义YAML将是:
input_features:
- - - - - -
标题名称:
类型:文本
- - - - - -
作者名称:
类型:类别
- - - - - -
名称:描述
类型:文本
- - - - - -
名称:封面
类型:图像
output_features:
- - - - - -
名称:类型
类型:类别
- - - - - -
名称:价格
类型:数值
训练:
时代:10
我们通过在控制台中输入以下命令来开始培训:
路德维格列车-data_csv路径/to/file.csv -model_definition_file model_definition.yaml
通过这个命令,Ludwig对训练、验证和测试集中的数据进行随机分割,对它们进行预处理,并为四个输入构建四个不同的编码器,为两个输出目标构建一个合并器和两个解码器。然后在训练集上对模型进行训练,直到验证集上的精度停止提高或达到10个epoch的最大值。
培训进度将在控制台中显示,但是TensorBoard也可以使用。
默认情况下,文本特征是用CNN编码器编码的,但是我们可以使用RNN编码器,它使用状态大小为200的双向LSTM来编码标题。我们只需要将标题编码器定义更改为:
标题名称:
类型:文本
编码器:RNN.
cell_type: lstm
双向:真
如果我们想改变训练参数,如epoch的数量,学习率和批大小,我们将改变模型定义如下:
input_features:
- ...
output_features:
- ...
训练:
时代:100
Learning_rate:0.001
batch_size: 64
关于如何执行分割和数据预处理的所有参数,每个编码器合并器和解码器的参数都有默认值,但它们是可配置的。指的是用户指南要了解各种可用的模型定义和训练参数,请查看我们的例子来看看路德维希是如何用于几个不同的任务的。
可视化培训结果
训练结束后,Ludwig会创建一个结果目录,其中包含训练后的模型及其超参数和训练过程的汇总统计信息。控件提供的几种可视化选项之一可以使它们可视化可视化工具,例如:
路德维希可视化-可视化learning_curves -training_stats results/training_stats.json
这将显示一个如下图所示的图表,显示损失和准确性作为列车epoch号的函数:
有几种可视化。的用户指南中的可视化部分提供更多的细节。
预测培训型号的结果
拥有新数据的用户,如果希望他们以前训练过的模型预测目标输出值,可以输入以下命令:
路德维希预测-data_csv path/to/data.csv -model_path /path/to/model
如果数据集包含与预测相比较的ground truth信息,则运行此命令将返回模型预测和一些测试性能统计数据。这些可以通过可视化命令(如上)进行可视化,也可以用于比较不同模型的性能和结果预测。例如:
路德维希可视化-可视化compare_performance -test_stats path/to/test_stats_model_1。/ / test_stats_model_2.json json路径
将返回一个比较不同度量的模型的条形图:
还有一个handi实验先进行训练然后进行预测的命令,不需要使用两个单独的命令。
使用路德维希的编程API
Ludwig还提供了一个简单的Python编程API,允许用户训练或加载一个模型,并使用它来获得对新数据的预测:
来自Ludwig Import Ludwigmodel
#训练一个模型
model_definition ={…}
模型= LudwigModel (model_definition)
train_stats = model.train (training_dataframe)
#或加载模型
模型= LudwigModel.load (model_path)
#获取预测
预测= model.predict (test_dataframe)
model.close ()
此API使使用具有Ludwig培训的模型在现有代码中培训,以在其中构建应用程序。提供了使用Ludwig使用Programmatic API的更多详细信息用户指南而在API文档.
结论
我们决定开源Ludwig,因为我们认为它可以是非专家机器学习从业者和经验丰富的深度学习开发人员和研究人员的有用工具。雷竞技是骗人的非专家可以快速培训和测试深度学习模型,而无需编写代码。专家可以获得强大的基线,可以将其模型与实验设置进行比较,并通过执行标准数据预处理和可视化来轻松测试新的想法和分析模型。
在未来的版本中,我们希望为每个数据类型添加几个新的编码器,例如变压器,榆树o,伯特对于文本,DenseNet和FractalNet的图片。我们还想添加额外的数据类型,如音频、点云和图表,同时集成更可扩展的解决方案来管理大数据集,如pet.
路德维希是基于可扩展性原则构建的,为了促进社区的贡献,我们提供了一个开发人员指南这说明为已有的数据类型添加额外的数据类型以及额外的编码器和解码器是多么简单。
我们希望你们会喜欢使用我们的工具我们喜欢建造它!
如果你对开发下一代机器学习工具感兴趣,可以考虑申请一个角色与优步艾!





