【答疑解惑III】說說高斯過程中的多維輸入和多維輸出
這節我們來說一說最近各種小夥伴們最常問到的兩個問題:
“如果我的資料的輸入是多維的,我改如何選擇應用高斯過程模型呢?“
“我需要考慮做兩個相關變數的整體預測,我應該如何使用高斯過程模型呢?“
首先,讓我們來明確一下概念,以保證大家說的是同一回事哦!
輸入(input)和輸出(output) :這個概念相信大多數小夥伴還是知道的吧,所謂輸入就好比一個機器,你打算扔點什麼東西進去,所謂輸出就是你希望它可以吐出來點什麼。
多維輸入 :這裡有不少同義詞,比如multi-input,multiple-input, multi-dimensional input等等,這些詞語描述的都是一種input,也就是每一個輸入點有多個屬性(當然也包括多個量被考慮成為多個屬性的情況)。
“好抽象呀!!!“
好吧,舉個例子來說吧,如果我們用今天的上證指數去推斷預測明天的中石化的收盤價,那麼這裡上證指數就是剛才說的輸入,中石化的收盤價就是輸出,由於這裡只有上證指數一個輸入,所以這裡就是單數輸入的模型,同理這也是單一輸出的模型,因為只有中石化一個公司。還是剛才那個例子,如果我們用上證指數和上證成交量一起去推斷預測明天的中石化收盤價,那麼這就是多輸入了啦,因為我們用到了前一天的成交資訊,這個裡的成交資訊包括連個屬性量,一個是指數,一個是成交量。
多維輸出 :當然這裡更多的同義詞,比如multi-output,multiple-output,multiple task, dependent output, correlated output. 所謂多維輸出就是指最後我們的目標量有多個。
這裡或許你會有疑問,目標量有多個的話,我們就不能一個一個考慮麼?
即用所謂的輸入,得到一個輸出,然後在用一摸一樣的輸入,再建模得到另一個輸出,這樣不可以麼?
可以呀,當然可以,只不過如此操作默認了一個事實:
“各個輸出之間的是不相關的!“
這也就是解釋了為什麼多維輸出的情況的又被經常稱作是dependent output, correlated output,因為這些模型是直接考慮多輸出的,即考慮其中的各個輸出之間的相關性的。
如果我們試圖用上證指數去一起推斷預測,中石化和中石油兩個股票的收盤情況,那麼這個就是多輸出的模型,也就是說需要考慮中石化和中石油之間相對較高的相關性。
好啦,稍稍解釋完這些之後,我們來說說多輸入和多輸出的高斯過程吧。
事實上,對於多輸入的情況,高斯過程本身就是支援的哦,回憶一下我們之前有關高斯過程這個隨機過程的定義:高斯過程可以由一個mean function和一個kernel所確定
ofollow,noindex" target="_blank">驀風星吟:什麼是Gaussian process? —— 說說高斯過程與高斯分佈的關係數學化之後就是下面這個定理:

這裡其實只是要求了mean function和kernel定義在S上,可沒有說這個S是什麼哦!所以S可以是一維實數,當然也可以n維的實空間哦!反倒是這個輸出,可以明顯看到mean和kernel的值域都是R(實數,一維的實數空間),因此經典的高斯過程模型的輸出必然只能是單輸出的哦!
結論:經典的高斯過程理論天然的可以解決多輸入的問題,但是無法解決多輸出的問題!!!
結論:經典的高斯過程理論天然的可以解決多輸入的問題,但是無法解決多輸出的問題!!!
結論:經典的高斯過程理論天然的可以解決多輸入的問題,但是無法解決多輸出的問題!!!
重要的結論說三遍!!!
“Okay,既然你說GP可以解決這個多輸入的,可到底是如何解決的呢?”
嗯,這是不錯的問題!如果瞭解這個問題的核心,就需要觀察一個這個輸入究竟是與誰有關的呢?根據定義,這個輸入空間將會印象到的mean和kernel,不過一般mean設定為零,所以重中之重就是kernel了哈,所以來讓我們來看看這個kernel。以Squared Exponential (SE)為例(採用GPML書中的表述),
(1)
之前討論過的哦, Gaussian process 的重要組成部分——關於那個被廣泛應用的Kernel的零零總總 ,kernel中有至關重要的一部就是距離的刻畫,或者說kernel其實就是基於距離的一個量,那麼自然距離的定義將直接影響到這個kernel的結果。
若是一維情況,此處的距離計算方式是就是兩個數字的相減然後平方,這個毫無疑問。但如果這裡的x是多維情況呢,即現在x與x’是一個向量,我們該如何辦呢?
當然就是把絕對值放到更高的角度來看啦,這就是範數!至於什麼範數,這個只有直接wiki一下了哈,見Norm (mathematics)。所以現在這個kernel的定義該是
(2)
如果點了連結後的小夥伴可能還有疑問,那這個範數也有很多種, 比如0範數,1範數,2範數
事實上,這裡可以採取的方法有很多,比如L1範數(又叫 Taxicab norm or Manhattan norm ),比如L2範數( Euclidean norm ),當然更一般的還可以是p-範數。理論上呢這些都可以成為選擇, 但是實際操作中,還是以最為常見的歐式距離為主,所以一般的高斯過程中採取的也是這種歐式距離的定義哦!
當然很多情況下,公式(2)也會以下幾個不同的面具
(3)
(4)
其中公式(3)裡面的 是對應的輸入的向量的各個分量,也就是說公式(3)是分量的表示方法。而公式(4)也即是對應的向量表示方法,其中這個P是個對角矩陣,而且這裡對角線元素都是
。
再回憶一下, Gaussian process 的重要組成部分——關於那個被廣泛應用的Kernel的零零總總 這篇文章中我們提到了這裡面的引數 所具有的特殊意義哦!記不記得?
對,人家的名字叫做lengthscale哦!
所以依照公式(3)(4)的定義,我們可以看到這些定義方式中都肯定了一點,即
對於多維的輸入,每一個分維度上的lengthscale都是一樣!
這就樣的定義方式就是GPML書和gpml toolbox中說到的isotropic distance measure。不過顯然這樣的定義方式讓很多聰明的小夥伴無法全盤接受接受。為什麼呢?
“你說多維是指一個輸入變數具有多個不同的屬性,為什麼這些屬性只能共用一個lengthscale呀!這個在很多情況下不合理呀!”
的確,isotropic的方式在很多情況都有侷限性,當然如果輸入的維度特別大的話,這樣的處理唯一的好處就是計算速度快,因為這將原先許多個lengthscale考慮為了一個!
針對這個具體問題,GPML書中也提到了automatic relevance determination (ARD)的方式,即
(5)
(6)
這裡同樣(5)是分量表示法而(6)是向量表示法,只不過此時的(6)中P是一個對角線元素並不相同的對角矩陣,即對角元素為 。這裡
就是對應不同維度上分量的lengthscale。
或許聰明的你又會問,如此操作一頓後,雖然看上去的確漂亮了不少,可到底有什麼意義呢?
當然,這裡的意義就是在於目前機器學習中非常重要的一點,feature selection, 也是一些神經網路方法中想要努力處理的一點。那麼這個ARD方法如何就做到了所謂的特徵選擇了呢?
在之前的文章 Gaussian process 的重要組成部分——關於那個被廣泛應用的Kernel的零零總總 ,我們實驗中可以看到,如果這個lengthscale越大,sample的曲線越平坦,可以試想一下,如果這個lengthscale足夠大,那麼sample曲線將會變成一條平的直線,也就是說此時,該輸入分量的變動並不會改變kernel,從某種意義上可以說,此時kernel是獨立於該分量的,即刪除了該分量也無所謂哦!
因而,ARD的kernel的引入使得高斯過程模型自然自帶feature selection的能力,這就是GP相對於其他機器學習模型的有優勢之一!
當然說了那麼多,或許許多小夥伴更關注的或許是如何實現吧!其實既然多輸入是GP天然自然的屬性,那麼實現肯定不是問題呀!比如經典的gpml toolbox中都是妥妥的好工具,而且本文上述的描述都是妥妥的遵守gpml包中的描述方式的哦!
比如:gpml包中的isotropic核都在cov資料夾下面,並且以iso結尾(當然意思是不算".m"這樣的字尾名)。同樣的如果是ard的核的話,那麼都是以ard結尾的哦。
這裡要敲黑板的是

超引數的個數!!!
許多小夥伴發信息來說:“哎呀,我的程式碼出問題了,問題在哪裡呀?”
其實很多的問題就在於你的超數數給的個數不對,無論iso還是ard都需要在設定的時候回到cov資料夾下面找到對應的檔案,檢視確認是一下總共需要幾個超引數,尤其是對以多維的輸入的情況,記得數數能力要過關哦!
至於如果是自己寫的實現方式的話,個人感覺也不太需要我這裡說什麼了吧,畢竟打算自己寫了,對這裡的認識和了解也該是不比偶少了哈。這裡放上我們組的一點點折騰起來的小米加步槍(基於python下的TensorFlow)
predictive-analytics-lab/UniversalGP總的來說,其實多維的輸入真的不是什麼大問題,好好看書,仔細些程式碼,執行gpml基本沒有問題哦(當然初始超引數的選擇這裡還是有不少的門門道道的,這個之後再細說哦,如[6])
說完了多維的輸入,我們再來簡單說說多維的輸出。
由於多維輸出並不是GP天然可以做到的事情,因而其中的實現就需要運用目前暫時無法詳細描述的方法,如果有興趣的小夥伴可以先直接去看對應的paper哦!這裡就簡單說說基本架構吧 (不是很明白的小夥伴也有兩個選擇,第一去看對應的paper,第二,直接忽略敘述,直接去找給出的程式碼包)
第一步:所有training output構成矩陣後(因為每一個點是一個向量,所以堆疊後所有training可以構成矩陣)向量化,當然也可以說直接就把每個點直接堆疊構成一個更長的向量。只不過這個一個更長的向量的可以分為d段,每一段對應這一個output。
第二部:核函式重構,即採取kronecker product的方式將核函式與output相關性矩陣結合,構造一個新的大的covariance matrix。
第三部:首先回歸或是分類
這裡可以參考的文獻有[2][3][4][5],都有比較詳細的介紹。
最近經常有人問到這個多輸出的GP如何實現呢?
當然,最好的辦法自然是好好看paper,然後自己去實現,不過更多小夥伴還是想著直接調包啦!
這裡主要還是之前 【番外篇】Gaussian process for machine learning實戰學習資料推薦整理 中推薦的 Sheffield Machine Learning Software (ML@SITraN) 中的一些內容,
比如基於Matlab的 SheffieldML/multigp ,基於Python的GPy(以前記得沒有的哈,不過最近在其中發現了 gp_multiout_regression.py , 因而想必也是可以多維輸出的哦!由於寫著是迴歸,想必應該也是隻能做多維輸出的迴歸吧!), 另外理論上基於GPy的GPflow應該也是可以的哈!不過沒有親測哦!
另外就是最近有小夥伴推薦的一個 MTGP - A multi-task Gaussian Process Toolbox ,同樣也木有用過,不過看上去還不錯呢,至少功能明確。
除此之外,根據一些矩陣代數的內容,偶也自己寫個toolbox,功能明確,不過還處於試驗階段,文章在[6],程式碼在
Magica-Chen/gptp_multi_output不過目前功能還不是很完善,有關於初始超參仍有一些問題,外加侷限於迴歸以及還沒有實現加入一些對於大dataset的加速的方法。不過打算近期抽時間調整一下框架然後逐漸加入一些內容,歡迎各位大牛小夥伴們多多指正, 熟悉github的小夥伴也可以直接動手!輕踩哦!

Reference
[1] Rasmussen, Carl Edward, and Christopher KI Williams. Gaussian process for machine learning . MIT press, 2006.
[2] Bonilla, Edwin V., Kian M. Chai, and Christopher Williams. "Multi-task Gaussian process prediction." Advances in neural information processing systems . 2008.
[3] Boyle, Phillip, and Marcus Frean. "Dependent gaussian processes." Advances in neural information processing systems . 2005.
[4] Alvarez, Mauricio A., Lorenzo Rosasco, and Neil D. Lawrence. "Kernels for vector-valued functions: A review." Foundations and Trends® in Machine Learning 4.3 (2012): 195-266.
[5] Wang, Bo, and Tao Chen. "Gaussian process regression with multiple response variables." Chemometrics and Intelligent Laboratory Systems 142 (2015): 159-165.
[6] Chen, Zexun, and Bo Wang. "How priors of initial hyperparameters affect Gaussian process regression models." Neurocomputing 275 (2018): 1702-1710.