理論部分
Keras:
- 基於 python 的高階神經網路 API
- Francois Chollet 與 2014-2015 年編寫 Keras
- 以 Tensorflow、CNTK、Theano 為後端執行,keras 必須有後端才可以執行(現在一般多用 tensorflow)
- 極方便與快速實驗,幫助使用者以最少的時間驗證自己的想法
Tensorflow-keras:
- Tensorflow 對 keras API 規範的實現
- 相對於以 tensorflow 為後端的 keras,Tensorflow-keras 與Tensorflow 結合更加緊密
- 實現在 tf.keras 空間下
Tf-keras 和 keras 聯絡:
- 基於同一套 API(keras程式可以通過改匯入方式輕鬆轉為 tf.keras 程式;反之可能不成立,因為 tf.keras 有其他特性)
- 相同的 JSON 和 HDF5 模型序列化格式和語義
Tf-keras 和 keras 區別:
- Tf.keras 全面支援 eager mode
- 只是用 keras.Sequential 和 keras.Model 時沒影響
- 自定義 Model 內部運算邏輯的時候會有影響
- Tf 底層 API 可以使用 keras 的 model.fit 等抽象
- 適用於研究人員
- Tf.keras 支援基於 tf.data 的模型訓練
- Tf.keras 支援 TPU 訓練
- Tf.keras 支援 tf.distribution 中的分散式策略
- 其他特性
- Tf.keras 可以與 Tensorflow 中的 estimator 整合
- Tf.keras 可以儲存為 SavedModel
如果想用 tf.keras 的任何一個特性,那麼選 tf.keras
如果後端互換性很重要,那麼選 keras,如果都不重要,隨便選。
分類問題、迴歸問題、損失函式
分類問題
分類問題預測的是類別,模型的輸出是概率分佈。
三分類問題輸出例子:[0.2, 0.7, 0.1]
比如
- 第 0 類是「貓」類,
- 第 1 類是「狗」類,
- 第 2 類是「狼」類。
為什麼分類問題的模型輸出是概率分佈,這裡涉及到知識點「目標函式」
迴歸問題
迴歸問題預測的是值,模型的輸出是一個實數值。
比如房價預測問題,就屬於迴歸問題,房價是一個值。
目標函式
為什麼需要目標函式?
- 引數是逐步調整的(不像數學的計算問題,可以直接得到值,機器學習中需要目標函式逐步調整引數來逼近準確值)
- 分類問題舉例:目標函式可以幫助衡量模型的好壞(模型A 和 模型B 的準確率沒有區別,但 模型A 比 模型B 更接近正確結果)
- Model A:[0.1, 0.4, 0.5]
- Model B:[0.1, 0.2, 0.7]
分類問題需要很亮目標類別與當前預測的差距
- 三分類問題輸出例子:[0.2, 0.7, 0.1]
- 三分類真實類別:2 -> one_hot -> [0, 0, 1]
One-hot 編碼:把正整數變為向量表達
生成一個長度不小於正整數的向量,只有正整數的位置處為 1,其餘位置都為 0。
目標函式-分類問題
「平方差損失」,x,y都是向量,對應位置相減。
\displaystyle \frac{1}{n}\sum_{x,y}\frac{1}{2}(y-Model(x))^2
「交叉熵損失」,Model(x)是預測值。
\displaystyle \frac{1}{n}\sum_{x,y}y\ln(Model(x))
分類問題的平方差損失舉例:
- 預測值:[0.2, 0.7, 0.1]
- 真實值:[0, 0, 1]
- 損失函式值:[(0.2-0)^2 + (0.7-0)^2 + (0.1-1)^2]*0.5
由於預測值只有 1 個,所以 1/n = 1/1 = 1
目標函式-迴歸問題
- 預測值與真實值的差距
- 平方差損失
- 絕對值損失
「絕對值損失」\displaystyle \frac{1}{n}\sum_{x,y}\big|y-Model(x)\big|
模型的訓練就是調整引數,使得目標函式逐漸變小的過程。
實戰:Keras 搭建分類模型,Keras 搭建回撥函式, Keras 搭建迴歸模型。
神經網路、啟用函式、批歸一化、Dropout
神經網路
先看下三層神經網路的案例:
全連線層指的是層級結構中,下一層的神經單元都和上一層的神經單元相連線。
當然,每一層計算完畢之後都會用到「啟用函式」:
神經網路訓練
神經網路訓練使用「梯度下降」:
- 梯度下降
- 求導
- 更新引數
我們可以形象的想象一下“下山演算法”:
- 下山演算法
- 找到方向
- 走一步
深度神經網路
深度學習就是層次非常深的神經網路,以上我們看到的都是層次比較淺的神經網路,只有三層,如果有幾十幾百層的神經網路就叫做深度神經網路。
啟用函式
我們先介紹 6 種啟用函式:
Sigmoid:
\displaystyle \sigma(x)=\frac{1}{1+e^{-x}}
tanh:
\tanh(x)
ReLU
\max(0,x)
Leaky ReLU:
\max(0.1x,x)
Maxout:
\max(w_1^Tx+b_1,w_2^Tx+b_2)
ELU:
\displaystyle \left\{ \begin{aligned} x && x\geqslant0\\ \alpha(e^x-1) && x<0 \end{aligned} \right.
啟用函式圖:
歸一化
歸一化是把輸入資料做一個規整,使輸入資料均值為 0,方差為 1。
還有一些其他歸一化:
- Min-Max 歸一化:
\displaystyle x^*=\frac{x-\min}{\max-\min}
- Z-score 歸一化:
\displaystyle x^*=\frac{x-\mu}{\sigma}
批歸一化
每層的啟用值都做歸一化,把歸一化的範圍從輸入資料擴充到每層啟用值。
歸一化為何有效?
回顧梯度下降演算法:在當前狀態下給每一個變數都求一個導數,然後在這個導數的方向上把引數更新一點。上圖的未歸一化的兩個變數\theta_1和\theta_2的資料範圍是不一樣的,所以等高線看起來像是個橢圓,因為它是個橢圓,所以當在橢圓上計算梯度「法向量」的時候,它指向的並不一定是圓心,所以會導致訓練軌跡會非常曲折。經過歸一化的資料等高線是一個正圓,這意味著「法向量」都是對著圓心的,所以歸一化之後,它的訓練速度會更快。這是歸一化有效的一個原因。
Dropout
Droutout 在深度神經網路中會用到。
可以看到 Dropout 在全連線層隨機棄用一些神經單元,而且每層的棄用都不一樣的,棄用是隨機性的。
Dropout 作用:
- 防止過擬合(訓練集上很好,測試集上不好)
- 過擬合原因:模型引數太多,模型容易記住樣本,不能泛化
當樣本輸入的時候,每層啟用的值都非常大,就容易導致模型記住樣本。
實戰:Keras 實現深度神經網路,Keras 更改啟用函式, Keras 實現批歸一化,Keras 實現 dropout。
Wide & Deep 模型
Wide & Deep 模型在 16 年釋出,用於分類和迴歸,應用到了 Google Play 中的應用推薦,原始論文:提取碼:a8rg
稀疏特徵
- 離散值特徵
- One-hot 表示
- Eg:專業 = {計算機, 人文, 其他},人文 = [0, 1, 0]
- Eg:詞表 = {人工智慧,你,我,他,張量,…},他 = [0, 0, 0, 1, 0, …]
- 稀疏特徵之間可以做「叉乘」= {(計算機, 人工智慧), (計算機, 你), …}
- 稀疏特徵做叉乘獲取共現資訊
- 實現記憶的效果
稀疏特徵優點:有效,廣泛用於工業界。
稀疏特徵缺點:需要人工設計;可能過擬合,所有特徵都叉乘,相當於記住每一個樣本;泛化能力差,沒出現過就不會起效果。
例:組合問題,我很高興和我很快樂是一個意思,不能泛化。
密集特徵
向量表達:
- Eg:詞表 = {人工智慧, 你, 他, 愣酷},他 = [0.3, 0.2, 0.6, (n維向量)]
- Word2vec 工具
- 男 - 女 = 國王 - 王后
密集特徵的優點:帶有語義資訊,不同向量之間有相關性;相容沒有出現過的特徵組合;更少人工參與。
密集特徵缺點:過度泛化,推薦不怎麼相關的產品。
說明完畢,來看模型:
這是 Wide&Deep 模型的通用結構。
這是 Google play上的應用推薦演算法的模型圖。
實戰:子類API,功能API(函式式API),多輸入與多輸出。
超引數搜尋
超引數用手工去試耗費人力
- 神經網路有很多訓練過程中不變的引數
- 網路結構引數:層數,每層寬度,每層啟用函式等
- 訓練引數:batch_size,學習率,學習率衰減演算法等
batch_size 指的是一次訓練從訓練資料中選多少資料塞到神經網路中去。
搜尋策略
- 網格搜尋
- 隨機搜尋
- 遺傳演算法搜尋
- 啟發式搜尋
網格搜尋
網格搜尋步驟:
- 定義 n 維方格
- 每個方格對應一組超引數
- 一組一組引數嘗試
隨機搜尋
網格搜尋有個缺點,都只能取幾個固定的值,比如上面的網格搜尋圖示中取了 DropoutRate = [0.2, 0.4, 0.6, 0.8],但如果最優值是 0.5 那麼我們的網格搜尋將永遠不可能找到最優解。
遺傳演算法
遺傳演算法是對自然界的模擬
A. 初始化候選引數集合 -> 訓練 -> 得到模型指標作為生存概率
B. 選擇 -> 交叉 -> 變異 -> 產生下一代集合
C. 重新到 A
啟發式搜尋
- 研究熱點-AutoML
- 迴圈神經網路來生成引數
- 使用強化學習來進行反饋,使用模型來訓練生成引數
實戰:使用 scikit 實現超引數搜尋
實戰部分
Keras 搭建分類模型
Keras 回撥函式
Keras 搭建迴歸模型
Keras 搭建深度神經網路
Keras 與 scikit-learn 實現超引數搜尋
本作品採用《CC 協議》,轉載必須註明作者和本文連結