2018年10月3日 星期三

筆記:深度學習

桌前孔雀魚的尾鰭 很像某種神經網路



深度學習是人工智慧的一個分支,完整的人工智慧是假設機器具有和人類相同的思考能力,不過這個目標遠遠脫離我們想像,過於遙不可及。一般工程師會接觸到的人工智慧,僅能視為"初階"人工智慧,又分為統計為基礎的機器學習,和深度學習。

統計概念


統計中提到的評估方式,除了連續性回歸分析外,也是輔助和強化深度學習的基礎。
  1. VSM
  2. KNN分類
  3. 無母數統計
  4. 線性方程式
  5. SVM

網路文件自動分類 自己論文

線性迴歸。已知迴歸模型(y = 0.1x + 0.3)的係數(0.1)與截距(0.3)。亂術產生一組線性的數值,計算新產生數值和標準結果的差距,盡量讓這個差距縮小,經過多次的iterator,數值趨近正確。結果會是0.1和0.3。

iterator的一個重要概念就是optimizer,常見的是GradientDescent,梯度下降法,利用跨的遠近以及產生的負值,因為有很大的負向,就會快速到達正確點。參考test1.py。另外一篇對梯度下降的介紹連結
起始狀況,預測線距離很遠,斜率也完全不同

經過四十次iterator,開始接近目標值

深度學習


深度學習與機器學習不同,出發點是仿生,模擬生物神經細胞鏈結和迴授特性(文章介紹)。雖然過程是黑盒,效果卻出奇的好。事實上,此概念早在三十年前成形,只是近幾年,因為網際網路興起,以往難以取得的訓練資料,突然隨手可能,且高效能GPU也普及,再經過AlphaGo的一戰成名,各大科技廠高調宣揚,還有媒體的推波助瀾,讓深度學習成為顯學。

深度學習的特色是效果驚人,且有一致性,對人們來說,卻有無法解釋的缺陷。費曼有句名言What I cannot create, I do not understand。大意是說我不能創造的東西,我就不瞭解。套用在深度學習上,就是,我們幾乎無法對一個模型為何能運作成功,提供完整解釋。這個連結是google提供的視覺化觀察方法(連結)。

接觸相關領域後,有兩個小心得,
一是此領域實在是飛躍性的成長,尤其是CNN和物件識別部分,實在如同百花齊放。
二是Deep learning 堆 layer 的方式,跟要處理的問題領域息息相關,背後所需要的經驗難度不亞於 feature engineering。情境一換就得重調參數。不論是模型選擇和參數調整,都牽涉許多基礎概念,不像網路或是資料庫般直觀或用簡單推論就可獲得。

以下是由基礎到進階不同的神經網路。討論前,先介紹常見範例MNIST手寫數字,內有多張圖像,且都直接轉變成一維陣列。test9.py 會自動連結網路下載mnist檔案,存入MNIST_data目錄。test10.py 透過ui界面顯示圖形檔案。

單層神經網路


 每一個圖形進來,都會轉變成784X10的權重矩陣(還要加上biases),softmax計算出來的數值,在每次iterator中,系統會自動更新weight和biases的數值(更新的方式就是梯度下降,數值就是使用的參數)。隨著iterator增加,正確率也會增加,直到沒有辦法再細微調整。其中使用了。
oftmax_cross_entropy_with_logits進行lost計算(連結)。
activate function Softmax為分類器
函數將分類器輸出的分數(Evidence)轉換為機率(Probability),然後依據機率作為預測結果的輸出,可想而知深度學習模型的輸出層會是一個 Softmax 函數。



test11.py 訓練和測試結果,準確率92%,並且會產生TensorBoard目錄。,僅單一hidden,且與一維陣列配對,即使如此抽象表現形態,MNIST表現上也有92%效果(說明)。test28.py,正確率約為89%,說明位置連結。兩者寫法不同,但是概念相似,奇特的是,就是始終有3%的差距。

雙層神經網路

以數學來解釋兩層的神經網路,可以用非線性迴歸的例子,test2.py。activate function可使用的函數如下。tf.nn.relu() tf.nn.sigmoid() tf.nn.tanh() tf.nn.elu() tf.nn.bias_add() tf.nn.crelu() tf.nn.relu6() tf.nn.softplus() tf.nn.softsign() tf.nn.dropout()

輸入參數都相同,可隨時互換使用,函數概念也不相同,這也是設計神經網路時,需要具備的知識。


套用不同activate function後,得到的結果如下。

tanh,左右的開口是向外


softplus,左右的開口是向內
relu

sigmoid,底部與tanh不同

XOR

類神經網路很大特點是,他能處理非線性的問題,例如下面xor圖就無法畫一條直線分割紅點與藍點。一個單層神經網路的的結構,如果用單層神經網路的結構只能找出一條直線或是一個超平面,無論在圖中哪個位置放處一條直線,都無法完美切割,所以不適合解決 XOR 這種非線性的問題。


多層感知機的結構包含輸入層(Input layer)、隱藏層(Hidden layer)與輸出層(Output layer),如果只是將「資料 * 權重 + 偏差值」,無論向前傳遞幾層,都只是在做線性組合(Linear Combination),線性組合不管做幾次結果都還是線性,那麼多層感知機要怎麼解決非線性的問題呢?

在資料每次經過一個節點時,都會通過一個激勵函數,激勵函數即是多層感知機能夠解決非線性問題的關鍵。通過激勵函數後,便是做了一次非線性轉換,假設隱藏層與輸出層共有 n 個節點,就是經過 n 次的非線性轉換。test26.py  連結


後續神經網路都會用TensorFlow(或Caffe)為範例,這些都是很高階應用套件,若有興趣,也可用較簡易的Java範例描寫Neural Network 參考這裡。參考編譯方式連結



MNIST
MNIST辨識改進成為雙層test30.py,說明(連結),成效不顯著,但是文章內容豐富。

Tic Tac Toe圈圈叉叉
Tic Tac Toe本質是策略步驟,並不是分類的概念,但若不管成效,也可以透過DNN訓練。方法是,feature設定為每次要下的棋局,label設定為應該要下的那個座標。形式類似csv內容。實際執行後,發現分數並不高。
test31,說明(連結  連結)。


CNN,和延伸的物體辨識,和YOLO(點擊這裡)

RNN(點擊這裡)



這邊為止以上都是屬於Supervised learning。DNN是神經網路的基本架構,CNN是架構在DNN上的應用,RNN延續DNN精神,因為加入時間因素而更豐富。
Supervised learning requires training data showing example inputs and outputs, e.g.
an image classifier is trained using along with an expected text label.
a spam classifier is trained using example emails along with a label indicating whether it is spam or not.
a house price estimator is trained using data about a house along with its price.
supervised learning is driving most of the machine learning applications in production today, so that's the best place to focus your attention for now.

----------------------

GAN

生成對抗網路Generative Adversarial Network是加入Discriminator network的概念,更進一步讓神經網路強大的方式。

Unsupervised learning does not need training data. A typical example is performing clustering on data to find similar groups. Move and product recommendation engines work this way -- they don't need to understand anything about the thing being recommended, they just need to know that people who like X and Y, also like Z.

GAN有兩個需要被訓練的model,一個是Discriminator network,另一個是Generator network。透過來回運作,Generator network就會逐漸修正自己,成為正確結果。有點像是在作夢,透過機制調整原本訓練模型。參考文章,文章1 文章2 文章3 文章4 

程式是test18.py,算是標準範例,利用mnist資料,也就是所謂正常的圖片(不在乎label),不斷產生假資料,但是假資料會越來越接近真實。

逐漸有筆劃的感覺

GAN有"未來性",特別再挑範例研究test21,解壓縮後包括測試資料和眾多python檔案,使用pil軟體 sudo apt-get install python-pip    pip install Pillow

test21中 先執行 python main.py 會產生需要的訓練資料,並且在result中陸續看到逐漸變好的雜點移除細果。執行 python main.py --is_trained 會清除照片上的雜點。

Attention Mechanism

理論基礎(連結)。例如AlphaFold,突破突破暴力方法,用人工智慧決定蛋白質的3D結構( 連結 )。

Reinforce Learning

強化學習(reinforce learning)的概念看似類似GAN,但更適合用在和環境交互影響。可以被視為通用性AI的架構環境。

Reinforcement learning works on anything with a reward function. A reward function basically means anything with a score. A common example is AI for playing computer games -- the video frames are provided as input, the model decides which action to take, an the resulting score is used to reinforce the model. If it doesn't have a score, you can use the length of time that your character stays a live.

以遊戲的概念來看,以猜拳遊戲來看,某個動作都會有對應輸贏,就可以轉化為分類行為,類似遊戲,只要讓專家多玩幾次這個遊戲,並且紀錄他們的行為,就可以訓練模型。但這實際上並不是人類學習的方式,人類可以在無指導無專家的情況下,自學遊戲,也就是無標記。強化學習就是不需要標記數據,而是通過以往的經歷。這和心理學很像,並沒有所謂正確的行為,而是給予獎勵和懲罰。模型接受環境訊號後,輸出一個動作,然後等待環境動作,持續下去。 參考 參考文章 參考code

pip install keras==2.2.0
建立一個catch目錄,將test19 test20拷貝到這下面
步驟一 python test19.py
步驟二 python test20.py
步驟三 ffmpeg -i %03d.png output.gif -vf fps=1   將結果編成gif

CATCH遊戲出來的結果

其他項目

Transfer Learning如果在已經擁有的訓練架構上,給予新的學習目標,可以大幅減化新事物的學習難度。

優化神經網路的方法
Overfitting的處理 神經網路中,常見overfitting現象,原因是訓練資料太少就會有類似情形。處理方式如下

  1. 使用L1計算方式
  2. 使用L2計算方式
  3. 隨機移除掉部分weight,讓系統不要過份依賴一些節點
Batch Normalization:處理資料不敏感問題
外部處理數據:文章
聲音範例 NSynth,介紹
資料庫 中文資料庫WIKI 中文斷詞
以AI進行人工智慧繪圖,作者是中國清華大學學生,休學辦公司,清楚介紹這個領域的架構和演進(連結)。

生成式 Stable Diffusion XL 1.0 (連結 連結 連結)

軟體平台


市面上已有許多網路資料或實體書(只是幾乎全來自中國大陸,覺得本地人才消失這現象實在不妙)介紹深度學習。基礎語言最常見就是PYTHON。平台以Caffe和TensorFlow為大宗。和以往邏輯性程式不同,類似的平台比較偏向描述思考(解題)的方式,而非親自撰寫程式。

這些套件,都具備有基本統計和高階神經網路功能,下面的學理篇章也會盡量含括Caffe和TensorFlow兩種的範例。

  1. TensorFlow 出自Google,所以親合性、資源都有優勢。長期發展,或許會像Android獨佔開發市場。但提到獨佔,就不免培養出第二選項。
  2. Caffe 出自柏克萊,學術性高。因為高通範例是Caffe,希望投入這方案。參考書1 參考書2 參考書3
主要參考書;機器學習實作

學習文件  文件2  文件3  文件4  影片介紹  文件5

沒有留言:

張貼留言