前面實作初步的Learned Index並進行測試,今天我們要來實作出Learned Index的完全體!!XD
其實不是完全體,也只是模擬拉 XD
Learned Index 的架構可以分為 LIF、RMI、Search Method,但是,Kraska et al.說明LIF為測試框架,並無完整介紹實際架構為何,因此本次模擬實作Learned Index不包括LIF框架。
Learned Index的主要架構圍繞著 Recursive Model Index(RMI),疊帶式的模型索引架構,但是RMI的架構有幾層?每層有幾個模型?這是可以自行定義,根據 Kraska et al.測試2層的RMI架構,第一層的Model為1個,可以是0~2層神經網路模型,神經元數量8 or 16最好,第二層的架構則選擇簡單的線性回歸,可以有數個。
首先,我們要建置2層架構Learned Index,第二層的Model數量為自帶參數:
class Learned_Index():
def __init__(self, model_num):
self.RMI = [1, model_num] # Learned Index RMI架構
self.index = [] # 儲存模型的索引
再來就是建置模型,所謂的建置模型,就是依據我們設定的Learned Index架構來配置我們的模型與其數量:
def build(self):
for m in RMI:
if(m==1):
# 第一層 => 建置 NN Model 8x8
model = Sequential()
model.add(Dense(8, input_dim=1, activation="relu"))
model.add(Dense(8, activation="relu"))
model.add(Dense(1))
sgd=keras.optimizers.SGD(lr=0.000001) # lr:學習率,可調參數
model.compile(loss="mse", optimizer=sgd, metrics=["mse"])
index.append(model)
else:
# 第二層 => 建置多個簡單線性回歸
index.append([])
for j in range(m):
model = LinearRegression()
index[1].append(model)
建置完後,我們就要來訓練資料嚕~
訓練資料有點麻煩,因為必須疊帶訓練,從第一層的1個Model到第二層的多個Models,除此之外,第一層的Model訓練完後,要將資料分配至第二層的各個Model,比較複雜一點,我們明天再來實作出剩餘的部分並詳細解釋!
掰鋪~~