

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

# 搭配 Amazon SageMaker AI 使用強化學習
<a name="reinforcement-learning"></a>

強化學習 (RL) 結合電腦科學、神經科學和心理學等領域，以釐清如何將各種情況映射到相關動作，藉此最大化數值獎勵訊號。RL 中獎勵訊號的這種概念源於神經科學研究，探究人類大腦如何決定哪些動作可最大化獎勵並最小化懲罰。在大多數情況下，人類並無明確指示該採取哪些動作，而是必須了解哪些動作會產生最立即的獎勵，以及這些動作如何影響未來的情況和後果。

RL 的問題使用源於動態系統理論的馬可夫決策過程 (MDP) 來公式化。MDP 旨在擷取學習代理程式在嘗試實現一些最終目標時，於一段時間內所遇到的真實問題之高層次細節。學習代理程式應能夠判斷自身環境的目前狀態，並識別會影響學習代理程式目前狀態的可能動作。此外，學習代理程式的目標應與環境的狀態有極大的相互關聯。以這種方式公式化的問題之解決方案稱為：強化學習方法。

## 強化、監督式和非監督式學習範例之間有何區別？
<a name="rl-differences"></a>

機器學習可分為三種不同的學習範例：監督式、非監督式和強化。

在監督式學習中，外部主管提供一組標籤範例的訓練集。每個範例都包含狀況的相關資訊、屬於哪個類別，並具有識別其所屬類別的標籤。監督式學習的目標是推廣，以便出現訓練資料中不存在的情況時能正確預測。

相較之下，RL 處理的是互動問題，因此收集所有使用代理程式可能遇到的正確標籤的情況範例是不可行的。當代理程式能夠準確地從自身經驗中學習並相應地進行調整時，這種類型的學習會是最有前途的。

在非監督式學習中，代理程式會透過發現未標籤資料中的結構來學習。雖然 RL 代理程式可能會從基於其經驗的結構探索中受益，但 RL 的唯一目的是最大化獎勵訊號。

**Topics**
+ [

## 強化、監督式和非監督式學習範例之間有何區別？
](#rl-differences)
+ [

## 為什麼強化學習很重要？
](#rl-why)
+ [

## 馬可夫決策過程 (MDP)
](#rl-terms)
+ [

## Amazon SageMaker AI RL 的主要功能
](#sagemaker-rl)
+ [

## 強化學習範例筆記本
](#sagemaker-rl-notebooks)
+ [

# 使用 Amazon SageMaker AI RL 的範例 RL 工作流程
](sagemaker-rl-workflow.md)
+ [

# Amazon SageMaker AI 中的 RL 環境
](sagemaker-rl-environments.md)
+ [

# Amazon SageMaker AI RL 的分散式訓練
](sagemaker-rl-distributed.md)
+ [

# 使用 Amazon SageMaker AI RL 進行超參數調校
](sagemaker-rl-tuning.md)

## 為什麼強化學習很重要？
<a name="rl-why"></a>

RL 非常適合解決大型複雜的問題，例如供應鏈管理、HVAC 系統、工業機器人、遊戲人工智慧、對話系統和自動駕駛汽車。由於 RL 模型是透過代理程式所採取動作的獎勵與懲罰連續程序來學習的，因此可以在不確定及動態的環境下訓練系統以進行決策。

## 馬可夫決策過程 (MDP)
<a name="rl-terms"></a>

RL 是以稱為馬可夫決策過程 (MDP) 的模型為基礎。MDP 由一系列的時間步驟組成。每個時間步驟都包含下列項目：

Environment  
定義 RL 模型運作的空間。這可以是真實世界環境或模擬器。例如，若您訓練一台實體道路上的實體自動車，該環境便是一個真實世界環境。若您訓練一個電腦程式，為在道路上行駛的自動車建立模型，該環境便是一個模擬器。

State  
指定與環境相關的所有資訊，以及與未來相關的過去步驟。例如，在機器人可以在任何時間步驟中往任何方向移動的 RL 模型中，目前時間步驟中機器人的位置便是狀態，因為我們知道機器人所在的位置，而無須了解機器人到達該位置所需採取的步驟。

Action  
代理程式的功能 例如，機器人可以向前一步。

獎勵  
代表狀態值的數字，該狀態是代理程式所採取最近一個動作的結果。例如，若機器人的目標是尋找寶藏，則尋找寶藏的獎勵可以是 5，而沒有找到寶藏的獎勵則可以是 0。RL 模型會嘗試尋找一個策略，最佳化長期下來的累積獎勵。此策略稱為*政策*。

觀察  
與環境狀態有關的資訊，可供代理程式在每個步驟時使用。這可以是整個狀態，或是狀態的一部分。例如，下西洋棋模型中的代理程式可能可以在任何步驟中觀察棋盤的整個狀態，但迷宮中的機器人則可能只能觀察到迷宮中其目前所處位置的那一小部分。

一般而言，在 RL 中進行訓練包含了許多*集*。每一集都包含 MDP 中所有的時間步驟，從初始狀態開始，直到環境到達最終狀態為止。

## Amazon SageMaker AI RL 的主要功能
<a name="sagemaker-rl"></a>

若要在 SageMaker AI RL 中訓練 RL 模型，請使用下列元件：
+ 一個深度學習 (DL) 框架。目前，SageMaker AI 支援 TensorFlow 和 Apache MXNet 中的 RL。
+ RL 工具組。RL 工具組可管理代理程式和環境間的互動，並提供各種最先進的 RL 演算法。SageMaker AI 支援 Intel Coach 和 Ray RLlib 工具組。如需 Intel Coach 的資訊，請參閱 [https://nervanasystems.github.io/coach/](https://nervanasystems.github.io/coach/)。如需 Ray RLlib 的資訊，請參閱 [https://ray.readthedocs.io/en/latest/rllib.html](https://ray.readthedocs.io/en/latest/rllib.html)。
+ RL 環境。您可以使用自訂環境、開放原始碼環境，或是商業環境。如需相關資訊，請參閱[Amazon SageMaker AI 中的 RL 環境](sagemaker-rl-environments.md)。

下圖顯示 SageMaker AI RL 中支援的 RL 元件。

![\[SageMaker AI RL 中支援的 RL 元件。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/sagemaker-rl-support.png)


## 強化學習範例筆記本
<a name="sagemaker-rl-notebooks"></a>

如需完整的程式碼範例，請參閱 SageMaker AI 範例儲存庫中的[強化學習範例筆記本](https://github.com/aws/amazon-sagemaker-examples/tree/main/reinforcement_learning)。

# 使用 Amazon SageMaker AI RL 的範例 RL 工作流程
<a name="sagemaker-rl-workflow"></a>

以下範例說明使用 Amazon SageMaker AI RL 開發 RL 模型的步驟。

1. **公式化 RL 問題**—首先，您必須將企業問題公式化成 RL 問題。例如，自動調整規模可讓服務根據您定義的條件，動態增加或減少容量。目前，這需要透過設定警示、調整規模政策、閾值及其他手動步驟來完成。為了使用 RL 解決此問題，我們會定義馬可夫決策過程的元件：

   1. **目標**—擴展執行個體的容量，使其符合所需的負載設定檔。

   1. **環境**—一個自訂環境，其中包含了負載設定檔。它會使用每天及每週的變化，以及偶爾發生的峰值，產生一個模擬負載。模擬系統在請求新資源及提供資源給請求使用之間會有一段延遲。

   1. **狀態**—目前的負載、失敗的任務數量，以及作用中的機器數量。

   1. **動作**—移除、新增或保持相同數量的執行個體。

   1. **獎勵**—超過指定閾值時，成功交易的正面獎勵，以及交易失敗時的嚴重懲罰。

1. **定義 RL 環境**—RL 環境可以是與 RL 代理程式互動的真實世界，或是真實世界的模擬。您可以連線使用 Gym 介面開發的開放原始碼和自訂環境，以及像是 MATLAB 和 Simulink 這種商業模擬環境。

1. **定義預設**—預設會設定 RL 訓練任務，並定義 RL 演算法的超參數。

1. **撰寫訓練程式碼**—以 Python 指令碼的形式撰寫訓練程式碼，然後將指令碼傳遞給 SageMaker AI training 訓練任務。在您的訓練任務中，匯入環境檔案及預設檔案，然後定義 `main()`函式。

1. **訓練 RL 模型**—使用 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable) 中的 SageMaker AI `RLEstimator` 來啟動 RL 訓練任務。若您使用本機模式，則訓練任務會在筆記本執行個體上執行。當您使用 SageMaker AI 進行訓練時，您可以選取 GPU 或 CPU 執行個體。若您在本機模式中進行訓練，請將訓練任務的輸出存放在本機目錄中；或您使用 SageMaker AI 訓練，則請存放在 Amazon S3 上。

   `RLEstimator` 需要使用以下資訊做為參數。

   1. 上傳環境、預設和訓練程式碼的來源目錄。

   1. 指向訓練指令碼的路徑。

   1. 您希望使用的 RL 工具組及深度學習框架。它會自動解析至 RL 容器的 Amazon ECR 路徑。

   1. 訓練參數，例如執行個體數、任務名稱，以及輸出的 S3 路徑。

   1. 您希望在日誌中擷取的指標定義。這些也可以在 CloudWatch 中及 SageMaker AI 筆記本內視覺化。

1. **視覺化訓練指標和輸出**—在使用 RL 模型的訓練任務完成後，您可以在 CloudWatch 中檢視您在訓練任務中定義的指標。您也可以使用 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable) 分析程式庫，在筆記本中繪製指標。視覺化指標可協助您透過隨時間逐步改善的獎勵，來了解模型的效能。
**注意**  
若您在本機模式中進行訓練，您無法在 CloudWatch 中視覺化指標。

1. **評估模型**—您可以在檢查點通道中繼續傳遞先前訓練模型中建立檢查點的資料，以進行評估和推論。在本機模式中，使用本機目錄。在 SageMaker AI 訓練模式中，您需要先將資料上傳到 S3。

1. **部署 RL 模型** - 最後，使用 在 SageMaker AI 容器或邊緣裝置上託管的端點上部署訓練模型 AWS IoT Greengrass。

如需 RL 搭配 SageMaker AI 的詳細資訊，請參閱[使用 RL 搭配 Sagemaker Python SDK](https://sagemaker.readthedocs.io/en/stable/using_rl.html)。

# Amazon SageMaker AI 中的 RL 環境
<a name="sagemaker-rl-environments"></a>

Amazon SageMaker AI RL 使用環境來模擬真實世界案例。指定環境的目前狀態及代理程式所採取的動作，模擬器便會處理動作的影響，並傳回下一個狀態及獎勵。當在真實世界中訓練代理程式不安全時 (例如操控一台無人機)，或是當 RL 演算法花費太多時間進行收斂時 (例如下西洋棋時)，模擬器便會很有用。

下圖顯示與一個賽車遊戲模擬器互動的範例。

![\[與一個賽車遊戲模擬器互動的範例。\]](http://docs.aws.amazon.com/zh_tw/sagemaker/latest/dg/images/sagemaker-rl-flow.png)


模擬環境由代理程式及模擬器組成。此處，卷積神經網路 (CNN) 會使用來自模擬器的影像，產生動作來控制遊戲控制器。透過多次模擬，此環境會產生形式為 `state_t`、`action`、`state_t+1` 及 `reward_t+1` 的訓練資料。定義獎勵並不容易，且會影響 RL 模型的品質。我們希望提供幾個獎勵函式的範例，但也想要讓使用者能夠進行設定。

**Topics**
+ [

## 在 SageMaker AI RL 中針對環境使用 OpenAI Gym 介面
](#sagemaker-rl-environments-gym)
+ [

## 使用開放原始碼環境
](#sagemaker-rl-environments-open)
+ [

## 使用商業環境
](#sagemaker-rl-environments-commercial)

## 在 SageMaker AI RL 中針對環境使用 OpenAI Gym 介面
<a name="sagemaker-rl-environments-gym"></a>

若要在 SageMaker AI RL 中使用 OpenAI Gym 環境，請使用下列 API 元素。如需有關 OpenAI Gym 的詳細資訊，請參閱 [Gym 文件](https://www.gymlibrary.dev/)。
+ `env.action_space`—定義代理程式能採取的動作，指定每個動作是否連續或離散，並在動作為連續動作時，指定最小值及最大值。
+ `env.observation_space`—定義代理程式從環境接收到的觀察，以及連續觀察的最小值及最大值。
+ `env.reset()`—初始化訓練集。`reset()` 函式會傳回環境的初始狀態，而代理程式則會使用初始狀態來採取第一個動作。動作接著會重複傳送到 `step()`，直到集到達最終狀態為止。當 `step()` 傳回 `done = True` 時，集便會結束。RL 工具組會呼叫 `reset()` 來重新初始化環境。
+ `step()`—將代理動作做為輸入，並輸出環境的下一個狀態、獎勵、集是否已終止，以及一個 `info` 字典來通訊除錯資訊。環境需要負責驗證輸入。
+ `env.render()`—用於具備視覺化的環境。RL 工具組會在每一次呼叫 `step()` 函式後，呼叫此函式來擷取環境的視覺化。

## 使用開放原始碼環境
<a name="sagemaker-rl-environments-open"></a>

您可以在 SageMaker AI RL 中，透過建置您自己的容器，來使用開放原始碼環境 (例如 EnergyPlus 和 RoboSchool)。如需 EnergyPlus 的詳細資訊，請參閱 [https://energyplus.net/](https://energyplus.net/)。如需 RoboSchool 的詳細資訊，請參閱 [https://github.com/openai/roboschool](https://github.com/openai/roboschool)。[SageMaker AI 範例儲存庫](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/reinforcement_learning)中的 HVAC 和 RoboSchool 範例會示範，如何建立自訂容器以搭配使用 SageMaker AI RL：

## 使用商業環境
<a name="sagemaker-rl-environments-commercial"></a>

您可以在 SageMaker AI RL 中，透過建置您自己的容器，來使用商業環境 (例如 MATLAB 和 Simulink)。您需要管理您自己的授權。

# Amazon SageMaker AI RL 的分散式訓練
<a name="sagemaker-rl-distributed"></a>

Amazon SageMaker AI RL 支援多核心及多執行個體分散式訓練。根據您的使用案例，可以分散訓練和 (或) 環境推出。例如，SageMaker AI RL 可針對下列分散式案例運作：
+ 單一訓練執行個體及相同執行個體類型的多個推出執行個體。如需範例，請參閱 [SageMaker AI 範例儲存庫](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/reinforcement_learning)中的神經網路壓縮範例。
+ 單一訓練員執行個體和多個推出執行個體，其中訓練和推出的執行個體類型皆不同。如需範例，請參閱 AWS SageMaker AI 範例儲存庫中的 DeepRacer /RoboMaker 範例。 AWS RoboMaker [SageMaker ](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/reinforcement_learning)
+ 使用多核心以進行推出的單一訓練員執行個體。如需範例，請參閱 [SageMaker AI 範例儲存庫](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/reinforcement_learning)中的 Roboschool 範例。若模擬環境相當輕巧，可在單一執行緒上執行，這將非常有用。
+ 用於訓練和推出的多個執行個體。如需範例，請參閱 [SageMaker AI 範例儲存庫](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/reinforcement_learning)中的 Roboschool 範例。

# 使用 Amazon SageMaker AI RL 進行超參數調校
<a name="sagemaker-rl-tuning"></a>

您可以執行超參數調校任務，來最佳化 Amazon SageMaker AI RL 的超參數。[SageMaker AI 範例儲存庫](https://github.com/awslabs/amazon-sagemaker-examples/tree/master/reinforcement_learning)範例筆記本中的 Roboschool 範例顯示如何使用 RL Coach 執行此操作。啟動器指令碼會示範如何從 Coach 預設檔案中抽象化參數，以及最佳化他們的方式。