有界内存流处理:原理与递归表征
在计算机科学,尤其是人工智能领域,流处理一直是一个高度相关的研究课题。流处理面临着诸多挑战,其中数据的潜在无限性是主要难题之一。本文将深入探讨有界内存流处理,介绍相关的基础概念、有界内存查询以及有界内存函数的递归表征。
流处理的重要性与挑战
流处理在人工智能研究和应用的各个层面都具有重要意义,涉及传感器数据层面的处理(如智能体基于感知进行推理)以及关系数据层面的处理(如在数据流管理系统中)。近年来,对基于本体的高级声明式流处理的关注,为流处理带来了新的方面。用户可以通过声明式查询语言,使用本体的签名访问各种异构数据源(静态、时间和流数据)。
然而,流处理的主要挑战在于数据的潜在无限性。这意味着不能采用一次性查询回答程序,而需要注册可在流上持续评估的查询。目标是使流处理具有可行性,特别是通过最小化处理查询所需的空间资源。有界内存查询在流处理中允许仅使用恒定空间来存储增长流前缀的相关信息。
预备知识
- 流的定义 :流是指有限或无限字母表 $D$ 上的单词流。有限流是字母表 $D$ 上的有限单词集合 $D^ $,无限流是 $D$ 上的 $\omega$- 单词集合 $D^\omega$,所有流的集合记为 $D^\infty = D^ \cup D^\omega$。
- 抽象可计算流函数 :抽象可计算(AC)流函数是通过对输入流的有限前缀进行增量计算得到的函数。具体来说,设 $K: D^ \to D^ $ 是一个从有限单词到有限单词的函数,定义由内核 $K$ 诱导的流查询 $Repeat(K): D^\infty \to D^\infty$ 为 $Repeat(K): s \to \bigcirc_{j = 0}^{|s|} K(s_{\leq j})$。一个查询 $Q$ 是抽象可计算的,当且仅当存在一个内核 $K$ 使得 $Q(s) = Repeat(K)(s)$。
抽象可计算性是流处理的一个合适概念,因为 AC 函数满足两个基本属性:前缀确定性(FP∞)和数据驱动性(F2F)。
有界内存查询
- 抽象可计算性的细化 :抽象可计算性的概念非常宽泛,甚至包含了一些根据 TTE 可计算性概念无法由图灵机计算的查询。因此,作者考虑了相对于类 $C$ 的抽象可计算性的细化概念,即诱导抽象可计算查询的窗口 $K$ 必须属于 $C$。在大多数情况下,$C$ 代表某种复杂度类的函数族。
- 有界内存 sAsm :有界内存流处理中,有界内存的流式抽象状态机(sAsm)是一个特别有趣的类别。这些机器实现了仅需恒定内存量的增量可维护窗口的思想。然而,有界内存 sAsm 的空间限制对流函数的表达能力构成了强大约束,例如,无法使用有界内存 sAsm 计算检查在给定时间点 $t$ 之前两个给定流中是否存在相同元素的 INTERSECT 问题。
一个 sAsm 在具有静态部分和动态部分的一阶排序结构上运行。静态部分包含允许在流元素域 $D$ 上使用的所有函数,动态部分由在更新过程中可能通过转换而改变的函数组成。
常宽度窗口
常宽度窗口是有界内存窗口的一个更受限的类别。
-
n - 窗口的定义
:一个函数 $K: D^
\to D^
$,如果由 $n$ - 后缀($n \in N$)确定,即对于所有长度为 $n$ 的单词 $w, u \in D^
$,满足 $K(uw) = K(w)$,则称该函数为 $n$ - 窗口。如果对于所有长度小于 $n$ 的 $s$,$K(s) = \epsilon$,则称 $K$ 为正常 $n$ - 窗口。由某个 $n$ - 窗口生成的流查询集合称为 $n$ - 窗口抽象可计算流查询($n$ - WAC 运算符),所有 $n$ - WAC 运算符的并集 $WAC = \bigcup_{n \in N} n$ - WAC 是窗口抽象可计算流查询的集合。
-
WAC 与 AC 查询的关系
*:直观上,WAC 流查询是 AC 流查询的一个真子类,因为 WAC 查询仅考虑输入流的固定大小有限部分,而 AC 查询允许使用输入流的整个历史来生成输出流。例如,奇偶查询 $PARITY: {0, 1}^\infty \to {0, 1}^\infty$ 是一个 AC 查询,但不是 WAC 查询。
下面通过一个表格来对比 WAC 和 AC 查询的特点:
| 查询类型 | 考虑输入流部分 | 输出流生成依据 | 举例 |
| ---- | ---- | ---- | ---- |
| WAC 查询 | 固定大小有限部分 | 固定大小部分的输入 | 无(难以简单举例,与 AC 对比明显) |
| AC 查询 | 整个历史 | 整个过去的输入流 | 奇偶查询 PARITY |
有界内存函数的递归表征
虽然使用有界内存 sAsm 对有界内存流函数进行表征的机器导向方法具有普遍性,但基于单词的原始递归思想提供了一种简单直接的表征方法。
-
基本函数与规则
:从有限单词的基本函数开始,用户可以通过应用组合和简单形式的递归构建更多函数。为了保证有界内存,所有构造规则都使用特定的窗口运算符,如 $last_n(\cdot)$,它输出输入单词的 $n$ - 后缀。
-
三类函数的定义
:同时定义了三类函数:
-
Accu_n
:用于建模累加器函数 $f: (D^
)^n \to D^
$。
-
Bmem(n;m)
:用于建模具有有界内存的增量可维护函数,即有界内存且输出有界的窗口函数。
-
MonBmem(n;m)
:用于建模增量可维护、内存有界且单调的函数,用于定义无限流上的单调函数。
以下是这些函数的具体定义规则:
1.
常量
:对于任何单词 $w \in D^
$,$w \in Accu_0$。
2.
后缀
:对于任何 $k \in N$,$last_k(\cdot) \in Accu_1$。
3.
后继
:对于任何 $a \in D$,$S_a^k(w) = last_k(w) \circ a \in Accu_1$。
4.
前驱
:$P_k(w) = last_{k - 1}(w) \in Accu_1$。
5.
条件
:$cond_{k,l}(w, v, x) = \begin{cases} last_k(v) & \text{if } last_1(w) = 0 \ last_l(x) & \text{else} \end{cases} \in Accu_3$。
6.
投影
:对于任何 $k \in N$ 和 $j \in [n]$($n \neq 0$),$\Pi_j^k(w_1, \ldots, w_n) = last_k(w_j) \in Accu_n$。
7.
左移
:$shl(\cdot)^{(1;0)} \in MonBmem$,其中 $shl(aw;) = w$ 且 $shl(\epsilon;) = \epsilon$。
8.
组合条件
:
- 如果 $f \in Accu_n$,且对于所有 $i \in [n]$,$g_i \in Accu_m$,则 $f(g_1, \ldots, g_n) \in Accu_m$。
- 如果 $g^{(m;n)} \in MonBmem(m;n)$,且对于所有 $i \in [m]$,$g_i \in Accu_l$,$h^{(k;l)}_j \in MonBmem(k;m)$ 对于 $j \in [n]$,则 $f^{(k;l)} \in MonBmem(k;l)$。
- 如果 $g^{(m;n)} \in Bmem(m;n)$,且对于所有 $i \in [m]$,$g_i \in Accu_l$,$h^{(k;l)}_j \in MonBmem(k;m)$ 对于 $j \in [n]$,则 $f^{(k;l)} \in Bmem(k;l)$。
9.
累加递归
:如果 $g: (D^
)^n \to D^
\in Accu$ 且 $h: (D^
)^{n + 3} \to D^
\in Accu$,则 $f: (D^
)^{n + 1} \to D^
\in Accu$,其中 $f(\epsilon, v_1, \ldots, v_n) = g(v_1, \ldots, v_n)$,$f(wa, v_1, \ldots, v_n) = h(w, a, v_1, \ldots, v_n, f(w, v_1, \ldots, v_n))$。
10.
窗口递归
:如果对于 $i \in [m]$,$g_i: (D^
)^{n + m} \to D^
\in Accu$,$g_0 \in Accu$,则 $k = k^{(n;m)} \in Bmem(n;m)$,其中 $k(\epsilon, \ldots, \epsilon; v) = g_0(v)$,$k(w; v) = k(shl(w); g_1(v, w_{=1}), \ldots, g_m(v, w_{=1}))$。
11.
重复递归
:如果对于 $i \in [m]$,$g_i: (D^
)^{n + m} \to D^* \in Accu$,$g_0 \in Accu$,则 $f = f^{(n;m)} \in MonBmem(n;m)$,其中 $f(\epsilon, \ldots, \epsilon; out, v) = out$,$f(w; out, v) = f(shl(w); out \circ g_1(v, w_{=1}), g_1(v, w_{=1}), \ldots, g_m(v, w_{=1}))$。
以下是这些规则的 mermaid 流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B(定义基本函数):::process
B --> C{选择规则类型}:::decision
C -->|常量| D(w ∈ Accu0):::process
C -->|后缀| E(lastk(·) ∈ Accu1):::process
C -->|后继| F(Sak(w) = lastk(w) ◦ a ∈ Accu1):::process
C -->|前驱| G(Pk(w) = lastk−1(w) ∈ Accu1):::process
C -->|条件| H(condk,l(w, v, x) ∈ Accu3):::process
C -->|投影| I(Πjk(w1, ..., wn) ∈ Accun):::process
C -->|左移| J(shl(·)(1;0) ∈ MonBmem):::process
C -->|组合| K(组合规则):::process
C -->|累加递归| L(accu - 递归规则):::process
C -->|窗口递归| M(窗口 - 递归规则):::process
C -->|重复递归| N(重复 - 递归规则):::process
D --> C
E --> C
F --> C
G --> C
H --> C
I --> C
J --> C
K --> C
L --> C
M --> C
N --> C
C --> O([结束]):::startend
通过这些规则,可以构建有界内存流函数。例如,考虑窗口函数 $K_{par}$,它输出一个单词的奇偶性。单调函数 $Par(w) = Repeat(K_{par})(w) = \bigcirc_{j = 0}^{|w|} K_{par}(w_{\leq j})$ 可以通过重复递归规则建模。
有界内存流处理在流处理领域具有重要意义。通过对有界内存查询和函数的研究,我们可以更好地理解如何在有限的空间资源下进行有效的流处理。递归表征方法为构建有界内存流函数提供了一种简单而直接的方式,使得我们能够处理各种有趣的信息需求。未来,有界内存流处理有望在更多领域得到应用,如实时数据分析、智能传感器网络等。
有界内存流处理:原理与递归表征
递归类型分析
在上述定义中,出现了三种类型的递归:
-
累加器上的原始递归
:这种递归从单词的末尾开始消费单词,因为在流处理过程中累加器是从左到右构建的。此规则输出的长度是有界的。
-
窗口递归
:这是一种特定形式的尾递归,意味着递归定义的函数是递归调用中的最后一个应用。该递归规则旨在模拟内核/窗口函数,它从输入单词的开头使用左移函数
shl()
消费输入单词,并且实现了一种同时递归,所有输入单词根据前面提到的时间模型并行消费。
-
重复递归
:同样是尾递归形式,旨在模仿
Repeat
函数。通过重复递归构建的输出单词通过在
out
变量中连接中间结果来生成,输出呈线性增长。例如,奇偶查询
Par(w)
可以通过重复递归规则进行建模,具体如下:
f(ϵ; out, v) = out
f(w; out, v) = f(shl(w); out ◦ v ⊕ w=1, v ⊕ w=1)
Par(w) = f(w; ϵ, 0)
以输入单词
w = 101
为例,消费过程如下:
Par(101) = f(101; ϵ, 0) = f(shl(101); ϵ ◦ 0 ⊕ 101=1, 0 ⊕ 101=1)
= f(01; ϵ ◦ 0 ⊕ 1, 0 ⊕ 1) = f(01; 1, 1)
= f(1; 1 ◦ 1 ⊕ 0, 1 ⊕ 0) = f(1; 1 ◦ 1, 1)
= f(ϵ; 1 ◦ 1 ⊕ 1, 1 ⊕ 1) = f(ϵ; 1 ◦ 1 ◦ 0, 0) = 110
下面通过表格对三种递归类型进行对比:
| 递归类型 | 消费方式 | 用途 | 输出特点 |
| ---- | ---- | ---- | ---- |
| 累加器上的原始递归 | 从单词末尾消费 | 构建累加器 | 长度有界 |
| 窗口递归 | 从单词开头使用左移函数消费,并行消费输入单词 | 模拟内核/窗口函数 | 长度有界 |
| 重复递归 | 从单词开头使用左移函数消费,连接中间结果生成输出 | 模仿
Repeat
函数 | 输出线性增长 |
函数性质与拓展
-
单调性
:
MonBmem中的所有函数在其输入参数上是单调的。证明思路为:引入函数f(x; y)关于其参数x单调的概念,即对于每个y,函数fy(x) = f(x, y)是单调的。MonBmem中的函数要么是左移函数(本身单调),要么是通过组合(保持单调性)或重复递归(由于输出位置的连接操作保证单调性)构建的函数。 -
函数拓展
:由于
MonBmem中的函数将(有限单词的)向量映射到有限单词,并且具有单调性,因此可以为每个f ∈ MonBmem定义一个扩展˜f,它将(有限或无限单词的)向量映射到有限或无限单词。如果f (n;) : (D*)^n → D*,则˜f : (D∞)^n → D∞定义如下:如果所有si ∈ D*,则˜f(s1, ..., sn) = f(s1, ..., sn);否则,˜f(s1, ..., sn) = supi∈Nf(s≤i1 , ..., s≤in ),其中supi∈Nf(s≤i1 , ..., s≤in )是唯一的流s ∈ D∞,使得对于所有i,f(s≤i1 , ..., s≤in ) ⊑ s。将可以表示为Q = ˜f(其中f ∈ MonBmem)的函数Q称为有界内存流查询,记为BmemStr。
有界内存流查询与 sAsm 的关系
一个具有一个参数的函数
Q
属于
BmemStr
当且仅当它是一个可以由有界内存 sAsm 计算的流查询。证明如下:
-
正向证明
:显然,
Bmem
中每个函数
f
的范围长度是有界的,即存在
m ∈ N
,使得对于所有
w ∈ D*
,
|f(w)| ≤ m
。根据相关结论,
f
可以由有界内存 sAsm 计算。由于
Repeat
函数与重复递归规则的作用几乎相同,因此可以得到所需的表示。
-
反向证明
:所有基本规则(如更新规则)可以由
Accu
函数建模(因为每个寄存器只需存储字母表中的一个符号,更新操作通过累加递归实现)。并行应用通过窗口递归中的并行递归原理建模。
if
构造可以使用
cond
模拟,并且
if
构造中的无量词公式也可以使用
cond
表示,因为
cond
是功能完备的。
以下是该证明过程的 mermaid 流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;
A([开始]):::startend --> B{函数类型}:::decision
B -->|Q ∈ BmemStr| C(正向证明):::process
B -->|可由有界内存 sAsm 计算| D(反向证明):::process
C --> E(证明 f 范围长度有界):::process
E --> F(根据结论 f 可由 sAsm 计算):::process
F --> G(Repeat 函数与重复递归规则对应):::process
G --> H(得到所需表示):::process
D --> I(基本规则由 Accu 函数建模):::process
I --> J(并行应用由窗口递归建模):::process
J --> K(if 构造用 cond 模拟):::process
K --> L(无量词公式用 cond 表示):::process
H --> M([结束]):::startend
L --> M
类似情况模拟
类似地,可以模拟
o(n)
位串有界 sAsm。在累加器的定义中,不使用常量大小的窗口
lastk(c)
,而是根据具体情况进行调整。
有界内存流处理为在有限空间资源下进行有效的流处理提供了理论基础和实践方法。通过递归表征有界内存函数,我们能够构建出满足各种信息需求的流处理函数。随着技术的发展,有界内存流处理有望在实时数据处理、物联网等领域发挥更大的作用,为这些领域的数据处理提供高效、可行的解决方案。
超级会员免费看
925

被折叠的 条评论
为什么被折叠?



