好吧,我要去跨年了只好挖部落格先擋一下 XD ,題目算是只是吸引人的噱頭吧!無論如何還是希望能幫助到一些朋友。
我的影片在這邊哈哈:https://www.youtube.com/embed/cpXhwJY1JkI
關於 Dark Knownledge(後面簡稱暗知識)從 2015 年起的新發展,一直很想找個機會打一篇文章,我認為所有在嘗試將啟發式演算法混合類神經網路、機器學習相關演算法的人,需要了解「暗知識」這個新名詞(儘管某種程度雖然還是舊觀念的包裝,不過至少要能跟上時代)。
我覺得對於多數人而言,想解決問題之前,我們通常具有自己專業領域一定水準的知識,能協助我們找到一定量的相關資料,或是透過知識計算得到衍生的資料,這件事透露了兩點:
因此我想提出一個可能有些人不會同意的觀點,我基本上是比較傾向於建議,普通人如果想做出有意思的東西,應該做客製化的演算法,例如你想創業、想要有獨到的眼光、亦或是你只想說有個初步的探查,但是你能槓桿的只有你自己的腦袋,不是公司或企業的內部的資料庫的較高權限的話,客製化演算法不錯。
唯一的條件就是你得寫程式,當然你可能不用寫得很厲害,但是至少是要能手刻(hardcode)自己的演算法,不過你還是可以使用具有一定自由度的標準套件,擱置開發上的瑣碎問題。
關於客製化演算法的通常方法有兩種(以類神經網路為例):
TODO:關於過擬合想打一系列文章,過擬合的處理比較麻煩,要抓漏的步驟依賴你過擬合之前的輸入和訓練步驟
倘若你讀過模糊理論,你對於硬目標 Hard Target 與軟目標 Soft Target 就不會有太大的陌生,什麼是 Hard Target 呢?就是例如像是不是 0 就是 1 的標籤值。
那 Soft Target 呢?就是被模糊過後的標籤值,例如 0.1 、 0.2 、 0.3 ,好現在問題來了,你為什麼能模糊你的標籤值呢?
你的訓練資料的標籤值,我們先假定處理二元的資料(0 或 1)例如你在處理地理資料,到底這邊是河?還是海?
那因為你具有地理的知識,你可以把你的標前值放到一些假設底下,使得是河還是海,它具有一個機率分布(可以依據你的輸入資料,或是標籤資料都可以,當然你甚至可以不要做任何假設,純粹模糊化你的標籤)也就是每個輸入資料的標籤值對應一個河海相似度,你可能可以先用理論模型計算,假設真的有一個能判斷是河海是海的模型,你就可以把標籤值用機率來表示:
P( X = 河 ) = 0.4 , P( X = 海 ) = 0.6
阿你可能會問說,我要用理論模型幹嘛還要用類神經網路?
問得很好,所以我們會理論模型的標籤值,和你純粹資料蒐集來的標籤值一起用,這就是「軟硬兼施」
如果你有常在看類神經網路搭配啟發式演算法的文章,你就會對於 loss function 結合兩個模型的 error 不會太訝異,但是對於剛學習的新手而言,這是一個還蠻不錯值得思考的方向。
什麼方向呢?就是我們常常會思考訓練資料要挑維度,而忽略掉標籤資料也可以挑維度,你在最後一層輸出層其實可以去受到兩個標籤資料的共同監督。也就是說你的 Loss Function 可以長得像:
loss function = ( Hard Target Error ) + ( Soft Target Error ) $$
給進階者的問題是,你的 Norm Function 怎麼挑呢?我挑 L1, L2 會不會有影響呢?這就是進階問題了,線索是要去了解凸性。
好,那為什麼我們可以把 Hard Target 和 Soft Target 一起放進來衡量呢?大家要記得,如果我 loss function 有放不只是模型輸出該匹配的值,還有例如你透過模型輸出得到的反饋值(例如你以模型預測庫存,然後用庫存得到銷售損益的反饋,你放入了 loss function )
永遠要記得,配適函數中兩個部分的懲罰/獎勵因子,是要可能有一定程度的相關性(不一定是統計的相關,也可以是在訊息含量上可能的重疊)否則你達不到模型壓縮的功用。
否則我就直接 Hard Target 訓練一組模型、Soft Target 訓練一組模型就好啦!
有時候對於手上資料少的人,我們用無監督其實很難把結果做很好的分類,但是透過給定的標籤值往往又會過擬合,透過這種將目標函數考量兩種以上的標籤值,而給予標籤值一個模糊空間或許是一個能拓展我們想像力的方法,而這樣子的處理方法,就是所謂的「暗知識」也就是我們把更多資料潛藏的可能特性,封裝到更少的參數中,讓這些參數能表達出更深層次的意涵。
其實暗知識的原文方法還是採取一個給定非常標準的方法,對於手上資料量大的人而言還是有用,但是手上資料量少的人更有用。
這篇文章的產生是來自於我在今天看到一篇文章,提到了BDK,也就是貝式暗知識,提醒我可以分享這篇文章,作為目標函數構造的初級入門參考。