

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 SageMaker AI DeepAR 預測演算法
<a name="deepar"></a>

Amazon SageMaker AI DeepAR 預測演算法是一種監督式學習演算法，利用遞迴神經網絡 (RNN) 來預測純量 (單一維度) 時間序列。古典的預測方法 (例如整合移動平均自迴歸模型 (ARIMA) 或指數平滑法 (ETS)) 會將單一模型套用到每個個別時間序列。他們接著會使用模型來將時間序列外插至未來。

但是在許多應用程式中，您在一組橫截面單位會有許多類似的時間序列。例如，您可能擁有針對不同產品、伺服器負載和網頁請求需求分組的時間序列。針對這類應用程式，您可以受益於跨越所有時間序列共同訓練的單一模型。DeepAR 便是採用此方法。當您的資料集包含數百個相關時間序列時，DeepAR 的執行效能會優於標準 ARIMA 和 ETS 方法。您也可以使用已訓練的模型，來對類似其已訓練過的新時間序列產生預測。

DeepAR 演算法的訓練輸入是一個或 (最好) 多個由相同程序或類似程序產生的 `target` 時間序列。根據此輸入資料集，演算法會訓練模型，學習這個程序/多個程序的近似值，並運用它來預測目標時間序列如何演進。每個目標時間序列都可以選擇性地關聯至靜態 (與時間無關) 分類特徵的向量 (由 `cat` 欄位提供) 及動態 (時間相依) 時間序列的向量 (由 `dynamic_feat` 欄位提供)。SageMaker AI 會透過從訓練資料集中的每個目標時間序列隨機抽樣數個訓練範例，來對 DeepAR 模型進行訓練。每個訓練範例都包括一對相鄰內容和具有固定預先定義長度的預測視窗。若要控制網路能看見的過去時間長度，請使用 `context_length` 超參數。若要控制網路對未來所能預測的時間長度，請使用 `prediction_length` 超參數。如需詳細資訊，請參閱[DeepAR 演算法的運作方式](deepar_how-it-works.md)。

**Topics**
+ [DeepAR 演算法的輸入/輸出介面](#deepar-inputoutput)
+ [使用 DeepAR 演算法的最佳實務](#deepar_best_practices)
+ [DeepAR 演算法的 EC2 執行個體建議事項](#deepar-instances)
+ [DeepAR 範例筆記本](#deepar-sample-notebooks)
+ [DeepAR 演算法的運作方式](deepar_how-it-works.md)
+ [DeepAR 超參數](deepar_hyperparameters.md)
+ [調校 DeepAR 模型](deepar-tuning.md)
+ [DeepAR 推論格式](deepar-in-formats.md)

## DeepAR 演算法的輸入/輸出介面
<a name="deepar-inputoutput"></a>

DeepAR 支援兩種資料通道。必要的 `train` 通道會描述訓練資料集。選擇性的 `test` 通道則會描述演算法在訓練後用來評估模型準確度的資料集。您可以以 [JSON Lines](http://jsonlines.org/) 格式提供訓練和測試資料集。檔案可以是 gzip 或 [Parquet](https://parquet.apache.org/) 檔案格式。

指定訓練和測試資料的路徑時，您可以指定單一檔案，或是包含多個檔案的目錄，而這些檔案也都可以存放在子目錄中。若您指定一個目錄，DeepAR 會使用該目錄中的所有檔案做為對應通道的輸入，除了開頭是句號 (.) 的檔案及名為 *\_SUCCESS* 的檔案。這能確保您可以直接使用 Spark 任務產生的輸出資料夾，做為 DeepAR 訓練任務的輸入通道。

根據預設，DeepAR 模型會從指定輸入路徑中的檔案副檔名判斷輸入格式 (`.json`、`.json.gz` 或 `.parquet`)。若路徑的結尾不在這些副檔名之中，您必須在適用於 Python 的 SDK 中明確指定格式。使用 [s3\_輸入](https://sagemaker.readthedocs.io/en/stable/session.html#sagemaker.session.s3_input)類別的`content_type` 參數。

您輸入檔案中的記錄應包含下列欄位：
+ `start`——有格式的字串`YYYY-MM-DD HH:MM:SS`。開始時間戳記不可包含時區資訊。
+ `target`——代表時間序列的浮點數值或整數陣列。您可以將遺失的值做為 `null` 常值編碼，或是做為 JSON 中的 `"NaN"` 字串，或是做為 Parquet 中的 `nan` 浮點數值。
+ `dynamic_feat`(選用) ——代表自訂特徵時間序列 (動態特徵) 向量的浮點數值或整數陣列。若您設定此欄位，所有記錄都必須擁有相同數量的內部陣列 (相同數量的特徵時間序列)。此外，每個內部陣列都必須與相關聯的 `target` 值再加上 `prediction_length` 的長度相同。特徵中不支援遺失的值。例如，如果目標時間序列代表不同產品的需求，相關聯的 `dynamic_feat` 可能是布林值時間序列，表示促銷是否套用 (1) 於特定產品 (0)：

  ```
  {"start": ..., "target": [1, 5, 10, 2], "dynamic_feat": [[0, 1, 1, 0]]}
  ```
+ `cat`(選用) — 可用來編碼記錄所屬群組的分類特徵陣列。分類特徵必須編碼為以 0 為基礎的正整數序列。例如，分類領域 {R, G, B} 可編碼成 {0, 1, 2}。每個分類領域中的所有值都必須出現在訓練資料集中。這是因為 DeepAR 演算法只能預測在訓練期間觀察到的分類。此外，每個分類特徵都會內嵌在低維度的空間中，而該空間的維度則由 `embedding_dimension` 超參數控制。如需詳細資訊，請參閱[DeepAR 超參數](deepar_hyperparameters.md)。

若您使用 JSON 檔案，該檔案必須是 [JSON Lines](http://jsonlines.org/) 格式。例如：

```
{"start": "2009-11-01 00:00:00", "target": [4.3, "NaN", 5.1, ...], "cat": [0, 1], "dynamic_feat": [[1.1, 1.2, 0.5, ...]]}
{"start": "2012-01-30 00:00:00", "target": [1.0, -5.0, ...], "cat": [2, 3], "dynamic_feat": [[1.1, 2.05, ...]]}
{"start": "1999-01-30 00:00:00", "target": [2.0, 1.0], "cat": [1, 4], "dynamic_feat": [[1.3, 0.4]]}
```

在此範例中，每個時間序列都有兩個相關聯的分類特徵，及一個時間序列特徵。

針對 Parquet，您會使用相同的三個欄位來做為欄。此外，`"start"` 可以是 `datetime` 類型。您可以使用 gzip (`gzip`) 或 Snappy 壓縮程式庫 (`snappy`) 來壓縮 Parquet 檔案。

如果演算法不使用 `cat` 和 `dynamic_feat` 欄位來訓練，則它會學習一個 “全球” 模型，這是在推論時間內與目標時間序列的特定身分無關的模型，僅以其形狀為條件。

如果模型以每個時間序列所提供的 `cat` 和 `dynamic_feat` 特徵資料為條件，則預測可能會受到具有相應 `cat` 特徵之時間序列的字元影響。例如，如果 `target` 時間序列代表服裝項目的需求，您可以在第一個元件中關聯編碼項目類型的二維 `cat` 向量 (例如，1 = 鞋子、0 = 包裝)，並在第二個元件中關聯項目的顏色 (例如 0 = 紅色、1 = 藍)。範例輸入如下所示：

```
{ "start": ..., "target": ..., "cat": [0, 0], ... } # red shoes
{ "start": ..., "target": ..., "cat": [1, 1], ... } # blue dress
```

在推論時，您可以請求具有 `cat` 值之目標的預測，這些值是訓練資料中觀察到的 `cat` 值組合，例如：

```
{ "start": ..., "target": ..., "cat": [0, 1], ... } # blue shoes
{ "start": ..., "target": ..., "cat": [1, 0], ... } # red dress
```

下列準則適用於訓練資料：
+ 時間序列的開始時間和長度可以不同。例如，在行銷中，產品通常在不同的日期進入零售目錄，所以它們的開始日期自然不同。但是，所有序列都必須有相同的頻率、類別特徵數和動態特徵數。
+ 根據檔案中時間序列的位置隨機輪換訓練檔案。換句話說，時間序列在檔案中應以隨機順序發生。
+ 請務必將 `start` 欄位設定正確。演算法使用 `start` 時間戳記來衍生內部特徵。
+ 若您使用分類特徵 (`cat`)，所有時間序列都必須具備相同數量的分類特徵。若資料集包含 `cat` 欄位，演算法會使用它並從資料集截取群組的基數。根據預設，`cardinality` 是 `"auto"`。若資料集包含 `cat` 欄位，但您不想要使用它，您可以將 `cardinality` 設為 `""` 來停用它。若模型是使用 `cat` 特徵訓練，您必須針對推論包含它。
+ 若您的資料集包含 `dynamic_feat` 欄位，演算法會自動使用它。所有時間序列都必須擁有相同數量的特徵時間序列。每個特徵時間序列鐘的時間點都會一對一地對應到目標中的時間點。此外，`dynamic_feat` 欄位中的項目應和 `target` 具有相同的長度。若資料集包含 `dynamic_feat` 欄位，但您不想要使用它，請透過設定來停用它 (將 `num_dynamic_feat` 設為 `""`)。若模型是使用 `dynamic_feat` 欄位訓練，您必須針對推論提供此欄位。此外，每個特徵都必須具備所提供目標加上 `prediction_length` 的長度。換句話說，您必須提供未來的特徵值。

如果您指定選用的測試通道資料，DeepAR 演算法會使用不同的準確率指標，來評估經過訓練的模型。演算法會針對測試資料，計算出均方根誤差 (RMSE)，如下所示：

![RMSE 公式：Sqrt(1/nT(Sum[i,t](y-hat(i,t)-y(i,t))^2))](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/deepar-1.png)


*y**i*,*t* 是時間序列 *i* 在時間 *t* 時的真值，而 *ŷ**i*,*t* 是預測平均值。總和涵蓋了測試集中的所有 *n* 時間序列，以及每個時間序列最後的 T 時間點，其中的 T 對應預測期間。您可以藉由設定 `prediction_length` 超參數，來指定預測期間的長度。如需詳細資訊，請參閱[DeepAR 超參數](deepar_hyperparameters.md)。

此外，演算法會使用加權分位數損失來評估預測分布的準確度。對於落在範圍 [0, 1] 之中的分位數，加權分位數損失的定義如下：

![加權分位數損失方程式。](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/deepar-2.png)


 *q**i*,*t*(τ) 是模型所預測分布的 τ-quantile (τ 分位數)。若要指定要為哪些分位數計算損失，請設定 `test_quantiles` 超參數。除了這些之外，指定的分位數損失平均會做為訓練日誌的一部分報告。如需相關資訊，請參閱[DeepAR 超參數](deepar_hyperparameters.md)。

針對推論，DeepAR 接受 JSON 格式及下列欄位：
+  `"instances"`，包含一或多個 JSON Lines 格式的時間序列
+  `"configuration"` 的名稱，包含產生預測的參數 

如需詳細資訊，請參閱[DeepAR 推論格式](deepar-in-formats.md)。

## 使用 DeepAR 演算法的最佳實務
<a name="deepar_best_practices"></a>

準備時間序列資料時，請遵循下列最佳實務以取得最佳結果：
+ 除了分割訓練和測試資料集以外，一律為訓練、測試，和在呼叫模型以進行推論時提供整個時間序列。無論您如何設定 `context_length`，都不要分割時間序列或只提供一部分。針對延遲值特徵，模型會使用比 `context_length` 中所設定的值更往前的資料點。
+ 調校 DeepAR 模型時，您可以分割資料集來建立訓練資料集和測試資料集。在典型評估中，您會在用於訓練，但是位於訓練期間可見最後一個時間點之後未來 `prediction_length` 時間點的相同時間序列上測試模型。您可以建立滿足此條件的訓練和測試資料集，方法是使用整個資料集 (所有可用時間序列的完整長度) 做為測試集，並在訓練期間從每個時間序列移除最後一個 `prediction_length` 點以用於訓練。在訓練期間，模型便會看不到訓練期間它所評估時間點的目標值。在測試期間，演算法會保留測試集中每個時間序列的最後一個 `prediction_length` 點，並產生預測。然後，它會比較預測與保留的值。您可以多次重複測試集內的時間序列，但在不同的端點切斷它們，以建立更複雜的評估。使用此方法，平均指標便會從不同時間點的多個預測進行平均。如需詳細資訊，請參閱[調校 DeepAR 模型](deepar-tuning.md)。
+ 請避免針對 `prediction_length` 使用過大的值 (>400)，因為這樣會使模型變慢而且較不準確。如果您想要進一步預測未來，請考慮以更低的頻率彙整您的資料。例如，使用 `5min` 代替 `1min`。
+ 由於使用了延遲，模型可以往回查看時間序列中比 `context_length` 所指定的值更早的時間。因此，您不必將此參數設為較大的值。我們建議您從針對 `prediction_length` 所使用的值開始。
+ 我們建議您盡量在越多的時間序列上訓練 DeepAR 模型。雖然在單一時間序列上訓練的 DeepAR 模型可能可以正常運作，但標準的預測演算法 (例如 ARIMA 或 ETS) 可能可以提供更準確的結果。當您的資料集包含數百個相關時間序列時，DeepAR 演算法的執行效能便會開始優於標準方法。目前，DeepAR 要求所有訓練時間序列中可用的觀察總數至少為 300。

## DeepAR 演算法的 EC2 執行個體建議事項
<a name="deepar-instances"></a>

您可以在 GPU 和 CPU 執行個體上訓練 DeepAR，並且可採用單部機器和多部機器的設定。我們建議從單一 CPU 執行個體 (例如，ml.c4.2xlarge 或 ml.c4.4xlarge) 開始，然後只在必要時切換到 GPU 執行個體和多部機器。使用 GPU 和多部機器只能改善較大模型 (擁有許多層且每一層有許多儲存格) 和大型迷你批次大小 (例如大於 512) 的輸送量。

針對推論，DeepAR 只支援 CPU 執行個體。

為 `context_length`、`prediction_length`、`num_cells`、`num_layers` 或 `mini_batch_size` 指定較大的值，可能會建立對小型執行個體來說過大的模型。在這種情況下，請使用較大的執行個體類型，或是減少這些參數的值。此問題也會在執行超參數調校任務時頻繁發生。在這種情況下，請使用大小適合模型調校任務的執行個體類型，並考慮限制關鍵參數的數值上限，避免任務失敗。

## DeepAR 範例筆記本
<a name="deepar-sample-notebooks"></a>

如需示範如何為訓練 SageMaker AI DeepAR 演算法準備時間序列資料集，以及如何部署訓練模型以執行推論的範例筆記本，請參閱 [DeepAR demo on electricity dataset](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_amazon_algorithms/deepar_electricity/DeepAR-Electricity.html)，該內容示範了在真實世界資料集上運用 DeepAR 的進階功能的方式。如需建立和存取您可以用來在 SageMaker AI 執行範例的 Jupyter 筆記本執行個體說明，請參閱[Amazon SageMaker 筆記本執行個體](nbi.md)。在建立並開啟筆記本執行個體後，請選擇 **SageMaker AI 範例**索引標籤以查看所有 SageMaker AI 範例的清單。若要開啟筆記本，請選擇其**使用**標籤，然後選擇**建立複本**。

如需 Amazon SageMaker AI DeepAR 演算法的詳細資訊，請參閱下列部落格文章：
+ [Amazon SageMaker AI 現已推出：DeepAR 演算法可更精確地預測時間序列](https://aws.amazon.com/blogs/machine-learning/now-available-in-amazon-sagemaker-deepar-algorithm-for-more-accurate-time-series-forecasting/)
+ [使用 Amazon SageMaker AI 進行深度需求預測](https://aws.amazon.com/blogs/machine-learning/deep-demand-forecasting-with-amazon-sagemaker/)