ML-Agents(七)訓練指令與訓練配置文件


ML-Agents(七)訓練指令與訓練配置文件

一、背景

到現在為止,官方的示例已經研究三個了,但是說實話自己去按官方的配置文件訓練,有時候並不能完全訓練出好的模型,而且官方的配置文件配置項都不是很明白,因此想在看下一個示例之前,先來研究一下官方關於配置文件的文檔,通俗點就是翻譯一下,有可能其中會找到我之前在訓練模型時遺漏的點。

當然如果大家有時間的話,還是可以去學習一下ML-Agents的理論,就是機器學習那套。我自己的話直接把ML-Agents當黑盒來用了,一般我的理念就是先學會怎么用,要知道能解決什么問題,然后遇到不懂得再看原理,這樣就是有好有壞,主要看個人喜好。

以下翻譯內容主要來自ml-agents的github文檔:

https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Training-ML-Agents.md

二、訓練命令

先來翻譯一下官方文檔中Command Line Training Options部分,這一部分主要是在Anaconda的命令行里要輸入的訓練命令字,之前我們已經見過一些了,例如--run-id=<run-identifier>就是存儲訓練模型的名稱,--sampler=<file>就是讀取可變參數配置等。下面我們來看一下官方比較全的命令:

  • --env=<env>:指定要訓練的可執行環境。這個命令是可選的,因為我們之前訓練都是利用UnityIDE直接去訓練的,因此之前的命令我都沒有加這個。但是如果你的訓練環境是發布出來的可執行程序,那就需要加這個命令來指定發布后的程序路徑了。

  • --curriculum=<file>:如果你的訓練是Curriculum Learning,這個命令可以指定你要訓練的課程配置文件,官方也有一個示例(Wall Jump)專門展示了Curriculum Learning這種訓練類型,這里我們之后的文章再去深入研究。

  • --lesson=<n>:指定在執行Curriculum Learning時要開始的課程,默認為0。

  • --sampler=<file>:用於指定訓練環境的可變參數的配置文件。我們之前也有提到過,具體內容可以看ML-Agents(四)3DBall補充の引入泛化

  • --save-freq=<n>:指定在訓練過程中保存模型的頻率,默認為50000。這個命令之前也沒有用過,具體是什么用途有待考察。

  • --keep-checkpoints=<n>:指定了要保存模型的檢查點的最大數量。該屬性與上面的--save-freq=<n>有命令關,即在n步后,會記錄一個檢查點。此外,新的檢查點形成,會使得老的檢查點刪除,默認存5個檢查點。當然,這個命令也沒用過,明白的童靴可以留言交流一下。

  • --num-envs=<n>:指定在訓練時,從幾個Unity環境實例中收集數據,默認為1。當然如果是發布的程序,你就可以多開幾個程序讓訓練數據更多。

  • --run-id=<run-identifier>:為每個訓練指定一個標識符(id)。這個id主要用於命名保存的訓練模型、統計信息以及模型名稱(就是在models、summaries文件夾下),默認id為“ppo”。如果用tensorboard查看訓練統計數據,則每個訓練模型的唯一id也是你設置的<run-idetifier>

  • --seed=<n>:指定一個數字作為訓練代碼使用的隨機數生成器的seed。

  • --env-args=<string>:為可執行程序傳參,具體給Unity傳參可以參考官方文檔Unity Command Line Arguments。例如,命令mlagents-learn config/trainer_config.yaml --env-args --num-orcs 42會將--num-ors 42傳遞給可執行文件。

  • --base-port:指定啟動的端口。用於多個Unity程序連接會依次分配一個端口。默認是5005。當然我們之前都是直接使用IDE進行訓練的,所以這一項直接可以忽略。

  • --inference:指定是否僅在推理模式下運行。這種模式會忽略對對模型的訓練。要加載現有的訓練模型,需要結合--reusme以及run-id來使用。

  • --resume:如果設置這一項,則訓練代碼會在訓練前加載已經訓練好的模型去初始化神經網絡。訓練代碼會在models/<run-id>目錄下查找訓練模型。這個選項僅在模型存在且具有與場景中當前代理相同的行為名稱(Behavior Name)時才有效。

    --inference--resume我還沒想到有什么適用場合,基本上就是用已有的訓練模型繼續訓練來用的?目前看起來還用不到。

  • --force:當要使用之前已經使用過的run-id來訓練模型會拋出錯誤。適用--force來強制覆蓋原有id的數據模型和數據統計。

  • --initialize-form=<run-identifier>:指定一個已存在的訓練模型來初始化新的訓練模型。但是注意,當前的訓練環境行為參數要與之前保存的訓練模型參數相同才可以。

  • --no-graphics:指定Unity以-batchmode運行,並且不初始化圖形驅動程序。當然注意只適用於訓練中不涉及視覺觀察(Observations,讀取像素訓練)。關於Unity不利用GPU運行請查看這里Unity官方文檔

  • --debug:此選項可以輸出代碼某些部分的調試代碼日志。

  • --cpu:強制只使用CPU訓練。

  • Unity設置:

    • --width:Unity運行時窗口的寬度,單位像素,默認84(IDE訓練可忽略)。
    • --height:有width,就有height,與上相同,指高度,默認84,同樣IDE訓練可忽略。
    • --quality-level:設置Unity的QualitySettings.SetQualityLevel屬性,即畫面質量,默認為5。
    • --time-scale:設置Unity的Time.timeScale屬性,即游戲時間縮放比例,默認為20,最大為100。下次試試把這個值調大一些,是否可以加快訓練速度。
    • --target-frame-rate:設置Unity的Application.targetFrameRate,即設置游戲幀率,默認為-1,即不設置,一般為60幀每秒。

OK,以上就是官方已有的命令,下面來看一下與訓練效果相關的配置文件各個屬性是什么含義。

三、訓練配置文件

在官方ml-agents的源碼中,配置文件都在config文件夾下,例如有config/trainer_config.yamlconfig/sac_trainer_config.yamlgail_config.yaml等配置文件,它們分別指定了當使用PPO(Proximal Policy Optimization)、SAC(Soft Actor-Critic)、GAIL(Generative Adversarial Imitation Learning)的訓練方法、超參數和一些附加值。其實這三種訓練方法就是ml-agents支持的三種訓練類型。這些配置文件都是yaml格式的,一開始是的部分是default部分,對於所有訓練都適用,當然在指定的訓練部分可以重設置default里的屬性來覆蓋default里的設置。每一部分的開頭即是Unity中Behavior Parameters腳本的Behavior Name屬性。

屬性 描述 適用的訓練類型
batch_size 梯度下降每次迭代的樣本批量大小。相對於正常數據,如果過小,訓練數據收斂困難,過大處理速度加快,但所需內存(顯存)增大。不過該值並非越大越好。 PPO,SAC
batches_per_epoch 在模仿學習中,在訓練模型之前收集的訓練示例數量。
beta 熵正則化的強度。 PPO
buffer_size 更新策略模型之前要收集的經驗數量。在SAC中,為經驗緩存取得最大大小。 PPO,SAC
buffer_init_steps 在更新策略模型之前要收集到緩沖區中的經驗總數。 SAC
epsilon 影響策略在訓練過程中的形成速度。 PPO
hidden_units 神經網絡隱含層的單位數。 PPO,SAC
init_entcoef 在訓練開始時,agent應該探索多深。 SAC
lambd 正則化參數。 PPO
learning_rate 梯度下降的初試學習率。 PPO,SAC
learning_rate_schedule 確定學習速度隨時間的變化。 PPO,SAC
max_steps 在訓練期間要模擬步驟的最大步數。 PPO,SAC
memory_size 一個agent必須保留的內存大小。主要用於遞歸神經網絡的訓練,示例Hallway用到了該屬性,詳見Using Recurrent Neural Networks PPO,SAC
normalize 是否自動標准化觀測值。 PPO,SAC
num_epoch 執行梯度下降優化時,通過經驗緩沖區的遍歷次數。 PPO
behavioral_cloning 使用演示引導神經網絡的策略。詳見Pretraining Using Demonstrations中的(Optional) Behavioral Cloning Using Demonstrations PPO,SAC
reward_signals 用來訓練策略的獎勵信號。適用於Curiosity和GAIL。詳見Reward Signals PPO,SAC
save_replay_buffer 退出訓練時保存到回放緩存區,並在恢復時加載。 SAC
sequence_length 定義當訓練時,經驗序列必須為多長。僅用於遞歸神經網絡的訓練。詳見Using Recurrent Neural Networks PPO,SAC
summary_freq 設置多久一次保存統計數據。主要決定了在tensorboard中顯示數據點的數量。 PPO,SAC
tau 在SAC訓練中,如何主動更新用於引導值估計的目標網絡。 SAC
time_horizon 在將每個agent添加到經驗緩沖區之前,需要多少步訓練。 PPO,SAC
trainer 要執行的訓練類型:"ppo","sac","offline_bc"或"online_bc"。 PPO,SAC
train_interval 更新代理的頻率。 SAC
num_update 在每次更新期間用於更新代理的最小批量數。 SAC
use_recurrent 使用遞歸神經網絡進行訓練。詳見Using Recurrent Neural Networks PPO,SAC
init_path 從之前保存的模型初始化trainer。 PPO,SAC

以上大部分都是直譯,其中有許多深度學習的相關內容,如果翻譯不准確請見諒。還有我這里的地址不是官方github地址,由於我圖快捷,把ml-agents克隆到gitee上了,所以打開應該是我的gitee倉儲,影響應該不大。

官方文檔又對以下內容分別作了文檔:

下面我主要再研究一下Training with PPOTraining with SAC以及Reward Signals。其中最后一篇Traning with Environment Parameter Randomization已經在ML-Agents(四)3DBall補充の引入泛化研究過了,有興趣的童靴可以去看看。剩下的幾篇我准備在具體官方示例中再研究。

四、用PPO訓練

這章對應官方文檔 Training with Proximal Policy Optimization。文檔一開始主要就是介紹了PPO,PPO是如何與Unity訓練的等等,開頭都是些客套話,該文檔主要說明一點:要成功地訓練一個強化學習模型通常涉及調整訓練超參數,而該文檔則包含一些最佳實踐,用於參考來調優訓練過程。下面直接開始。

配置文件參數

  • Reward Signals

    在強化訓練中,目標就是要學習一種使獎勵最大化的策略(Policy)。在基礎層面上,獎勵是由環境給予的。然而我們可能會遇到獎勵擁有不同行為的agent。例如,我們可以讓agent探索新的狀態而獲得獎勵,而不是僅僅給予明確的獎勵;再例如,我們還可以使用混合獎勵信號來幫助學習過程。

    使用reward_signals可以定義獎勵信號。ML-Agents默認提供三種獎勵信號:外部(環境)獎勵信號、好奇心獎勵信號(可用於agent進行探索)和GAIL獎勵信號(對抗模仿學習)。具體的Reward Signals一會兒來看。

  • Lambda

    lambd對應於當計算廣義優勢估計時使用的lambd參數。這個參數可以被認為是agent在計算更新值估計時,依賴其當前估計值的多少。低值對應於agent更多地依賴於當前值估計(可能是高偏差),高值對應於更多的依賴於環境中收到的實際獎勵(可能是高方差)。該參數提供了兩者之間的平衡值,正確的值可使得更穩定的訓練過程。

    推薦范圍:0.9-0.95

  • Buffer Size

    buffer_size對應於在我們對模型進行任何學習或更新前,需要收集多少經驗(包括agent的observations、actions以及獲得的rewards)。這應該是batch_size的倍數。通常,較大的buffer_size對應於更穩定的訓練更新。

    推薦范圍:2048-409600

  • Batch Size

    batch_size是一個梯度下降迭代更新的樣本數量。它應該始終是buffer_size的一小部分。如果你的agent使用的是連續動作空間(Continuous Type),那這個值應該要大一些(大約1000s);如果agent使用的是離散動作空間(Discrete Type),那這個值應該小一些(大約10s)。

    Continuous Type推薦范圍:512-5120

    Discrete Type推薦范圍:32-512

  • Number of Epochs

    num_epoch是在梯度下降過程中通過經驗緩存區的次數。batch_size越大,這個值越大也是可接受的。減少該值將確保更新更穩定,但是會降低學習速度。

    推薦范圍:3-10

  • Learning Rate

    learning_rate對應於每個梯度下降更新步驟的強度。如果訓練不穩定,該值應該減少,並且獎勵不能持續增加。

    推薦范圍:1e-5-1e-3

  • (可選)Learning Rate Schedule

    learning_rate_schedule對應於學習率如何隨時間變化。對於PPO來說,建議在max_steps之前降低學習速率,這樣學習才能更穩定地收斂。但是在某些情況下(例如訓練時間未知),可以禁用此功能。

    選擇項:

    • linear(默認):線性衰減learning.rate,在max_steps到達最大步數時到達0
    • constant:在整個訓練過程中,保持學習速率恆定。
  • Time Horizon

    time_horizon對應於在將每個agent添加到經驗緩存區之前要收集多少訓練步數。當在一個episode結束之前達到此值時,將使用一個值估計來預測agent當前狀態的總體預期回報。因此,該參數在偏差較小但變化較大的估計值(長時間范圍)和偏差較大但變化較小的估計值(短時間范圍)之間進行權衡。在一個episode里agent如果頻繁獲得獎勵或者episode數量非常大的情況下,該值更小可能更理想。該值應該足夠大,以捕獲agent動作序列中所有重要行為。

    推薦范圍:32-2048

  • Max Steps

    max_steps對應於在訓練過程中運行了多少步模擬(乘以跳幀)。對於較復雜的問題,該值應該增大。

    推薦范圍:5e5-1e7

  • Beta

    beta對應於熵正則化的強度,這使得策略更具“隨機性”。該值使得agent在訓練過程中正確地探索動作空間。增加該值將使得agent執行更多的隨機動作。該值應該被調整成,使得entropy(熵)在tensorboard中顯示隨着獎勵的增加而緩慢減小。如果entropy下降太快,則增加beta,如果entropy下降太慢,則減小beta

    推薦范圍:1e-4-1e-2

  • Epsilon

    epsilon對應於梯度下降更新過程中新舊policy之間可接受的差異閾值。將此值設置得較小將導致更穩定的更新,但也會減慢訓練過程。

    推薦范圍:0.1-0.3

  • Normalize

    normalize對應於是否對輸入的矢量觀測值(vector observation)進行規范化處理。這種歸一化是基於矢量觀測值的平均值和方差。規范化對於復雜的連續控制(continuous control)問題很有用,但對於較簡單的離散控制(discrete control)可能反而有害。

  • Number of Laters

    num_layers對應於觀察值輸入之后或在視覺觀察的CNN編碼之后存在多少個隱藏層。對於簡單的問題,更少的層數可使得訓練更加迅速、高效。對於更復雜的控制問題,可能需要更多的層。

    推薦范圍:1-3

  • Hidden Units

    hidden_units對應於神經網絡的每個全連接層中有多少個單元。對於簡單的問題,正確的操作是將觀察輸入直接組合,因此該值應該較小。對於動作是觀察變量之間非常復雜的交互問題,這個值應該較大。

    推薦范圍:32-512

  • (可選)Visual Encoder Type

    vis_encode_type對應於visual observations進行編碼的編碼器類型。有效地選項包括:

  • (可選)Recurrent Neural Network Hyperparameters

    以下超參數僅在use_recurrent為true時使用。

    • Sequence Length

      sequence_length對應於訓練過程中通過網絡傳遞的經驗序列的長度。該值應該足夠大以捕獲agent隨時間推移可能需要記住的任何信息。例如,如果agent需要記住物體的速度,則該值可能很小。如果agent需要記住一段episode開始時只給出一次的信息,那么該值應該更大。

      推薦范圍:4-128

    • Memory Size

      memory_size對應於存儲策略的遞歸神經網絡隱藏狀態的浮點數數組的大小。該值必須是2的倍數,並且應該與期望agent成功完成任務所需記住的信息量成比例。

      推薦范圍:32-256

  • (可選)Behavioral Cloning Using Demonstrations

    在某些情況下,你可能希望使用player記錄的行為來引導agent的策略。這可以幫助指導agent獲得獎勵。行為克隆(BC)增加了模擬演示的訓練操作,而不是試圖使報酬最大化。

    要使用BC,請在trainer_config中添加一個behavioral_cloning部分,例如:

    behavioral_cloning:
            demo_path: ./Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
            strength: 0.5
            steps: 10000
    

    以下為BC可用的超參數。

    • Strength

      strength對應於模仿的學習率相對於PPO的學習率,大致對應的使我們允許BC對policy的影響強度。

      推薦范圍:0.1-0.5

    • Demo Path

      demo_path.demo文件或.demo文件目錄的路徑。有關.demo文件的更多信息,詳見imitation learning guide

    • Steps

      在BC期間,通常希望agent在“看到”獎勵后停止使用演示,並允許其優化過去可用的demonstrations和/或概括所提供的演示之外的內容。steps對應於激活BC的訓練步驟。BC的學習率將隨步驟逐步提高。將steps設置為0,以便在整個訓練過程中持續模仿。

    • (可選)Batch Size

    batch_size是梯度下降更新的一次迭代的樣本數。如果未指定,則默認為PPO的batch_size

    推薦范圍(Continuous):512-5120

    推薦范圍(Discrete):32-512

    • (可選)Number of Epochs

    num_epoch是在梯度下降過程中通過經驗緩存區的次數。如果未指定,則默認為PPO的num_epoch

    推薦范圍:3-10

    • (可選)Samples Per Update

      samples_per_update是每個模擬更新期間使用的最大樣本數。如果演示數據集非常大,則可能需要降低該值,以避免在演示上過渡擬合策略。設置為0,以便在每個更新步驟中對所有演示進行訓練。

      默認值:0(所有)

      推薦范圍:大於等於PPO的buffer_size

    • (可選)Advanced: Initialize Model Path

      init_path可以指定在開始訓練之前初始化以前訓練的模型。注意,以前的模型的訓練配置需要與當前運行的相同,並且使用相同版本的ML-Agents保存。同時要提供全路徑存儲,例如./models/{run-id}/{behavior_name}

      如果要從不同的運行中初始化不同的行為,則使用該項。大多數情況下,使用--initialize-fromCLI參數足以從同一運行中初始化所有模型。

訓練統計參數

使用PPO訓練后,在tensorboard的參數解釋。

  • Cumulative Reward

    獎勵的總體趨勢應隨時間不斷增減。預計會有小的欺負。根據任務的復雜性,獎勵可能不會顯著增加,有可能直到訓練到數百萬步才增加。

  • Entropy

    該值對應於決策的隨機性。在訓練期間該值應該不斷減小。如果該值下降的太快或者根本沒有減小,則應該調整beta(當使用discrete action space時)。

  • Learning Rate

    默認情況下,在line schedule中,該值會隨時間減小,除非learning_rate_schedule設置為constant

  • Policy Loss

    策略損失,該值會在訓練過程中振盪。通常它們應該小於1.0。

  • Value Estimate

    該值應該隨着獎勵積累的增加而增加。它們對應於agent預測自己在任何給定時間點上會得到多少獎勵。

  • Value Loss

    該值會隨着獎勵的增加而增加,一旦獎勵變得穩定,該值則應降低。

五、用SAC訓練

對應官方文檔: Training with Soft-Actor Critic

與PPO不同的是,SAC(Soft-Actor Critic)是off-policy訓練,這意味着它可以從過去任何時候收集的經驗中學習。收集經驗后,它們被放置在經驗回放緩沖區,並在訓練期間隨機抽取。這使得SAC大大提高了采樣效率,與PPO相比學習相同的任務通常采樣量少5-10倍。但是,SAC往往需要更多的模型更新。對於較重或較慢的環境(大約每步0.1s或更長時間),SAC是一個不錯的選擇。SAC也是一種“最大熵”算法,並且可以以固有方式進行探索。

為了訓練agent,你需要向agent提供一個或多個獎勵信號,agent需要嘗試最大化獎勵信號。獎勵信號有關部分在第六章看。以下配置參數內容有些與PPO重復,也有SAC單獨定義的參數。

配置文件參數

  • Reward Signals

    在強化訓練中,目標就是要學習一種使獎勵最大化的策略(Policy)。在基礎層面上,獎勵是由環境給予的。然而我們可能會遇到獎勵擁有不同行為的agent。例如,我們可以讓agent探索新的狀態而獲得獎勵,而不是僅僅給予明確的獎勵;再例如,我們還可以使用混合獎勵信號來幫助學習過程。

    使用reward_signals可以定義獎勵信號。ML-Agents默認提供三種獎勵信號:外部(環境)獎勵信號、好奇心獎勵信號(可用於agent進行探索)和GAIL獎勵信號(對抗模仿學習)。具體的Reward Signals一會兒來看。

  • (可選)Number of Updates for Reward Signal

    獎勵信號的reward_signal_num_update對應於在每次更新過程中采樣並用於更新獎勵信號的小批量數。默認情況下,在每次主policy更新時都會更新一次獎勵信號。但是,為了模仿某些學習論文(e.g. Kostrikov et. al, Blondé et. al)中的中的訓練過程,我們可能需要更新N次策略,然后將獎勵信號(GAIL)更新M次。此時我們可以將SAC的train_intervalnum_update設置為N,並將reward_signals下的reward_signal_num_update改為M。默認操作下,reward_signal_num_update設置為num_update

    推薦范圍:num_update

  • Buffer Size

    buffer_size對應於在我們對模型進行任何學習或更新前,需要收集多少經驗(包括agent的observations、actions以及獲得的rewards)。該值應該很大,大概是你的eposodes的數千倍,以便SAC可以從新、舊經驗中學習。它也應該比batch_size大得多。

    推薦范圍:50000-1000000

  • Buffer Init Steps

    buffer_init_steps是在嘗試進行訓練之前預填充緩沖區的經驗數。由於未經訓練的策略是相當隨機的,因此用隨機動作預填充緩沖區對於探索非常有用。通常,至少應預填一些episodes經驗。

    推薦范圍:1000-10000

  • Batch Size

    batch_size是一個梯度下降迭代更新的樣本數量。它應該始終是buffer_size的一小部分。如果你的agent使用的是連續動作空間(Continuous Type),那這個值應該要大一些(大約1000s);如果agent使用的是離散動作空間(Discrete Type),那這個值應該小一些(大約10s)。

    Continuous Type推薦范圍:128-1024

    Discrete Type推薦范圍:32-512

  • Initial Entropy Coefficient

    init_entcoef是訓練開始時設置的初始熵系數。在SAC中,激勵agent使其行為熵化,可以促進更好的探索。熵系數用bonus entropy reward來衡量真正的獎勵。熵系數會自動調整為預設的目標熵,因此init_entcoef僅對應於熵加成的初始值。開始時增加init_entrcoef以進行更多探索,減少該值則可以更快的收斂於一個解決方案。

    Continuous Type推薦范圍:0.5-1.0

    Discrete Type推薦范圍:0.05-0.5

  • Train Interval

    train_interval是每個agent訓練事件之間采取的步驟數。通常,我們可以在每個步驟之后進行訓練,但是如果環境的步驟很少或者非常頻繁,那么在步驟之間不會有任何有趣的新信息,此時可以適當增加train Interval

    推薦范圍:1-5

  • Number of Updates

    num_update對應於每個訓練事件中期間采樣並用於培訓的最小批量數。在SAC中,單個“update”對應於從經驗回放緩沖區抓取一批batch_szie大小的數據,並使用這個小批量數據更新模型。通常情況下,該值可以保留為1。但是,為了模仿某些淪為(e.g. Kostrikov et. al, Blondé et. al),我們可能需要在獲取去其他樣本之前,用不同的小批量樣本更新N次。我們可以將train_intervalnum_update設置為N來完成此操作。

    推薦范圍:1

  • Tau

    tau對應於SAC模型更新期間目標Q更新的大小。在SAC中,有兩個神經網絡:目標和策略。目標網絡用於引導給定狀態下策略對未來獎勵的估計。然后根據tau慢慢更新此目標。通常,該值應該保留為0.005。對於簡單問題,以穩定性為代價,可以將tau增加到0.01可能會減少學習時間。

    推薦范圍:0.005-0.01

  • Learning Rate

    learning_rate對應於每個梯度下降更新步驟的強度。如果訓練不穩定,該值應該減少,並且獎勵不能持續增加。

    推薦范圍:1e-5-1e-3

  • (可選)Learning Rate Schedule

    learning_rate_schedule對應於學習率如何隨時間變化。對於PPO來說,建議在max_steps之前降低學習速率,這樣學習才能更穩定地收斂。但是在某些情況下(例如訓練時間未知),可以禁用此功能。

    選擇項:

    • linear(默認):線性衰減learning.rate,在max_steps到達最大步數時到達0
    • constant:在整個訓練過程中,保持學習速率恆定。
  • Time Horizon

    time_horizon對應於每個agent添加到經驗緩沖區之前要收集的經驗步驟。與PPO相比,這個參數對SAC的重要性要小得多,通常可以設置為接近episode長度。

    推薦范圍:32-2048

  • Max Steps

    max_steps對應於在訓練過程中運行了多少步模擬(乘以跳幀)。對於較復雜的問題,該值應該增大。

    推薦范圍:5e5-1e7

  • Normalize

    normalize對應於是否對輸入的矢量觀測值(vector observation)進行規范化處理。這種歸一化是基於矢量觀測值的平均值和方差。規范化對於復雜的連續控制(continuous control)問題很有用,但對於較簡單的離散控制(discrete control)可能反而有害。

  • Number of Layers

    num_layers對應於觀察值輸入之后或在視覺觀察的CNN編碼之后存在多少個隱藏層。對於簡單的問題,更少的層數可使得訓練更加迅速、高效。對於更復雜的控制問題,可能需要更多的層。

    推薦范圍:1-3

  • Hidden Units

    hidden_units對應於神經網絡的每個全連接層中有多少個單元。對於簡單的問題,正確的操作是將觀察輸入直接組合,因此該值應該較小。對於動作是觀察變量之間非常復雜的交互問題,這個值應該較大。

    推薦范圍:32-512

  • (可選)Visual Encoder Type

    vis_encode_type對應於visual observations進行編碼的編碼器類型。有效地選項包括:

  • (可選)Recurrent Neural Network Hyperparameters

    • Sequence Length

      sequence_length對應於訓練過程中通過網絡傳遞的經驗序列的長度。該值應該足夠大以捕獲agent隨時間推移可能需要記住的任何信息。例如,如果agent需要記住物體的速度,則該值可能很小。如果agent需要記住一段episode開始時只給出一次的信息,那么該值應該更大。

      推薦范圍:4-128

    • Memory Size

      memory_size對應於存儲策略的遞歸神經網絡隱藏狀態的浮點數數組的大小。該值必須是2的倍數,並且應該與期望agent成功完成任務所需記住的信息量成比例。

      推薦范圍:32-256

    • (可選)Save Replay Buffer

      save_replay_buffer設置在退出和重新開始訓練時保存和加載經驗回放緩沖區以及模型。這將有助備份恢復,因為收集的經驗不會被刪除。注意,回放緩沖區可能非常大,並且會占用大量磁盤空間。因此默認該功能為禁用狀態。

      默認:False

  • (可選)Behavioral Cloning Using Demonstrations

    在某些情況下,你可能希望使用player記錄的行為來引導agent的策略。這可以幫助指導agent獲得獎勵。行為克隆(BC)增加了模擬演示的訓練操作,而不是試圖使報酬最大化。

    要使用BC,請在trainer_config中添加一個behavioral_cloning部分,例如:

    behavioral_cloning:
            demo_path: ./Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo
            strength: 0.5
            steps: 10000
    

    以下為BC可用的超參數。

    • Strength

      strength對應於模仿的學習率相對於PPO的學習率,大致對應的使我們允許BC對policy的影響強度。

      推薦范圍:0.1-0.5

    • Demo Path

      demo_path.demo文件或.demo文件目錄的路徑。有關.demo文件的更多信息,詳見imitation learning guide

    • Steps

      在BC期間,通常希望agent在“看到”獎勵后停止使用演示,並允許其優化過去可用的demonstrations和/或概括所提供的演示之外的內容。steps對應於激活BC的訓練步驟。BC的學習率將隨步驟逐步提高。將steps設置為0,以便在整個訓練過程中持續模仿。

    • (可選)Batch Size

      batch_size是梯度下降更新的一次迭代的樣本數。如果未指定,則默認為SAC的batch_size

      推薦范圍(Continuous):512-5120

      推薦范圍(Discrete):32-512

    • (可選)Advanced: Initialize Model Path

      init_path可以指定在開始訓練之前初始化以前訓練的模型。注意,以前的模型的訓練配置需要與當前運行的相同,並且使用相同版本的ML-Agents保存。同時要提供全路徑存儲,例如./models/{run-id}/{behavior_name}

      如果要從不同的運行中初始化不同的行為,則使用該項。大多數情況下,使用--initialize-fromCLI參數足以從同一運行中初始化所有模型。

訓練統計參數

  • Cumulative Reward

    獎勵的總體趨勢應隨時間不斷增減。預計會有小的欺負。根據任務的復雜性,獎勵可能不會顯著增加,有可能直到訓練到數百萬步才增加。

  • Entropy Coefficient

    SAC是一種“最大化熵”的強化學習算法,使用SAC訓練的agent在解決問題的同時被激勵產生隨機行為。熵系數平衡了激勵隨機行為與最大化獎勵之間的平衡。該值會自動調整,以便agent在訓練過程中保留一定程度的隨機性。在開始訓練時,該值應該穩定下降,並達到一個小的值,然后區域穩定。如果下降得過快或者需要很長時間才能下降,init_entcoef的只應該進行調整。

  • Entropy

    該值與決策的隨機性是一致的。在訓練過程中,初始值應該增加,達到一個峰值,然后隨着熵系數(Entropy Coefficient)的下降而下降。這是因為在一開始,由於較高的Entropy Coefficient,agent被激勵為更隨機的探索。如果它下降的太快或者需要太長時間才能下降,則應調整init_entcoef

  • Learning Rate

    在默認情況下,該值保持一個常量,除非learning_rate_schedule設置為linear

  • Policy Loss

    該值可能會隨着policy的探索而增加,但是隨着agent學習如何解決任務而應長期減少。

  • Value Estimate

    該值應該隨着Cumulative Reward的增加而增加。它對應於agent預測自己在任何給定時間點會收到多少獎勵。它們也可能在開始時增加,因為agent被獎勵為隨機的(see: Entropy and Entropy Coefficient),但是應該隨着Entropy Coefficient的減少而減少。

  • Value Loss

    該值會隨着獎勵的增加而增加,一旦獎勵變得穩定,該值則應降低。

六、獎勵信號(Reward Signals)

對應官方文檔:Reward Signals

在強化學習中,agent的最終目標是發現一種使得獎勵最大化的行為或策略。通常獎勵是由你的環境定義的,並且與達成某個目標相對應。這就是所謂的“外部的(extrinsic)”獎勵,因為它們是在學習算法外部定義的。

但是,獎勵也可以定義在環境之外,以鼓勵agent以某些方式行事,或幫助其學習真正的外部獎勵。我們把這些獎勵稱為“內在的(intrinsic)”獎勵。agent將學習最大化的總獎勵可以是外部獎勵信號和內部獎勵信號的結合。

ML-Agents允許以模塊化的方式定義獎勵信號,一共提供了三種獎勵信號,這些信號可以混合和匹配以幫助訓練agent的行為。extrinsic獎勵信號表示是環境中定義的獎勵,默認情況下時啟用的。當外部獎勵稀少時,curiosity獎勵信號會幫助agent探索。

開啟獎勵信號

獎勵信號像其他超參數一樣,在trainer_config.yaml文件中定義。config/trainer_config.yamlconfig/gail_config.yaml提供了一個示例。要啟用獎勵信號,在配置文件中需要增加reward_signals部分。例如,除了好奇心獎勵信號和GAIL獎勵信號外,要啟用外部信號,可以按以下方式定義:

reward_signals:
    extrinsic:
        strength: 1.0
        gamma: 0.99
    curiosity:
        strength: 0.02
        gamma: 0.99
        encoding_size: 256
    gail:
        strength: 0.01
        gamma: 0.99
        encoding_size: 128
        demo_path: Project/Assets/ML-Agents/Examples/Pyramids/Demos/ExpertPyramid.demo

除了任何特定類別的超參數外,每個獎勵信號還應至少定義兩個參數:strengthgamma。注意,要刪除某個獎勵信號,你應該從reward_signals完全刪除其條目,並且任何時候都應該至少留下一個獎勵信號。

獎勵信號類型

外部獎勵信號(Extrinsic Reward Signal)

外部獎勵信號僅僅是環境給出的獎勵。刪除它迫使agent忽略環境獎勵。

  • Strength

    strength是原始獎勵的倍乘系數。通常范圍將根據獎勵信號來變化。

    推薦范圍:1.0

  • Gamma

    gamma對應於未來獎勵的折扣因子。可以認為這是agent應該在多遠的將來關心可能的回報。在agent為了准備在遙遠的將來的獎勵情況下,該值應該很大。如果希望獎勵更加及時,則該值可能更小。

    推薦范圍:0.8-0.995

好奇心獎勵信號(Curiosity Reward Signal)

好奇心獎勵將啟動agent內在的好奇心模塊。這是Pathak等人在“Curiosity-driven Exploration by Self-supervised Prediction”中描述的方法的一種實現。它訓練兩個網絡:

  1. 一個逆向模型,該模型采用agent的當前和下一個觀察值,對它們進行編碼,並使用編碼來預測觀察值之間采取的動作。

  2. 一個正向模型,它采用當前已編碼的觀測值和動作,並預測下一個已編碼的觀測值。

正向模型的損失(預測值和實際觀測值之間的差異)被用作內在獎勵,因此模型越好奇,獎勵越大。

更多信息可以查看以下網站:

https://arxiv.org/abs/1705.05363

https://pathak22.github.io/noreward-rl/

https://blogs.unity3d.com/2018/06/26/solving-sparse-reward-tasks-with-curiosity/

下面來看一下具體設置值:

  • Strength

    在好奇心獎勵信號開啟情況下,strength對應於內在好奇心模塊產生的好奇心獎勵的大小。應該對其進行調整,以確保它足夠大而不會被環境中的外部獎勵淹沒。同樣,它也不應該太大,以致於掩蓋了外部獎勵信號。

    推薦范圍:0.001-0.1

  • Gamma

    gamma對應於未來獎勵的折扣因子。

    推薦范圍:0.8-0.995

  • (可選)Encoding Size

    encoding_size對應於好奇心模塊使用的編碼大小。該值應該足夠小,以鼓勵ICM壓縮原始的觀察,但也不應該太小,以防ICM學習區分顯示的行為和實際的行為。

    默認值:64

    推薦范圍:64-256

  • (可選)Learning Rate

    learning_rate適用於更新內在好奇心模塊的學習率。如果訓練不穩定且Curiosity Loss不穩定,則通常應該減小該值。

    默認值:3e-4

    推薦范圍:1e-5-1e-3

GAIL獎勵信號

GAIL,即對抗性生成模仿學習,是一種使用對抗性方法的模擬學習算法,與GANs(Generative Adversarial Networks)相似。在這個框架中,第二個神經網絡,即鑒別器,被用來區分觀察/動作是來自於demonstration還是來自於agent。這個鑒別器可以檢查一個新的觀察/動作,並根據它認為這個新的觀察/動作所提供的演示的接近程度來提供獎勵。

在每個訓練過程中,agent都會嘗試學習如何最大程度地提高獎勵。然后,對鑒別器進行訓練,以更好地區分demonstrations和agent的狀態/動作。這樣,當agent越來越擅長模仿演示時,鑒別器缺變得越來越嚴格,agent必須努力地“愚弄(fool)”它。

這種方法學習的策略將產生類似於演示的狀態和動作,與直接克隆操作相比,所需的演示次數更少。除了單純從演示中學戲外,還可以將GAIL獎勵信號與外部獎勵信號混合以知道學習過程。

使用GAIL需要來自Unity環境的記錄演示。詳見imitation learning guide

  • Strength

    strength是原始獎勵的倍乘系數。注意,將GAIL獎勵信號與外部獎勵信號一起使用時,如果你的演示不理想(如來自人的操作演示),則應該將該值設置得較低,以便受過訓練的agent專注於獲得外部獎勵,而不是完全地復制演示。在這些情況下,將該值保持在約0.1以下。

    推薦范圍:0.01-1.0

  • Gamma

    gamma對應於未來獎勵的折扣因子。

    推薦范圍:0.8-0.9

  • Demo Path

    demo_path.demo文件或.demo文件目錄的路徑。詳見imitation learning guide

  • (可選)Encoding Size

    encoding_size對應於鑒別器使用的隱藏層的大小。該值應該足夠小,以鼓勵鑒別器壓縮原始觀察結果,但也不能太小,以防止其學習區分演示時和實際的行為。大幅增加該值會對訓練時間產生負面影響。

    默認值:64

    推薦范圍:64-256

  • (可選)Learning Rate

    learning_rate適用於更新鑒別器的學習率。如果訓練不穩定且GAIL loss不穩定,通常應該減少該值。

    默認值:3e-4

    推薦范圍:1e-5-1e-3

  • (可選)Use Actions

    use_actions確定鑒別器是應該根據觀察和操作進行鑒別,還是僅僅根據觀察值進行區分。如果你希望agent模仿演示中的操作,則將其設置為True,如果你希望agent可能使用不同的操作而達到演示中相同的狀態,則將其設置為False。設置為False更有可能是穩定的,特別是在演示不完美的情況下,但是學習的速度可能較慢。

    默認值:false

  • (可選)Variational Discriminator Bottleneck

    use_vail可啟動鑒別器中的變分瓶頸。這迫使鑒別器學習一種更籠統的表示,並降低了其在鑒別方面“太好”的傾向,從而使得學習更加穩定。然而,它確實增加了訓練時間。如果你注意到你的模仿學習是不穩定的,或者不能學習手頭的任務,那就嘗試啟動這個功能。

    默認值:false

七、總結

以上就是這次的內容,主要就是的官方文檔做一個翻譯,順便對各種參數進行一個理解,許多參數其實是和深度學習相關,如果翻譯有誤請見諒指出,共同學習~

寫文不易~因此做以下申明:

1.博客中標注原創的文章,版權歸原作者 煦陽(本博博主) 所有;

2.未經原作者允許不得轉載本文內容,否則將視為侵權;

3.轉載或者引用本文內容請注明來源及原作者;

4.對於不遵守此聲明或者其他違法使用本文內容者,本人依法保留追究權等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM