關於強化學習優化粒子群演算法的論文解讀(上)

語言: CN / TW / HK

theme: channing-cyan highlight: a11y-light


持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第17天,點選檢視活動詳情

前言

本片博文主要講解一下一篇關於使用DDPG神經網路去優化粒子群演算法的一篇文章。文章名為: 《Reinforcement learning based parameters adaption method for particleswarm optimization》

這不是要開組會了嘛,小爺得上,得講一篇論文,不想寫PPT直接寫MarkDown。

TIPS:本文的順序和那篇論文的是不一樣的,我將挑選重點的來說明。

本文主要分四步:

  1. 背景知識 (快速上手)
  2. 相關研究(大致過一下)
  3. 具體如何使用強化學習
  4. 更多細節
  5. 思考與假設

版權

鄭重提示:本文版權歸本人所有,任何人不得抄襲,搬運,使用需徵得本人同意!

2022.6.25

日期:2022.6.25 DAY 6

背景知識

傳統PSO演算法

1995年,受到鳥群覓食行為的規律性啟發,James Kennedy和Russell Eberhart建立了一個簡化演算法模型,經過多年改進最終形成了粒子群優化演算法(Particle Swarm Optimization, PSO) ,也可稱為粒子群演算法。

粒子群演算法的思想源於對鳥群覓食行為的研究,鳥群通過集體的資訊共享使群體找到最優的目的地。如下圖,設想這樣一個場景:鳥群在森林中隨機搜尋食物,它們想要找到食物量最多的位置。但是所有的鳥都不知道食物具體在哪個位置,只能感受到食物大概在哪個方向。每隻鳥沿著自己判定的方向進行搜尋,並在搜尋的過程中記錄自己曾經找到過食物且量最多的位置,同時所有的鳥都共享自己每一次發現食物的位置以及食物的量,這樣鳥群就知道當前在哪個位置食物的量最多。在搜尋的過程中每隻鳥都會根據自己記憶中食物量最多的位置和當前鳥群記錄的食物量最多的位置調整自己接下來搜尋的方向。鳥群經過一段時間的搜尋後就可以找到森林中哪個位置的食物量最多(全域性最優解)。

在這裡插入圖片描述

這裡主要是通過兩個方程來實現對粒子的控制,以此來實現讓粒子實現全域性的搜尋。 在這裡插入圖片描述

強化學習

強化學習是機器學習領域之一,受到行為心理學的啟發,主要關注智慧體如何在環境中採取不同的行動,以最大限度地提高累積獎勵。

在這裡插入圖片描述

關鍵概念

關於強化學習這裡面主要有幾個概念。

智慧體

強化學習的本體,作為學習者或者決策者。

環境

強化學習智慧體以外的一切,主要由狀態集合組成。

狀態

一個表示環境的資料,狀態集則是環境中所有可能的狀態。

動作

智慧體可以做出的動作,動作集則是智慧體可以做出的所有動作。

獎勵

智慧體在執行一個動作後,獲得的正/負反饋訊號,獎勵集則是智慧體可以獲得的所有反饋資訊。

策略

強化學習是從環境狀態到動作的對映學習,稱該對映關係為策略。通俗的理解,即智慧體如何選擇動作的思考過程稱為策略。

目標

智慧體自動尋找在連續時間序列裡的最優策略,而最優策略通常指最大化長期累積獎勵。

因此,強化學習實際上是智慧體在與環境進行互動的過程中,學會最佳決策序列。

基本框架

強化學習主要由智慧體和環境組成。由於智慧體與環境的互動方式與生物跟環境的互動方式類似,因此可以認為強化學習是一套通用的學習框架,是通用人工智慧演算法的未來。 強化學習的基本框架如圖所示,智慧體通過狀態、動作、獎勵與環境進行互動。 在這裡插入圖片描述

線上學習(簡述)

這裡先做一個簡述,後面我們會進行深入一點的探討。 關於強化學習呢,還可以劃分:線上學習和離線學習。在論文當中使用的DDPG,使用的是線上學習策略,所以本文也是簡單說一下線上學習和離線學習。

這裡以QLearn 為代表

在這裡插入圖片描述

離線學習(簡述)

離線學習其實和線上學習類似,區別在於選擇動作的時候,離線學習單純按照價值最大的去現在。而線上學習的話還是有一定概率來選擇並不是當前價值最大的動作。 在這裡插入圖片描述

實際核心程式碼的區別:

Q Learn

```python def QLearning(): QTable = Init(N_STATES, ACTIONS)
for ecpho in range(ECPHOS): step_counter = 0 S = 0 # 是否回合結束 isWin = False updateEnvShow(S, ecpho, step_counter) while not isWin:

        #選擇行為
        A = ChoseAction(S, QTable)
        # 得到當前行為會得到的Reward,以及下一步的情況
        S_, R = GetReward(S, A)
        # 估算的(狀態-行為)值
        q_predict = QTable.loc[S, A]
        if S_ != 'win':

            # 實際的(狀態-行為)值 這個就是類似與G1
            q_target = R + GAMMER * QTable.iloc[S_, :].max()

        else:
            #  實際的(狀態-行為)值 (回合結束)
            q_target = R
            isWin = True

        QTable.loc[S, A] += ALPHA * (q_target - q_predict)  #  QTable 更新
        S = S_  # 探索者移動到下一個 state
        # 環境更新顯示
        updateEnvShow(S, ecpho, step_counter+1)

        step_counter += 1
return QTable

```

在這裡插入圖片描述 Sarsa 離線學習 ```python def SARSA(): QTable = Init(N_STATES, ACTIONS) for ecpho in range(ECPHOS): step_counter = 0 S = 0 # 是否回合結束 isWin = False updateEnvShow(S, ecpho, step_counter) A = ChoseAction(S, QTable) # 先初始化選擇行為 while not isWin:

        S_, R = GetReward(S, A)
        try:
            A_ = ChoseAction(S_, QTable)
        except:
            # 這裡說明已經到了終點(如果報錯)
            pass
        q_predict = QTable.loc[S, A]
        if S_ != 'win':
            q_target = R + GAMMER * QTable.iloc[S_, :].max()

        else:
            q_target = R
            isWin = True

        QTable.loc[S, A] += ALPHA * (q_target - q_predict)  #  QTable 更新

        S = S_  
        A = A_  
        updateEnvShow(S, ecpho, step_counter+1)

        step_counter += 1
return QTable

``` 對於離線學習而言,如果從上面的程式碼來改的話,那麼只需要把動作選擇函式的概率調整為1,並且先提前選擇一個價值最大的動作即可。

無論是對於線上學習還是離線學習,其目的都是需要得到這樣一張表: 在這裡插入圖片描述

Qlearn

現在我們來好好的聊了裡面的一些大體的細節。

馬爾可夫決策

我們這裡只講大概幾個和QLearn 關係比較緊密的東西。 裡面比較詳細的關於這個的是 概率論 這裡面有提到。 這個是強化學習的一個理論支撐,類似於梯度下降,微分對神經網路

馬爾科夫鏈

那麼首先我們的第一點是馬爾可夫鏈:這個東西就是一系列可能發生的狀態。

例如:一個人剛起床,他有可能先刷牙,然後洗臉,然後上課。 或者這個人 起床,洗澡,刷牙,然後上課。 用一條鏈來表示就是:

刷牙-洗臉-上課 洗澡-刷牙-上課

策略

在這裡插入圖片描述

累計回報

在這裡插入圖片描述 這個主要是看到馬爾可夫鏈,當前的狀態對後面是有關聯的。

值函式

在這裡插入圖片描述

他們之間的對應關係大致如下圖: 在這裡插入圖片描述

具體表現

強化學習就是數學原理是基於馬爾可夫來的,那麼在實際的表現當中的目的是為了求取一個表格Q。 這個表格Q,其實就是: 在這裡插入圖片描述 按照前面的粒子就是這個玩意: 在這裡插入圖片描述

在我們實際上開始的時候Q表我們是不知道的,所以我們會有一個初始化,之後輸入當前的狀態和下一步的動作,會得到當前如果選擇了這個動作,那麼將得到的獎勵,以及下一個狀態,我們先通過q(s,a)可以得到。但是除此之外,由於我們實際上Q表一開始是隨機的,所以是需要進行不斷完善,收斂的,所以我們還需要不斷更新我們的Q表。

所以在我們的實際程式碼裡面還是有不一樣的。 在這裡插入圖片描述

DQN神經網路

這個主要是因為論文中提到了DDPG,如果不說這個DQN 的話,這個DDPG很難說下去,那麼論文也很難講下去,這篇論文的難點在於知識面較廣,實際演算法其實不難。

DQN 其實和QLearn是一樣的,區別在於,原來的Q表從一個表,一個有實體的表,變成了一個神經網路。目的是為了,通過神經網路去擬合那個Q表,因為在實際過程當中,如果需要將所有的狀態和動作價值存起來是不可能的如果它的狀態很多的話。所以需要一個神經網路來做擬合。 虛擬碼如下: 在這裡插入圖片描述

在這裡插入圖片描述

編碼細節

在我們原來的時候,使用Q表 在這裡插入圖片描述

但是現在的話,由於我們是直接使用了這種“特殊的表”所以我們可以單獨使用兩個神經網路去分別代表實際和估計(預測)

在這裡插入圖片描述 在這裡插入圖片描述 而我們的損失函式就是讓q_eval 和 q_target 變小 於是: 在這裡插入圖片描述 這裡的loss_func 是nn.MSELoss()

DDPG

從上面的內容,你會發現,這個玩意和傳統的Qlearn沒太大區別只是很巧妙地使用了神經網路,最終還是要得到一個關於每一個動作的打分,然後去按照那個得分去選擇分高的動作,換一句話說是,這個神經網路還是隻能得到對應動作的價值,例如 上下左右,然後選價值最大的,如 上 這個動作。

但是在我實際的PSO問題當中,我想要的是一組解,也就是你直接告訴我w c1 c2 取哪些值?

所以現在直接使用DQN 就很難了,顯然這玩意貌似只能選擇出一個動作,而我的w c1 c2 不可能是一個動作,如果把他看作是一個動作的話,那麼你將有 無窮個動作選擇,假定有範圍,那就是可數無窮個動作。

為了解決那個問題,於是有了DDGP,也就是我想要直接得到一組動作,你直接告訴我 w c1 c2取得哪些值?

怎麼做,沒錯,再來一個神經網路。 具體怎麼做,如下圖: 在這裡插入圖片描述

Actor 網路直接生成一個動作,然後 原來在DQN的那個網路在這裡是Critic 網路 去評價,這個評價其實就是在DQN裡面的那個網路,輸入一個S,和 A 得到一個價值,現在這個價值變成了評分。 在這裡插入圖片描述

損失函式就是這樣: 在這裡插入圖片描述

GAN對抗神經網路(拓展)

這個是我接下來要乾的事情,基於GAN來優化PSO,因為從流程和建模的角度來看,使用DDPG是使用GAN區別不大,只是一個建模將直接通過適應值來,一個是可以通過引數本身進行建模。

在這裡插入圖片描述

異同

現在我們再來對比一下DDPG神經網路。

首先Actor 在這裡相當於Generator 評委還是評委,這兩個網路都是要訓練的網路。 這個判斷器,就好比那個Cirtic,區別是啥?強化學習有個環境,這個DQN裡面,或者DDPG裡面那個評分怎麼來的,還不是按照環境來給的,你把DDPG裡面的Critic換成Q表一樣跑,只是記憶體要炸,而且效果可能還要好,一方面精準記錄,一方面只有一個網路。 而我們的GAN 是現有一個專家,這個專家不就也相當於環境嘛?

此外損失函式不同。 在這裡插入圖片描述

在這裡插入圖片描述

相關研究

這篇論文的話,有相當大的部分再緒論這個。我們這裡簡單挑選幾個。

Linear strategies 線性策略

這個是我們經常使用的一個優化。

在這裡插入圖片描述 下面的一些描述都是相關論文有關於線性策略的一個優化 在這裡插入圖片描述

History based

在這裡插入圖片描述

有的論文在執行過程中將整個執行過程劃分為許多小的過程。在每一個小過程中使用不同的引數或策略,並根據小階段最後的演算法效能來判斷引數或策略是否足夠好。足夠好的策略或引數將在後續執行中被更多地選擇。在論文[29]中,作者建立了一個引數儲存器。每次執行時,將所有執行粒子分配不同的引數組,小段執行完成後,將一些效能較好的粒子使用的引數儲存在引數儲存器中。後續粒子選擇的引數將趨向於接近引數記憶的平均值。在[30]中,作者根據以往一些優秀的粒子群演算法設計了5種粒子群操作策略,並記錄了每種策略的成功率。在初始狀態,所有成功率設定為50%,然後在每個小過程中,根據過去成功率的權重,隨機選擇一個策略執行。有多少粒子被提升了,這是基於記憶的成功率更新。在論文[31]中,作者對原EPSo進行了改進,更新了設計的策略,將粒子群劃分為多個子群,並對策略進行單獨評估,進一步提高了演算法的效能。

強化學習優化

關於其他的方法的話,實在是在論文裡面提到的不少,但是都還不是主角,所以我們重點來到這裡。

這個部分的話,還不是這篇論文當中所使用到的策略,還是在介紹相關的研究。 這裡論文中給了一張表: 在這裡插入圖片描述

這裡是其他使用強化學習的童鞋,他們使用這個強化學習輸入輸出得到的東西在PSO的運用。 如[40] 它輸入的引數的當前位置,gbest,輸出c1 c2 通過 gbest 設計獎勵,是直接作用在單個粒子的,使用的演算法是PG(DDPG)

然後下面是關於強化學習的介紹了,這個在我們的背景知識裡面有提到。我感覺是至少要比論文更加詳細的。

Comprehensive learning particle swarm optimizer(CLPSO)

這個也是一個對粒子群進行優化的一個演算法,我個人覺得比較有意思,所以這裡也是單獨講一下。 原文是這樣的: 在這裡插入圖片描述

我這大概說一下人話就是: 首先是這個速度方程: 在這裡插入圖片描述 w 還是那個w,c 還是那個c,rand就是隨機數,這裡的pbest指的是全部的粒子的pbest,通過下面這個方程來實現選擇哪一個pbest 在這裡插入圖片描述

這裡ps為種群大小,a = 0.05,b = 0.45。當粒子更新其一維速度時,會生成一個隨機值[0,1],並與Pc進行比較。如果隨機值大於Pc,該維度的粒子將遵循自己的pbest。否則,它會跟隨另一個粒子的最佳值。CLPSo將採用錦標賽選擇來選擇目標粒子。此外,為了避免在錯誤的方向上浪費函式的計算,CLPSO將一定次數的計算定義為重新整理間隙m。在粒子跟隨目標粒子的過程中,將粒子停止改進的次數記錄為flag,如果flag大於m,則粒子將再次採用竟賽選擇的方式獲得新的目標粒子。

那麼這裡就是相關研究了,我這裡先粗略帶過,因為重點還是這篇論文的實際運用。

由於篇幅問題,今天就先到這裡吧~