基于Alink模型流的在线学习
导读 本次分享题目是基于 Alink 模型流的在线学习。
主要从下面4个方面展开:
-
相关问题
-
Alink 与在线学习
-
模型流 1.0
-
模型流 2.0
-
Q&A
分享嘉宾|杨旭博士 阿里云资深算法专家
编辑整理|王丽燕
内容校对|李瑶
出品社区|DataFun
01相关问题
机器学习实践中会常会遇到如下一些问题:
- 首先是算法问题和工程问题,Alink 希望通过组件的方式把算法固化下来,通过调整一些参数更方便地进行算法切换、实验调整和组件的部署等。
- 实践中正常有实验环境和生产环境,在实验环境进行一些方法的尝试,如何把实验中产生的场景和流程部署到生产环境也是经常遇到的一个问题。
- 预处理、特征工程、模型训练预测等各模型和参数的固化。
- 如何保持各流程参数同步更新,保证训练和预测的一致性。
- 预测服务及时更新模型。
- 增量训练、在线学习的问题。在线学习,在理想状态下是希望模型能实时训练学习,但在实际中往往是采用增量的方式去训练,这些方式如何更好地跟预测服务联动,是希望能解决的一个问题。
- 分布式训练还是单机多线程训练,在训练方式上,希望能有更多的训练方式可以选择。
02Alink 与在线学习
1. Alink 连接算法与应用
Alink 的目标是连接算法与应用,其核心是机器学习算法库,已支持700+算法组件。目前已开源(
https://github.com/alibaba/Alink)并迭代了几个版本,比较稳定,可以放心使用。Alink 简单易用,提供了多种调用方式,并配有文档和教程。
上图是开源的一些算法列表,包括机器学习中最常用的分类和回归、聚类等算法,还有相似度计算、图相关算法(graph embedding)、时间序列、异常检测、模型选择和调参,还包含各种数据处理方法组件、文本相关处理组件、特征工程方法(特别是窗口类函数),以及在线学习、评估方法、推荐&关联算法、统计分析等等。这些都是以算子的形式提供给用户。
2. 支持的计算方式
上述算子支持以下几种计算方式。
- Flink 批式任务(分布式,相关组件后缀名为"BatchOp")
- Flink 流式任务(分布式,相关组件后缀名为"StreamOp")
- 本地批式任务(相关组件后缀名为"LocalOp")
- 本地预测组件,对单条数据进行预测,可以嵌入到 Java 或 Python 预测服务。
批式和流式的计算方式可以根据数据量进行选择,前三种计算方式都是以一个数据集作为一个整体来进行训练。本地预测组件可以对单条数据进行预测,嵌入到预测服务中。
3. 使用方式
使用方式包括以下三种:
- Java 库
- PyAlink
- WebUI: 可实现上图中的可视化流程
https://github.com/alibaba/Alink/tree/master/webui是开源网站上的一个原型,可以在此基础上做二次开发或者其他适合自己场景的实践。
4. 相关参考资料
相关资料可通过以下方式获取:
- Github 地址:https://github.com/alibaba/Alink
- 文档:https://alinklab.cn/manual/index.html,可以按名称搜索组件,查看组件说明、应用示例代码等,还可以通过关键词来查询。
- 教程:具体讲解使用方法
Java版
:https://alinklab.cn/tutorial/index.html#book_java
Python版
:https://alinklab.cn/tutorial/index.html#book_python
- 钉钉群:可以添加到群里沟通
5. Alink 与在线学习的关联
在线学习具有以下两大特点:
- 通过线上反馈及时调整模型
- 模型更新频率高
Alink 模型流可以简化模型更新过程:
- 预测组件可以自动从模型流获取最新模型,完成更新,不需中断预测服务;
- 流式训练任务、批式训练任务都可以为模型流提供模型;
- 特征工程、粗排、精排等过程都可以放在一个 Pipeline 模型,保证模型更新过程中的参数一致性。
03模型流1.0
1. 模型流业务场景一
最开始的模型流 1.0,通过 Kafka 流式数据,去做实时预测和结果输出。不同时间段的数据会得到不同的模型,这些模型依次产生形成模型流,实时预测时会检测、更新、部署、消费最新的模型,这里是通过 Flink 机制实现模型流的检测和更新。
上图是基于流式任务的模型流的调用。
- Ftrl train:训练阶段,需要初始模型和训练数据流,就可以持续产生新的模型。
- Ftrl predict:预测阶段,需要初始模型、模型流(Ftrl train 产生的)、预测数据流,去输出预测结果。
2. 模型流业务场景二
上述业务场景一中不同时间段产生的不同的模型不一定都符合标准,因此还需要有模型过滤的环节,进行模型评估,比如如果 AUC 下降很多,那么就暂时不对这个模型进行更新上线。
模型过滤部分,通过留一部分的验证数据流,设置指标阈值(AUC、Accuracy等),判断模型是否满足要求。预测部分输入模型评估过滤后产生的模型和待预测数据流,最后预测输出最终结果。
04模型流2.0
1. 模型流 1.0 与 2.0 的区别
模型流 1.0 只存在于流式任务中,流淌在流式算法组件间。
模型流 2.0 进行了扩展,可以接入离线批式(全量/增量)组件训练模型,只要接入即具备模型流的属性,可以被下游接收并部署;可以连接预测服务组件,自动更新线上模型;并且支持 Pipeline 模型(将数据处理、特征工程、分类等各阶段模型合成一个模型)解决各阶段模型的一致性问题。
2. 批式任务与模型流
上图为代码示例。
- 首先读取训练数据。
- 连接到逻辑回归分布式训练组件,产生单个模型。
- 再把单个模型添加到模型流里(需设置存储模型的文件系统或者本地存储路径),之后就跟流式组件一样进行消费。
3. 增量训练
增量训练代码如上图所示。
增量训练需要有初始模型,是从模型流取最新的模型开始进行增量训练,再添加到模型流里,添加方式跟上述批式训练是一样的。不同的地方在前面的部分,用文件系统存储模型时,每一个新的模型会有一个单独的文件夹,根据文件夹最新修改时间可以判断模型的新旧程度,从文件系统查找最新的文件夹,从中取出最新的模型。之后进行增量训练,需要添加初始模型 init_model,如果不加初始模型就是全量训练。
4. 模型流中的 Pipeline 模型
处于特征工程或者模型阶段会产生不同的 model,把各流程中产生的 model 整体部署,一起执行,保证参数和流程的一致性。
上图是一个简单的示例。首先定义一个 Pipeline 模型,然后进行标准化和 onehot 编码,再进行特征合并,最后应用逻辑回归模型。
用 Pipeline 训练时,和 sklearn 一样,先用训练集用 fit 方法训练,再添加到模型流文件系统里。
5. 嵌入预测服务
模型调用使用:
- 嵌入预测组件需要输入模型所在位置的路径,以及所要预测数据的schema_string 信息。
- 如果要使用模型流,Pipeline model 要设置模型流的路径,预测时随着模型流的更新载入新的模型,自行更新模型预测。
05Q&A
Q1:目前 2.0 版本已经能够开源使用了吗?
A1:是的,现在开源版本就是 2.0 的。
Q2:那对于已经采买了阿里云的相关产品(比如云服务器),如何方便地使用 Alink?
A2:目前 PAI 有集成 Alink, 可以在 PAI 里面调用 Alink 的功能。
以上就是本次分享的内容,谢谢大家。