Reflection: Deep Learning with R-Ch3.2–3.4
ch3.2-ch3.4
### 3.2. INTRODUCTION TO KERAS
* Keras 是 DL 的框架,提供方便的方式去訓練任何 DL 模型。
* 一開始主要目標是提供學者能夠快速地做實驗
* Keras 有以下的特色
- 在 CPU 和 GPU 上可以用一樣的 code
- 提供 user-friendly API
- 內建支援卷積網路、遞迴網路及兩種的組合
- 它支持任意網絡架構:多輸入或多輸出
模型,圖層共享,模型共享等。這意味著Keras基本上適合於構建任何深度學習模型。
* R interface (https://keras.rstudio.com)
#### 3.2.1. Keras, TensorFlow, Theano, and CNTK
* Keras為開發深度學習模型提供了高級構建塊。 它不處理諸如張量操縱和微分之類的底層操作。
* Keras以模塊化方式解決問題
* 可使用多種 backend engines,TensorFlow, Theano, Cognitive Toolkit(CNTK)
* Theano: by MILA lab at University de Montreal (http://deeplearning.net/software/theano)
* TensorFlow by Google(www.tensorflow.org)
* CNTK by Microsoft (https://github.com/Microsoft/CNTK)
* 建議使用 TensorFlow,最廣為接受,可擴展且可立即投入生產的產品。
* 在 GPU 上 TensorFlow 有封裝低階張量運算套件Eigen,且 TensorFlow 包裝了經過優化的庫深度學習操作稱為 NVIDIA CUDA Deep Neural Network library(CuDNN)
#### 3.2.2. Installing Keras
* CPU版
* GPU版-需有NVIDIA GPU, 並安裝 CUDA & cuDNN
#### 3.2.3. Developing with Keras: a quick overview
* 建模方式有兩種
- keras_model_sequential function: 僅適用於線性的層堆疊,這是目前最常見的網絡架構
- functional API: 用於層的有向無環圖,使您可以構建完全任意的體系結構。
- 有向無環圖:在圖論中,如果一個有向圖從任意頂點出發無法經過若干條邊回到該點,則這個圖是一個有向無環圖。
* 學習的過程設定於編譯步驟,設定模型的 optimizer 與 loss function 及 metrics
* 通過 fit()方法將輸入數據(和相應的目標數據)數組傳遞給模型
### 3.3. SETTING UP A DEEP-LEARNING WORKSTATION
* 使用卷積網絡進行圖像處理和使用遞歸神經網絡進行序列處理,在CPU上,甚至在快速的多核CPU上,都將非常慢。
* 如果不想安裝 GPU,則可以選擇在AWS EC2 GPU instance 或 Google Cloud Platform上運行實驗。但 cloud instance 用越久越貴。
* 最好是用 Unix 系統,如果是 windows 用戶,建議裝雙系統 Ubuntu。
#### 3.3.1. Getting Keras running: two options
* run Keras experiments within RStudio Server on EC2
* local Unix workstation,需先有 high-end NVIDIA GPU.
#### 3.3.2. Running deep-learning jobs in the cloud: pros and cons
* 在雲中運行深度學習實驗是一種簡單,低成本的方法,無需購買任何其他硬件即可開始使用的方法,如 AWS EC2 + RStudio Server.
* EC2 很貴,一小時0.9鎂,一顆GPU約1000–1500鎂。
#### 3.3.3. What is the best GPU for deep learning?
* NVIDIA GPU
* mid-2017: NVIDIA TITAN Xp
* 便宜一點的: GTX 1060
### 3.4. CLASSIFYING MOVIE REVIEWS: A BINARY CLASSIFICATION EXAMPLE
#### 3.4.1. The IMDB dataset
* 25,000 reviews for training and 25,000 reviews for testing, each set consisting of 50% negative and 50% positive reviews
* multi-assignment (%<-%) operator from zeallot package
* 變量train_data和test_data是評論列表,每個評論都是單詞索引列表(編碼單詞序列)。 train_labels和test_labels是0和1的列表,其中0代表負評,1代表好評:
* decode review 回英文單字:
#### 3.4.2. Preparing the data
* 不能直接餵 list 進模型,需要轉為 tensor
- embedding layer: 填充列表,以使它們都具有相同的長度,將它們變成整數張量shape(samples,word_indices),然後將能夠處理此類整數張量的層用作網絡中的第一層
- one-hot encode 變成 0, 1的 vector
#### 3.4.3. Building your network
* The input data is vectors, and the labels are scalars (1s and 0s)
* simple stack of fully connected (dense) layers with relu activations: layer_dense(units = 16, activation = “relu”).
* 16 是 layer 中 hidden units 的個數
* hidden unit 是圖層表示空間中的維度。
* output = relu(dot(W, input) + b),16 個 hidden units表示 W 維度是(input_dimension, 16),內積會將input data投影到16-dim的表示空間中,加上偏差向量b,最後套用relu運算。
* 中間層使用 relu 作為激活函數,最後一層用 sigmoid 輸出機率。
- relu
- sigmoid
* 網路架構
* dense layer 只有內積和加法,只會有線性的表現。為了有更多元更豐富的假設空間,該空間將受深層表示影響,則需要非線性或激活函數,如relu, prelu, elu等等。
* loss function: binary_crossentropy loss。當輸出為機率時最好使用crossentropy,是一種量測機率分配之間距離或ground-truth分配與預測值之間的距離
的量值。
* 可以 custom optimizer, loss, metric function。
#### 3.4.4. Validating your approach
* fit()返回物件history包含模型參數history$params,還有計算的metrics history$metrics。
* plot(history) 可以視覺化的觀察每個epoch的metrics。
* 觀察到何時overfitting後,就可以選擇適合的epoch數,再建模。(Listing 3.9.)
#### 3.4.5. Using a trained network to generate predictions on new data
* 預測評論是好評的機率:
* model %>% predict(x_test[1:10,])
#### 3.4.6. Further experiments
* 新增或減少 hidden layer,一層或三層…
* 新增或減少 hidden units,32 or 64 …
* 改用 mse 當作 loss function
* 改用 tanh 當作 activation
#### 3.4.7. Wrapping up
* preprocessing: 將有序的文字編碼為 binary vectors (or 其他方式)
* dense layer 和 relu activation 可以解決大部分的分類問題
* 二元分類問題,模型架構應該要以一層 1 個 unit 的 dense layer (sigmaoid activaiton)作為結尾,並且輸出0, 1之間的純量值作為機率。
* 應使用 binary_crossentropy 作為 loss function
* optimizer 選擇 rmsprop 最適合,這是最不需要擔心的部分。
* 注意測試資料的 performance 而不是訓練資料