<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          干貨 | Python人工智能在貪吃蛇游戲中的應(yīng)用探索(上)

          共 9334字,需瀏覽 19分鐘

           ·

          2020-03-14 23:20

          文案&代碼 白宇嘯
          排版&審校 鄧發(fā)珩

          前言

          一個(gè)月前,人工智能對(duì)我來(lái)說(shuō)都是很陌生的,更不用說(shuō)神經(jīng)網(wǎng)絡(luò)、強(qiáng)化學(xué)習(xí)、DQN等名詞了。疫情期間,經(jīng)過(guò)在家努力學(xué)習(xí),我對(duì)這些概念越來(lái)越清晰了,也越來(lái)越喜歡上了它們。b047fec4895c9b4bd821ea888ad86e41.webp

          下面,我想寫一些收獲,希望能給同樣想在這方面學(xué)習(xí)的小伙伴一點(diǎn)啟發(fā),也歡迎大家指教,一起進(jìn)步哦。今天的內(nèi)容主要有以下幾方面:

          • 什么是神經(jīng)網(wǎng)絡(luò)
          • tensorflow的安裝和開(kāi)發(fā)環(huán)境的配置
          • 強(qiáng)化學(xué)習(xí)Q_Learning
          • 深度神經(jīng)網(wǎng)絡(luò)DQN
          • 利用DQN開(kāi)發(fā)的貪吃蛇程序

          后續(xù)我將分三篇來(lái)進(jìn)行該主題的分享,讓我們開(kāi)始吧!

          什么是神經(jīng)網(wǎng)絡(luò)

          神經(jīng)網(wǎng)絡(luò)原本指的是生物神經(jīng)網(wǎng)絡(luò),人工智能興起后,產(chǎn)生了人工神經(jīng)網(wǎng)絡(luò)(artificial neural network,縮寫ANN)。人的神經(jīng)接受信息以后,通過(guò)軸突傳至末梢,轉(zhuǎn)化成一種人可接受的信息。

          而ANN是指由大量的處理單元(神經(jīng)元) 互相連接而形成的復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu),是對(duì)人腦組織結(jié)構(gòu)和運(yùn)行機(jī)制的某種抽象、簡(jiǎn)化和模擬,以數(shù)學(xué)模型模擬神經(jīng)元活動(dòng),是基于模仿大腦神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)和功能而建立的一種信息處理系統(tǒng)。

          2bd2c25c6a97b3a7257e43e849b1a9b1.webp生物神經(jīng)網(wǎng)絡(luò)圖

          神經(jīng)網(wǎng)絡(luò)主要由:輸入層、隱藏層、輸出層構(gòu)成。如圖,最左邊的一層稱為輸入層,位于這一層的神經(jīng)元稱為輸入神經(jīng)元。最右邊的輸出層包含了輸出神經(jīng)元。中間的層被稱為隱藏層。隱藏層就是既不是輸入也不是輸出的層次,一個(gè)神經(jīng)網(wǎng)絡(luò)可以有一個(gè)或多個(gè)隱藏層。

          d7c8d95130c9508d253c7bc91c884ef5.webp神經(jīng)網(wǎng)絡(luò)構(gòu)成

          網(wǎng)絡(luò)中的輸入和輸出層一般都被設(shè)計(jì)的很簡(jiǎn)單。網(wǎng)絡(luò)輸入層的每個(gè)神經(jīng)元代表了一個(gè)特征,輸出層個(gè)數(shù)代表了分類標(biāo)簽的個(gè)數(shù)。而隱藏層的設(shè)計(jì)比較復(fù)雜,隱藏層作用很大,就其本身而言,每一層都可以視為一個(gè)單獨(dú)的機(jī)器學(xué)習(xí)算法。

          每個(gè)隱藏層神經(jīng)元/輸出層神經(jīng)元的值(激活值),都是由上一層神經(jīng)元,經(jīng)過(guò)加權(quán)求和與非線性變換而得到的。上游層的輸出被用作輸入,它的輸出被傳遞到下一層,然后下一層使用該輸出作為輸入,依此類推。

          此行為意味著,當(dāng)堆疊各種層和創(chuàng)建深度神經(jīng)網(wǎng)絡(luò)時(shí),系統(tǒng)會(huì)學(xué)習(xí)數(shù)據(jù)的中間表示,以幫助下游層更有效地完成其工作。現(xiàn)在,神經(jīng)網(wǎng)絡(luò)的研究人員已經(jīng)開(kāi)發(fā)了隱藏層的許多的最優(yōu)設(shè)計(jì)規(guī)則,幫助我們決定如何權(quán)衡網(wǎng)絡(luò)的隱藏層數(shù)和訓(xùn)練網(wǎng)絡(luò)所需的時(shí)間。

          總結(jié):建立神經(jīng)網(wǎng)絡(luò)的方法:建立M個(gè)隱藏層,按順序建立輸入層跟隱藏層的聯(lián)結(jié),最后建立隱藏層跟輸出層的聯(lián)結(jié)。為每個(gè)隱藏層的每個(gè)節(jié)點(diǎn)選擇激活函數(shù)。求解每個(gè)聯(lián)結(jié)的權(quán)重和每個(gè)節(jié)點(diǎn)自帶的bias值。

          下面重點(diǎn)描述下神經(jīng)網(wǎng)絡(luò)中的概念。

          結(jié)構(gòu):結(jié)構(gòu)指定了網(wǎng)絡(luò)中的變量和它們的拓?fù)潢P(guān)系。例如,神經(jīng)網(wǎng)絡(luò)中的變量可以是神經(jīng)元連接的權(quán)重和神經(jīng)元的激勵(lì)值。激活函數(shù)(激勵(lì)函數(shù))與權(quán)重

          權(quán)重:通俗來(lái)講就是各個(gè)變量在計(jì)算中所占比重。舉個(gè)簡(jiǎn)單的例子,大學(xué)的每一門科目都有相應(yīng)的學(xué)分,這個(gè)學(xué)分意味著在加權(quán)時(shí)所占的比重,我們假設(shè)哲學(xué)占5學(xué)分,數(shù)學(xué)3學(xué)分,就有得到值A(chǔ)。在神經(jīng)元中,這個(gè)值會(huì)被帶入激活函數(shù)進(jìn)一步處理。

          此處還涉及到偏值b,其大概相當(dāng)于一次函數(shù)的截距,我們通過(guò)b來(lái)適當(dāng)控制值的范圍。常見(jiàn)激活函數(shù)如下:

          6d49399f9f1889fed4e0f4ea1e081f35.webp激活函數(shù)

          損失函數(shù):如下公式,此處為得到的輸出值,則是期望值,當(dāng)函數(shù)值趨于零,就得到了理想的輸出值(不一定是最好的)。從數(shù)學(xué)的角度來(lái)講,我們寫出的損失函數(shù),在輸出值趨于期望時(shí),函數(shù)值要盡可能快的趨于零,如果在絕對(duì)值外添加次方,即可達(dá)到這一效果。

          根據(jù)損失函數(shù)的大小,我們以此來(lái)調(diào)整權(quán)重和偏值,尋找最優(yōu)解。

          學(xué)習(xí)規(guī)則:指定了網(wǎng)絡(luò)中的權(quán)重如何隨著時(shí)間推進(jìn)而調(diào)整。一般情況下,學(xué)習(xí)規(guī)則依賴于神經(jīng)元的激勵(lì)值。它也可能依賴于監(jiān)督者提供的目標(biāo)值和當(dāng)前權(quán)重的值。

          tensorflow的安裝與配置

          TensorFlow是谷歌研發(fā)的第二代人工智能學(xué)習(xí)系統(tǒng),其命名來(lái)源于本身的運(yùn)行原理。Tensor(張量)意味著N維數(shù)組,F(xiàn)low(流)意味著基于數(shù)據(jù)流圖的計(jì)算,TensorFlow為張量從流圖的一端流動(dòng)到另一端計(jì)算過(guò)程。TensorFlow是將復(fù)雜的數(shù)據(jù)結(jié)構(gòu)傳輸至人工智能神經(jīng)網(wǎng)中進(jìn)行分析和處理過(guò)程的系統(tǒng)。

          TensorFlow可被用于語(yǔ)音識(shí)別或圖像識(shí)別等多項(xiàng)機(jī)器深度學(xué)習(xí)領(lǐng)域。是一個(gè)開(kāi)源的、基于 Python 的機(jī)器學(xué)習(xí)框架。下面我們先講述如何配置tensorflow的開(kāi)發(fā)環(huán)境。

          首先強(qiáng)調(diào)一點(diǎn),在python環(huán)境下安裝tensorflow,必須做到版本的匹配。如果你的電腦上裝了多個(gè)python版本,則很容易因?yàn)榘姹締?wèn)題造成安裝的失敗。最好卸載不需要的python,使用Anacoda自帶的python。

          下載安裝Anacoda

          輸入網(wǎng)址https://www.anaconda.com/distribution/,如圖所示,選擇python3.7版本下載:

          8c307bd907d6a577f506f5c6fc50716a.webp

          下載安裝后,點(diǎn)擊開(kāi)始,找到Anacoda3文件,選擇Anacoda Prompt,輸入python,會(huì)顯示python版本,即安裝成功。

          14d02b242d23189ebd387b2594beaaf7.webp

          或者在cmd中輸入pip list,如圖,即安裝成功。

          8f271a4215898efa83f949c2f9fa42a5.webp

          建立tensorflow虛擬環(huán)境

          Step 1: 建立Anacoda(以下簡(jiǎn)稱ana)與tensorflow、python 的關(guān)系,輸入conda create --name tensorflow python=3.7

          Step 2: 輸入y,即開(kāi)始建立虛擬環(huán)境。

          這里注意版本問(wèn)題,自己需要的python版本是哪個(gè)版本,這里需要寫明確(即conda create --name tensorflow python= ??? )。一個(gè)ana在同一時(shí)間只能支持一個(gè)版本,每個(gè)版本對(duì)應(yīng)的tensorflow 的版本不同。查詢版本,即在ana prompt 中輸入python。如果已經(jīng)知道對(duì)應(yīng)的tensorflow版本,可以直接conda create—name tensorflow版本,

          Step 3: 安裝tensorflow,在ana環(huán)境下,進(jìn)入tensorflow的虛擬環(huán)境,輸入conda activate。

          2b3a6649da6fe47fbcfc23cee1ef7544.webp

          注意一定要進(jìn)入tensorflow 虛擬環(huán)境安裝,輸入conda install tensorflow 版本(我安裝用的2.1.0),如圖,即安裝成功

          91c11377c2315e5553808668920d96d1.webp

          輸入deactivate,退出虛擬環(huán)境。

          Step 4: 安裝完畢,可以在cmd的python狀態(tài)下輸入import tensorflow as tf來(lái)測(cè)試是否安裝成功。

          安裝pycharm

          Step 1: 下載安裝Pycharm,進(jìn)入官網(wǎng):

          http://www.jetbrains.com/pycharm/download/#section=windows

          如圖所示,推薦下載免費(fèi)使用的社區(qū)版:

          dbcc570cb2106ccb5d153baae2846d81.webp

          Step 2: 配置pycharm 環(huán)境,進(jìn)入pycharm,點(diǎn)擊左上角File,找到Setting,點(diǎn)擊Project 中的Project Interpreter,點(diǎn)擊設(shè)置按鈕,找到已安裝包的路徑,創(chuàng)建環(huán)境。創(chuàng)建完畢后,可以找到python庫(kù)和tensorflow庫(kù)。(圖中很多為私人配置,不一樣不要緊)

          54805cb4ce5776b4301c16ae93b039de.webp54805cb4ce5776b4301c16ae93b039de.webp

          Step 3: 安裝opencv

          方法一:Opencv在cmd環(huán)境中安裝,輸入pip install opencv-python,默認(rèn)使用國(guó)外源文件,速度比較慢,能夠成功,但大概率在下載過(guò)程中因?yàn)榫W(wǎng)絡(luò)原因或者其他原因中斷,如圖

          6cdeeaca0aaaa86c560286a8f244745c.webp

          方法二:在opencv的官網(wǎng)上下載好安裝文件包再進(jìn)行安裝:

          https://www.lfd.uci.edu/~gohlke/pythonlibs/

          注意,要對(duì)應(yīng)自己的python 和tensorflow版本,還有自己安裝的電腦的位數(shù)來(lái)選擇合適的安裝包,方法是在出錯(cuò)的那句話中找到文件名,按照這個(gè)文件名去找安裝包。

          00b4175d27a095517f4a6074bd2a8796.webp

          進(jìn)入網(wǎng)站后要瘋狂往下拉,在很下面。

          安裝合適opencv文件后,在cmd環(huán)境下輸入pip install 路徑(\opencv_python-*.whl)

          寫命令代碼時(shí)指明安裝包的路徑。安裝完成后,在python環(huán)境下,輸入import cv2,即可檢驗(yàn)。

          94626c2e8e7dc21bd8f34ffaa2411431.webp

          另外有很多文獻(xiàn)建議使用國(guó)內(nèi)鏡像網(wǎng)站安裝opencv ,這里不建議,因?yàn)槭×撕芏啻巍?/p>

          Step 4: 安裝loguru,輸入pip install loguru

          ad49fb16694e2d1b6830e625a11b3f72.webp

          Tips:其實(shí)能順利安裝 tensorflow 并且在Python中正常使用不是件很容易的事情。特別指出的是,能正確導(dǎo)入tensorflow并不一定能正常使用,如果遇到同樣的問(wèn)題,請(qǐng)?jiān)俅握J(rèn)真的檢查你的python版本,tensorflow版本 和python中的環(huán)境配置。實(shí)在找不出原因,那就重新開(kāi)始吧!我用了一周的時(shí)間解決安裝中遇到的各種問(wèn)題,步步驚心哦!

          利用tensorflow建立神經(jīng)網(wǎng)絡(luò)(用后面貪吃蛇神經(jīng)網(wǎng)絡(luò)的模型為例)

          Step 1: 導(dǎo)入tensorflow

          import tensorflow as tf
          from tensorflow.keras import layers

          Step 2: 用模型堆疊構(gòu)建模型

          我們使用的最多的是層的堆疊,即tf.keras.Sequential模型,如下:

          self.model = tf.keras.Sequential([
          tf.keras.layers.Dense(units=32, input_dim=self.input_shape,
          activation=tf.nn.relu), #輸入層
          tf.keras.layers.Dense(units=16, activation=tf.nn.relu),
          tf.keras.layers.Dense(units=8, activation=tf.nn.relu),
          tf.keras.layers.Dense(units=8, activation=tf.nn.relu),
          tf.keras.layers.Dense(units=16, activation=tf.nn.relu),
          tf.keras.layers.Dense(units=32, activation=tf.nn.relu),#隱藏層
          tf.keras.layers.Dense(units=self.output_size, activation=tf.keras.activations.linear) #輸出層
          ])
          # activation 激活函數(shù)

          下面圖形是用激活函數(shù)0e1eae3f87fbeee7dc1fcd6a4656354b.webp

          Step 3: 編譯網(wǎng)絡(luò)神經(jīng)模型

          self.model.compile(optimizer = tf.keras.optimizers.Adam(self.lr), loss='mse',metrics=['accuracy'])
          #loss 損失函數(shù)

          Step 4: 神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)

          self.model.predict(state, batch_size)
          # batch_size批次數(shù)據(jù) 整形

          Step 5: 神經(jīng)網(wǎng)絡(luò)訓(xùn)練

          model.fit(states, action_values, batch_size=batch_size, verbose=0, epochs=4)

          強(qiáng)化學(xué)習(xí)Q_Learning

          Q_learning是一個(gè)基于值的強(qiáng)化學(xué)習(xí)算法,利用 Q 函數(shù)尋找最優(yōu)的「動(dòng)作—選擇」策略。強(qiáng)化學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個(gè)分支,是指在某個(gè)環(huán)境下,一個(gè)個(gè)體通過(guò)和環(huán)境的互動(dòng),而不斷改進(jìn)他行為的方法。

          最常見(jiàn)的強(qiáng)化學(xué)習(xí)的例子就是我們經(jīng)常玩的游戲,比如貪吃蛇游戲,在這個(gè)游戲中,

          輸入的內(nèi)容是:

          狀態(tài)(States)=環(huán)境,貪吃蛇的蛇頭的位置,食物的位置;

          動(dòng)作(Actions)=任何可以執(zhí)行的操作,上下左右的移動(dòng);

          獎(jiǎng)勵(lì)(Rewards)=每個(gè)動(dòng)作得到的獎(jiǎng)勵(lì),吃掉食物得到的分?jǐn)?shù),蛇死掉扣掉的分?jǐn)?shù)等;

          輸出的內(nèi)容:

          方案(Policy)=在當(dāng)前狀態(tài)下,應(yīng)該選哪個(gè)行動(dòng)。它是一個(gè)狀態(tài)到一個(gè)行動(dòng)的函數(shù)。(S,A,R)是用戶輸入的,P是函數(shù)生成的。

          以上4個(gè)元素通過(guò)tuple方法定義結(jié)構(gòu),tuple(S,A,R,P) 構(gòu)成了強(qiáng)化學(xué)習(xí)系統(tǒng)。

          Q_learning 的目的就是最大化Q函數(shù)的值(給定一個(gè)狀態(tài)和動(dòng)作時(shí)的未來(lái)獎(jiǎng)勵(lì)期望),貪吃蛇走怎么樣的路線,才能得到最高的分?jǐn)?shù)。

          對(duì)于在每個(gè)狀態(tài)下的每個(gè)動(dòng)作產(chǎn)生的結(jié)果(得到的分?jǐn)?shù)),我們可以用下面的表

          553d7cd1a3122da64fc253d4ab0a81d0.webp

          這里,我們引入一個(gè)路徑規(guī)劃的概念: Bellman condition, 這個(gè)概念的中心思想是說(shuō):如果從最佳選擇的路徑的末端截除一小部分,余下的路徑仍然是最佳路徑。舉例:有個(gè)最優(yōu)路徑經(jīng)過(guò)了ABCDE五個(gè)點(diǎn),那么BCDE路徑肯定是最優(yōu)的。所以,我們想獲得最優(yōu)的路徑,只需要獲得每個(gè)分割成的更短路徑的最優(yōu)解。上圖是最簡(jiǎn)單的Q_table的例子, Q-table是Q-learning的核心。它是一個(gè)表格,每一列代表一個(gè)動(dòng)作,每一行表示一個(gè)狀態(tài)。則每個(gè)格子的值就是此狀態(tài)下采取此動(dòng)作獲得的最大長(zhǎng)期獎(jiǎng)勵(lì)期望。通過(guò)此,就可以知道每一步的最佳動(dòng)作是什么。

          將這個(gè)概念用到尋找最佳路徑上稱作temporal difference learning。

          為便于計(jì)算,將Q-Table表示為Bellman遞推等式,拆分為當(dāng)前回報(bào)和未來(lái)最大回報(bào)的和,即,其中表示狀態(tài)在行為作用下的下一狀態(tài),而為狀態(tài)后所有可能的行為,為價(jià)值累積過(guò)程中的打折系數(shù),決定了未來(lái)回報(bào)相對(duì)于當(dāng)前回報(bào)的重要程度。

          在訓(xùn)練過(guò)程中,初始為0,訓(xùn)練中每行動(dòng)一次,通過(guò)Bellman等式計(jì)算,優(yōu)化目標(biāo)是使得Agent根據(jù)Q函數(shù)執(zhí)行動(dòng)作能獲得訓(xùn)練過(guò)程中的最大價(jià)值回報(bào),即與的差異最小。

          我們的訓(xùn)練步驟是:首先我們?cè)O(shè)置一個(gè)探索速率「epsilon」,它的值在0和1之間。一開(kāi)始時(shí)候我們將它設(shè)定為1。它處于最大值,因?yàn)槲覀儾恢?Q-table 中任何的值,所以我們需要走出隨機(jī)的行動(dòng)。隨著訓(xùn)練次數(shù)的增加,我們將會(huì)進(jìn)行借助前面訓(xùn)練得到的經(jīng)驗(yàn),于是我們逐漸減小「epsilon」值,做到探索和貪心的平衡。

          選擇了動(dòng)作Action后, 并且觀察輸出的狀態(tài)和獎(jiǎng)勵(lì)。接著我們使用Bellman方程去更新,

          Q_learning 訓(xùn)練過(guò)程如上圖所示,推薦給大家我看到的兩張有趣的圖,可以更清楚的理解Q_Learning.

          e23ebce2887ceb6058c254a332268779.webpfa7d2e47e167e5de752a3e005549a8d5.webp

          Deep Q-Learning深度學(xué)習(xí)

          在前面介紹中,我們用矩陣來(lái)表示,但是在現(xiàn)實(shí)情況下,這個(gè)只是個(gè)理想狀態(tài),因?yàn)闋顟B(tài)實(shí)在是太多。使用表格的方式根本存不下,那么怎么處理遇到的上面的問(wèn)題呢?

          對(duì)于如同貪吃蛇或者更復(fù)雜的場(chǎng)景這種情況,需要輸入的state包含的信息會(huì)很多(高維),而輸出的內(nèi)容比較少(低維,比如上下左右)。這種情況又怎么處理呢?

          Q-learning無(wú)法解決的這些問(wèn)題,而被與神經(jīng)網(wǎng)絡(luò)結(jié)合的DQN完美的解決了。DQN和Q_learning相比,還有突出的幾個(gè)改進(jìn):

          1) DQN使用了卷積神經(jīng)網(wǎng)絡(luò)來(lái)逼近行為值函數(shù)

          什么是價(jià)值函數(shù)近似呢?說(shuō)起來(lái)很簡(jiǎn)單,就是如果用一個(gè)函數(shù)來(lái)表示Q(s,a)。理論上對(duì)于任意的(s,a)我們都可以由公式求出它的值函數(shù)。但是當(dāng)state或action的個(gè)數(shù)過(guò)多時(shí),分別去求每一個(gè)值函數(shù)會(huì)很慢。因此我們用函數(shù)近似的方式去估計(jì)值函數(shù),這樣,對(duì)于未在Q_Table中出現(xiàn)的state action也可以估計(jì)值函數(shù)。

          值函數(shù)網(wǎng)絡(luò)與貪心策略之間的聯(lián)系是這樣的:首先環(huán)境會(huì)給出一個(gè)state,根據(jù)值函數(shù)網(wǎng)絡(luò)得到關(guān)于這個(gè)state的所有Q(s,a),然后利用貪心策略選擇action并做出決策,環(huán)境接收到此action后會(huì)給出一個(gè)獎(jiǎng)勵(lì)Rew及下一個(gè)state。這是一個(gè)step,此時(shí)我們根據(jù)Rew去更新值函數(shù)網(wǎng)絡(luò)的參數(shù),接著進(jìn)入下一個(gè)step。如此循環(huán)下去。

          最優(yōu)化一個(gè)損失函數(shù)loss function,也就是標(biāo)簽和網(wǎng)絡(luò)輸出的偏差,目標(biāo)是讓損失函數(shù)最小化。然后我們用Q_table處理巨量的有標(biāo)簽數(shù)據(jù),然后通過(guò)反向傳播使用梯度下降的方法來(lái)更新神經(jīng)網(wǎng)絡(luò)的參數(shù)。

          2) DQN 設(shè)計(jì)了memory儲(chǔ)存經(jīng)驗(yàn),并利用經(jīng)驗(yàn)回放訓(xùn)練強(qiáng)化學(xué)習(xí)過(guò)程

          由于在強(qiáng)化學(xué)習(xí)中,我們得到的觀測(cè)數(shù)據(jù)是有順序的,用這樣的不獨(dú)立數(shù)據(jù)使整個(gè)網(wǎng)絡(luò)局限于一小塊狀態(tài)區(qū)域,用它們?nèi)ジ律窠?jīng)網(wǎng)絡(luò)的參數(shù)有很大的局限性,為了得到獨(dú)立的數(shù)據(jù), 用一個(gè)Memory來(lái)存儲(chǔ)經(jīng)歷過(guò)的數(shù)據(jù),每次更新參數(shù)的時(shí)候從Memory中隨機(jī)抽取一部分的數(shù)據(jù)來(lái)用于更新,這樣打破數(shù)據(jù)間的關(guān)聯(lián)。

          3) DQN的探索

          在開(kāi)始訓(xùn)練的時(shí)候,所有的參數(shù)都是隨機(jī)的,有最高Q值的Action也是隨機(jī)的,這是神經(jīng)網(wǎng)絡(luò)剛開(kāi)始的探索過(guò)程。但是隨著訓(xùn)練次數(shù)的增加,隨著Q值的收斂,選擇的Action會(huì)趨于一致。這時(shí)候,我們選擇一個(gè)合適的概率,使一部分Action不按照最大Q值行動(dòng),也就是尋找一個(gè)好奇心和貪婪心之間的平衡。這個(gè)概率一般是從開(kāi)始訓(xùn)練時(shí)的1逐步減少到0.1。也就是說(shuō)開(kāi)始訓(xùn)練擁有最大的好奇心,然后逐步向利用經(jīng)驗(yàn)側(cè)重。

          4) 引入了一個(gè)target Q網(wǎng)絡(luò)

          為了解決這個(gè)問(wèn)題, DQN在原來(lái)的Q網(wǎng)絡(luò)的基礎(chǔ)上又引入了一個(gè)target Q網(wǎng)絡(luò),即用來(lái)計(jì)算target的網(wǎng)絡(luò)。它和Q網(wǎng)絡(luò)結(jié)構(gòu)一樣,初始的權(quán)重也一樣,只是Q網(wǎng)絡(luò)每次迭代都會(huì)更新,而target Q網(wǎng)絡(luò)是每隔一段時(shí)間才會(huì)更新。

          下圖是DQN的基本架構(gòu)

          41ddab9cd7dbb7e55c637a8dc2b58ce9.webpDQN的基本架構(gòu)

          DQN的基本算法流程:

          1. 首先初始化Memory,定義它的容量為D;
          2. 初始化本地神經(jīng)網(wǎng)絡(luò)和目標(biāo)神經(jīng)網(wǎng)絡(luò),隨機(jī)生成權(quán)重,本地神經(jīng)網(wǎng)絡(luò)和目標(biāo)神經(jīng)網(wǎng)絡(luò)的權(quán)重相同;
          3. 循環(huán)遍歷訓(xùn)練次數(shù)episode =1, 2, …, M;
          4. 初始化環(huán)境變量;
          5. 循環(huán)遍歷step =1,2,…, T:
          6. 用貪心策略生成action
          7. 執(zhí)行action 計(jì)算得到的分?jǐn)?shù),獲取next state;
          8. 分action后是terminal和不是terminal兩種情況計(jì)算reward;
          9. 對(duì)模型權(quán)重使用梯度下降法進(jìn)行更新;
          10. 每經(jīng)過(guò)N步,對(duì)目標(biāo)模型進(jìn)行更新;
          11. 將相應(yīng)內(nèi)容存入memory中(state, action, reward, next state)

          利用DQN開(kāi)發(fā)的貪吃蛇程序

          說(shuō)明:為了更快地學(xué)習(xí)和驗(yàn)證DQN在貪吃蛇程序中的應(yīng)用,我借鑒了齊浩洋學(xué)長(zhǎng)的源代碼。為了程序的呈現(xiàn)效果,我把部分源程序(訓(xùn)練部分)重新組合了一下,并將原來(lái)的程序里的各個(gè)模塊進(jìn)行了一下整合。

          此處,先介紹貪吃蛇訓(xùn)練的過(guò)程,完整的程序在后續(xù)推文中進(jìn)行介紹。

          貪吃蛇訓(xùn)練的過(guò)程(DQN實(shí)現(xiàn)方法)

          ** 注:在本例中每個(gè)批次取出的數(shù)據(jù)
          self.BATCH_SIZE=64
          For.. to 迭代次數(shù)
          #環(huán)境初始化
          # ...
          # 蛇,食物位置;界面大小,邊界位置
          # while 貪吃蛇 處于活的狀態(tài) 每次循環(huán)是走一個(gè)step.
          # memory 中如果有足夠的樣本,則隨機(jī)取出批次量的數(shù)據(jù)。
          if self.memory.__len__() > self.BATCH_SIZE:
          # experiences = random.sample(self.memory, k=self.BATCH_SIZE)
          #提取反饋信息 取出的每個(gè)變量為長(zhǎng)度為64的數(shù)組,18是state組合的環(huán)境因素個(gè)數(shù).
          states(當(dāng)前狀態(tài) tensor[64,18]), actions(動(dòng)作 tensor[64,4]), rewards(分?jǐn)?shù)), next_states(下一狀態(tài), tensor[64,18]), dones(是否活著) = zip(*experiences)

          #設(shè)置本地模型和目標(biāo)模型(解決參數(shù)不收斂的問(wèn)題)
          #使用本地模型估計(jì)下一個(gè)動(dòng)作 target 為tensor(64,4)
          target = self.qnetwork_local.predict(states, self.BATCH_SIZE)

          #使用目標(biāo)模型估計(jì)下一個(gè)動(dòng)作。
          target_val = self.qnetwork_target.predict(
          next_states, self.BATCH_SIZE)
          target_next = self.qnetwork_local.predict(
          next_states, self.BATCH_SIZE)

          #Double DQN需要從中取出有最大值的下一步做為action
          max_action_values = np.argmax(target_next, axis=1)
          #計(jì)算target 的獎(jiǎng)勵(lì)分?jǐn)?shù)(或許樣本的最大分?jǐn)?shù))
          for i in range(self.BATCH_SIZE):
          if dones[i]:
          target[i][actions[i]] = rewards[i]
          else:
          target[i][actions[i]]= rewards[i] + self.GAMMA
          target_val[i][max_action_values[i]]

          # 訓(xùn)練模型 對(duì)本地模型權(quán)重進(jìn)行更新
          self.qnetwork_local.train(
          states, target, batch_size=self.BATCH_SIZE)

          # 每訓(xùn)練UPDATE_EVERY次更新目標(biāo)模型的權(quán)重 目標(biāo)模型不是每次都進(jìn)行更新,保持參數(shù)的收斂。
          if self.t == self.UPDATE_EVERY:
          self.update_target_weights()
          self.t = 0
          else:
          self.t += 1

          #按照訓(xùn)練選擇下一步 (代碼3,隨機(jī)走出隨機(jī)的動(dòng)作,使樣本內(nèi)容更加全面)
          state = state.reshape((1,)+state.shape)
          action_values = self.qnetwork_local.predict(state)
          if random.random() > epsilon:
          #選擇最好的行動(dòng)
          action = np.argmax(action_values)
          else:
          #選擇隨機(jī)的行動(dòng)
          action = random.randint(0, self.nA-1)

          #在環(huán)境中走下一步,并且判斷貪吃蛇是否觸發(fā)死的條件
          ......
          if 死掉
          break;

          #將經(jīng)驗(yàn)存入memory
          self.memory.add(state, action, reward, next_state, done)
          Endfor

          系統(tǒng)設(shè)置參數(shù),循環(huán)進(jìn)行上述訓(xùn)練,從環(huán)境初始到貪吃蛇死掉.為一個(gè)過(guò)程。系統(tǒng)訓(xùn)練這個(gè)過(guò)程多次,訓(xùn)練結(jié)果放入****.h文件中。

          下圖為貪吃蛇訓(xùn)練部分的程序運(yùn)行展示:

          c5c2a2ace5a229a65a98c9e6496f99f0.webp

          5626c68876c7adb2fe0bde8b579cca2e.webp

          上述就是人工智能貪吃蛇的基本入門知識(shí),希望對(duì)大家有所幫助,后續(xù),我還會(huì)進(jìn)一步完整的分析代碼,方便大家理解。

          瀏覽 78
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人精品午夜无码免费 | www射www | 91精品久久久久久综合 | www.操比 | 天堂8在线视频 |