教程:用強化學習玩轉恐龍跳跳

摘要: 本文用強化學習作一個相似障礙跑的小遊戲

DeepMind在2013年發表了一篇題爲《用深度強化學習玩Atari》的文章,介紹了一種新的用於強化學習的深度學習模型,並展現了它僅使用原始像素做爲輸入來掌握Atari 2600計算機遊戲難度控制策略的能力。在本教程中,我將使用Keras實現本文。咱們將從加強學習的基礎開始,而後深刻代碼中進行實踐性的理解。python

clipboard.png

AI玩遊戲git

我在2018年3月初開始了這個項目,並取得了一些不錯的成果。可是,只有CPU的系統是學習更多功能的瓶頸。強大的GPU極大地提高了性能。github

在咱們運行模型以前,咱們須要瞭解許多步驟和概念。算法

步驟:chrome

在瀏覽器(JavaScript)和模型(Python)之間構建雙向接口
捕獲和預處理圖像
訓練模型
評估
源代碼:https://github.com/Paperspace...瀏覽器

入門

要按照原樣訓練和玩遊戲,請在設置環境後克隆GitHub存儲庫網絡

Git克隆:https://github.com/Paperspace...架構

並在jupyter notebook上工做。框架

Reinforcement Learning Dino Run.ipynb機器學習

確保你第一次運行init_cache()來初始化文件系統結構。

強化學習

對許多人來講,這多是一個新詞,但咱們每一個人都已經學會了使用強化學習(RL)的概念,這就是咱們的大腦仍然工做的方式。獎勵系統是任何RL算法的基礎。若是咱們回到兒童走路的比喻,積極的獎勵將是來自父母的鼓掌或可以獲得糖果,而負面獎勵將是沒有糖果。孩子在開始走路以前首先學會站起來。就人工智能而言,代理商的主要目標(在咱們的案例中是Dino)是經過在環境中執行特定的操做序列來最大化某個數值獎勵。RL中最大的挑戰是缺少監督(標記數據)來指導代理人。它必須本身探索和學習。代理從隨機執行行動開始,觀察每一個行動帶來的回報,並學習如何在面臨相似環境情況時預測最佳行動。

clipboard.png

一個普通的強化學習框架

Q-learning

咱們使用Q-learning, RL的一種技術,在這裏咱們嘗試去近似一個特殊的函數,它能夠驅動任意環境狀態序列的動做選擇策略。Q- Learning是一種沒有模型的強化學習的實現,它根據每一個狀態、所採起的行動和所產生的獎勵來維護一個Q值表。一個示例q表應該告訴咱們數據是如何構造的。在咱們的例子中,狀態是遊戲截圖和動做,什麼都不作,而後跳轉[0,1]。

clipboard.png

樣本Q表

咱們利用深度神經網絡經過迴歸來解決這個問題,並選擇具備最高預測Q值的動做。有關Q-learning的詳細瞭解,請參閱Tambet Matiisen撰寫的這篇使人驚歎的博客文章。你也能夠參考我之前的文章,瞭解全部Q-learning特有的超參數。

創建

讓咱們設置咱們的環境來開始訓練過程。

1.選擇虛擬機:

咱們須要一個完整的桌面環境,在這裏咱們能夠捕獲和利用屏幕截圖進行培訓。我選擇了一個Paperspace ML-in-a-box(MLIAB)Ubuntu鏡像 MLIAB的優點在於它預裝了Anaconda和許多其餘ML庫。clipboard.png

clipboard.png

盒子中的機器學習

2.配置和安裝Keras以使用GPU:

咱們須要安裝keras和tensorflow的GPU版本。Paperspace的虛擬機具備這些預先安裝的,可是若是不安裝它們的話

pip install keras

pip install tensorflow

另外,確保GPU能夠被設置識別。執行下面的python代碼,你應該看到可用的GPU設備

from keras import backend as K

K. tensorflow_backend._get_available_gpus()

3.安裝依賴項

Selenium pip install selenium

OpenCV pip install opencv-python

http://chromedriver.chromium....

遊戲框架

你能夠經過將瀏覽器指向chrome://dino或只要拔掉網絡插頭來啓動遊戲。若是咱們想修改遊戲代碼的話,另外一種方法是從chromium的開源存儲庫中提取遊戲。

咱們的模型是用python編寫的,遊戲是用JavaScript構建的,咱們須要一些接口工具讓它們相互通訊。

【Selenium是一種流行的瀏覽器自動化工具,用於向瀏覽器發送操做,並獲取當前分數等不一樣的遊戲參數。】

如今咱們有一個接口來發送動做到遊戲中,咱們須要一種機制來捕獲遊戲屏幕。

【Selenium和OpenCV分別爲屏幕捕獲和圖像預處理提供了最佳性能,實現了6-7 fps的降低幀率。】

咱們每一個時間幀只須要4幀,足以將速度做爲一項功能來學習。

遊戲模塊

咱們使用這個模塊實現了Python和JavaScript之間的接口。下面的代碼片斷會給你一個關於模塊中發生的事情的要點。

clipboard.png

代理模塊

咱們使用代理模塊來封裝全部的接口。咱們使用此模塊控制Dino,並獲取環境中的代理狀態。

clipboard.png

遊戲狀態模塊

要將操做發送到模塊並得到環境做爲該操做的結果轉換爲的結果狀態,咱們使用遊戲狀態模塊。它經過接收和執行動做、決定獎勵和返回經驗元組來簡化過程。

clipboard.png

圖像管道

圖像捕捉

咱們能夠經過多種方式捕獲遊戲屏幕,例如使用PIL和MSS python庫截取整個屏幕和裁剪區域。 然而,最大的缺點是對屏幕分辨率和窗口位置的敏感度。幸運的是,遊戲使用了HTML Canvas。咱們可使用JavaScript輕鬆得到base64格式的圖像。咱們使用selenium來運行這個腳本。

clipboard.png

clipboard.png

從畫布中提取圖像

clipboard.png

圖像處理

所捕獲的原始圖像的分辨率約爲600x150,有3個(RGB)通道。咱們打算使用4個連續的屏幕截圖做爲模型的一個輸入。這就使得咱們對尺寸600x150x3x4的單個輸入。這在計算上是昂貴的,並非全部的功能均可用於玩遊戲。因此咱們使用OpenCV庫來調整大小、裁剪和處理圖像。最終的處理輸入僅爲80x80像素和單通道(灰度)。

clipboard.png

clipboard.png

圖像處理

模型架構

咱們獲得了輸入和一種利用模型輸出來玩遊戲的方法,讓咱們來看看模型架構。

咱們使用了一系列的三層卷積層,而後將它們壓平爲密集層和輸出層。僅限CPU的模型不包含池化層,由於我已經刪除了許多功能,而且添加池化層會致使已稀疏功能的顯着損失。但藉助GPU的強大功能,咱們能夠容納更多功能,而不會下降幀頻。

【最大池圖層顯着改善了密集特徵集的處理。】

clipboard.png

模型架構

咱們的輸出圖層由兩個神經元組成,每一個神經元表明每一個動做的最大預測回報。而後咱們選擇最大回報(Q值)。

clipboard.png

訓練

這些是訓練階段發生的事情:

以無動做開始並得到初始狀態(s_t)
觀察遊戲步數
預測並執行操做
在回放記憶中存儲經驗
從回放記憶中隨機選擇一個批次並在其上訓練模型
從新開始遊戲結束
這個代碼很長,但很容易理解

clipboard.png

clipboard.png

請注意,咱們正在從回放記憶中抽取32次隨機經驗回放,並使用批量的訓練方法。其緣由是遊戲結構中的動做分配不平衡,以及避免過分擬合。

結果

咱們應該可以經過使用這個體系結構獲得好的結果。GPU顯著改善告終果,經過平均分數的提升能夠驗證。下圖顯示了訓練開始時的平均成績。每10場遊戲的平均分在訓練結束時都保持在1000分以上。

clipboard.png

每10場遊戲的平均分數

最高的記錄是4000+,遠遠超過了以前250的模型(也遠遠超出了大多數人的能力!)圖中顯示了訓練期間遊戲最高分數的進度(比例= 10)。

clipboard.png

每10場遊戲最高得分

Dino的速度與分數成正比,這使得它更難以檢測並以更快的速度進行動做。所以整個遊戲都是在恆定的速度下進行的。本博客中的代碼片斷僅供參考。請參考GitHub repo中的函數代碼,並添加其餘設置。

本文做者:【方向】

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索