天天看點

【強化學習入門】馬爾科夫決策過程

本文介紹了馬爾可夫決策過程,首先給出了馬爾可夫決策過程的定義形式

,其核心是在時序上的各種狀态下如何選擇最優決策得到最大回報的決策序列,通過貝爾曼方程得到累積回報函數;然後介紹兩種基本的求解最優決策的方法,值疊代和政策疊代,同時分析了兩種方法的适用場景;最後回過頭來介紹了馬爾科夫決策過程中的參數估計問題:求解

-即在該狀态下采取該決策到底下一狀态的機率。

作者 | 文傑

編輯 | yuquanle

馬爾科夫決策過程

A、馬爾科夫決策過程

機器學習算法(有監督,無監督,弱監督)中,馬爾科夫決策過程是弱監督中的一類叫增強學習。增加學習與傳統的有監督和無監督不同的地方是,這些方法都是一次性決定最終結果的,而無法刻畫一個決策過程,無法直接定義每一次決策的優劣,也就是說每一次的決策資訊都是弱資訊,是以某種程度上講,強化學習也屬于弱監督學習。從模型角度來看,也屬于馬爾科夫模型,其與隐馬爾科夫模型有非常強的可比性。

下面是一個常用的馬爾科夫模型的劃分關系

不考慮動作 考慮動作
狀态完全可見 馬爾科夫鍊(MC) 馬爾科夫決策過程(MDP)
狀态不完全可見 隐馬爾科夫模型(HMM) 不完全可觀察馬爾科夫決策過程(POMDP)

馬爾科夫決策過程:

馬爾科夫決策過程由五元組組成

:表示狀态集合

:表示一組動作

:表示在某一狀态

下,采取動作

,轉移到

轉态的機率,也就是說在确定的狀态下采取相應的動作之後不能完全确定下一狀态,而是以一定的機率确定下一狀态。

:表示決策過程的一個阻尼系數,使用者定義回報在決策過程中随時間打折扣,加快決策國産的收斂

:表示在該狀态下的一個回報

,有時由動作和狀态共同決定回報該時刻的回報

有了上面的定義之後,一個完整的馬爾科夫決策過程狀态轉移圖如下:

【強化學習入門】馬爾科夫決策過程

該過程表示從

出發,有決策函數來選擇相應的動作

,然後以機率

到達下一狀态

,這裡的

隻是表示第

時刻的狀态,而

的值屬于狀态集。

回報函數定義之後,整個決策過程的累積回報如下:

當回報函數與狀态無關累積回報如下:

其中

為折扣因子,随着決策不斷進行,回報不斷打折扣。

—在

狀态下采取

動作。是以,從狀态

出發,采用決策函數

,有累積回報函數如下:

直接最大化累積回報函數不易,從遞推角度來看,由貝爾曼方程有:

其中

為立即回報,

表示由

采取

動作之後轉移到下一個狀态集中,具體到哪個狀态的機率為

。其解釋性可以了解為下象棋最終的累積回報為輸赢,在第

狀态下的累積回報則是目前狀态下的立即回報以及未來的回報。第一項為立即回報,第二項就是未來的回報。

有了上面的貝爾曼方程,我們的目标就是最大化任意狀态下出發的累積回報函數

,其中

也是一個決策函數,但是在累積回報函數中它是我們需要優化的變量。目标函數如下:

由目标函數可以看出,最優回報和最優決策一一對應。最大化累積回報對應的決策函數

就是最有決策,最有決策對應的累積回報也是最大累積回報,是以最有決策如下:

有了最優決策和最大累積回報,那麼必定有下式:

也就是說最優決策下對應的累積回報一定不小于一般的決策下的累積回報。

值得注意是,最優決策是出于全局考慮的,是從所有狀态下出發到得到的累積回報的加和最大,這就意味着決策函數不保證其中每一個狀态出發根據決策函數得到的累積回報都是最大的。

最優決策:

也許上面的目标函數還不清晰,如何求解最有決策,如何最大化累積回報

下面結合例子來介紹如何求解上面的目标函數。且說明累積回報函數本身就是一個過程的累積回報,回報函數

才是每一步的回報。

【強化學習入門】馬爾科夫決策過程

下面再來看求解上述最優問題,其中 就是以s為初始狀态沿着決策函數走到結束狀态的累積回報。

值疊代:

  1. 将每一個初始狀态為s的

    初始化為0,目标狀态累積回報為1

  2. 循環直到收斂{

對于每一個初始狀态

,對

進行更新:

}

可以看出,更新第一次所有的

,也就是說都隻看眼下的立即回報,然後由于獎勵狀态和懲罰狀态的分布不同,由靠近獎勵狀态和懲罰狀态的狀态決策逐漸導向到初始狀态的決策,這也就是累積回報不斷更新的原因(動力)。但是值得思考的還是最終會不會收斂到最優累積回報(暫時不作讨論)。

内循環疊代的的處理方法有兩種:

  1. 同步疊代:即在一次循環過程中,累積回報不更新,而是計算完所有的累積回報之後,再統一更新。
  2. 異步疊代,即在一次循環過程中,每計算完一個初始狀态下累積回報就立即更新,不需要等到所有的累積回報都計算出來之後再更新。

可以看出兩種疊代方式造成不同的原因是第二項,因為立即更新之後,再計算下一個初始狀态下的累積回報與暫時不更新得到的累積回報肯定不一樣,拿第一次更新為例,同步更新第一次 

,而異步更新則第一次内循環中,除了第一次更新的s會出現 

,剩下的都有 

,值得肯定的是異步疊代的收斂速度肯定是快于同步疊代。

政策疊代:

值疊代是使累積回報值最優為目标進行疊代,而政策疊代是借助累積回報最優即政策最優的等價性,進行政策疊代。

  1. 随機指定一個政策
  2. 循環直到收斂{

    a:令

    b:對于每一個狀态s,對

    做更新

}

這裡要說明的是a步是通過前面的貝爾曼方程,以解方程的形式求解出每一個狀态下的累積回報:

在b步則是根據累積回報值,重新更新決策

同樣,收斂性也是值得探讨的,這裡簡單的思考一下,由于獎勵狀态和懲罰狀态的分布,以及累積回報唯一确定決策函數,那麼未達到最優決策,必然累積回報和決策函數處于不穩定的狀态,而隻有當到達最優決策時,才有:

是以該過程就是在a步由決策函數确定累積回報,然後最大化累積回報來更新決策,如此反複,則有最優決策。值疊代和政策疊代比較:可以看出政策疊代涉及從決策函數到累積回報的解線性方程組的步驟,值疊代則是反複的,是以政策疊代更适合處理少量狀态的情況,一般10000以内還是可以接受的。

MDP中的參數估計:

回過頭來再來看前面的馬爾科夫決策過程的定義是一個五元組,一般情況下,五元組應該是我們更加特定的問題建立馬爾科夫決策模型時該确定的,并在此基礎上來求解最優決策。是以在求解最優決策之前,我們還需更加實際問題建立馬爾科夫模型,模組化過程就是确定五元組的過程,其中我們僅考慮狀态轉移機率,那麼也就是一個參數估計過程。(其他參數一般都好确定,或設定)。

假設,在時間過程中,我們有下面的狀态轉移路徑:

【強化學習入門】馬爾科夫決策過程

其中 表示

步,第

條轉移路徑對應的狀态,

狀态下執行的動作,每一條轉移路徑中狀态數都是有限的,在實際過程中,每一個狀态轉移路徑都要進入終結狀态。如果我們獲得了很多上面的轉移路徑,那麼我們就可以來估計參數

分子是在 狀态下采取

動作都轉移到

的次數,分母是在

狀态下采取

動作的次數。為了避免

的情況,同樣采用拉普拉斯平滑。也就是說當到達的狀态是樣本中為為到達過的狀态,那麼在該狀态下的執行的動作達到下一狀态的機率均分。上面的這種估計方法是從曆史資料中進行統計的,同樣該方法适合于線上更新。對于立即回報函數的估計,一般根據實際情況學習或者設定。

是以整個馬爾科夫決策過程流程如下(以政策疊代為例):

  1. 随機初始化政策
  2. 循環直到收斂{

    a 在樣本上統計該政策下每個狀态轉移的次數,來估計 和

    b 使用估計到參數來更新對應決策函數下的累積回報

    c 根據更新的累積回報 重新進行決策,即更新

}

整個流程就是在政策疊代的基礎上,同時進行了參數估計。

代碼實戰

A、馬爾可夫決策過程值疊代​

/***
 馬爾科夫決策過程值疊代,關鍵在于第一次疊代要例外,
 因為目标狀态是一個終止狀态,放到疊代循環裡面會出現
 臨近的狀态回報函數無限的,發散。
 疊代過程采用的是異步疊代,即每一次内層循環找到更優的
 回報就立即更新最大回報,以便與之相鄰的狀态能立即更新到最優
 */ 
   /****
 值疊代
 同步更新
 12*12*7
   */ 

while(!flag)
 {
 flag=1;
 for(i=0; i<size; i++)
 {
 if(action[i]>0||action[i]==0)
 maxreward[i]=reward[i]+maxreward[action[i]];
 else 
 maxreward[i]=reward[i];
 }//放到這意味着同步更新,count=1008是12*12的7倍,即掃了7遍
 for(i=0; i<size; i++)//對每一個狀态求最大的V(s)
 {
 for(j=0; j<size; j++)//政策疊代的話這裡其實可以換做掃一遍政策集,這也就是和值疊代不同的地方
 {
 //cout<<"i="<<i<<" "<<maxreward[i]<<" "<<endl;
 if(matrix[i][j]==1&&maxreward[j]>maxreward[i]-reward[i]+0.0001)//更新累積回報
 {
 action[i]=j;
 //if(action[i]>0||action[i]==0)
 //maxreward[i]=reward[i]+maxreward[action[i]];//放到這是異步更新,
 //else
 // maxreward[i]=reward[i];
 flag=0;//當累積回報不再更新,即不進入該if,那麼就結束疊代
 }
 count++;
 }
 }
 }      

B、馬爾可夫決策過程政策疊代​

while(!flag)
 {
 flag=1;
 for(i=0; i<size; i++)//對每一個狀态求最大的V(s)
 {
 for(j=0; j<ACTION; j++)//政策疊代的話這裡其實可以換做掃一遍政策集,這也就是和值疊代不同的地方
 {
 //cout<<"i="<<i<<" "<<maxreward[i]<<" "<<endl;
 if(matrix[i][ac[j]+i]==1&&maxreward[ac[j]+i]>maxreward[i]-reward[i]+0.0001)
 {
 action[i]=j;
 //if(reward[i]!=1&&reward[i]!=-1)
 maxreward[i]=reward[i]+maxreward[ac[j]+i];
 //else
 // maxreward[i]=reward[i];
 flag=0;
 }
 count++;
 }
 }
 }      

C、馬爾可夫決策過程動态規劃版

/**
   4 非遞歸動态規劃
   從最終狀态出發,采用廣度周遊不斷的更新其上一狀态的累積回報
 */ 
   /*
 
while(q!=NULL)//這裡圖的廣度周遊沒有用到隊列,但也用到了隊列的思想
 //對于目前步能到達的節點用連結清單連接配接起來,然後逐漸進行下一步的能到達的節點進行傳入連結(入隊列),同樣是一種先進先出思想
 {
 for(i=0; i<size; i++) //由于不是政策疊代,隻能周遊所有的狀态,找出能到的,且更優的
 {
 if(matrix[i][q->data]==1&&maxreward[i]<0)//double類型比較大小的偏差,加上一個小數作為精度
 {
 maxreward[i]=reward[i]+maxreward[q->data];
 p=(subset *)malloc(sizeof(subset)*1);
 p->data=i;
 p->next=NULL;
 q=maxsubset;
 while((q->next)!=NULL)
 q=q->next;
 q->next=p;
 }
 count++;
 }
 maxsubset->next=maxsubset->next->next;//删除目前節點,即目前步下能到達的節點都已經走完了,可出隊列了
 q=maxsubset->next;//
 }      

The End

備注:公衆号菜單包含了整理了一本AI小抄,非常适合在通勤路上用學習。

【強化學習入門】馬爾科夫決策過程