编辑:朱健
在全球数字化经济浪潮的背景下,大数据与机器学习成为了这个新时代的弄潮儿。经营数字化、助力商家精细化经营符合公司“一体两翼”的战略目标,同时也是大势所趋。机器学习、深度学习算法基于历史积累的数据信息进行决策,为商户赋能提供了可能。
下图是人工智能发展的时间线,随着计算机技术的不断发展,机器学习已广泛应用于数据挖掘[1]、计算机视觉[2]、自然语言处理[3]、生物特征识别、搜索引擎、医学诊断、检测信用卡欺诈、证券市场分析、DNA序列测序、语音和手写识别、战略游戏和机器人等领域。其中,深度学习属于机器学习的一个分支,其利用的结构是神经元构成的神经网络,更偏向于完成端到端的任务,如自然语言处理、计算机视觉等。
算法开发的工作平台依托于阿里云人工智能平台PAI[4](Platform of Artificial Intelligence)。数据源一般来自数仓(ODPS)和对象存储(OSS),利用PAI-DSW(Data Science Workshop)Notebook交互式AI研发平台进行算法开发,选用PAI-DLC(云原生AI基础平台)或者PAI-EAS(Elastic Algorithm Service,在线预测)进行模型服务的部署。
构建EasyModeling框架的初衷:
面对收钱吧众多的业务线,往往对于算法建模任务会提出不同的需求,这就造成了:
数据来源不固定:有的需求是需要从数仓中取数,有的要在OSS上,有的则是要对数据进行人工标注后才能训练模型,重要的数据集没有进行版本管理,数据资产得不到充分利用;
任务目标不固定:有的需求是表格型数据挖掘任务,有的需求则是需要对非结构化的数据进行深度学习训练,训练代码一个任务写一次,如深度学习训练模型,训练过程可以形成模版,后面复用;
部署方式不固定:有的需求实时性要求较高,有的需求则是T+1批量更新,模型预测器没有统一的接口,在修改部署方式时,需要同时修改预测逻辑;
第三方开源的解决方案性能发挥不到极致:例如一开始的odps SDK只能单核读取数仓数据,针对上亿的C端消费者模型打标,往往都要耗时3-5天,严重影响到了开发进度;还有现在开源的算法库无法针对特定的任务进行最有效的优化。
这些都是需要去解决的问题。基于此,力求给建模人员提供便利,提高模型开发的效率,并保留高度自定义的能力,并且为了更全面地支持建模人员在PAI平台上对PyTorch、Tensorflow等深度学习算法的开发,提供了从训练到部署的一站式模型开发体验,着手开发了EasyModeling框架。明显提高了建模的效率和模型的可复用性,并对数据和模型等数据资产持久化。
EasyModeling框架拥有以下几个特性:
注:本建模框架拒绝重复造轮子,旨在提升开发效率,并追求高可复用性和灵活性,并持久化收钱吧的数据资产。
深度学习模型的训练主要是针对指定Loss的优化,采用梯度下降和反向传播的优化方法进行的模型参数的更新。因此,在训练和验证阶段,需要不同的梯度保留策略,显然利用灵活的trainer模版可以提高开发效率和保证开发的方向正确。Trainer模版包含了大部分深度学习开发所需要的基础及高阶功能,支持GPU加速训练,并支持多卡并行训练任务,log及tensorboard存放本地或者oss bucket上。
若要真正解决业务痛点,做个“调包侠”远远不够。如信贷业务线的信用模型,逾期数据与非逾期数据存在严重的类别不均衡。除了预处理时的数据增强,还可以修改Loss函数,这种方式直接提升了5%-10%的模型效果。如Kaiming大神的Focal Loss,一开始是为了计算机视觉中目标检测出现的类别不均衡的问题而引入的loss计算方式。我们就可以修改为适合业务场景的loss,不仅可以调整正负样本的权重,又能控制难易分类样本的权重。从而使得模型的预测目标和业务预期目标保持一致。
EasyModeling框架中用python实现了Focal Loss的计算方式,并可以用于LightGBM等ML模型的训练上。
这个工具模块主要是提供建模时的一些log输出,全局参数管理可以保存每次训练的环境参数和模型参数,保证模型或问题的可复现。
针对模型所需的训练数据,有时并不是从数仓取出来的,而是业务同学花费人力、资源标注出来的,这些数据对公司对业务来讲,都是有巨大价值的,因此将其持久化,使用的时候一键调用。对于模型来说也是如此,随着时间的变化,之前部署的模型的预测能力和预测稳定性会下降。模型保存云端,随时可以进行迁移训练、微调等任务。
不仅提供了预训练模型的调用接口,也提供常用的模型结构、NN模块。如用于推荐系统的DIN,DIEN等模型,如用于文本挖掘的TextCNN,Transformer等模型。其中,Transformer结构如下:
因为其可以给序列加位置编码,注意力机制等特点,是用于文本挖掘的常用模型结构。而文本的含义就是这种基于上下文的特征得出的,和Transformer的结构相吻合。因此,往往大文本的任务都是基于Transformer的预训练模型经过finetune得到的。
每个字在文本中的位置都会被不同的向量编码,并且理论上不会重复,为了可视化这种位置编码。下图中代表了一段文本中不同位置的字,每个处在文本不同位置上的字都被赋予了不同的512维(y axis)的一个向量,颜色代表了数值的大小。
模型除了训练得到的参数优化外,控制模型泛化能力(复杂程度)的参数并不是通过训练获得的,而是认为根据特定领域的特定经验来进行调整的,俗称“炼丹”。这部分参数除了可以认为调整外,还可以通过贝叶斯优化等优化算法得到全局最优解的近似解。
通过引入Hyperopt、NNI[5](Microsoft)等开源AutoML工具,对训练代码进行简单的包装,就可以在训练平台进行自动化的调参工作。下面是某建模任务下的不同超参数对应的模型表现图。
根据业务或开发所需要的时效性将部署算法模型分为以下三个场景:
准实时调用模型服务
业务或开发对模型的响应速度要求比较高,s级别或ms级别,例如SPA标品库、老板圈推荐等场景,需要将模型和预测逻辑打包成RESTful API服务,供后端开发调用。
T+1定时离线批量调用模型结果
针对业务对模型标签更新频率要求较高,例如T+1,例如信贷业务场景,用以更新人群/商户标签,每日BI分析、决策。
一次性离线批量调用模型结果
业务只需要一次建模需求,将所有的或一部分B端商户或C端消费者打标,更新频率较低,可手动执行。
Easymodeling框架出现之前,往往建模人员针对不同的部署场景,即使预测逻辑一致,也会写出不同的接口来应对不同的场景。Easymodeling框架内的BasePredictor基类统一了预测逻辑的接口,一套预测逻辑就可以适用于这三个场景。模型服务部署效率得以显著提升。
智慧门店的餐饮商家品类众多,有面类、饭类、小吃、甜品等各种商家。理想的加料的规则应当覆盖全品类和商品。平台美食、甜点、饮品类在线商品有百万级之多,其中很多是属性信息一致的相同商品。建立对商品的标准化描述、聚合相同商品,是小料搭配业务场景的底层诉求。以此为引子,产品也提出后续基于标品库的众多应用简化菜单录入、动销分析、小料搭配...
基于上述业务应用的痛点,启动扫码点单菜品的标品库建设。目标是建立菜品的标准化名称,实现对相同菜品的聚合,从而为业务提供合理粒度的概念划分。其中有个从菜品名中识别食材、做法等实体信息的任务,属于自然语言处理NLP中的序列标注问题,它的目标是对给定序列中的文本单元进行打标,以获取文本单元的额外信息。
近年来,基于transformer架构的语言模型不断突破NLP任务榜单上的成绩,对自然语言的理解达到了新的高度。RoBERTa[6](Robustly Optimized BERT pretraining Approach)是由FaceBook(现为META)AI研究院在BERT的基础上增加额外训练数据以及改进预训练策略而获得的更强有力的预训练语言模型,在自然语言理解任务中的性能表现显著强于BERT。
此次建模选择的方式就是利用RoBERTa大模型加上Finetune的方法,去做特定领域上的实体识别任务。模型架构图如下:
模型在测试集上的表现(量化指标)如下:
模型在预测菜品中的食材和做法上,能将90%以上的食材、做法召回,预测的准确程度也在90%以上,满足业务的要求与预期。
数据挖掘: https://zh.wikipedia.org/wiki/数据挖掘
[2]计算机视觉: https://zh.wikipedia.org/wiki/计算机视觉
[3]自然语言处理: https://zh.wikipedia.org/wiki/自然语言处理
[4]机器学习PAI: https://help.aliyun.com/product/30347.html
[5]Neural Network Intelligence: https://github.com/microsoft/nni
[6]RoBERTa: A Robustly Optimized BERT Pretraining Approach: https://arxiv.org/pdf/1907.11692.pdf