

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

# 適用於時間序列資料的內建 SageMaker AI 演算法
<a name="algorithms-time-series"></a>

SageMaker AI 提供專為分析時間序列資料量身打造的演算法，以用於預測產品需求、伺服器負載、網頁要求等。
+ [使用 SageMaker AI DeepAR 預測演算法](deepar.md) — 一種監督式學習演算法，利用遞迴神經網絡 (RNN) 來預測純量 (單一維度) 時間序列。


| 演算法名稱 | 頻道名稱 | 訓練輸入模式 | 檔案類型 | 執行個體類別 | 可平行化 | 
| --- | --- | --- | --- | --- | --- | 
| DeepAR Forecasting | 訓練和 (選擇性) 測試 | 檔案 | JSON Lines 或 Parquet | GPU 或 CPU | 是 | 

# 使用 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 會使用該目錄中的所有檔案做為對應通道的輸入，除了開頭是句號 (.) 的檔案及名為 *\$1SUCCESS* 的檔案。這能確保您可以直接使用 Spark 任務產生的輸出資料夾，做為 DeepAR 訓練任務的輸入通道。

根據預設，DeepAR 模型會從指定輸入路徑中的檔案副檔名判斷輸入格式 (`.json`、`.json.gz` 或 `.parquet`)。若路徑的結尾不在這些副檔名之中，您必須在適用於 Python 的 SDK 中明確指定格式。使用 [s3\$1輸入](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 為基礎的正整數序列。例如，分類領域 \$1R, G, B\$1 可編碼成 \$10, 1, 2\$1。每個分類領域中的所有值都必須出現在訓練資料集中。這是因為 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/)

# DeepAR 演算法的運作方式
<a name="deepar_how-it-works"></a>

在訓練期間，DeepAR 接受訓練資料集和選擇性的測試資料集。它會使用測試資料集來評估訓練模型。一般而言，資料集不必包含相同的時間序列。您可以使用對指定訓練集進行訓練的模型，對訓練集中時間序列的未來以及其他時間序列產生預測。訓練和測試資料集都包含一或更多個 (建議) 目標時間序列。每個目標時間序列都可以選擇性的與特徵時間序列的向量和分類特徵的向量建立關聯。如需詳細資訊，請參閱[DeepAR 演算法的輸入/輸出介面](deepar.md#deepar-inputoutput)。

例如，以下是使用 *i* 建立索引訓練集中的一個元素，該訓練集由目標時間序列 *Zi,t* 和兩個相關聯的特徵時間序列 (*Xi,1,t* 及 *Xi,2,t*) 組成：

![\[圖 1：目標時間序列及相關聯的特徵時間序列\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/ts-full-159.base.png)


目標時間序列可包含遺漏值，以時間序列中的斷行表示。DeepAR 僅支援未來已知的特徵時間序列。這可讓您執行 “假設” 藍本。例如：如果我以某種方式變更產品的價格，會發生什麼事？ 

每個目標時間序列也可以與多個分類特徵建立關聯。您可以使用這些特徵來編碼時間序列所屬的分組。分類特徵可讓模型了解群組的典型行為，用來增加模型的準確度。DeepAR 透過學習每個群組的內嵌向量 (用於擷取群組中所有時間序列的共通屬性) 來實作這一點。

## DeepAR 演算法中特徵時間序列的運作方式
<a name="deepar_under-the-hood"></a>

為了促進學習時間依存模式 (例如週末的峰值)，DeepAR 會根據目標時間序列的頻率自動建立特徵時間序列。它會使用這些衍生特徵時間序列，搭配您在訓練和推論期間提供的自訂特徵時間序列。下圖顯示兩個衍生時間序列特徵：*ui,1,t* 代表一天中的小時，而 *ui,2,t* 則代表星期幾。

![\[圖 2：衍生時間序列\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/ts-full-159.derived.png)


DeepAR 演算法會自動產生這些特徵時間序列。下表列出所支援基本時間頻率的衍生特徵。


| 時間序列的頻率 | 衍生特徵 | 
| --- | --- | 
| Minute |  `minute-of-hour`, `hour-of-day`, `day-of-week`, `day-of-month`, `day-of-year`  | 
| Hour |  `hour-of-day`, `day-of-week`, `day-of-month`, `day-of-year`  | 
| Day |  `day-of-week`, `day-of-month`, `day-of-year`  | 
| Week |  `day-of-month`, `week-of-year`  | 
| Month |  年中的月  | 

DeepAR 會透過從訓練資料集中的每個時間序列隨機抽樣數個訓練範例，來進行訓練。每個訓練範例都包括一對相鄰內容和具有固定預先定義長度的預測視窗。`context_length` 超參數會控制網路可以看到過去多久的時間，而 `prediction_length` 超參數則會控制可對未來多遠的時間進行預測。在訓練期間，演算法會忽略時間序列比指定預測長度短的訓練集元素。下圖呈現五個從元素 *i* 擷取，內容長度為 12 小時，預測長度為 6 小時的樣本。為求簡化，我們已省略特徵時間序列 *xi,1,t* 和 *ui,2,t*。

![\[圖 3：抽樣時間序列\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/ts-full-159.sampled.png)


為了擷取季節性模式，DeepAR 也會從目標時間序列自動傳送延遲值。在頻率為每小時的範例中，針對每個時間索引 (*t = T*)，模型會公開 *zi,t* 值 (發生在過去大約一天、兩天和三天)。

![\[圖 4：延遲時間序列\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/ts-full-159.lags.png)


進行推論時，訓練過的模型會接受目標時間序列做為輸入 (這些時間序列在訓練時不一定使用過)，並預測下一個 `prediction_length` 值的概率分布。由於 DeepAR 是以整個資料集進行訓練，因此預測會將從類似時間序列學習到的模式列入考慮。

如需 DeepAR 背後的數學資訊，請參閱 [DeepAR: Probabilistic Forecasting with Autoregressive Recurrent Networks](https://arxiv.org/abs/1704.04110)。

# DeepAR 超參數
<a name="deepar_hyperparameters"></a>

下表列出使用 Amazon SageMaker AI DeepAR 預測演算法進行訓練時可設定的超參數。


| 參數名稱 | Description | 
| --- | --- | 
| context\$1length |  模型在進行預測之前所看到時間點的數量。此參數的值應和 `prediction_length` 大致相同。模型也會從目標接收到延遲的輸入，因此 `context_length` 可能會比典型的季節週期小上許多。例如，每日時間序列可以有每年季節性。模型會自動包含一年的延遲年，因此內容的長度可能會比一年短。模型所選擇的延遲值，取決於時間序列的頻率。例如，每日頻率的延遲值為前一週、2 週、3 週、4 週和一年。 **必要** 有效值：正整數  | 
| epochs |  針對訓練資料的最高傳遞次數。最佳值取決於您的資料大小和學習速率。另請參閱`early_stopping_patience`。典型值介於 10 到 1000 之間。 **必要** 有效值：正整數  | 
| prediction\$1length |  要訓練模型預測的時間步長，也稱為預測期間。經過訓練的模型一律會使用此長度來產生預測。該模型無法產生較長期間的預測。在訓練模型時，`prediction_length` 是固定的，而且之後無法變更。 **必要** 有效值：正整數  | 
| time\$1freq |  資料集中時間序列的精細程度。請使用 `time_freq` 來選擇適合的日期特徵和延遲。模型支援下列基本頻率。它也支援多個基本頻率。例如，`5min` 會指定 5 分鐘的頻率。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/deepar_hyperparameters.html) **必要** 有效值：其後跟隨 *M*、*W*、*D*、*H* 或 *min* 的整數。例如，`5min`。  | 
| cardinality |  使用分類特徵 (`cat`) 時，`cardinality` 是一個陣列，指定每個分類特徵的分類 (群組) 數。將此設為 `auto` 來從資料推導基數。`auto` 模式也可以在資料集中沒有使用分類特徵時運作。這是該參數的建議設定。 將基數設為 `ignore` 來強制 DeepAR 不使用分類特徵，即使資料中存在該特徵也一樣。 若要執行額外的資料驗證，您可以將此參數明確設為實際的值。例如，若提供了兩個分類特徵，其中第一個具有 2 個，另一個則具有 3 個可能值，請將此設為 [2, 3]。 如需如何使用分類特徵的詳細資訊，請參閱 DeepAR 主要文件頁面的資料一節。 **選用** 有效值：`auto`、`ignore`、正整數陣列、空白字串，或  預設值：`auto`  | 
| dropout\$1rate |  在訓練中所使用的丟棄率。模型使用範圍限制 (zoneout) 正規化。針對每次反覆運算，不會更新隱藏神經元的隨機子集。典型值小於 0.2。 **選用** 有效值：浮點數 預設值：0.1  | 
| early\$1stopping\$1patience |  如果設定此參數，在 `epochs` 的指定時間數值內沒有進度時，訓練就會停止。損失最低的模型會做為最終的模型傳回。 **選用** 有效值：整數  | 
| embedding\$1dimension |  針對每個分類特徵學會的內嵌向量大小 (會對所有分類特徵使用相同的值)。 如果提供了類別分組特徵，DeepAR 模型可以學習分組層級的時間序列模式。為完成此項動作，模型會針對每個分組，學習大小為 `embedding_dimension` 的內嵌向量，擷取分組中所有時間序列的共通屬性。較大的 `embedding_dimension` 可讓模型擷取更為複雜的模式。不過，由於增加 `embedding_dimension` 會增加模型中參數的數量，因此也會需要更多的訓練資料，來準確地學習這些參數。此參數的典型值介於 10 到 100 之間。 **選用** 有效值：正整數 預設值：10  | 
| learning\$1rate |  在訓練中所使用的學習率。典型值介於 1e-4 到 1e-1 之間。 **選用** 有效值：浮點數 預設值：1e-3  | 
| likelihood |  此模型會產生機率預測，並可提供分佈的分位數並傳回樣本。根據您的資料，選擇適合用來估計不確定性的可能性 (雜訊模型)。您可以選擇下列的可能性： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/deepar_hyperparameters.html) **選用** 有效值：*gaussian*、*beta*、*negative-binomial*、*student-T* 或 *deterministic-L1* 其中一個。 預設值：`student-T`  | 
| mini\$1batch\$1size |  訓練期間所使用迷你批次的大小。典型值介於 32 到 512 之間。 **選用** 有效值：正整數 預設值：128  | 
| num\$1cells |  要在 RNN 的每個隱藏層中使用的單元數。典型值介於 30 到 100 之間。 **選用** 有效值：正整數 預設值：40  | 
| num\$1dynamic\$1feat |  資料中所提供的 `dynamic_feat` 數量。將此設為 `auto` 來從資料推導動態特徵數。`auto` 模式也可以在資料集中沒有使用動態特徵時運作。這是該參數的建議設定。 若要強制 DeepAR 不使用動態特徵，並且即使資料中存在該特徵也不使用，請將 `num_dynamic_feat` 設為 `ignore`。 若要執行額外的資料驗證，您可以將此參數明確設為實際的整數值。例如，若提供了兩個動態特徵，請將此設為 2。 **選用** 有效值：`auto`、`ignore`、正整數或空白字串 預設值：`auto`  | 
| num\$1eval\$1samples |  計算測試準確度指標時，針對每個時間序列所使用的樣本數。此參數不會對訓練或最終模型產生任何影響。特別是，可以使用不同數量的樣本查詢模型。此參數只會影響訓練後測試通道報告的準確度分數。較小的值可以加快評估速度，但評估分數通常會變差且更不確定。使用較高的分位數 (例如 0.95) 來進行評估時，考慮增加評估樣本的數量可能會很重要。 **選用** 有效值：整數 預設值：100  | 
| num\$1layers |  RNN 中隱藏層的數量。典型值介於 1 到 4 之間。 **選用** 有效值：正整數 預設值：2  | 
| test\$1quantiles |  要計算測試通道分位數損失的分位數。 **選用** 有效值：浮點數的陣列 預設值：[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]  | 

# 調校 DeepAR 模型
<a name="deepar-tuning"></a>

*自動模型調校*，又稱為超參數調校，會透過在您的資料集上，執行許多測試超參數範圍的任務，來尋找最佳版本的模型。您可以選擇可調校的超參數、每一個超參數的值範圍，及目標指標。您可以從演算法運算的指標中選擇目標指標。自動模型調校會搜尋所選擇的超參數，以找出產生之模型可最佳化目標指標的值組合。

如需模型調校的詳細資訊，請參閱[使用 SageMaker AI 執行自動模型調校](automatic-model-tuning.md)。

## 由 DeepAR 演算法運算的指標
<a name="deepar-metrics"></a>

DeepAR 演算法會報告三個指標，這三個指標都是在訓練期間運算而得。調校模型時，請選擇這些指標中的其中一個做為目標。針對目標，請使用所提供測試通道上的預測準確度 (建議) 或訓練損失。如需 DeepAR 演算法訓練/測試分割的建議事項，請參閱[使用 DeepAR 演算法的最佳實務](deepar.md#deepar_best_practices)。


| 指標名稱 | Description | 最佳化方向 | 
| --- | --- | --- | 
| test:RMSE |  預測和測試集上實際運算目標之間的均方根誤差。  |  最小化  | 
| test:mean\$1wQuantileLoss |  在測試集上運算而得到的平均整體分位數損失。若要控制要使用的分位數，請設定 `test_quantiles` 超參數。  |  最小化  | 
| train:final\$1loss |  模型中最後一個訓練 epoch 內的平均負 log 可能性 (negative log-likelihood)。  |  最小化  | 

## DeepAR 演算法之可調校的超參數
<a name="deepar-tunable-hyperparameters"></a>

使用下列超參數調校 DeepAR 模型。依照程度最大到程度最小進行排序，對 DeepAR 目標指標影響程度最大的超參數為：`epochs`、`context_length`、`mini_batch_size`、`learning_rate` 與 `num_cells`。


| 參數名稱 | 參數類型 | 建議範圍 | 
| --- | --- | --- | 
| epochs |  `IntegerParameterRanges`  |  MinValue: 1、MaxValue: 1000  | 
| context\$1length |  `IntegerParameterRanges`  |  MinValue: 1、MaxValue: 200  | 
| mini\$1batch\$1size |  `IntegerParameterRanges`  |  MinValue: 32、MaxValue: 1028  | 
| learning\$1rate |  `ContinuousParameterRange`  |  MinValue: 1e-5、MaxValue: 1e-1  | 
| num\$1cells |  `IntegerParameterRanges`  |  MinValue: 30、MaxValue: 200  | 
| num\$1layers |  `IntegerParameterRanges`  |  MinValue: 1、MaxValue: 8  | 
| dropout\$1rate |  `ContinuousParameterRange`  |  MinValue: 0.00、MaxValue: 0.2  | 
| embedding\$1dimension |  `IntegerParameterRanges`  |  MinValue: 1、MaxValue: 50  | 

# DeepAR 推論格式
<a name="deepar-in-formats"></a>

以下頁面說明使用 Amazon SageMaker AI DeepAR 模型進行推論的請求和回應格式。

## DeepAR JSON 請求格式
<a name="deepar-json-request"></a>

利用模型的端點來查詢訓練過的模型。該端點接受下列的 JSON 請求格式。

在請求中，`instances` 欄位對應於模型應該預測的時間序列。

如果模型是使用分類來進行訓練，您必須為每個執行個體提供 `cat`。如果模型在訓練時並未使用 `cat` 欄位，則應省略此欄位。

若模型是使用自訂特徵時間序列 (`dynamic_feat`) 進行訓練，您必須為每個執行個體提供相同數量的 `dynamic_feat` 值。每個值都必須具備 `length(target) + prediction_length` 所指定的長度，其中最後的 `prediction_length` 值會對應到將預測未來中的時間點。若模型並未使用自訂特徵時間序列進行訓練，則不應在請求中包含此欄位。

```
{
    "instances": [
        {
            "start": "2009-11-01 00:00:00",
            "target": [4.0, 10.0, "NaN", 100.0, 113.0],
            "cat": [0, 1],
            "dynamic_feat": [[1.0, 1.1, 2.1, 0.5, 3.1, 4.1, 1.2, 5.0, ...]]
        },
        {
            "start": "2012-01-30",
            "target": [1.0],
            "cat": [2, 1],
            "dynamic_feat": [[2.0, 3.1, 4.5, 1.5, 1.8, 3.2, 0.1, 3.0, ...]]
        },
        {
            "start": "1999-01-30",
            "target": [2.0, 1.0],
            "cat": [1, 3],
            "dynamic_feat": [[1.0, 0.1, -2.5, 0.3, 2.0, -1.2, -0.1, -3.0, ...]]
        }
    ],
    "configuration": {
         "num_samples": 50,
         "output_types": ["mean", "quantiles", "samples"],
         "quantiles": ["0.5", "0.9"]
    }
}
```

`configuration` 欄位是選擇性的。`configuration.num_samples` 會設定模型產生，以估計平均數和分位數的樣本路徑數。`configuration.output_types` 則描述了應在請求中傳回的資訊。有效值為 `"mean"` `"quantiles"` 和 `"samples"`。如果您指定 `"quantiles"`，則在 `configuration.quantiles` 中的每個分位數值都會以時間序列的形式傳回。如果您指定 `"samples"`，模型也會傳回用來計算其他輸出的原始樣本。

## DeepAR JSON 回應格式
<a name="deepar-json-response"></a>

下列是回應的格式，其中 `[...]` 為數字陣列：

```
{
    "predictions": [
        {
            "quantiles": {
                "0.9": [...],
                "0.5": [...]
            },
            "samples": [...],
            "mean": [...]
        },
        {
            "quantiles": {
                "0.9": [...],
                "0.5": [...]
            },
            "samples": [...],
            "mean": [...]
        },
        {
            "quantiles": {
                "0.9": [...],
                "0.5": [...]
            },
            "samples": [...],
            "mean": [...]
        }
    ]
}
```

DeepAR 的回應逾時為 60 秒。在單一請求中傳遞多個時間序列時，預測會依序產生。因為每個時間序列的預測通常需要 300 到 1000 毫秒以上的時間，根據模型的大小，在單一請求中傳遞太多時間序列可能會造成逾時。建議在每個請求中傳遞較少數量的時間序列，並傳送更多請求。因為 DeepAR 演算法針對每個執行個體使用多個工作者，您可以透過平行傳送多個請求來取得更高的輸送量。

根據預設，DeepAR 會針對每個 CPU 使用一個工作者進行推論 (若每個 CPU 有足夠的記憶體)。若模型較大且沒有足夠的記憶體來在每個 CPU 上執行模型，便會減少工作者的數量。用於推論的工作者數量可使用環境變數 `MODEL_SERVER_WORKERS` 覆寫。例如，在呼叫 SageMaker AI [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateModel.html) API 時設定 `MODEL_SERVER_WORKERS=1`)。

## 使用 DeepAR 演算法進行批次轉換
<a name="deepar-batch"></a>

DeepAR 預測支援使用 JSON Lines 格式，利用批次轉換從資料取得推論。在此格式中，每個記錄都會在單行上以 JSON 物件表示，每一行則會由換行字元分隔。其格式與用於模型訓練的 JSON Lines 格式完全相同。如需相關資訊，請參閱[DeepAR 演算法的輸入/輸出介面](deepar.md#deepar-inputoutput)。例如：

```
{"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]]}
```

**注意**  
使用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html) 建立轉換任務時，將 `BatchStrategy` 值設為 `SingleRecord`，並將 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html) 組態中的 `SplitType` 值設為 `Line`，因為預設值目前會導致導致執行期錯誤。

與託管端點推論請求格式相似，若符合下列條件，則每個執行個體的 `cat` 和 `dynamic_feat` 都是必要項目：
+ 模型是在同時包含 `cat` 和 `dynamic_feat` 欄位的資料集上訓練。
+ 訓練任務中所使用的對應 `cardinality` 和 `num_dynamic_feat` 值並未設為 `"".`

與託管端點推論不同，組態欄位只會使用名為 `DEEPAR_INFERENCE_CONFIG` 的環境變數，為整個批次推論任務設定一次。`DEEPAR_INFERENCE_CONFIG` 的值可以在呼叫 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html) API 建立模型時傳遞。若容器環境中遺失 `DEEPAR_INFERENCE_CONFIG`，則推論容器會使用下列預設：

```
{
    "num_samples": 100,
    "output_types": ["mean", "quantiles"],
    "quantiles": ["0.1", "0.2", "0.3", "0.4", "0.5", "0.6", "0.7", "0.8", "0.9"]
}
```

輸出也是 JSON Lines 格式，每一行代表每一個預測，其順序則與對應輸入檔案中的執行個體順序相同。預測會編碼成物件，並且和線上推論模式中回應所傳回的物件完全相同。例如：

```
{ "quantiles": { "0.1": [...], "0.2": [...] }, "samples": [...], "mean": [...] }
```

請注意，在 SageMaker AI [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html) 請求的 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_TransformInput.html) 組態中，用戶端必須將 `AssembleWith` 值明確設定為 `Line`，因為預設值 `None` 會將所有 JSON 物件串連在同一行。

例如，以下是具有自訂 `DEEPAR_INFERENCE_CONFIG` 之 DeepAR 任務的 SageMaker AI [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html) 請求：

```
{
   "BatchStrategy": "SingleRecord",
   "Environment": { 
      "DEEPAR_INFERENCE_CONFIG" : "{ \"num_samples\": 200, \"output_types\": [\"mean\"] }",
      ...
   },
   "TransformInput": {
      "SplitType": "Line",
      ...
   },
   "TransformOutput": { 
      "AssembleWith": "Line",
      ...
   },
   ...
}
```