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

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

1、背景

到如今爲止,官方的示例已經研究三個了,可是說實話本身去按官方的配置文件訓練,有時候並不能徹底訓練出好的模型,並且官方的配置文件配置項都不是很明白,所以想在看下一個示例以前,先來研究一下官方關於配置文件的文檔,通俗點就是翻譯一下,有可能其中會找到我以前在訓練模型時遺漏的點。html

固然若是你們有時間的話,仍是能夠去學習一下ML-Agents的理論,就是機器學習那套。我本身的話直接把ML-Agents當黑盒來用了,通常個人理念就是先學會怎麼用,要知道能解決什麼問題,而後遇到不懂得再看原理,這樣就是有好有壞,主要看我的喜愛。ios

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

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

2、訓練命令

先來翻譯一下官方文檔中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。這個命令以前也沒有用過,具體是什麼用途有待考察。less

  • --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,以上就是官方已有的命令,下面來看一下與訓練效果相關的配置文件各個屬性是什麼含義。

3、訓練配置文件

在官方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補充の引入泛化研究過了,有興趣的童靴能夠去看看。剩下的幾篇我準備在具體官方示例中再研究。

4、用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

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

5、用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

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

6、獎勵信號(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

7、總結

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

寫文不易~所以作如下申明:

1.博客中標註原創的文章,版權歸原做者 煦陽(本博博主) 全部;

2.未經原做者容許不得轉載本文內容,不然將視爲侵權;

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

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

相關文章
相關標籤/搜索