<>一.流式计算背景

<>1.概述


其实技术总在更新,做这个行业也是一直要走在学习并适应的路上,这也是人工智能领域最吸引我的地方,其实基础的理论是不变的,但是随着业务的发展,计算能力的发展,上层的实现总是在迭代,今天讲下我对于流计算的一些认知。



先聊下计算引擎的进化,随手画了上面的图。其实第一代分布式计算引擎是Hadoop,这是一个跨时代的创造,人们使用Hadoop的MapReduce框架实现了许多的算法,这些算法也发挥了很大的作用。Hadoop最大的特点是,数据计算依赖于硬盘存储,也就是说很多的计算过程中的结果都需要存在硬盘中,然后再从硬盘拉起,造成性能较低的问题。


Spark好在一点,把数据全部放到内存中进行计算,大大提高效率。但是无论是Spark或是Hadoop解决的都是批计算的问题,也称batch计算。离线计算需要把数据收集起来统一的去算,对于算法来讲,可能收敛会更快,因为参与计算的数据比较多。但是也有暴露一个问题,实时性很差。这个问题就引出了下一代计算引擎-流计算这样一个话题。

<>2. 流计算

弄明白流计算,首先要搞清楚概念。先来看下流计算(stream compute)以及批计算(batch compute)的计算模型:

*
流计算:当一条数据被处理完成后,序列化到缓存中,然后立刻通过网络传输到下一个节点,由下一个节点继续处理。

*

批处理系统:当一条数据被处理完成后,序列化到缓存中,并不会立刻通过网络传输到下一个节点,当缓存写满,就持久化到本地硬盘上,当所有数据都被处理完成后,才开始将处理后的数据通过网络传输到下一个节点。

对于流计算,是不是有一点感觉了。相较于batch compute,stream
compute对于业务上一定是更灵活,因为可以跟数据更实时性的相关联(数据的时间周期其实很重要,有机会我也会给大家分享我的看法)。


stream对于业务的优势我举一个例子,比如一个电商平台,有一个推荐系统,推荐模型都是每周根据离线数据做批训练生成的。但是突然有一天,这个电商搞了一个针对特殊人群的定向营销活动,有大量的特殊用户涌入,那针对这部分人群以前的老模型可能就不会起作用,这时候如果有一个实时训练模型的能力就会对这种场景有更快速地响应,这个就有是online
learning的概念,那底层依赖的是流计算引擎。

<>3. 真正的下一代流计算引擎

流计算引擎会是下一代的计算引擎,这里指的不是流计算替代批计算,而是下一代流计算引擎会兼容batch compute和stream
compute,做到流批一体,Flink或许是一个答案。

当然流计算的挑战会比做批计算大很多,比如failover机制,批计算所有计算结果都是有存储的,可以回溯,流计算怎么解决宕机问题。比如exactly
once机制,如何保证分布式流计算中的数据只被处理一次,而不是被多台机器多次处理。

不过还是相信这些问题会被完美解决,未来的算法也一定是会向流式方向迁移。

<>二.浅谈FTRL算法(流式逻辑回归算法)

<>1.流失算法概览


先聊下对于流式算法的一些看法,流式算法就是要实时的去更新模型,所以从易实现的角度分析,不是所有的批计算算法都适合做流式算法,只有那些损失函数易于计算的算法才比较适合做成流式。

常见的两种损失函数的计算方法如下:




(注:这里每个变量的具体含义我就不解释了,如果看不懂的同学,真应该买本书好好补补基础知识了)

流式算法跟批算法最大的不同就在于数据的计算量,批算法和流算法的计算模型如下:

*
批算法:每次使用全量数据计算损失函数和梯度,然后更新模型

*
流算法:每次使用1条数据计算损失函数和梯度,然后更新模型


从这个角度来看,因为每次参与训练的数据量变小了,所以对于算法从训练数据稀疏度和数据维度这两给角度来看,有更多的约束和挑战。FTRL算法是由Google提出,目前在online
learning这个层面有非常好表现的算法,可以理解为是流计算中的逻辑回归算法,目前FTRL在广告投放、商品推荐等实时计算场景被广泛应用。下面就介绍下FTRL的具体计算流程。

<>2.FTRL具体推导

首先看下FTRL的迭代公式(可能需要有一些算法背景,大家可以先了解下逻辑回归的迭代方法),逻辑回归的推导在我的书里讲过了,这里就不多说:


针对这个公式做一个具体的解释,

*
首先w表示的是模型的权重,t表示迭代轮次

*
arg
min(f(x))这个函数表示的是使得f(x)取得最小值的,x的集合。在这个公式中表示的是使得每一轮迭代的损失函数最小的w组合,也就是等到收敛,w参数会是一个恒值

*
表示的是第t轮的原始模型参数

*
表示的是损失函数

*
是正则项,防止过拟合


总结一下,FTRL从算法逻辑上来讲跟批算法没有太大改变,只不过经过大量的测试表名FTRL算法在流式的模型训练过程中对于稀疏数据以及大维度模型训练方面有比较好的效果。

有几篇不错的文章介绍FTRL,也推荐给大家。

参考文献:

【1】https://zhuanlan.zhihu.com/p/32903540
<https://zhuanlan.zhihu.com/p/32903540>

【2】http://vividfree.github.io/机器学习/2015/12/05/understanding-FTRL-algorithm
<http://vividfree.github.io/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/2015/12/05/understanding-FTRL-algorithm>