跳至主要內容

指南

強化學習

Oloproof 透過按回合(episode)執行強化學習策略來評估它,或依據它將要取代的那個策略的日誌來評估。能執行時就執行它;當結果只會在真實世界中發生時,就使用日誌。本頁是這兩種方式的參考,教學會在一個可執行的範例上逐一演練。

Oloproof 不託管、不重設也不模擬環境,也不訓練策略。您的系統執行它自己的環境,就像 Oloproof 評估的每個系統都執行它自己的程式碼一樣。

回合

一個任務就是一個案例。一個回合是對它的一次量測:您的系統在它的環境中執行策略,並以 current_case().rl_episode(...) 把這個回合記錄為一個 rl_episode/v1 產物。

欄位類型意義
steps步驟清單,index 從 1 開始每一步的 reward(獎勵)、它的限制條件 cost(成本,預設 0),以及選用的 action 與 observation
successtrue、false 或不存在環境本身對這個回合的判定
truncated布林值,預設 false步數上限在抵達終止狀態之前結束了這個回合
horizon整數,選用步數上限;回合不得比它更長

記錄包含回合的每一步。被截斷的回合,是評估協定定義為在其上限處結束的回合,因此它的報酬(return)與成本是完整的,而不是下界。

宣告系統記錄的類型,讓執行能拒絕一個需要系統從不寫入之記錄的評估器:

system:
  name: grid-agent
  callable: env:run_baseline
  records: [rl_episode/v1]

回合評估器

類型量測欄位
episode_return報酬,每一步的獎勵依 discount 逐步加權,作為分數return_range(必需)、discount(預設 1)
episode_success回合記錄了 success: true 時通過;未記錄時為缺失無
episode_cost_within各步成本之和不超過 budget 時通過budget(必需)

return_range 是每個報酬都落在其中的範圍,例如最差是 30 步、每步 -1,最好是抵達目標的獎勵。平均報酬上的區間只在這個範圍內成立,因此超出範圍的報酬會以結束代碼 2 停止執行。在 SDK 中,對應的類別是 oloproof.evaluators 中的 EpisodeReturn、EpisodeSuccess 與 EpisodeCostWithin。

每個任務多個回合

設定 replicates: 以便為每個任務執行多個回合。current_case().replicate 說明正在執行的是哪一個(第一個為 0),它是已儲存執行之鍵的一部分,因此用它為回合設定種子的環境,會為同一次重複量測重播同一個回合,而第二次執行會重複使用已儲存的內容。

任務仍然是單位。每個準則都成為各任務的平均值,而每個任務的值是它自己在各回合上的平均值;區間按任務計數:一個任務的五個回合不是五個獨立的任務。

對重複量測的任務計算的通過率,讀取的是每個任務通過的回合所占比例。若要改為詢問一個任務是否每次都通過,請宣告一個 every_replicate 指標:

metrics:
  - {id: solved_every_time, type: every_replicate, criterion: episode_success}

只有當一個任務的所有回合都通過時,它才計為通過,因此每個任務是一次通過或失敗,適用精確二項區間。每個任務只有一個回合時,它等於通過率。有一個回合缺失的任務即為缺失,即使它的另一個回合失敗了也是如此。

比較兩個策略

oloproof compare 把每個任務與它自己配對,每一側取它在各回合上的平均值。報酬的差異以報酬本身的單位顯示,通過率的差異以百分點顯示。兩次執行可以為每個任務執行不同數量的回合,但 every_replicate 指標除外:五個回合全部成功與唯一一個回合成功是不同的問題,因此不計算這種比較。當任一次執行的每個任務有多個回合時,不計算分位數與排序比較。

離策略評估

當您在意的結果只會在真實世界中發生(一張工單被解決、一位使用者再度回來),而您還不能在真實流量上試用新策略時,就使用它。證據是一個較舊的策略所做決策的日誌。

每個案例是一筆已記錄的決策:

{"id":"t001","input":{"topic":"technical","length":"short"},"expected":{"action":"small","logging_probabilities":{"small":0.7,"large":0.3},"reward":1}}
欄位意義
input策略做決策時看到的內容
expected.action日誌策略(logging policy)採取的動作
expected.logging_probabilities日誌策略在那一刻給每個動作的機率,總和為 1
expected.reward隨後發生的結果,位於 reward_range 之內;若它從未到來則不存在

系統就是您想評估的策略。它接收 input,並在 probabilities 之下(或在您以 probabilities_field 指定的欄位之下)回傳它自己給每個動作的機率。它從不執行模型,也不觸及真實世界。input 只包含日誌策略做決策時看到的內容:絕不包含已記錄的動作或獎勵,受測策略不得看到它們。以抽樣做出選擇的策略,回傳它抽樣所依據的機率,而不是它抽到的動作;即使輸入重複,每筆決策也會重新評估。動作的名稱必須與日誌中的完全一致:拼寫不同的動作會被視為日誌策略從未採取過的動作。

類型估計
off_policy_value該策略在與已記錄決策相似的決策上的平均獎勵
off_policy_improvement這個平均值減去日誌策略本身的平均值

兩者都接受 reward_range 與 propensity_floor,也就是日誌策略給新策略可能採取的任何動作的最小機率。請依據日誌策略的設計方式(探索率、最低比例)來設定它,絕不要在日誌上試值。每筆已記錄的決策都按新策略對其動作的機率與日誌策略的機率之比重新加權,而這個下限限制了該權重:沒有它,任何區間都不成立。在 SDK 中,對應的類別是 OffPolicyValue 與 OffPolicyImprovement。

引擎如何處理一筆它無法按原樣讀取的決策:

情況結果
機率總和不為 1、某個已記錄動作的機率為 0、獎勵超出 reward_range執行以結束代碼 2 停止:錯誤的機率會讓區間出錯而不顯露出來
新策略可能採取一個以低於下限的機率被記錄的動作該決策為缺失,並以最壞情況納入界限
獎勵不存在該決策為缺失,並以最壞情況納入界限

這個答案的假設:

  • 機率是在日誌策略做決策時記錄的,而且正是它所使用的機率。Oloproof 從不估計它們。
  • 每筆決策的獎勵取決於它自己的輸入與動作,而不取決於其他決策。
  • 日誌策略在日誌所涵蓋的時間範圍內維持相同的機率。
  • 答案描述的是與已記錄決策相似的決策,範圍是日誌所涵蓋的期間。

下限較小時區間較寬:能為一個很少被選中的動作提供資訊的決策很少,而每一筆都被計入許多次。更長的日誌,以及探索更多的日誌策略,會讓區間變窄。

尚未建置的功能

  • 對一連串決策的離策略評估,其中每個選擇都會改變接下來發生的事。
  • 策略在時間範圍內一邊學習一邊改變機率的日誌。
  • 事後估計的機率。
  • 託管或重設環境與模擬器。

下一步