| 导语 腾讯神盾产品化为推荐业务提供了一站式的解决方案,大大节约算法和开发的时间,同时提高推荐转化率。离线算法平台是神盾产品化中负责训练离线算法模型,并出库模型和特征到线上推荐的模块,最小训练粒度为小时级。同时,离线算法平台还整合了离线批量打分、文本内容理解与特征工程等针对特定需求的功能。

一、离线算法平台简介

算法+特征是推荐的基础,自然也是离线算法平台的两个核心模块。

  • 离线算法平台算法库,提供了LR、CF、XGBoost、FM等多个算法模型,并且为部分算法提供了不同的优化器。
  • 离线算法平台特征引擎,在方便管理和使用用户自行构造的特征外,提供了系列公共特征,包括达芬奇画像系统构造的基础画像特征、活跃用户特征、兴趣爱好特征等。
  • 离线算法平台还添加特征工程、文本内容理解和离线批量打分等辅助特征构造、算法模型分析评估的功能,助力算法人员构造出更佳的模型。
  • 同时,整个离线算法平台在整体流程中添加多个控制点,优化任务的执行流程,例如缓存管理、统一数据时间等控制优化功能。
  • 最后,离线平台负责将训练的模型和推荐所需的特征、池子数据输出到神盾产品化后台。

离线算法平台的各个模块组成如下图所示。

二、特征引擎

特征引擎负责两个方面的工作:一是根据用户配置的特征工程项目(上报流水自动构造特征、文本内容理解自动构造特征、特征工程二次处理生产特征)产生适配离线平台的特征数据存放到特征表。二是处理训练算法所用到的所有特征,生成算法训练所需格式的数据。

特征分类及特征格式

特征的表示方式是KV类型,具体为ID+特征唯一标识(特征库+特征主键+特征副键)+特征值+特征类型。例如:“张三,基础画像库,性别,男,1.0,用户特征”。

特征的类别有User特征、Item特征、Cross特征、Context上下文特征等几种类型,统一采用上述KV类型的表示方法。

  • User特征的ID为用户ID,离线平台提供的用户画像特征包括了QQ为ID和Imei为ID两种帐号。
  • Item特征的ID为物品ID。User特征和Item特征必须有实际的特征表存储。
  • Cross特征是交叉特征,可以选择相关的User特征和Item特征做交叉(内积、分素乘积、笛卡尔积)。交叉特征不必存放在TDW表中,在特征-样本的处理中会根据交叉规则实时计算。
  • Context上下文特征是包含在样本中的,注册时也不需要实际的特征表存储,在特征-样本的处理中实时处理上下文特征。

除此之外,离线算法平台还支持宽表类型的特征,宽表类型的的特征与KV类型的特征在注册时基本相同,不同的是存储在特征表里的结构。

但是,在实际注册特征的时候,并不是以特征库+特征主键+特征副键来注册一个特征,而往往是通过特征库+特征主键来注册特征,副键填写为”.*”做正则匹配。

特征自动化构造

特征自动化构造,适合于从DC上报流水、文本内容、其他系统提取的可作为特征的数据(如图片分解出的向量矩阵)等中构造适合于离线算法平台的特征。特征自动构造的原理大致类似,即提取数据源表中的指定列,构造或者利用文本工具(如分词、关键词提取、LDA主题模型、Word2Vec词向量模型等)处理后构造成特征的唯一标识:特征库module+特征主键primarykey+特征副键secondaryKey。

当然,离线算法平台也同时支持宽表类型的特征,格式与上图中的向量值相同,因此上图中的向量值同样可以直接注册为宽表类型的特征。

Tips:神盾离线算法平台的的特征自动化构造是一个由离线平台任务调度管理且完全独立的lz任务,因此文本处理可以作为一个独立使用的工具哦,而不一定必须注册特征到离线算法平台。

特征工程

特征工程的输入,可以是用户已经注册的自己构造的特征,也可以是前文提到的自动构造的特征作为输入。特征工程实际上是对已有特征做二次操作得到新的特征,例如历史记录的整合。因此,离线算法平台定义了三种类型的操作Transformer,基于这三种操作构建整个特征工程的执行链路(有向无环图DAG),如下图所示。

通过特征工程产生的特征和普通注册的特征使用上没有任何区别,只是再注册时特征来源属于特征工程,每天特征工程调起的lz任务会独立于训练任务之前执行。

特征-样本处理

训练算法的输入是样本和特征,将样本和和特征关联成训练算法的输入(离线算法平台所依赖的Spark MLlib,LibLinear,DML等库使用统一的输入LabeledPoint)是特征引擎的核心工作。对于每一个训练模型,用户指定了样本表LabelTable,和使用的多个特征Array[Feature],因此涉及到多个特征表Array[FeatureTable]。但是实际上并不简单的从特征表Array[FeatureTable]和样本表LabelTable中读出数据关联就可以生成训练数据了。

第一,推荐算法所使用的数据在数据时间上必须符合逻辑,因此离线算法平台指定所有数据读取都必须满足取数规则。

对于监督算法而言,样本数据的读取规则只能是UNSUPERVISED-FROCE,而特征取数规则则可以是SUPERVISED-FORCE或者SUPERVISED-MAX。原因是,特征数据的数据时间不应该早于样本时间。对于非监督算法而言,特征的取数规则则是UNSUPERVISED-MAX。其他比如业务可用的池子数据,都有其特定的取数规则。

第二,指定一个训练数据时间dateFrom,根据取数规则就可以得到一个周期的特征+样本数据作为训练数据,而多周期的训练数据则是扩充训练数据的方法之一。

第三,特征的读取还需要考虑一些额外的限定,例如有些公共特征或者其他项目的特征可以仅训练而不出库到产品化后台。此外,离线平台使用的特征数据格式和特征表所存储的特征数据是不相同的。特征表FeatureTable的五个字段分别是“ftime(一级分区、数据时间),owner(ID),primaryKey(特征主键,二级分区),secondaryKey(特征副键),score(特征值)”。这其中缺少了两个重要的信息:特征库module和特征类型featureType。因此读取所有的特征时,必须按FeatureTable读取该表中所有注册的特征,并通过正则化匹配pk和sk(特征注册时副键为.*就是为了正则化匹配),将module和featureType添加到特征的信息中。

以上特征读取的工作全部被封装在单独的FeatureReader中,样本读取的工作则全部封装在单独的LabelReader中。从特征读取到得到训练数据的工作同样是通过一个链式的操作完成。

(1) 样本特征拼接单元

样本特征拼接单元以周期为单位,每个周期内的样本和特征做拼接,拼接数据会做缓存,然后将多个周期的拼接数据合并。这个时候已经得到了每条样本数据下面的所有关联的的特征,接下来要通过三个Processor完善特征:

  • 上下文特征。由于上下文特征没有对应的特征表存储,而是携带在样本中,所以,在拼接完后第一步从样本携带的context feature信息中实例化出上下文特征。
  • 交叉特征。交叉特征也没有对应的特征表存储,而是注册为多个基础特征及基础特征的交叉方式。因此,拼接完的特征中仅包含了基础特征,交叉特征则是根据每条样本关联的基础特征是否主副键相同实现交叉产生新的特征。
  • 低覆盖度处理单元。特征覆盖到的样本较少时,特征不具有代表性,这时可以通过低覆盖度单元将这类特征过滤掉。

(2)特征编码单元

拼接完的特征可以可以认为是所有需要进行训练的特征,这时对所有的的特征做一个编码操作,每个特征取得其唯一一个编码。编码与特征的对应关系将会存储到TDW表作为缓存。再对每条样本的特征处理,将所有特征转换为Vector。

(3)训练数据生成单元

将特征编码单元的输出统一成LabeledPoint,并缓存到HDFS。当然,该单元单元还负责判断是否需要读缓存数据,如果直接读缓存数据,那么可以直接输出算法训练所需的数据,非常适合于算法参数调优。

在整个执行流程中,有两处非常重要的缓存数据用于提升整个离线算法平台的性能。一个

是多周期拼接缓存,可以自动检测算法的样本和特征配置是否有变化判断缓存是否可用,如下图所示。另一个是训练数据的缓存,适合于算法调参的场景。

三、算法库

训练算法

离线算法平台的算法库包括三种类型的算法:计算相似度的CF算法(User、Item),分类算法(LR、XGBoost、FM等)、排序算法(PRFM算法)。其中部分算法提供了不同的优化器SGD、LBFGS、ADA等。选择什么样的算法进行训练依赖于业务场景和算法人员的经验了,例如LR需要算法人员自行挖掘特征并且高度依赖特征的好坏,而XGBoost和FM则能够在一定程度上自行交叉特征,扩展特征的丰富度。

算法的输入被固定的划分为训练集和测试集,训练集是“特征-样本”处理的输出,而测试集可以是额外指定的数据集,也可以是训练集中按比例划分出来的数据集。对于训练过程,训练集还可以划分出验证集来防止过拟合的产生,例如在PRFM算法中,通过验证集防止过拟合的方法如下。

算法评估

算法训练过程中可以通过loss值评估算法的收敛,训练完成后可以通过模型的权重、正负样本比例、AUC、PR等指标评判算法的好坏。如下图所示。

同时,神盾产品化平台提供了Debug功能模拟上线及线上推荐效果。离线算法平台则提供了离线批量打分的功能,指定要打分的样本表,则可以离线批量对样本表进行打分,与样本的原始评分做对比,评估训练出的算法模型的优劣。

特征与模型出库

无论是特征数据还是模型数据,都是作为产品化后台推荐的重要依据,因此每个训练周期的特征数据和模型数据都需要实时更新导入线上。特征、模型和池子的出库全部由神盾产品化负责,不需要用户做额外的操作,统一在数据上线模块。

可出库的特征数据为User特征和Item特征。User特征数据量较大,每个注册的特征对应一份出库数据,同时导入到线上Grocery中,存储格式为(K,Array[V]),因此可以快速得到一个UID的所有特征。Item特征每个项目出库一份数据,导入线上内存。这部分特征每个小时会调起一次更新任务,自动检测TDW表中有更新的分区出库到产品化后台。

模型数据在训练任务调起完成后会自动更新模型到产品化后台。

池子数据,适用于各个业务需求而创建,每次数据上线会实时同步所有池子的数据,而用户用户也可以主动触发池子数据和Item数据的上线动作,快速上线。

四、写在最后

降低推荐的门槛,同时通过通用的方案提高推荐效果,离线平台接下来要做以下工作:一方面是丰富特征工程,提取出行业相关的通用解决方案,快速接入的同时简化部分高效特征的提取工作;另一方面是算法库的开放和丰富,意味着算法人员可以基于离线平台的输出数据开发自己独有的算法,甚至是只使用离线平台的特征引擎接口输出数据,对接到其他机器学习系统的训练模型。


文章来源于腾讯云开发者社区,点击查看原文