吳慶濤 師君如 張明川* 王倩玉 朱軍龍 張宏科
①(河南科技大學(xué)信息工程學(xué)院 洛陽 471023)
②(北京交通大學(xué)下一代互聯(lián)網(wǎng)互聯(lián)設(shè)備國家工程實(shí)驗(yàn)室 北京 100044)
隨著互聯(lián)網(wǎng)的不斷發(fā)展,基于IP協(xié)議的網(wǎng)絡(luò)細(xì)腰模型逐漸暴露出諸多弊端,端到端的通信方式已經(jīng)不能滿足用戶日益增長的網(wǎng)絡(luò)需求。針對當(dāng)前網(wǎng)絡(luò)可擴(kuò)展性差、動態(tài)性不足等問題,研究者拋開現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)的束縛,提出未來互聯(lián)網(wǎng)體系結(jié)構(gòu)[1-3]以解決當(dāng)前IP網(wǎng)絡(luò)所面臨的問題。命名數(shù)據(jù)網(wǎng)絡(luò)(Name Data Networking, NDN)[4]作為變革式網(wǎng)絡(luò)架構(gòu)的代表之一,成為學(xué)術(shù)界研究的熱點(diǎn)。在NDN網(wǎng)絡(luò)中,以基于內(nèi)容的通信方式取代傳統(tǒng)網(wǎng)絡(luò)基于IP的通信方式,每個(gè)信息內(nèi)容都有其獨(dú)立的、采用層次化方式命名的名字。網(wǎng)絡(luò)中的節(jié)點(diǎn)能夠緩存內(nèi)容,用戶通過包含內(nèi)容名的興趣包獲取所需信息[5]。內(nèi)容名字查找作為NDN路由器的一個(gè)關(guān)鍵功能,對整個(gè)網(wǎng)絡(luò)的路由效率至關(guān)重要[6]。因此,如何設(shè)計(jì)高效的名字查找結(jié)構(gòu)是NDN網(wǎng)絡(luò)的關(guān)鍵難題之一。
信息量的增加會造成路由表規(guī)模擴(kuò)大,在大規(guī)模路由表中實(shí)現(xiàn)準(zhǔn)確、低內(nèi)存消耗的內(nèi)容名字查找,成為NDN網(wǎng)絡(luò)名字查找算法的核心。為了更好地提供服務(wù),每個(gè)路由節(jié)點(diǎn)需要維護(hù)3個(gè)表:內(nèi)容存儲器(Content Store, CS)、待定請求表(Pending Interest Table, PIT)、轉(zhuǎn)發(fā)信息表(Forwarding Information Base, FIB)[7]。當(dāng)用戶請求數(shù)據(jù)時(shí),會向網(wǎng)絡(luò)發(fā)出一個(gè)請求內(nèi)容的興趣包。興趣包中包含所請求內(nèi)容的名字,而這個(gè)名字需要依次在CS,PIT, FIB表中進(jìn)行查找以獲得請求數(shù)據(jù)或?qū)?yīng)的轉(zhuǎn)發(fā)端口,幫助用戶獲取所需的信息內(nèi)容[8]。本文主要關(guān)注內(nèi)容名字在NDN網(wǎng)絡(luò)路由節(jié)點(diǎn)的CS和PIT中進(jìn)行精確查找的方法。
為實(shí)現(xiàn)內(nèi)容名字在大規(guī)模路由表中的精確查找,不僅需要降低路由表的內(nèi)存消耗,還需要提高查找的精度與效率。目前,一些研究者圍繞名字查找結(jié)構(gòu)提出了幾種精確查找算法,如字符查找樹[9]、布隆過濾器[10]和哈希表[11]等。為了優(yōu)化元素間的沖突和減少內(nèi)存占用量,Kraska等人[12]提出了學(xué)習(xí)索引結(jié)構(gòu),探索使用機(jī)器學(xué)習(xí)方法替代傳統(tǒng)索引結(jié)構(gòu)。為了提高學(xué)習(xí)索引的效率,Mitzenmacher[13]提出了使用兩個(gè)布隆過濾器將學(xué)習(xí)函數(shù)夾在其間的夾心索引結(jié)構(gòu)。這些算法在查找精度和內(nèi)存使用方面有不同的優(yōu)勢,但還沒有很好地解決名字之間的沖突問題,并且為了提高查找精度還會犧牲一定的內(nèi)存空間。
也有一些研究者采用幾種傳統(tǒng)查找算法相結(jié)合的方式提升查找效率。文獻(xiàn)[14]提出了利用哈希表進(jìn)行內(nèi)容名字查找,將每個(gè)內(nèi)容名字前綴通過哈希函數(shù)進(jìn)行計(jì)算,得到其關(guān)鍵值并存儲在路由節(jié)點(diǎn)的FIB中,以提高查找的效率。文獻(xiàn)[15]提出了一種基于字符查找樹的名字查找結(jié)構(gòu),將名字前綴通過分隔符分割為多個(gè)名字組件,利用樹狀結(jié)構(gòu)實(shí)現(xiàn)快速查找。文獻(xiàn)[16]使用布隆過濾器進(jìn)行名字查找,通過哈希函數(shù)將內(nèi)容名字進(jìn)行編碼,存儲在一個(gè)定長的位數(shù)組中,進(jìn)行名字查找時(shí)只需判斷對應(yīng)位數(shù)組上的數(shù)字是否全為1即可。這些方法雖然可以在一定程度上提升查找效率,但一般都會產(chǎn)生假陽性,犧牲了查找的精確性。
本文提出一種基于深度布隆過濾器的內(nèi)容名字查找結(jié)構(gòu)。它的基本方法是:首先,利用布隆過濾器對查找內(nèi)容名字進(jìn)行預(yù)過濾,快速篩選出符合要求的內(nèi)容;然后,引入長短記憶神經(jīng)網(wǎng)絡(luò)(Long Short Term Memory, LSTM)[17-19]對篩選出的內(nèi)容名字進(jìn)行精確查找,判斷內(nèi)容名字是否為表中的內(nèi)容;最后,再利用一個(gè)小型備份過濾器對漏報(bào)內(nèi)容進(jìn)行3重查找。由此,可以提高內(nèi)容名字在路由表中查找的準(zhǔn)確性,減少路由表項(xiàng)的內(nèi)存消耗,提升路由表查找效率。
本節(jié)首先對基于深度布隆過濾器的名字查找結(jié)構(gòu)進(jìn)行介紹;然后,提出了相應(yīng)的查找算法,對內(nèi)容名字在NDN網(wǎng)絡(luò)中的精確查找過程進(jìn)行解析;最后,對深度查找結(jié)構(gòu)產(chǎn)生的假陽性進(jìn)行分析。
深度布隆過濾器的查找結(jié)構(gòu)主要分為3級,包含內(nèi)容名字的用戶興趣包通過3級的查找,可以增加查找的精確度并減少內(nèi)存占用。第1級進(jìn)行預(yù)過濾,第2級進(jìn)行精確查找,第3級消除漏報(bào),如圖1所示。
圖1 深度布隆過濾器查找結(jié)構(gòu)
第1級初始過濾器主要采用布隆過濾器對名字進(jìn)行預(yù)處理,目的是判斷所查找的名字是否為內(nèi)容集合中的成員或近似成員,實(shí)現(xiàn)快速初步篩選。如果在初始過濾器中判斷這個(gè)名字屬于內(nèi)容集合中的成員或近似成員,則將名字傳遞給第2級進(jìn)行精確查找。
第2級使用基于門控循環(huán)單元(Gated Recurrent Unit, GRU)的LSTM構(gòu)建一個(gè)學(xué)習(xí)模型,將名字在學(xué)習(xí)模型中進(jìn)行精確查找,由于NDN網(wǎng)絡(luò)的層次化命名方式使得名字前綴之間有一定的語義關(guān)系,通過學(xué)習(xí)成員集合和非成員集合中的內(nèi)容,可以有效預(yù)測所查找內(nèi)容。因此,使用深度學(xué)習(xí)模型能夠更準(zhǔn)確地找到所請求內(nèi)容的名字,但是學(xué)習(xí)模型會產(chǎn)生假陰性,需要一個(gè)備份過濾器消除假陰性。
第3級備份過濾器使用一個(gè)具有學(xué)習(xí)函數(shù)的布隆過濾器,利用在學(xué)習(xí)模型中設(shè)置的閾值,將在學(xué)習(xí)模型中產(chǎn)生的假陰性內(nèi)容名字傳遞到備份過濾器中進(jìn)行再次查找,消除假陰性,并將匹配到的內(nèi)容進(jìn)行轉(zhuǎn)發(fā)。
在整個(gè)查找過程中,構(gòu)建的學(xué)習(xí)模型能夠影響查找的準(zhǔn)確性和內(nèi)存消耗,利用LSTM的門控設(shè)置解決傳統(tǒng)循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)中信息不能長期依賴的問題。構(gòu)建的學(xué)習(xí)模型內(nèi)部結(jié)構(gòu)如圖2所示。
圖2 學(xué)習(xí)模型結(jié)構(gòu)
對于每一個(gè)內(nèi)容名字,在學(xué)習(xí)模型中的處理方式如下:
(1) 首先對輸入的內(nèi)容名字進(jìn)行預(yù)處理,將名字的每個(gè)組件作為一個(gè)特征,提取出其中的一類特征;
(2) 將這些特征輸入進(jìn)Embedding層,把所有輸入轉(zhuǎn)化為向量的形式傳遞給LSTM層;
(3) 在LSTM層中,通過深度學(xué)習(xí)將輸入內(nèi)容進(jìn)行解析,提取出另外一類特征;
(4) 將第1層處理的特征與通過LSTM分析提取的第2類特征進(jìn)行融合,使用多層感知(MultiLayer Perceptron,MLP)模型對這兩類特征進(jìn)行處理;
(5) 將融合后的特征通過Softmax分類器進(jìn)行分類處理,將處理后的內(nèi)容名字輸出。
通過深度布隆過濾器結(jié)構(gòu)進(jìn)行名字查找,對名字進(jìn)行層層篩選分析,可以達(dá)到精確查找的目的,下面將通過算法詳細(xì)說明整個(gè)查找過程。
本節(jié)描述使用深度布隆過濾器進(jìn)行名字查找的算法。給定一個(gè)內(nèi)容名字集合S={a1,a2,...,am},一個(gè)非內(nèi)容名字集合U,一個(gè)待查找內(nèi)容名字集合Q,將初始過濾器與備份過濾器分配的總數(shù)組位數(shù)設(shè)定為bm bit,其中分配給初始過濾器b1m bit,分配給備份過濾器b2m bit。設(shè)置一個(gè)學(xué)習(xí)函數(shù)作為哈希函數(shù)替代傳統(tǒng)布隆過濾器中的哈希函數(shù),這樣能夠有效減少內(nèi)容名字通過多個(gè)哈希函數(shù)產(chǎn)生的沖突,并使用機(jī)器學(xué)習(xí)中的激活函數(shù)sigmoid作為學(xué)習(xí)函數(shù)的一部分。在學(xué)習(xí)模型中,通過設(shè)置一個(gè)閾值τ對查找內(nèi)容是否為內(nèi)容集合中的成員做出判斷。查找過程分為3級,先從第1級的初始過濾器進(jìn)行查找,然后再通過基于LSTM的學(xué)習(xí)模型進(jìn)行查找,最后通過備份過濾器進(jìn)行最終確認(rèn),具體過程如表1所示。
表1 面向深度布隆過濾器的名字查找算法
在名字查找過程中,根據(jù)內(nèi)容集合S和非內(nèi)容集合U,首先通過L S T M 訓(xùn)練一個(gè)集合D={(xi,yi=1)|xi ∈S}∪{(xi,yi=0)|xi ∈S},其中,xi為待查找名字集合Q中需要查找的任一內(nèi)容名字;yi為通過學(xué)習(xí)模型產(chǎn)生的輸出結(jié)果。表1的第3-5行通過初始過濾器判斷查找的名字是否為集合S中的成員或近似成員,如果不是,則將內(nèi)容發(fā)送給FIB,在FIB表中通過最長前綴匹配查找,確定是否有匹配的名字轉(zhuǎn)發(fā)端口。如果是S集合中的成員或近似成員,將x傳遞給第2級的學(xué)習(xí)模型進(jìn)行精確查找,如表1的第9-13行所示。作為一個(gè)預(yù)篩選,有可能會將x的相似成員傳遞給第2級,在第2級中設(shè)置閾值τ判定。如果f(x)≥τ,則說明x為集合S中的成員,輸出x,并將這個(gè)內(nèi)容名字在CS表中對應(yīng)的數(shù)據(jù)包轉(zhuǎn)發(fā)出去;如果f(x)<τ且x ∈S,那么說明通過學(xué)習(xí)模型查找產(chǎn)生了假陰性,需要將名字發(fā)送到第3級的備份過濾器進(jìn)行再次查找,如表1的第14-20行所示;如果在備份過濾器中查找到該名字,則將其輸出并在CS表中轉(zhuǎn)發(fā)名字對應(yīng)數(shù)據(jù)包,如果沒有找到該名字,則在FIB表中進(jìn)行最長前綴匹配查找。
在基于深度學(xué)習(xí)的3級查找結(jié)構(gòu)中,利用初始過濾器進(jìn)行預(yù)過濾能夠大幅減少備份過濾器的內(nèi)存開銷。名字通過3層查找提升了查找的精度,適用于精確查找。
傳統(tǒng)布隆過濾器通過多個(gè)哈希函數(shù)對名字進(jìn)行計(jì)算,將會產(chǎn)生假陽性。在NDN網(wǎng)絡(luò)中,通過CS,PIT進(jìn)行精確查找,雖然能夠容忍小概率的數(shù)據(jù)包轉(zhuǎn)發(fā)錯誤,但是轉(zhuǎn)發(fā)錯誤的內(nèi)容過多就會引起網(wǎng)絡(luò)流量的浪費(fèi),因此對內(nèi)容名字的查找精度要求很高且不能占用過高的內(nèi)存空間。本節(jié)將對深度布隆過濾器查找結(jié)構(gòu)產(chǎn)生的假陽性率進(jìn)行分析。
深度布隆過濾器查找結(jié)構(gòu)產(chǎn)生的假陽性率由3個(gè)部分組成,將初始過濾器與備份過濾器分配的總數(shù)組位數(shù)設(shè)定為bm bit,其中分配給初始過濾器b1m bit,分配給備份過濾器b2m bit。根據(jù)傳統(tǒng)布隆過濾器產(chǎn)生假陽性率的計(jì)算公式[16]可以得到,第1級初始過濾器產(chǎn)生的假陽性率為
在學(xué)習(xí)模型中,內(nèi)容成員集合為S且|S|=m,當(dāng)查找的名字不屬于集合S但與成員集合中的內(nèi)容非常相似時(shí),這就產(chǎn)生了假陽性。因此,通過學(xué)習(xí)模型產(chǎn)生的假陽性率為Fp。若一個(gè)名字是成員集合中元素,但是,通過學(xué)習(xí)模型判定為非集合中元素,這就產(chǎn)生了假陰性。因此,名字通過學(xué)習(xí)模型產(chǎn)生的假陰性率為Fn。
在備份過濾器中,上一級學(xué)習(xí)模型中產(chǎn)生的漏報(bào)在本級會再次查找,通過學(xué)習(xí)函數(shù)進(jìn)行哈希的過程仍會產(chǎn)生假陽性,在這個(gè)過程中產(chǎn)生的假陽性率為FB。因此,可以得到整個(gè)模型所產(chǎn)生的總假陽性率為
根據(jù)文獻(xiàn)[20],對布隆過濾器產(chǎn)生的假陽性率進(jìn)行建模,假設(shè)每個(gè)名字存儲占用i bit,假陽性率以αi下降,且當(dāng)使用一個(gè)完美哈希函數(shù)時(shí),α=1/2。基于文獻(xiàn)[21],可以根據(jù)學(xué)習(xí)模型產(chǎn)生的假陰性數(shù)量確定備份布隆過濾器的大小。因此,只需要在備份過濾器中查找mFn個(gè)內(nèi)容名字,得到模型的假陽性率為
令F′(b1)=0,可以得到最小的假陽性率,且b2的值為
從式(6)可以看出,備份過濾器所占用的位數(shù)與分配的總位數(shù)無關(guān),只與學(xué)習(xí)模型產(chǎn)生的假陽性率和假陰性率相關(guān)。因此,可以通過增大初始過濾器的數(shù)組位數(shù)降低第1級結(jié)構(gòu)產(chǎn)生的假陽性率,從而降低第2級產(chǎn)生的假陽性率,這就使得備份過濾器的內(nèi)存占用量大幅減少并且能夠提高查找精度。
本節(jié)通過實(shí)驗(yàn)將所提的深度布隆過濾器3級查找結(jié)構(gòu)與其他幾種內(nèi)容名字的精確查找結(jié)構(gòu)進(jìn)行對比,驗(yàn)證所提3級查找結(jié)構(gòu)在各個(gè)方面的特性。
試驗(yàn)采用服務(wù)器的配置如表2所示。其中,計(jì)算機(jī)的控制核心部件CPU采用Intel Core i7處理器,CPU的核心數(shù)為6個(gè),且擁有12個(gè)邏輯處理器,操作系統(tǒng)采用Windows 10。所提的深度布隆過濾器3級查找結(jié)構(gòu)代碼采用Python語言實(shí)現(xiàn)。數(shù)據(jù)集利用Blacklist[22]數(shù)據(jù)集,選取其中64M數(shù)據(jù)作為樣本集合進(jìn)行訓(xùn)練,選取41M數(shù)據(jù)作為測試樣本集合,將每個(gè)URL轉(zhuǎn)變?yōu)轭愃啤?www/baidu”形式。
表2 服務(wù)器配置
從Blacklist數(shù)據(jù)集中隨機(jī)選取4個(gè)分類的子文件夾,將文件中的數(shù)據(jù)進(jìn)行處理篩選出其中的URL數(shù)據(jù),然后從中選取10M數(shù)據(jù)查看其中每個(gè)內(nèi)容名字的字符串長度分布情況,如圖3所示。
圖3 名字字符串長度分布
3.2.1 假陽性分析
本文提出的查找方法包含3級結(jié)構(gòu),第1級和第3級都使用了布隆過濾器對名字進(jìn)行預(yù)處理和精確處理。為了節(jié)省內(nèi)存空間并減少誤報(bào)率,將兩個(gè)過濾器所占用的數(shù)組位數(shù)做了分配,初始過濾器分配b1m bit,備份過濾器分配b2m bit。通過調(diào)整初始過濾器的系數(shù),可以看出初始過濾器大小對查找結(jié)構(gòu)假陽性率的影響如圖4所示。
圖4 初始過濾器系數(shù)選擇對假陽性率的影響
將兩個(gè)過濾器分配的系數(shù)按照b1+b2=10的原則進(jìn)行分配,通過實(shí)驗(yàn)可以看出,隨著b1的增大,查找結(jié)構(gòu)產(chǎn)生的假陽性率持續(xù)降低;當(dāng)給初始過濾器分配數(shù)組位超過最大限度10,給備份過濾器分配數(shù)組位為0時(shí),假陽性率最低。這也驗(yàn)證了3.3節(jié)的分析,最優(yōu)的假陽性率與備份過濾器的數(shù)組位數(shù)無關(guān),備份過濾器所需的位數(shù)與學(xué)習(xí)模型產(chǎn)生的假陰性相關(guān)。因此,增加初始過濾器大小有利于提高查找的準(zhǔn)確度。
由于學(xué)習(xí)模型使用基于GRU的LSTM模型,因此通過實(shí)驗(yàn)驗(yàn)證GRU的大小是否會對算法的假陽性產(chǎn)生影響。選取了不同的學(xué)習(xí)率對不同的GRU大小進(jìn)行實(shí)驗(yàn),GRU和隱藏層參數(shù)配置與編號如表3所示。通過實(shí)驗(yàn)可以看出,當(dāng)GRU的大小設(shè)置為32且隱藏層的大小設(shè)置為4時(shí),相同學(xué)習(xí)率情況下假陰性率最??;GRU的大小設(shè)置為4時(shí),假陰性率最高;當(dāng)GRU的大小設(shè)置為8時(shí),假陽性率最低,如圖5所示。
圖5 GRU大小對假陰性率和假陽性率的影響
在深度學(xué)習(xí)模型中,通過設(shè)置一個(gè)閾值τ判斷內(nèi)容名字的假陰性和假陽性。實(shí)驗(yàn)通過選取不同閾值在10M的名字表中進(jìn)行判斷,GRU和隱藏層參數(shù)配置與編號如表3所示。結(jié)果顯示隨著閾值增大,深度學(xué)習(xí)模型的假陽性率越低;反之,假陰性率就越高。當(dāng)τ>0.5時(shí),通過模型查找的假陰性和假陽性率要低1到2個(gè)數(shù)量級。其中,假陰性可通過備份過濾器消除。在相同學(xué)習(xí)輪次和學(xué)習(xí)率條件下,GRU越大,假陰性和假陽性率就越小,如圖6所示。
圖6 閾值τ大小對假陽性率和假陰性率的影響
表3 GRU和隱藏層參數(shù)配置與編號
為了更直觀地驗(yàn)證3級深度布隆過濾器查找結(jié)構(gòu)名字查找的準(zhǔn)確性,選取了1M-10M的名字表進(jìn)行查找,與標(biāo)準(zhǔn)布隆過濾器和學(xué)習(xí)布隆過濾器[23]對比。深度模型選取了1個(gè)GRU和兩個(gè)GRU層對比??梢钥闯?級深度布隆過濾器查找結(jié)構(gòu)有更高的查找精度,與其他查找結(jié)構(gòu)相比,假陽性率最低,如圖7所示。這也驗(yàn)證了通過初始布隆過濾器的預(yù)過濾能夠很大程度上提升內(nèi)容名字查找的準(zhǔn)確性。
圖7 假陽性率
3.2.2 內(nèi)存消耗分析
為了驗(yàn)證本文結(jié)構(gòu)在內(nèi)存消耗方面的性能,選取了3種精確查找架構(gòu)進(jìn)行對比,實(shí)驗(yàn)結(jié)果如圖8所示。其中,基于字符樹的名字查找結(jié)構(gòu)所占用的內(nèi)存隨著名字表的增大而快速增加,這是由于隨著名字?jǐn)?shù)量的增多,字符樹的深度不斷增加,與二進(jìn)制數(shù)據(jù)結(jié)構(gòu)的布隆過濾器相比,內(nèi)存消耗增加明顯。深度布隆過濾器3級查找結(jié)構(gòu)與傳統(tǒng)布隆過濾器的內(nèi)存占用接近,但優(yōu)于傳統(tǒng)布隆過濾器。與基于字符樹的內(nèi)容名字查找結(jié)構(gòu)相比,深度布隆過濾器3級查找結(jié)構(gòu)節(jié)省了近80%的內(nèi)存空間,與哈希表的查找結(jié)構(gòu)相比,節(jié)省了近42%的內(nèi)存空間。在查找4M內(nèi)容名字時(shí),與布隆過濾器的內(nèi)存占用量基本相等,但隨著內(nèi)容名字的增多,在名字?jǐn)?shù)量達(dá)10M時(shí),深度布隆過濾器3級查找結(jié)構(gòu)的內(nèi)存消耗最低。
圖8 內(nèi)存消耗
本文針對NDN網(wǎng)絡(luò)中內(nèi)容名字在CS和PIT表中的精確查找問題,設(shè)計(jì)了基于深度布隆過濾器的3級結(jié)構(gòu)。在查找過程中,第1級使用初始過濾器對名字進(jìn)行預(yù)過濾,然后通過第2級的LSTM神經(jīng)網(wǎng)絡(luò)進(jìn)行精確查找和預(yù)測,最后通過第3級的備份過濾器提高查找精度。文中對3級結(jié)構(gòu)產(chǎn)生的假陽性率進(jìn)行了分析。通過實(shí)驗(yàn)結(jié)果可以看出,深度布隆過濾器查找結(jié)構(gòu)與傳統(tǒng)的精確查找結(jié)構(gòu)相比,假陽性率大幅降低,且比傳統(tǒng)基于字符樹的查找結(jié)構(gòu)節(jié)省了近80%的內(nèi)存空間,因此,基于深度布隆過濾器的3級結(jié)構(gòu)具有較優(yōu)的查找精度和內(nèi)存開銷。但由于LSTM需要學(xué)習(xí)大量的樣本特征,下一步計(jì)劃利用小樣本學(xué)習(xí)進(jìn)一步提升查找效率。