強化學習-ReinforcementLearning

強化學習是指agent通過與動態環境的反覆試驗交互來學習最佳行爲的問題。強化學習的所有算法都有一個共同的特性,即agent的反饋被限制爲一個獎勵信號,該信號表明agent的行爲有多好。與有監督的機器學習方法相比,任何關於如何改善其行爲的指導都是不存在的。因此,強化學習的目標和挑戰是改善只給予這種有限類型反饋的智能體的行爲。

Installation

使用devtools包,你可以輕鬆安裝ReinforcementLearning的最新開發版本,如下所示。

# install.packages("devtools")

# Option 1: download and install latest version from GitHub
devtools::install_github("nproellochs/ReinforcementLearning")
## Skipping install of 'ReinforcementLearning' from a github remote, the SHA1 (b14091a5) has not changed since last install.
##   Use `force = TRUE` to force installation
# Option 2: install directly from bundled archive
##devtoos::install_local("ReinforcementLearning_1.0.0.tar.gz")

Package loading

之後,你只需要加載如下的強化學習包。

library(ReinforcementLearning)

Data preparation

強化學習包利用不同的強化學習機制,包括q -學習和經驗重放。因此,它根據過去的經驗,以由狀態、行動和獎勵組成的樣本序列的形式學習最優策略。因此,每個訓練示例由一個狀態轉換元組(si,ai,ri+1,si+1)組成,如下所示:

—si爲當前環境狀態。 - ai表示當前狀態下選擇的動作。 - ri+1指定從當前狀態轉換到下一個狀態後收到的即時獎勵。 - si+1爲下一個環境狀態。

強化學習的訓練示例可以(1)從外部源收集並插入到表格數據結構中,或者(2)通過查詢定義環境行爲的函數動態生成。在這兩種情況下,相應的輸入必須遵循相同的元組結構(si,ai,ri+1,si+1)。我們將在下面詳細介紹這兩種變體。

Learning from pre-defined observations

當輸入數據是預先確定的,或者需要訓練複製過去行爲的代理時,這種方法是有益的。在這種情況下,只需要將包含過去觀察結果的表格數據結構插入到包中。當從外部源(如傳感器數據)收集了狀態轉換元組,並且希望通過消除與環境的進一步交互來了解代理時,可能會出現這種情況。

下面的例子展示了一個包含隨機抽樣的一字棋遊戲狀態的代表性數據集的前5個觀察結果。在這個數據集中,第一列包含匹配中當前板狀態的表示。第二列表示玩家X在這種狀態下觀察到的動作,而第三列則表示執行該動作後產生的棋盤狀態。第四列指定了玩家x的結果獎勵。這個數據集足以作爲學習agent的輸入。

data("tictactoe")
head(tictactoe, 5)
##       State Action NextState Reward
## 1 .........     c7 ......X.B      0
## 2 ......X.B     c6 ...B.XX.B      0
## 3 ...B.XX.B     c2 .XBB.XX.B      0
## 4 .XBB.XX.B     c8 .XBBBXXXB      0
## 5 .XBBBXXXB     c1 XXBBBXXXB      0

Dynamic learning from an interactive environment function

另一種策略是定義一個函數來模仿環境的行爲。然後,我們可以學習從這個函數中抽取經驗樣本的代理。這裏,環境函數接受狀態-操作對作爲輸入。然後,它返回一個列表,其中包含下一個狀態的名稱和獎勵。在這種情況下,還可以利用R訪問外部數據源,比如傳感器,並通過公共接口執行操作。這樣一個函數的結構由以下僞代碼表示:

environment <- function(state, action) {
  ...
  return(list("NextState" = newState,
              "Reward" = reward))
}

在指定了環境函數之後,我們可以使用它來收集隨機序列。因此,輸入指定了樣本個數(N)、環境函數、狀態集(即S)和動作集(即A)。然後,返回值是一個包含i=1,…,N的經歷狀態轉換元組(si,ai,ri+1,si+1)的數據幀。下面的代碼片段展示瞭如何從示例化的環境函數生成經驗。

# Define state and action sets
states <- c("s1", "s2", "s3", "s4")
actions <- c("up", "down", "left", "right")

env <- gridworldEnvironment

# Sample N = 1000 random sequences from the environment
data <- sampleExperience(N = 1000, 
                         env = env, 
                         states = states, 
                         actions = actions)

Learning phase

General setup

例程強化學習()捆綁了主要的功能,該功能使用先前的輸入數據教強化學習代理。爲此,它需要以下參數:(1)數據參數必須是一個數據幀對象,其中每一行表示一個狀態轉換元組(si,ai,ri+1,si+1)。(2)要求用戶指定data中各個元組元素的列名。

下面的僞代碼演示了來自外部源的預定義數據的用法,而後面的部分詳細介紹了交互式設置。這裏的參數s、a、r和s_new包含指定數據幀data中相應列名的字符串。

# Load dataset
data("tictactoe")

# Perform reinforcement learning
model <- ReinforcementLearning(data = tictactoe, 
                               s = "State", 
                               a = "Action", 
                               r = "Reward", 
                               s_new = "NextState", 
                               iter = 1)

Parameter configuration

爲了定製代理的學習行爲,可以提供幾個參數。

  • alpha學習速率,設置在0到1之間。將其設置爲0意味着q值永遠不會更新,因此,什麼也不會學到。設置一個較高的值,比如0.9,意味着學習可以很快進行。 -折現因子,設置在0和1之間。決定了未來回報的重要性。當因子爲0時,只考慮當前的獎勵就會使代理人變得目光短淺,而當因子接近1時,就會使代理人在長期內追求更大的獎勵。 —epsilon探索參數,設置在0到1之間。定義ε-貪婪行爲選擇中的探索機制。在這種策略中,agent通過隨機選擇一個概率爲ε的行爲來探索環境。或者,agent通過選擇概率爲1−ε的最優行動來利用其當前知識。此參數僅在基於現有策略抽樣新經驗時需要。
  • iter agent通過訓練數據集的重複學習迭代次數。Iter爲大於0的整數。默認值設置爲1,其中每個狀態轉換元組只向代理顯示一次。根據訓練數據的大小,重複學習迭代次數越多,收斂效果越好,但需要的計算時間越長。這個參數直接傳遞給ReinforcementLearning()。 學習參數alpha、gamma和epsilon必須在傳遞給ReinforcementLearning()函數的可選控制對象中提供。
# Define control object
control <- list(alpha = 0.1, gamma = 0.1, epsilon = 0.1)

# Pass learning parameters to reinforcement learning function
## model <- ReinforcementLearning(data, iter = 10, control = control)

model <- ReinforcementLearning(data = tictactoe, 
                               s = "State", 
                               a = "Action", 
                               r = "Reward", 
                               s_new = "NextState", 
                               iter = 1,
                               control = control)

Diagnostics

學習過程的結果是一個類型爲rl的對象,該對象包含狀態-動作表和在每個狀態下具有最佳可能動作的最優策略。命令computePolicy(model)顯示最優策略,而print(model)輸出狀態-動作表,即每個狀態-動作對的q值。此外,摘要(模型)打印進一步的模型細節和摘要統計信息。

# Print policy
computePolicy(model)
## .XXBB..XB XXBB.B.X. .XBB..BXX BXX...B.. ..XB..... XBXBXB... XX.BB..XB 
##      "c1"      "c5"      "c5"      "c4"      "c5"      "c9"      "c3" 
## X...BB..X BXX.....B BXBBXBX.X B.BBX.X.X BXX..BXB. .BBB.XXX. BXB.BX.X. 
##      "c4"      "c5"      "c8"      "c8"      "c5"      "c9"      "c1" 
## ..BXB..X. ..XBBXX.B XBX..B.XB .XBXB.X.B BBXBXB.XX .BXXB.X.B X...BX.B. 
##      "c7"      "c1"      "c7"      "c1"      "c7"      "c1"      "c2" 
## .XBBXX..B .BXB.XXB. XBB..XX.B X.B..XXBB BXXBXB.BX ....XBBX. XB..X.XBB 
##      "c8"      "c5"      "c4"      "c4"      "c7"      "c2"      "c4" 
## ..XBXX.BB XBXB...BX .X..BX.B. .B..BX.X. ..X.B..XB XB..BX... .BB.X.XXB 
##      "c7"      "c5"      "c3"      "c9"      "c1"      "c8"      "c2" 
## .XB.X.XBB ..XXB.XBB .XB.BBX.X XB.B.B.XX XB.XX.BB. .X.X...BB BXXXBXBB. 
##      "c2"      "c1"      "c8"      "c7

# Print summary statistics
summary(model)
## 
## Model details
## Learning rule:           experienceReplay
## Learning iterations:     1
## Number of states:        1893
## Number of actions:       9
## Total Reward:            5449
## 
## Reward details (per iteration)
## Min:                     5449
## Max:                     5449
## Average:                 5449
## Median:                  5449
## Standard deviation:      NA

案例:Gridworld

本節將通過一個實例來演示強化學習包的功能。

Problem definition

我們的實際例子旨在教機器人在網格形迷宮中的最佳運動(改編自Sutton(1998))。在這裏,代理必須從一個隨機的起始位置導航到模擬的2×2網格上的最終位置(參見下圖)。網格上的每個單元反映一種狀態,總共產生4種不同的狀態。在每個狀態下,代理可以執行四種可能操作中的一種,即向上、向下、向左或向右移動,唯一的限制是它必須保持在網格上。換句話說,網格被一堵牆包圍着,這使得代理無法離開網格。s1和s4之間的“牆”阻礙了這些狀態之間的直接運動。最後,獎勵結構如下:爲了懲罰非最短路徑的路線,每個移動都會導致負獎勵-1。如果代理人達到目標位置,他將獲得10英鎊的獎勵。

Defining an environment function

我們首先定義一組可用的狀態(狀態)和操作(動作)。

# Define state and action sets
states <- c("s1", "s2", "s3", "s4")
actions <- c("up", "down", "left", "right")

然後我們把上面的問題公式改寫成下面的環境函數。如前所述,該函數必須以狀態和操作作爲輸入。if條件決定當前狀態和操作的組合。在我們的示例中,狀態指的是代理在網格上的位置,動作表示預期的移動。基於這些,功能決定下一個狀態和數值獎勵。它們一起作爲列表返回。

# Load built-in environment function for 2x2 gridworld 
env <- gridworldEnvironment
print(env)
## function (state, action) 
## {
##     next_state <- state
##     if (state == state("s1") && action == "down") 
##         next_state <- state("s2")
##     if (state == state("s2") && action == "up") 
##         next_state <- state("s1")
##     if (state == state("s2") && action == "right") 
##         next_state <- state("s3")
##     if (state == state("s3") && action == "left") 
##         next_state <- state("s2")
##     if (state == state("s3") && action == "up") 
##         next_state <- state("s4")
##     if (next_state == state("s4") && state != state("s4")) {
##         reward <- 10
##     }
##     else {
##         reward <- -1
##     }
##     out <- list(NextState = next_state, Reward = reward)
##     return(out)
## }
## <bytecode: 0x7fdcd2a93b00>
## <environment: namespace:ReinforcementLearning>

Learning an optimal policy

在指定了環境函數之後,我們可以使用內置的sampleExperience()函數從環境中採樣觀察序列。下面的代碼片段生成了一個包含1000個隨機狀態轉換元組(si,ai,ri+1,si+1)的數據幀數據。

# Sample N = 1000 random sequences from the environment
data <- sampleExperience(N = 1000, 
                         env = env, 
                         states = states, 
                         actions = actions)
head(data)
##   State Action Reward NextState
## 1    s3  right     -1        s3
## 2    s1   left     -1        s1
## 3    s4     up     -1        s4
## 4    s3     up     10        s4
## 5    s3  right     -1        s3
## 6    s2   down     -1        s2

我們現在可以使用數據中的觀察序列來了解agent的最佳行爲。爲此,我們首先通過定義一個控制對象來定製代理的學習行爲。我們遵循默認的參數選擇,將學習速率alpha設置爲0.1,折現係數gamma設置爲0.5,探索貪心設置爲0.1。隨後,我們使用ReinforcementLearning()函數來學習輸入數據的最佳策略。

# Define reinforcement learning parameters
control <- list(alpha = 0.1, gamma = 0.5, epsilon = 0.1)

# Perform reinforcement learning
model <- ReinforcementLearning(data, 
                               s = "State", 
                               a = "Action", 
                               r = "Reward", 
                               s_new = "NextState", 
                               control = control)

Evaluating policy learning

函數的作用是:返回一個rl對象。我們可以喚醒computePolicy(model),以便顯示在每個狀態下定義最佳可能操作的策略。另外,我們也可以使用print(model)將整個狀態-動作表寫入屏幕,即每個狀態-動作對的q值。顯然,agent已經學會了最優策略,允許它從任意起始位置走最短路徑到目標位置s4。

# Print policy
computePolicy(model)
##      s1      s2      s3      s4 
##  "down" "right"    "up"    "up"
# Print state-action function
print(model)
## State-Action function Q
##        right         up       down       left
## s1 -0.657079 -0.6435135  0.7560353 -0.6586489
## s2  3.562075 -0.6482063  0.7658358  0.7197767
## s3  3.573793  9.1307219  3.5880442  0.7561129
## s4 -1.876336 -1.8028849 -1.8147210 -1.8339686
## 
## Policy
##      s1      s2      s3      s4 
##  "down" "right"    "up"    "up" 
## 
## Reward (last iteration)
## [1] -197

最後,我們可以使用summary(model)來進一步檢查模型。這個命令輸出關於模型的額外診斷,比如狀態和操作的數量。此外,它允許我們分析獎勵的分配。例如,我們看到樣本中的總獎勵(遊戲邦注:即獎勵r列的總和)是非常負的。這表明,用於生成狀態轉移樣本的隨機策略偏離了最優情況。因此,下一節將解釋如何使用新數據示例應用和更新學習到的策略。

# Print summary statistics
summary(model)
## 
## Model details
## Learning rule:           experienceReplay
## Learning iterations:     1
## Number of states:        4
## Number of actions:       4
## Total Reward:            -197
## 
## Reward details (per iteration)
## Min:                     -197
## Max:                     -197
## Average:                 -197
## Median:                  -197
## Standard deviation:      NA

Applying a policy to unseen data

我們現在對看不見的數據應用一個現有的策略,以便評估代理的樣本外性能。下面的示例演示如何從現有策略中採樣新數據點。結果產生一個列,該列具有每個給定狀態的最佳操作。

# Example data
data_unseen <- data.frame(State = c("s1", "s2", "s1"), 
                          stringsAsFactors = FALSE)

# Pick optimal action
data_unseen$OptimalAction <- predict(model, data_unseen$State)

data_unseen
##   State OptimalAction
## 1    s1          down
## 2    s2         right
## 3    s1          down

Updating an existing policy

最後,可以用新的觀測數據更新現有的策略。例如,當額外的數據點可用時,或者當人們想要將獎勵作爲訓練樣本數量的函數時,這是有益的。爲此,ReinforcementLearning()函數可以將現有的rl模型作爲額外的輸入參數。此外,它還附帶了一個預定義的行動選擇模式,即ε-greedy,從而遵循概率爲1 - ε的最佳行動和ε的隨機行動。

# Sample N = 1000 sequences from the environment
# using epsilon-greedy action selection
data_new <- sampleExperience(N = 1000, 
                             env = env, 
                             states = states, 
                             actions = actions, 
                             actionSelection = "epsilon-greedy",
                             model = model, 
                             control = control)

# Update the existing policy using new training data
model_new <- ReinforcementLearning(data_new, 
                                   s = "State", 
                                   a = "Action", 
                                   r = "Reward", 
                                   s_new = "NextState", 
                                   control = control,
                                   model = model)

下面的代碼片段顯示,與前一個策略相比,更新後的策略產生的回報明顯更高。這些更改也可以通過plot(model_new)在學習曲線中可視化。

# Print result
print(model_new)
## State-Action function Q
##         right         up       down       left
## s1 -0.6420792 -0.6278631  0.7703925 -0.6464018
## s2  3.5397460 -0.6318365  0.7696272  0.7450224
## s3  3.5593900  9.0767870  3.5645303  0.7666640
## s4 -1.8950310 -1.9234186 -1.8490891 -1.8821899
## 
## Policy
##      s1      s2      s3      s4 
##  "down" "right"    "up"  "down" 
## 
## Reward (last iteration)
## [1] 1475
# Plot reinforcement learning curve
plot(model_new)

Notes on performance

強化學習保證收斂到最優策略。然而,該方法是計算的要求,因爲它依賴於一個代理和它的環境之間的連續交互。爲了解決這個問題,reinforcement learning包允許用戶執行批處理強化學習。在大多數情況下,這種強化學習變體有利於計算性能,因爲它減輕了純在線學習中的“探索開銷”問題。與經驗回放相結合,它通過收集並反覆回放觀察到的狀態轉換到代理,就像它們是在與系統交互時收集到的新觀察一樣,從而加速收斂。儘管如此,由於這個程序包完全是用R編寫的,所以它對於非常大規模的問題(例如計算機視覺的應用)的適用性仍然有限。下面,我們簡要地總結一下這個包能夠處理的場景,以及應該考慮使用“更快”編程語言編寫的強化學習實現的情況。

強化學習R包能做什麼:

-通過有限的狀態和行動集,爲現實世界的問題學習最佳策略(例如,爲簡單的遊戲尋找最佳策略,訓練一個簡單的股票市場交易代理,從自然語言處理學習應用程序中的極性標籤)。 -該包允許一個人通過調整學習參數和使用經驗回放加速性能。 -該包允許一個人訓練一個代理從預先定義的觀察,而不需要建模的動態環境。通常,這種方法大大加快了收斂速度,並且在從外部源(如傳感器數據)收集狀態轉換元組的情況下非常有用。 -該包爲無模型強化學習任務提供了一個高度可定製的框架,在其中的功能可以很容易地擴展。例如,用戶可能試圖通過定義替代的強化學習算法並將它們集成到包代碼中來提高性能。

強化學習R包不能做的事情:

-用高維狀態-動作空間(如計算機視覺)解決大規模問題(用戶可以考慮用“更快”的編程語言編寫的強化學習實現) -解決需要實時交互的強化學習問題(例如與機器人的實時交互)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章