xiewajueji's blog

This is a site that express xiewajueji's views on software engineering and entertainment things.

about
5 May 2021

学习索引

by xiewajueji

learning index是一个非常有争议的东西,批评者觉得这玩意缺少有效的开源实现,不合适的数据集和缺少标准的benchmark组件。但这玩意的好处就是可以针对不同的情况做不同的事,使得用更少的代价做更多的事情。

背景

统计学习三要素为\(方法=模型+策略+算法\),模型是\(Y = f(X)\),策略是由\(L(Y, f(X))\)算出的\(R(f)\),算法是有限步骤找出使R(f)最小的有限步骤。监督学习主要解决的问题有分类问题,标注问题,还有回归问题。learning index属于监督学习中的回归问题。

index

learning index的作用是在一个排好序的数组中查找第一个大于等于输入key的Entry的范围,即缩小查找的范围。

\[\forall x \in Z [I(x) = (lo, hi) \rightarrow D_{lo} \le LB(x) \le D_{hi}]\]

假设我们训练的模型为\(A(X)\),误差率为\(\lambda\),排序数据集合为\(D\)。

\[I_A(x) = (A(x) - |D| * \lambda, A(x) + |D| * \lambda)\]

模型

Recursive model indexes(RMI)

\[A(x) = f_2^{\lfloor {B * f_1(x) / |D|} \rfloor}(x)\]

RMI

先训练\(f_1\)再训练\(f_2\)

Radix spline indexes(RS)

RS

不用训练

Piecewise geometric model indexes(PGM)

这玩意是RMI的特化版

PGM-f

PGM

问题

Learning Index依赖于单个有序数组,即单调递增性,这样可能能够很简单的做线性拟合。如果是多个有序数组,一是没法更新,二是模型的训练难度随着模型的复杂度指数上升。

\(key \rightarrow i_{th}entry\) 比 \(key \rightarrow offset\) 更好拟合,因为offset没有数学意义,所以数组内的Entry要是定长的才能随机访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
struct PersistentPointer {  // total 16B
    uint64_t file_no;   // 8B
    uint64_t offset;    // 8B
};

struct MetaBlock {   // total 256B
    std::bitset<1024> key_inline;   // 128B
    std::bitset<1024> value_inline; // 128B
};

using InlinePayload = char[sizeof(PersistentPointer)];

union Payload { // total 16B
    PersistentPointer pointer;
    InlinePayload inline_payload;
};

struct Entry { // total 32B
    Payload key;    // 16B
    Payload value;  // 16B
};

union SuperBlock {  // total 256B
    char padding[256];  // 256B
    
    struct {
        uint64_t magic_number;
        uint64_t file_no;
        FileType file_type;
        uint64_t nb_entry;
        uint64_t crct64;
    };
};

struct EntryBlock { // total 256B
    Entry entry[8]; // 256B
};

union ContainerBlock {
    char padding[256];
};

// | super block | meta block | ... | entry block | ... |
// | super block | container block | ... |

constexpr size_t table_prefix_length = 20;
using table_prefix_t = char[table_prefix_length];

struct HashMap {
    std::map<table_prefix_t, table_meta> map;
};
tags: Machine-Learning - Index