本文是我關於論文《Reasoning With Neural Tensor Networks for Knowledge Base Completion》的學習筆記。
一、算法簡介
網絡的結構為:
$$g(e_1,R,e_2)=u^T_Rf(e_1^TW_R^{[1:k]}e_2+V_R\begin{bmatrix} e_1 \\ e_2 \\ \end{bmatrix}+b_R)~~~~~~~~~~~(1)$$
其中$g$為網絡的輸出,也即對該關系$R$ 的打分。$e_1$,$e_2$為兩個實體的特征向量,維度都為$d$,初始化可以是隨機值,也可以是通過第三方工具訓練后的向量,在訓練中還需不斷調整。
右邊括號中扣除第一部分(Tensor部分),整個網絡就是一典型的三層bp網絡。$f=tanh$是隱層激活函數,輸出層激活函數為$pureline$,第一層權重為$V$,偏置為$b$,第二層權重為$u$。
右括號第一項為Tensor項。$W_R^{[1:k]}\in R^{d\times d \times k}$是張量,每個$W_R^i$是$d\times d$矩陣,稱作一個$slice$,網絡中共有$k$個$slice$,對應神經網絡隱層節點個數。$h_i=[e_1^TW_R^{[1:k]}e_2]_i=e_1^TW_R^i e_2$。
論文中給出的對應圖示為:

利用這個網絡可以進行知識庫推理學習。給定訓練樣本$(e_i,R_k,e_j)$。實體特征已給定,對應輸入;關系類型$R$ 對應訓練后的網絡參數,即網絡權重和張量值的集合,每個關系$R$ 對應一個參數集合,樣本中含有多個關系。
訓練時要構建負例樣本,構建的方法為從正例中隨機把一個實體替換掉。最終的損失函數為:
$$J(\Omega)=\sum^N_{i=1}\sum^C_{c=1}max(0,1-g(T^{(i)})+g(T_c^{(i)}))+\lambda ||\Omega||^2_2~~~~~~~~~~~~~(2)$$
其中$\Omega$是所有參數的集合${u,W,V,b,E}$。第1,3,4是一般的bp網絡的權重參數,最后一個是實體的特征向量,是輸入,第二個是張量。$T_c^{(i)}$是第$i$個樣本對應的反例。
根據損失函數算出上述參數的偏導數,按一般的梯度下降法或L-BFGS等算法訓練網絡,訓練出來的一個參數集對應一個關系。
文中給出的對應圖示為:

一個關系對是一個命題,我們要判定一個命題的置信度。把實體向量(已知)傳入具體網絡(關系參數已知)輸出的結果即為置信度。
二、等價變換
我們觀察公式$e_1^T\times W \times e_2$,記第一個特征向量$e_1$為$x$,第二個為$y$,皆為列向量(本文中所有向量如未說明,皆為列向量)。該公式改寫為:
$$f(x,y;W)=x^T\times W \times y=\sum W\otimes (x\times y^T)~~~~~~~~~~~~~(3)$$
其中$\otimes$圈乘符號,兩矩陣對應元素相乘作為新矩陣,$\times$為矩陣叉乘,$\sum$對矩陣的所有元素求和。
此函數可等價表示為:
$$f(x,y;W)=\sum_{i,j} w_{ij}x_i y_j$$
每個矩陣$W$對應一個$slice$,對應函數用$f_i$表示,共$k$個。
此時我們利用一個技巧,把矩陣$W$壓扁,拉長成一個向量$s$,$s=(w_{1,1},w_{2,1},...,w_{k,k})^T;$然后把矩陣$x\times y^T$也壓扁,拉長成一個向量$z$,$z=(x_1y_1,x_2y_1,...,x_ky_k)^T$。保持原矩陣元素不變,然后二維降成一維。矩陣和拉長后的向量之間可以相互轉換,生成網絡結構時我們把矩陣拉長成為向量,在訓練時計算梯度要把向量還原為矩陣。
砸扁拉長之后,上述公式變為:
$$f(x,y;W)=s^Tz$$
很顯然的是,$z$作為兩個原始向量的$x$,$y$的二次項$x_iy_j$集合,$s$是二次項系數,函數$f$是關於$x,y$的二次多項式。
每個片(slice)對應一個矩陣記為$W_i$,忽略關系下標$R$;對應一個長向量$s_i$;對應一個函數$f_i$,所有片的向量組成一個矩陣:
$$S=\begin{bmatrix} s_1^T \\ s_2^T \\ ...\\s_k^T\end{bmatrix}$$
這個矩陣$S$我稱之為張量矩陣,與張量$W_R^{[1:k]}$等價,此時公式$(1)$中的張量項表示為:
$$e_1^TW_R^{[1:k]}e_2=\begin{bmatrix} f_1 \\ f_2 \\ ...\\f_k\\ \end{bmatrix}=S\times z$$
到此為止,忽略關系下標,我們重寫公式$(1)$所表示的網絡結構為:
$$g=u^T(\begin{bmatrix} V \\ S \\\end{bmatrix}\times \begin{bmatrix} x \\ y \\ z\\\end{bmatrix}+b)~~~~~~~~~~~~~(4)$$
這就是一個經典的三層bp神經網絡了,輸入層為$x,y$以及它們的二次向量$z$,第一層權重矩陣為原權重矩陣$V$與張量矩陣$S$的合體。
等價變換之后,我們實現這個模型就變得方便多了!
三、引申應用
通過修改該網絡的輸入內容,損失函數,可以作為推薦系統的模型,特征訓練等其它方面的應用。
四、思考
該模型的本質是在經典的bp神經網絡的輸入層中加入了二次項,從而大大的提高了推斷的准確率。
如果把學習的數據看成一個物體的話,傳統的bp神經網絡看到的只是物體的邊界,然后根據邊界的線性特征進行學習,對物體的內部特征一無所知。也即傳統網絡是基於一維的數據進行學習,在該模型中,加入了輸入數據的二次項,等同於把物體進行2維展開,看過《三體》的應該對其中把原子進行高維展開然后在上面雕刻電路圖的宏大場景記憶猶新。物體從1維展開為2維,其信息量應該從$I^1\rightarrow I^2$,信息以維度級別暴增。
如此看來,我們平常的專志於增加樣本的特征個數,只是在同維度的范圍內增加信息量,並沒有改變維度的層次。
以此類推,我們可以在此基礎上繼續展開到3維(3次項),4維(4次項),。。。,當然,計算量與內存也是需要解決的問題。
或者是,我們不去改變輸入信息的維度,你展開,或者不展開,數據都在那里,蘊含的信息都沒有變。我們不改變輸入,而改變我們的大腦(網絡)的學習模式。結構決定性質,目前的神經網絡的所有節點都是加和節點,我們或許可以擴展一下,增加一類新的節點,叫乘和節點,這種節點並不是對所有輸入進行加權加和,而是加權相乘即$\sum w_ix_i \rightarrow \prod (w_i+x_i)$。直覺上來說,這應該是跟本文中的模型等價的,這兩種模型可以相互轉換。
