系列文章目录
手把手带你玩转需求预测
文章目录
前言
预测算法的本质是从历史数据中发现pattern,并利用这个pattern推演到未来,形成预测结果。供应链的绝大多数预测场景中,每个预测目标的历史观测值可以在时间轴上串起来形成一条时间序列(Time Series),因此这些预测问题都可以抽象成为一个时间序列预测的问题。
本文会从时序预测技术迭代升级历经的三个发展阶段,来讲述时序预测算法的发展更新过程。
时序预测算法类型
第一代:统计时序预测算法
第一代是传统统计时序预测算法,包括移动平均(Moving Average),指数平滑(Exponential Smoothing),ARIMA,Holt-Winters等。其核心思想都是从历史时间序列上的前后观察值之间的关系里发现模式(pattern),并按这个模式向未来推演。不同的算法所能捕捉的模式的复杂度不同,但基本上都围绕着基线(Level),趋势(Trend),周期性(Seasonality)来组合。
这一代算法最大的优点是简单,这意味着预测结果相对稳定性会高一些,其内在逻辑相对更容易解释和理解。同时,简单带来的缺点是准确性低,另外也很难针对具体问题场景对算法进行调整和定制。它们进行一条时序的预测时,对算力的要求很低,但对于供应链场景常见的大批量(十万、百万级)的时序,它们只能一条一条地跑,虽说可以并行化,但消耗还是较大的。
在应用层面,这类统计算法通常因为其高稳定性而被应用在早期的自动预测-补货系统。为了克服准确性和可调整性的局限,其算法下游需要一个相对较重的后处理体系,利用人工加工的规则来弥补。
从技术层面来看,统计方法有几个显然的局限:最重要的一个是难以引入其他协变量(covariates)或者说特征(features)对时间序列的影响(例如价格调整对商品销量的影响)。对于电商这样有着丰富数据沉淀的业务场景,这个局限的影响显然是巨大的。此外,对于时序上发生的脉冲性的波动,比如各种大促,由于波动时间短幅度大,很难去拟合。
第二代:经典机器学习方法
第二代是经典的机器学习算法,包括线性回归(Linear Regression),支持向量机回归(Support Vector Regression加粗样式),随机森林(Random Forests),梯度提升决策树(Gradient Boosting Decision Trees)及其变种XGBoost和LightGBM等等。
跟第一代算法不同,机器学习算法并不是直接用历史来推演未来。它的逻辑是,在历史上的每个时刻
t
t
t,在这个时间切片上,有一些潜在影响预测标的
Y
t
Y_t
Yt的因子
X
t
X_t
Xt,机器学习算法的任务是要在大量历史时间切片里找到
X
X
X和
Y
Y
Y之间的一个相对通用、稳定的关系,用函数形式表达就是
Y
=
f
(
X
)
+
ϵ
Y=f(X)+ϵ
Y=f(X)+ϵ,并把这个关系推演到未来,在未来的某一时刻
t
+
1
t+1
t+1,如果我们观察到了
X
t
+
1
X_t+1
Xt+1,就可以预测
Y
t
+
1
=
f
(
X
t
+
1
)
Y_t+1=f(X_t+1)
Yt+1=f(Xt+1)。这类算法弥补了第一代算法里难以考虑外生因子(尤其是非线性的复杂关系)的短板,在数据丰富的场景取得了显著的准确性提升,同时牺牲了一定的稳定性、可解释性。在可调整性上,虽然第二代算法更灵活,暴露出更多的超参(Hyper Parameters)可供调整,但其超参取值与具体应用场景之间的关系较为难以把握,很难通过对问题的理解来直接选择合适的超参。
在实际应用中,超参往往是通过暴力网格搜索和一些简单的优化算法来搜索,纯粹依赖算力,而非针对具体问题做有针对性的调整。更具挑战的是,由于这类机器学习算法模型都是高度封装的,其内在算法结构基本无法修改。如果要对机器学习模型注入具有场景语义的信息,只能通过特征工程的方式,把人对场景的理解提炼成关键信号,再加工成数值特征的形式,从算法模型的输入端灌入,然后期待算法能捕捉到这些信号所承载的信息并对预测产生作用。
从技术层面,机器学习算法在引入外生因子的能力上相对第一代算法有显著的优势,但在描述和捕捉时间序列的关系上(比如趋势性和周期性)也有所损失。(机器学习算法无法以很直接和intuitive的方式引入时序关系,需要通过一些复杂的特征工程来弥补,或者通过两代算法模型stacking的方式各取所长。
要是跟下一代的深度学习类算法相比,这些机器学习算法存在很多先天的技术局限。首先是在供应链场景存在的大量类别型的特征,比如seller_id,cate_id,brand_id这些对于描述商品的至关重要,但是由于这些类别型特征的类别数量巨大,如果用one-hot去编码完全不现实。
相比而言,深度学习算法可以用embedding的方式用少数几个浮点数描述这些类别变量。其次是损失函数的选择。机器学习算法大都只有内置的几个选项(例如MSE,MAE),通过超参来选择指定,而供应链场景中有各种各样复杂的评价预测结果的评估口径,它们往往无法直接对应到内置的loss选项。对于深度学习算法,仰仗于自动微分技术,我们可以相对简单的定义自己需要的损失函数,让模型训练调优的目标跟实际业务场景里的目标更加一致。最后,深度学习在端到端的训练、在定制特别的训练策略(比如固定模型的一部分结构/参数,只优化另外一部分)上都提供了更加灵活且简单的实现方式。
第三代:深度学习预测算法
第三代是基于深度学习的算法。得益于深度学习在底层框架设计上的灵活性,前面提到的第一、二代算法的技术局限可以被轻松突破,这给我们提供了一个十分坚实的基础起点。在讨论针对时序预测场景设计的深度算法之前,我们先review一下在其他领域已经取得颠覆性突破的算法,讨论一下可以借鉴的点和必须改进的点。最显著的突破是在图像、语言、搜索推荐这三个应用领域,对应的深度算法大类是卷积神经网络(CNN)、循环神经网络(RNN)、注意力机制(Attention)。这些模型在迁移到时序预测场景后,并没有展示出准确性的优势,稳定性反而降低了。更可怕的是,因为可调整性太高,模型优化的过程中可以改动的东西太多,而每一次改动的效果,随机性较大,导致模型的调整跟模型的效果之间很难建立一个健康的正向的闭环反馈,模型调优就像是在黑暗中乱摸乱撞,“炼丹”的挫折感很强。
究其根本原因,我们认为是这类模型巨大的规模(动辄百万、千万的参数量)跟时序预测场景的有限数据量之间的矛盾,以及这个矛盾所引发的过拟合问题。很多同学可能无法理解为何说时序场景的数据量有限,因为之前我们提到我们有比较长的历史数据积累,有丰富的特征,又有十万、百万级的序列数。表面上,我们的场景有海量数据,但跟图像、语言这些场景的关键差异在于,我们的场景是不稳定的(non-stationary),业务策略、竞争态势等等等等因素都会影响需求,导致最底层的需求体系一直在快速的变化迭代,相对久远的历史(二、三年前)数据所蕴含的信息是否能对当前的预测问题有帮助,这是一个很大的问号。因此,我们场景里数据的“保质期”要短的多。我们的算法模型必须考虑到这一客观约束。
我们真正需要的是设计一个适用于时序预测场景的深度学习算法:既有能提取时序关系的模块,又有能提取外生因子影响的模块;一个模型既涵盖了前两代模型的优势,又可以端到端的基于相对有限的历史数据完成训练。目前行业内大家都还在探索阶段,各方采纳的具体技术路线也多有不同:Amazon最早推出的DeepAR,路线上更多是把第一代算法深度化;Google的TFT(Temporal Fusion Transformer)是在Transformer基础上融入更多时间序列成分(LSTM);DeepMind的Wavenet,在时间轴上实现不同跨度的卷积;n-beats复现了第一代的时序STL拆解逻辑。这些算法各有所长,但有都欠缺一定的普适性,在不同场景效果好坏差异比较大。对我们来说,理想的深度时序算法需要做到准确性高、稳定性高、可调整性好、可解释性强、执行效率高,才能在供应链预测的业务场景上真正发挥作用。
总结
本文以综述性质分享了目前时序预测算法的发展迭代过程,分析了统计时序预测算法、经典机器学习预测算法、深度学习预测算法的优势及缺点。
版权归原作者 纯洁の小黄瓜 所有, 如有侵权,请联系我们删除。