Tensorflow-keras

Galois發表於2020-03-04

理論部分

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

神經網路

先看下三層神經網路的案例:
d4mIifWEsl.png!large
全連線層指的是層級結構中,下一層的神經單元都和上一層的神經單元相連線。
當然,每一層計算完畢之後都會用到「啟用函式」:

qC4HeduLZy.png!large

神經網路訓練

神經網路訓練使用「梯度下降」:

  • 梯度下降
    • 求導
    • 更新引數

我們可以形象的想象一下“下山演算法”:

  • 下山演算法
    • 找到方向
    • 走一步

深度神經網路

深度學習就是層次非常深的神經網路,以上我們看到的都是層次比較淺的神經網路,只有三層,如果有幾十幾百層的神經網路就叫做深度神經網路。

啟用函式

我們先介紹 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.

啟用函式圖:

x67adzWdgv.png!large

歸一化

歸一化是把輸入資料做一個規整,使輸入資料均值為 0,方差為 1。
還有一些其他歸一化:

  • Min-Max 歸一化:

    \displaystyle x^*=\frac{x-\min}{\max-\min}

  • Z-score 歸一化:

    \displaystyle x^*=\frac{x-\mu}{\sigma}

批歸一化

每層的啟用值都做歸一化,把歸一化的範圍從輸入資料擴充到每層啟用值。
歸一化為何有效?

NE2w0pWQDT.png!large

回顧梯度下降演算法:在當前狀態下給每一個變數都求一個導數,然後在這個導數的方向上把引數更新一點。上圖的未歸一化的兩個變數\theta_1\theta_2的資料範圍是不一樣的,所以等高線看起來像是個橢圓,因為它是個橢圓,所以當在橢圓上計算梯度「法向量」的時候,它指向的並不一定是圓心,所以會導致訓練軌跡會非常曲折。經過歸一化的資料等高線是一個正圓,這意味著「法向量」都是對著圓心的,所以歸一化之後,它的訓練速度會更快。這是歸一化有效的一個原因。

Dropout

Droutout 在深度神經網路中會用到。
wfYgCszMqh.png!large
可以看到 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 模型的通用結構。
7EK40burCg.png!large
這是 Google play上的應用推薦演算法的模型圖。
aSXzUcQ2qb.png!large

實戰:子類API,功能API(函式式API),多輸入與多輸出。

超引數搜尋

超引數用手工去試耗費人力

  • 神經網路有很多訓練過程中不變的引數
    • 網路結構引數:層數,每層寬度,每層啟用函式等
    • 訓練引數:batch_size,學習率,學習率衰減演算法等

      batch_size 指的是一次訓練從訓練資料中選多少資料塞到神經網路中去。

搜尋策略

  • 網格搜尋
  • 隨機搜尋
  • 遺傳演算法搜尋
  • 啟發式搜尋
網格搜尋

XrCcLPjm5N.png!large

網格搜尋步驟:

  • 定義 n 維方格
  • 每個方格對應一組超引數
  • 一組一組引數嘗試
隨機搜尋

網格搜尋有個缺點,都只能取幾個固定的值,比如上面的網格搜尋圖示中取了 DropoutRate = [0.2, 0.4, 0.6, 0.8],但如果最優值是 0.5 那麼我們的網格搜尋將永遠不可能找到最優解。

3lCxFj2DmX.png!large

遺傳演算法

遺傳演算法是對自然界的模擬
A. 初始化候選引數集合 -> 訓練 -> 得到模型指標作為生存概率
B. 選擇 -> 交叉 -> 變異 -> 產生下一代集合
C. 重新到 A

啟發式搜尋
  • 研究熱點-AutoML
  • 迴圈神經網路來生成引數
  • 使用強化學習來進行反饋,使用模型來訓練生成引數

實戰:使用 scikit 實現超引數搜尋

實戰部分

Keras 搭建分類模型

Keras 回撥函式

Keras 搭建迴歸模型

Keras 搭建深度神經網路

Keras 與 scikit-learn 實現超引數搜尋

本作品採用《CC 協議》,轉載必須註明作者和本文連結

不要試圖用百米衝刺的方法完成馬拉松比賽。