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

語言: CN / TW / HK

theme: channing-cyan highlight: a11y-light


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

前言

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

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)

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

我這大概說一下人話就是: 首先是這個速度方程: 在這裡插入圖片描述 簡單描述就是:對每一個粒子,在整個種群中隨機選取兩個粒子,比較兩個粒子適應度並取較優的一個作為待選(對比pbest),然後依據交叉概率Pc來按維度將待選粒子與該粒子的歷史最有進行交叉,以生成綜合學習因子,即公式中的在這裡插入圖片描述 。同時在迭代過程中記錄粒子沒有變化的迭代停滯次數(注意原始碼中並未將變化的粒子停滯次數歸零),當某個粒子的停滯次數大於閾值,則重新為其生成綜合學習因子。

在這裡插入圖片描述

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

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

具體如何使用強化學習

這個就是在論文當中如何具體使用了。

這裡我們首先需要先看到它的一個神經網路結構。

網路結構

Actor 網路

在這裡插入圖片描述

Critic 網路

在這裡插入圖片描述

在這裡的話,我感覺這個論文有點問題不知道是不是寫錯了,它輸出的(Actor)是25維度的,但是他後面的那個方程又說他是20個維度的,不知道是不是這個圖搞錯了(吐槽一波,這個圖其實也是可以使用工具生成的,畫的那麼醜,還不準)

輸入

首先是對Actor網路的輸入,這個玩意的話是話是需要三個玩意的。 第一個是當前的迭代狀態,也就是迭代了幾輪。 在這裡插入圖片描述 不過這裡都是做了歸一化的,範圍壓縮在0-1之間 第二個就是當前粒子之間的一個離散度 在這裡插入圖片描述

很簡單就是每一個粒子的每一個維度減去平均值,開根號,然後求和取平均。 其實這一部分我覺得他很大程度是按照:(HCLPSO)參考了一下的。

第三個就是,當前粒子的持續不再增長時間 在這裡插入圖片描述 這個很好理解。就是假設迭代200次,第50次的時候發現Gbest不變了,然後現在執行到100次了 這個算的話就是:100-50=50 50/200 = 0.25

最後是對這個輸入做0-1歸一化。 用的是這個玩意: 在這裡插入圖片描述 這裡我稍微解釋一下,就是我們這裡要求是三個引數輸入,但是這個還不夠,所以呢,使用這個方法來進行感知和擴充,也就是例如計算出分散度是5 那麼 就要得到 sin(51),sin(52),sin(54),sin(58),sin(5*16)

然後這樣擴充之後得到的輸入是15維。

然後這個劃分5組的在論文這部分的開頭和後面說了。 在這裡插入圖片描述

在這裡插入圖片描述

輸入引數的對映

看到剛剛那一段話: 在這裡插入圖片描述 這也是我覺得那個圖有問題的地方,他這裡說了是20維度,結果圖上給我說25。 這個對映就是這樣的。分了5組嘛,對於第一組也就是編號0的就是這樣的。

值得一提是下面的: 在這裡插入圖片描述 這個是人家用來做對比實驗的時候用的,在別人的演算法裡面套強化學習,套他的策略。 不是他自己提出的演算法。

之後是速度方程的更新:這裡它借用了CLPSO。

在這裡插入圖片描述 這裡他又改了,加了個C3,其實也就是利用了a[3]。

Critic的輸入

這個網路其實就是和DQN那個網路訓練是類似的。

然後這裡的輸入的是這個玩意 在這裡插入圖片描述 然後對輸入的動作做了一個擾動 在這裡插入圖片描述

訓練過程

環境的編寫

這個對環境的編寫就很簡單了,在當前的狀態下采用這個動作下,獲取的環境獎勵。這個獎勵直接參考這個: 在這裡插入圖片描述 這裡我再說一遍,這個哥們是沒有使用多種群的,人家只是劃分了一下組別,不同的組對應不同的引數,這個引數是一次性已經產生了的。

損失函式

這個沒啥好說的,套DDPG的就完了。 這裡我再重複一下就完了。 在這裡插入圖片描述

這裡解釋一下為啥那個Actor網路 loss = -Qw(s,a) 因為對於這個來說,我希望的是我的動作價值越大越好,如果Qw(s,a)的值越大,那麼說明損失越小,反正損失越大。我的目的是讓損失越來越小,所以一開始損失肯定是大的,我要讓他越來越小所以,需要加個負號。

流程的話論文有描述: 在這裡插入圖片描述

呼叫過程

這個就是訓練完後如何使用這個東西了。 在這裡插入圖片描述 主要是按照原來的結構去直接呼叫Actor網路即可。

後面我會有具體的復現講解。

更多細節

這部分其實就是後面的實驗部分等等,這部分還是看具體論文描述吧。

思考與假設

這裡我就打算把那個ENV換成“專家”,然後基於這個強化學習的框架去用GAN網路。 想怎麼樣,我感覺可能和強化學習類似,不過使用GAN建模的時候專家系統將會有點區別,它生成的將不是一個引數,如果套用這個演算法框架的話,而是直接生成評分,這樣的話建模方便,而且我覺得可以加快評委網路的收斂。不過損失函式還是類似的。不過這裡可能已經在某種程度上屬於強化學習了,只是對DQN那部分也就是cirtic網路和損失函式套用了GAN,至於Actor還是一樣的。

不過如果對PSO演算法或者進化演算法的話,我感覺還是使用多策略,平衡開採和區域性的關係才是不錯的選擇,在這片論文我覺得收穫最大的還是CLSPO,這種型別的演算法,以及這裡提到的離散度的概念,我感覺很適合用來做感知器,也許可以把強化學習或者GAN網路用在神經網路最擅長的感知方面。