想挑戰(zhàn)馮·諾依曼,就必須從三個(gè)要素入手:基本操作,例如加減乘除;邏輯流程控制,例如if-else-then,for,while;設(shè)存儲(chǔ)器,內(nèi)存和硬盤的尋址。DeepMind團(tuán)隊(duì)認(rèn)為,馮·諾依曼體系中的邏輯流程控制和外設(shè)存儲(chǔ)器使用,都必須在程序中寫死,而不能通過觀察范例,自動(dòng)生成程序。
2016年10月27日 “Nature” 期刊第538卷,發(fā)表了Google旗下的DeepMind團(tuán)隊(duì)寫的人工智能的論文,題目是 “Hybrid computing using a neural network with dynamic external memory” [1],用配置了動(dòng)態(tài)外部存儲(chǔ)的神經(jīng)網(wǎng)絡(luò),實(shí)現(xiàn)雜交計(jì)算。這篇論文介紹了Differentiable Neural Computer的實(shí)現(xiàn)細(xì)節(jié)。
DeepMind團(tuán)隊(duì)在倫敦工作,2014年被Google收購。DeepMind開發(fā)的AlphaGo,2016年年初戰(zhàn)勝了圍棋高手李世乭。
早在2014年12月,DeepMind團(tuán)隊(duì)發(fā)表了一篇論文,“Neural Turing Machines” [2]。后來,他們對(duì)Neural Turing Machines (NTM)的存儲(chǔ)管理方式做了改進(jìn),命名為Differentiable Neural Computer(DNC)。Differentiable是可訓(xùn)練的意思,尤其是可以用gradient descent的算法來訓(xùn)練。
馮·諾依曼體系
當(dāng)今世界,所有計(jì)算機(jī)的體系,都源自于馮·諾依曼于1945年設(shè)計(jì)的體系,馮·諾依曼體系有三大要素:
基本操作,例如加減乘除。
邏輯流程控制,例如if-else-then,for,while。
外設(shè)存儲(chǔ)器,內(nèi)存和硬盤的尋址。
想挑戰(zhàn)馮·諾依曼,就必須從這三個(gè)要素入手。DeepMind團(tuán)隊(duì)認(rèn)為,馮·諾依曼體系中的邏輯流程控制和外設(shè)存儲(chǔ)器使用,都必須在程序中寫死,而不能通過觀察范例,自動(dòng)生成程序。
如果把程序理解為把輸入x轉(zhuǎn)換為輸出y的函數(shù)f(),y = f(x),那么neural network就是模擬任何函數(shù)的通用模型f^()。
但是早期的neural network有兩個(gè)軟肋:
不能實(shí)現(xiàn)variable binding,也就是說,f() 的內(nèi)部參數(shù),不能隨著輸入x的不同而改變。
不能實(shí)現(xiàn)variable-length structure,也就是說,輸入x和輸出y的維度都是定長的,不能改變。
早期neural network的這兩個(gè)軟肋,都不難修補(bǔ)。譬如循環(huán)神經(jīng)網(wǎng)絡(luò)Recurrent Neural Network(RNN),就解決了這兩個(gè)問題。換而言之,RNN是Turing-complete的,可以用來模擬任何函數(shù),當(dāng)然也可以模擬任何程序的功能。
既然馮·諾依曼體系的三大要素中的兩個(gè),基本操作和邏輯流程控制,都能夠被RNN模擬,假如RNN也能夠解決存儲(chǔ)管理的問題,那么整個(gè)馮·諾依曼體系,就都能夠被RNN來實(shí)現(xiàn)了。所以 Differentiable Neural Computer (DNC)的工作重點(diǎn),在于存儲(chǔ)管理。
[3] 深入淺出地解釋了用RNN來管理存儲(chǔ)的原理。建議先讀 [3],再讀 [2],最后讀 [1]。需要特別注意的,個(gè)人體會(huì)有幾個(gè)方面,1. 存儲(chǔ)的設(shè)置,2. 尋址機(jī)制,3. 需要訓(xùn)練哪些參數(shù),4. 如何把DNC應(yīng)用到Graph操作中。
存儲(chǔ)的設(shè)置
[3] 把NTM/DNC的存儲(chǔ)設(shè)置解釋為the memory is an array of vectors,也就是一個(gè)矩陣,每一行就是一個(gè)vector,每行的vector的長度一致,所有行集結(jié)起來就是array。在文中的例子中,[3] 把memory簡化為an array of scalar, 也就是N行單列的矩陣,每一行只存儲(chǔ)一個(gè)數(shù)值。
什么時(shí)候需要存儲(chǔ)向量呢?如果存儲(chǔ)里存放的是圖像,那么每個(gè)存儲(chǔ)單元上存儲(chǔ)的是一個(gè)像素(r,g,b),像素就是一個(gè)向量,三個(gè)bytes組成的向量。
但是如果需要存儲(chǔ)的是一篇文章,每個(gè)存儲(chǔ)單元上需要存儲(chǔ)一個(gè)詞,而每個(gè)詞的長度不同,怎么辦?三篇文章都沒有說,但是簡單的辦法有二。
每個(gè)存儲(chǔ)單元上,預(yù)留足夠長的vector,遇到很短的詞,空著的byte就全部填0。
把每個(gè)詞,無論長短,都轉(zhuǎn)換為詞向量,詞向量的長度定長。第二個(gè)辦法就是其它論文中說的encoding的辦法。
另外要注意的是,存儲(chǔ)矩陣的行數(shù)可能很多。想象一下,把一部長篇小說存放到存儲(chǔ)矩陣?yán)?,每個(gè)詞都占用一行,需要占用存儲(chǔ)矩陣的多少行。
尋址機(jī)制
DNC改進(jìn)了NTM的尋址機(jī)制。NTM的尋址機(jī)制是content-based和location-based的混搭。為什么需要改進(jìn)呢?原因有三。
NTM不能保障多個(gè)存儲(chǔ)單元之間,不相互重疊,不相互干擾。dynamic memory allocation: allocate a free space
NTM不能釋放存儲(chǔ)單元,如果處理很長的序列時(shí),譬如處理一部超長的長篇小說,搞不好所有存儲(chǔ)都會(huì)被占滿,導(dǎo)致系統(tǒng)崩潰。dynamic memory allocation: free gates
如果連續(xù)做幾個(gè)讀寫操作,它們所使用的存儲(chǔ)單元的位置,最好是相鄰的。但是在NTM中,一旦某個(gè)讀寫操作,遠(yuǎn)遠(yuǎn)跳到其它存儲(chǔ)區(qū)域,那么后續(xù)操作也跟著去其它區(qū)域,而且失憶,想不起來原先的存儲(chǔ)區(qū)域在哪里。temporal link matrix
DNC的尋址機(jī)制,把讀操作和寫操作分開。DNC用content-based和dynamic memory allocation的混搭方式,處理寫操作。用content-based和temporal memory linkage的混搭方式,處理讀操作。
1. content-based尋址:
比較需要處理的目標(biāo)vector,與存儲(chǔ)矩陣中每一行的vector,用余弦距離來計(jì)算兩者相似性。取存儲(chǔ)矩陣中,與目標(biāo)vector距離最短的行。
計(jì)算余弦距離時(shí),需要一個(gè)系數(shù)向量,beta,這個(gè)系數(shù)向量是被訓(xùn)練出來的。
2. dynamic memory allocation存儲(chǔ)單元分配:
每一個(gè)存儲(chǔ)單元,都是等長的vector。當(dāng)每一個(gè)存儲(chǔ)單元被free的時(shí)候,整個(gè)vector中的每一個(gè)element,都可以用來寫入新數(shù)據(jù)。但是當(dāng)一個(gè)vector中有若干elements已經(jīng)被占用時(shí),剩下的elements還可以被寫入新數(shù)據(jù)。
想象一下,如果每個(gè)vector的長度是100,又如果某個(gè)vector里,已經(jīng)寫入了一個(gè)不長的詞,但是還有剩余的elements,這些剩余的elements可以用于給這個(gè)詞做詞性標(biāo)注等等。但是如果剩余的elements不多,那么詞性標(biāo)注只好被寫到其它行的vector里。
DNC設(shè)計(jì)了一個(gè)存儲(chǔ)單元占用向量u。u(i) = 0時(shí)第i行的vector中,所有element都可以被寫入新數(shù)據(jù),而當(dāng)u(i) = 1時(shí)第i行的vector中所有elements都已經(jīng)被占用了。
但是如果存儲(chǔ)矩陣中有兩行,i和j,分別有完全相同的elements可以被寫。誰先被寫,取決于權(quán)重向量wt。wt體現(xiàn)了存儲(chǔ)使用的策略,策略既可以是盡可能寫入最新釋放的存儲(chǔ)單元,也可以盡可能寫入內(nèi)容相似,而且沒有被完全占用的存儲(chǔ)單元。這個(gè)權(quán)重向量wt,是可以根據(jù)被訓(xùn)練出來的。
3. Temporal memory linkage讀寫時(shí)序的關(guān)聯(lián):
Dynamic memory allocation沒有記錄歷次寫操作時(shí),loc(t) 發(fā)生在哪個(gè)存儲(chǔ)單元,以及l(fā)oc(t+1) 發(fā)生在哪個(gè)存儲(chǔ)單元。而記錄歷次寫操作的存儲(chǔ)單元的位置順序,是有用的。
DNC用N^2的方陣,來記錄temporal link,其中L(i, j) 記錄著t時(shí)寫操作發(fā)生在存儲(chǔ)單元j,而t+1時(shí)寫操作發(fā)生在存儲(chǔ)單元i的概率。L(i, j) 可以是簡單的統(tǒng)計(jì)結(jié)果,也可以是加權(quán)的統(tǒng)計(jì)結(jié)果,權(quán)重體現(xiàn)了控制策略。權(quán)重是可以被訓(xùn)練出來的。
當(dāng)N很大的時(shí),理論上來說L方陣會(huì)占用很多空間。但是鑒于L方陣很稀疏,很多L(i, j) 等于0。根據(jù)DeepMind團(tuán)隊(duì)的估算,L實(shí)際占用空間只有O( N ),計(jì)算成本只有O( N * Log N )。
需要訓(xùn)練哪些參數(shù)?
除了讀寫操作、以及尋址操作中的幾個(gè)權(quán)重向量以外,還有作為controller的RNN的參數(shù)。RNN可以選擇結(jié)構(gòu)比較簡單的neuralnet work,也可以選擇結(jié)構(gòu)更復(fù)雜的LSTM。選用LSTM意味著有更多參數(shù),需要被訓(xùn)練。
訓(xùn)練數(shù)據(jù)通常不包含讀寫操作發(fā)生在哪個(gè)存儲(chǔ)空間上的信息。譬如NTM中,Priority Sort實(shí)驗(yàn)的訓(xùn)練數(shù)據(jù),是一連串(輸入,理想輸出)pairs。每個(gè)pair中的輸入,是20個(gè)向量,每個(gè)向量伴隨著priority打分。每個(gè)pair中的理想輸出,是從輸入的20個(gè)向量中,挑選出來的16個(gè),并且按priority得分排序。
注意,訓(xùn)練數(shù)據(jù)中不包含讀寫操作在哪些存儲(chǔ)單元上進(jìn)行的信息。
把DNC應(yīng)用到Graph操作中
文中把DNC用于在倫敦地鐵中,尋找兩站之間最佳路線。坐地鐵本身不重要,重要的是如果RNN學(xué)會(huì)使用Graph以后,能做什么?假如Graph不是地鐵,而是social graph呢?又假如是knowledge graph呢?
參考文獻(xiàn):
[1] Graves, Alex, et al. "Hybrid computing using a neural network with dynamic external memory." Nature 538.7626 (2016): 471-476.
[2] Graves, Alex, Greg Wayne, and Ivo Danihelka. "Neural turing machines." arXiv preprint arXiv:1410.5401 (2014).
[3] Chris Olah & Shan Carter, “Attention and Augmented Recurrent Neural Networks”, Distill, 2016.
評(píng)論
查看更多