# 使用機器學習解決問題的五步驟：模型推論


<!--more-->

## 前言

這是「機器學習基礎觀念」系列的第七篇文章。前面已經走過[定義問題](../define-problem/)、[建立資料集](../prepare-dataset/)、[模型訓練](../model-training/)與[模型評估](../model-evaluate/)，這篇要談的是最後一步：模型推論 (Model Inference)。

不少人第一次看到這個名詞會覺得有點多餘：模型都訓練完了，把它搬到機器上跑不就好了嗎？這篇文章要說明的正是這件事沒那麼單純。以下會先解釋什麼是模型推論，再比較它和模型訓練的差異，最後介紹兩個實務上最常見的模型最佳化方法：Pruning 與 Quantization。

## 模型推論的意義

{{< image src="model-inference.jpg" alt="一張示意圖，資料輸入已訓練完成的模型後直接輸出預測結果。" caption="模型推論即是直接使用模型進行預測" >}}

模型推論指的是模型已經完成訓練與評估，被部署到實際的目標硬體上，接著把資料輸入模型、由模型產生預測結果的過程。換句話說，這是模型真正開始「上工」的階段。

用生活化的例子來說，模型推論就像一位經過長期訓練的士兵，通過了各種測驗，終於能夠獨當一面地作戰。

說到這裡可能還是有疑問。畢竟在模型訓練的過程中，我們同樣會把樣本輸入模型、同樣會拿到預測結果。難道模型訓練完成後，只要把模型「複製」到目標裝置上運行，就算是模型推論了嗎？

## 模型訓練與模型推論的差異

{{< image src="model-training-vs-model-inference.jpg" alt="一張左右對照圖，比較模型訓練與模型推論兩個階段的流程差異。" caption="模型訓練 (Model Training) 與模型推論 (Model Inference)" >}}

當然不是的。模型訓練的重點在於最小化損失函數 (Loss Function)，替模型找到一組最佳的參數。這個階段的模型可能相當複雜，裡頭包含了成千上萬的參數。訓練通常也跑在資源充足的機器上，多花一點記憶體、多算幾個小時都還在可接受範圍內。

模型推論的重點則完全不同：把模型部署到目標硬體裝置或是生產線上，實際開始應用模型來解決問題。既然要把模型用在現實情境中，模型的大小與運算量就會被慎重考慮，因為這兩件事直接牽動記憶體的用量、運算所需時間與所需電力。

| | 模型訓練 | 模型推論 |
|---|---|---|
| 目標 | 最小化損失函數，找出最佳參數 | 實際套用模型產生預測 |
| 執行環境 | 資源充足的訓練機器 | 目標硬體、生產線上的裝置 |
| 最在意的事 | 模型的準確度 | 模型大小、運算速度、能耗 |

舉例來說，如果我們訓練出一個「人臉辨識」模型並把它部署到「空拍機」上，為了增強空拍機的續航力，模型的運算過程勢必不能消耗太多電力；或者我們要把模型部署到「自駕車」上，那麼模型的運算速度一定要夠快，慢了一秒都可能發生意外。同一個模型放到不同硬體上，會遇到完全不同的限制，這就是推論階段真正的難處。

因此，模型推論不單單只是輸入資料並產生預測的過程，還必須最佳化模型的效能、速度與能耗。常見的最佳化方法有兩種：Pruning 與 Quantization。

## Pruning 與 Quantization

這裡先簡單說明兩者的概念。如果想更深入了解模型效能、速度與能耗的最佳化問題，可以參考 [TensorFlow 的官方文件](https://www.tensorflow.org/model_optimization/guide)。

- **Pruning**：全名為 Weight Pruning，中文稱為「權重修剪」。透過觀察模型中哪些參數對於模型的預測過程較沒有影響，將這些參數移除，達到降低模型複雜度與運算量的目的。概念上很像整理行李，把幾乎用不到的東西先拿出來，箱子就輕了。
- **Quantization**：中文稱為「量化」。模型中的參數如果是 32-bit 的浮點數，將其轉為 8-bit。透過簡化模型中參數的「精確程度」，達到降低模型體積並提高運算速度的目的。

不管是 Pruning 或是 Quantization，都是希望在簡化模型複雜度、提升運算速度並降低能源與時間消耗的同時，保持模型原來的預測準確度。這裡的眉角在於「同時」兩個字：把模型砍小很容易，難的是砍完之後準確度沒有掉太多，所以這兩種方法在實務上都需要反覆測試與取捨。

## 結論

這篇文章介紹了模型推論的概念，並比較它與模型訓練的差異：前者在意的是把模型跑得又快又省，後者在意的是把參數學好。也介紹了 Pruning 與 Quantization 這兩種模型最佳化的方法。

下一篇文章會用一個完整的例子，重新複習這五個步驟：定義問題、建立資料集、模型訓練、模型評估與模型推論。

