1. 程式人生 > >對於張量有哪些增長和操作

對於張量有哪些增長和操作

內容來自網路,自己梳理和歸納

一、張量通常是動態增長的,它的增長通常可以用三種形式來實現。

第一種是維度的增長。比如我們只考慮使用者時間、電影和評分來進行張量建模,那麼這個張量只有三個維度。但如果我們再把電影主題也加進去,那麼就從一個三維張量增長成了四維張量,這是通過維度上的增長。

第二種增長是維度中資料的增長,如現在我們有使用者、時間和電影這三個維度,但是還會有新的使用者,也會有新的電影,時間也是逐漸增長的,所以每個維度也會自然增長,但是維數始終是固定的,這就是第二種增長。

最後一種增長是觀測資料的增長,比如說維度的個數是固定的,三個維度——使用者、時間、電影。那麼每個維度上的數量也是固定的,但是呢,我們可能一開始只獲取了部分資料,然後後面會獲取越來越多的資料。這樣就形成了一種觀測資料的增長,所以這也是一種張量的增長方式。

 

二、張量的基本操作

    首先如何計算兩個張量的內積?其實就是把他們相對應維度的元素相乘,然後把相乘後元素相加,這就是兩個張量的內積。張量的每一維度都可以被展成一個相應的矩陣。一個三維的、3×4×2的張量可以被展成對應的三個矩陣(如下圖所示)。

       接下來介紹另一個重要的操作--張量乘以矩陣。因為很多時候我們都需要用一個張量去乘一個矩陣。比如,我們有一個三維張量,它的大小是3×4×2,我們還有一個矩陣,它的大小是2×5。那麼我們用這一張量去乘以這一矩陣,最後得到的也是一個張量,它的大小就是3×4×5。

       對於張量,我們可以定義兩種不同的積,一個叫Kronecker(克羅內克)積,另一個叫Khatri-Rao積。這兩個積跟張量分解息息相關。需要注意的是Khatri-Rao積是基於Kronecker積的擴充套件。如果大家對於這兩種積的運算不太熟悉,建議大家可以在網上查詢相關資料,網路有大量關於這兩種積的介紹。

 

三、張量的分解。

     談張量分解之前,我們先回憶一下矩陣分解。下面的圖表示如何做矩陣的SVD分解。SVD分解是矩陣分解的一種形式,一個矩陣A可分解成三個矩陣(如下圖所示),U和V都是正交矩陣,S是一個對角矩陣。和矩陣分解相似,張量其實也是可以被分解的。

 

       張量分解通常是從資料中提取一個低秩(low rank)的結構。具體來說,就是把張量分解成一堆rank為1的張量的和。我們可以看下面的圖,這張圖裡揭示了兩種張量分解的方式,一種叫tucker,一種叫cp。張量x,可以被分解成矩陣a、b、c 以及一個張量叫g。這種分解形式跟矩陣的分解非常像。該張量是三維的,其每一維都會分解成一個矩陣。對應的分別是abc,那麼中間那個對角矩陣也會變成一個三維的對角張量。

     另外一種方式為cp,cp是由秩為1的張量來組成的,這個秩為1的張量,是由三個向量相乘所得到的。R我們通常就稱為是這個張量的秩。

四、張量補全

     張量補全的目標是用一個低秩的模型來恢復丟失的資料。通過下圖的兩個公式,我們可以看到,其實張量分解和張量補全只有一個微小的差別,就是張量補全會多出一個告訴張量哪個位置是我們觀測到的資料,而剩下的就是我們沒有觀測到的資料。在具體的方法中,張量分解在每次迭代中,是不需要估計丟失資訊的。而張量補全在每次迭代中是需要估計丟失資訊的。