星期五, 9月 15, 2017

[Paper note] Multiagent Bidirectionally-Coordinated Nets for Learning to Play StarCraft Combat Games


Paper: https://arxiv.org/abs/1703.10069

這篇論文是由 Alibaba & UCL共同發表的,並投稿到 NIPS 2017。他們發表了一個 Multi-agent framework 讓 agents 利用共同的 framework 一起學習,他們將這個架構簡稱為 BiCNet。

Attribute of BiCNet

  • Vectorised Actor-Critic: vectorised 指的是一個 input 可以輸入多個 agents的資訊。
  • Deterministic Policy
  • Use bidirectional RNN as their actor network and critic network
  • Dynamic Grouping 機制
  • Shared Parameter among all agents
他們使用 BRNN 利用 hidden layer 來 Model agents 之間彼此溝通的行為,這是這篇論文的創新點之一。不過他們團隊並不知道為什麼這樣可行,而僅僅解決了 how 的問題,還不知道 why?

另外精彩的地方我覺得是數學的 Model,他們分為兩個視角來看 Starcraft Combat 問題:

  1. 將 Combat 看作 zero-sum stochastic games (recycle) 定義出整體 Combat 的 reward (隨 step 變化)
  2. Model agents 之間彼此合作緊密度,是否完成共同目標。利用 Top-K list 記錄和當下 agent 合作的其他 agents。在這裡我稱為一個小 group,後續對應的是 dynamic grouping。在這樣的情況下,他們會共享 reward,好像一個小隊生死與共一樣。
最後,他們利用這樣的 framework 學習到了各種互動的策略

  • Coordinated moves without collision
  • Hit and Run tactics
  • Coordinated cover attack
  • Focus fire without overkill
  • Collaborations between heterogeneous agents
雖然這篇論文有些地方寫的不是很清楚而且沒有上 NIPS,但是我覺得裡面有一些想法還是值得我們學習。像是它定義的 action 是針對一個 unit, per unit per agent 並且 action space 的表示法是連續的: [-1. ~ 1, -1. ~ 1., -1. ~ 1.] 對應到 [attack or move, degree, radius]

demo:

  1. youtube: https://www.youtube.com/watch?v=kW2q15MNFug
  2. 騰訊: https://v.qq.com/x/page/a0389j004kk.html
另外,如果你熟知日語的話,也可以看這份投影片: https://rl-tokyo.github.io/resource/20170719-ikki407.pdf

星期一, 9月 04, 2017

Build Starcraft Learning Environment (using TorchCraft) 中文教學


前言

自從 AlphaGo 戰勝世界棋王李世以來,AI 還有 Deep Learning 至今火紅。DeepMind 將他們下一個研究的目標定錨為 Starcraft 這樣的 Real-Time Strategy Game 即時戰略遊戲。

在 8月的時候,DeepMind 與 Blizzard 合作釋出了適用於 Starcraft 2 的學習套件: pysc2。Blizzard 也是出了相應的 API protocol,目前實作 C++ 的版本。開拓了機器學習專家以及資料科學家的新戰場。

在這裡,我想要分享的是在 Starcraft 1代 如何搭建機器學習的環境,主要是利用 Facebook 發布的 TorchCraft 進行資料的串接處理。

需要的套件軟體

  • Starcraft: Brood War 1.16.1
  • BWAPI 4.1.2
  • TorchCraft 1.3.0/1.0.2
  • Torchcraft-py
  • gym-starcraft
我們將會在 Windows 端安裝遊戲以及 BWAPI 和 TorchCraft (server)。在 Linux 安裝 TorchCraft (client), Torchcraft-py, gym-starcraft

Installation

BWAPI 是與 Starcraft: Brood War 溝通的 API,在研究 RTS Game AI 的時候,主要的遊戲就是 Starcraft: Brood War (以下稱為 SC:BW) 以及 Starcraft2,並且透過自訂遊戲的方式來進行學習及遊玩。

Install Starcraft: Brood War
我們可以到 ICCup 的網站下載遊戲。https://iccup.com/starcraft/content/news/iccup_updated_to_1.16.1.html

Install BWAPI
然後到 BWAPI Github 頁面安裝需要的 API 版本。在這裡,我選定的版本是 4.1.2,因為目前 TorchCraft 尚未支援 BWAPI 4.2.0。在安裝的時候,不管 SC:BW, BWAPI 要安裝到哪一個路徑都可以,但是建議安裝在可以便於修改檔案的路徑下,因為之後再設定的時候,會必須要修改 BWAPI configuration file。

在這裡唯一要注意的事情是 BWAPI 安裝成功後,會將 bwapi-data 這個資料夾安裝在預設的路徑。要怎麼看預設路徑呢?在安裝的資料夾下打開 Chaoslauncher.exe,在 Settings 的部分就會看到 Starcraft 遊戲預設執行的路徑。如果這個路徑跟你的遊戲路徑不相符,並且你的遊戲資料夾內沒有 bwapi-data 這個資料夾的話,你必需要重新安裝 BWAPI。因為 bwapi-data 會安裝載 Installapth 下。

步驟
  1. 在 Chaoslauncher.exe 的 settings 設定 Starcraft Installpath,這樣重新安裝的時候才會把 bwapi-data 安裝在對的地方。
  2. 將 BWAPI 重新安裝一次,安裝在 BWAPI 的原路徑即可,主要是我們要產生 bwapi-data


附帶一提,Networkport 的地方,因為我們使用 TorchCraft 的關係,會跟他的設定無關。不要認為在 Chaoslauncher.exe 設定的 Networkport 就是稍後 TorchCraft 的 port。

安裝完 BWAPI 之後,點選 Config 進行 BWAPI 的設定。這個設定檔會在 $Starcraft/bwapi-data/bwapi.ini。沒有意外,應該會直接跳出記事本。如果檔案不見了則會發生 Exception,此時你可以到這裡複製一份:https://github.com/bwapi/bwapi/blob/master/Release_Binary/Starcraft/bwapi-data/bwapi.ini


按下 Start 如果跳出 SC:BW 的視窗就代表安裝成功啦!


Install TorchCraft 1.3.0/1.0.2 (torchcraft-py 要用舊版 TorchCraft)
你會問我們現在有了 BWAPI 不是就可以開始編寫程式了嗎? 是的,可以寫 C++, JAVA。
那為什麼還需要 TorchCraft? 據我的了解,TorchCraft 是利用 Torch 這個科學運算套件來建構學習的環境,並且對於資料有先做過 Formalization。對我個人而言,最重要的是因為他實作了 Server-Client 的架構,當遊戲執行端作為 Server, Machine Learning 端作為 Client。這樣我們就可以在 Client 端擴充運算資源就好!

TorchCraft 的實作利用了 ZeroMQ 讓 Client, Server 彼此之間可以通訊。
在這裡只要安裝好 BWAPI 後,照著官方的步驟應該不會有太大問題:


如果你是使用Mac的話,在安裝 TorchCraft 是會發生錯誤的。所以 Mac 不能使用TorchCraft 的 Client。不過!因為我們有了 TorchCraft Server (Windows) 所以 ZeroMQ 之間的通訊是可以使用的。在這樣的前提之下,我們可以使用 alibaba/torchcraft-py 作為我們的 Client。

TorchCraft 也是有 Configuration 檔的,如果你有乖乖的按照 TorchCraft 的安裝步驟裝完,應該會看到我們要複製 torchcraft.ini 到 bwapi-data 這個資料夾下面。我們有了 ZeroMQ 總要知道那些資料丟到哪一個 Port 對吧? 這個 Port 就是在 torchcraft.ini 中設定的。跟 Chaoslauncher settings 的 Networkport 是不一樣的設定不要搞混了。

如果你在 Client 端是使用 Lua 來編寫你的 Machine Learning Program 的話,基本上到這裡整個安裝就結束了。但是如果你想要使用 Python 來編寫你的程式的話,就繼續往下看吧!


Install torchcraft-py & gym-starcraft
搭配的 TorchCraft 為 1.0.2
torchcraft-py: https://github.com/alibaba/torchcraft-py
gym-starcraft: https://github.com/alibaba/gym-starcraft

這兩個套件都是 Alibaba 作的,torchcraft-py 實作了 TorchCraft Client 的 Python 2.7 版,gym-starcraft 則是利用 OpenAI gym 作為 Reinforcement Learning 的環境。

使用 Mac 的朋友利用 torchcraft-py 也可以跟 Linux 一樣作為 Client 端來簡易的編寫你的程式! 雖然 torchcraft-py & gym-starcraft 的文件寫的簡略,但是在安裝上應該不會碰到什麼嚴重的問題。

最後,就可以開始寫我們的 Learning Agent 了!


Go Programming

步驟:
  1. 在 Windows 端用系統管理員開啟 Chaoslauncher.exe,進到地圖畫面的時候要等待 Client 連接,這時候可能會讓你誤以為遊戲當機了。
  2. 在 TorchCraft Client 端,執行你要執行的 Example Scripts。在執行的那剎那,你會看到遊戲畫面開始動作了!這時候就是成功了。
  3. 開始你的 AI 之旅吧!


學習資源




星期六, 11月 19, 2016

如何建立 LINE BOT ( New API )




一個月前,我曾到 Golang Taiwan 參加社群聚會 GTG #16 (Golang Taipei Gethering)

在那次聚會中,Evan 為我們介紹如何建立一個 LINE BOT


然而,在前不久,11/16 的時候,LINE 把原本的 API 給移除了,目前採用的是 Messaging API, 和 LINE@ 的服務一起使用。於是我就想說,來分享一個 Talk 是有關於怎麼建置 LINE BOT 的好了!


今年我跟 Lab 的學弟政寬在系上創辦了一個 Open Source Community,名稱為 Edges

昨天(11/18) 是我們社群的第一次聚會,趁這個機會,趕快跟學弟妹們分享一下!

以下是當天的內容:

有任何可以改進的地方歡迎來信: ita3051@gmail.com

謝謝 :)




星期一, 10月 31, 2016

python3 限定使用 keyword 關鍵字的方式作為參數

這篇是從 《Effective Python》: tips 21 學習到的觀念

在我們實作 function 的時候,定義 function specification。為了讓 function 的行為能夠更明確化,我們傾向在傳遞某些參數的時候 "強制" "限定" 使用 keyword方式的寫法來傳遞參數也就是指名 parameter=value 的方式。

這在 Python 裡面稱為 "Keyword-only Arguments"
相較於 Python2, Python3 有特殊的語法來支持這樣的使用方式:

在 parameter list 可以看到 "*" 它是用來標記 positional arguments 的結尾。在這之後的參數都一定要使用 keyword-only 的寫法。

如果這時候,我們使用 3個以上的 positional arguments 的話,會引發 "TypeError"


那 Python2 呢?使用 **kwargs 的方式,並且要手動引發 TypeError 。

python 動態預設參數, 執行期

python 動態預設參數, 執行期 本文的內容是參考 《Effective Python》: tips 20
我們在 python 定義一個 function 時,如果想要給定 default argument 可以這樣寫:
def foo(arg=10):
    ... processing arg ...
但是如果我們今天要使用的預設參數是在動執行期才能夠決定的,而不是靜態時期該怎麼做呢? 例如:我們想要寫一個 log function, 會印出當時訊息的時間, 跟訊息內容
def log(msg, when=datetime.now()):
    print("{when}: {msg}".format(when, msg))
可是如果我們是用上面的寫法,會發現取到的時間都是一樣的,那是 function 被定義的時間。為了處裡這個問題,我們會先將它設置為 None 再做進一步的處理,然後再利用 docstring 來補充說明 default argument 的用處。
def log(msg, when=None):
    """
    when 的預設值是 function call 發生的時間,也就是 log message 的時間
    """
    when = datetime.now() if when is None else when
    ... print message ...
因為 default argument 只會被 evaluate 計算一次,所以如果我們使用 [], {} 做為我們的 default argument 有時候會出現不可預期的錯誤。 例如:
def to_json(data, default={}):
    try:
        return json.loads(data)
    except ValueError:
        return default
        
json_data1 = to_json('123 321')
json_data1['k1'] = 1

json_data2 = to_json('321 123')
json_data2['k2'] = 2

print(json_data1)
print(json_data2)
上面這段 code 我們預想 json_data1, json_data2 經由觸發 except 所得到的 dict 應該是 {} 且是不同的物件,但是他們卻是相同的!
如果你使用 [] 作為 default arguments 也會出現相似的錯誤! 這時候,我們的修正方式也是將他們先設置為 None 在 return 物件

Script Injection 的解決方案



在 Udacity Intro to Backend 的課程中,有提到一些後端的安全性問題像是:
  • SQL Injection
  • Script Injection
其中,針對 Script Injection 的處理方式是在我們將 user 傳送的資料寫到資料庫之前,要先做清除的動作,這個術語叫作 Script Sanitize。

在 Intro to Backend 的課程中,就有以 python 舉例一些 script sanitize module
至於 golang 方面呢 ?

bluemonday 好像是不錯的選擇:https://github.com/microcosm-cc/bluemonday

星期四, 10月 20, 2016

怎麼建立一個 Https server?

如何架設一個 https server

如何架設一個 https server

最近 chatbot 聊天機器人很火紅,在 Facebook, Line, Slack, Telegram 上都能夠架設聊天機器人。我們只需要設定 callback url 就可以了。但是, 我們服務的 callback url 通常必須是 https,所以我想分享一下自己是怎麼架設 https server。

會使用到的伺服器軟體及要準備的東西:

  • nginx
  • domain name
  • 一台擁有 public ip 的機器

流程

  • 將 domain name 綁定到你機器的 ip 上
  • 申請 ssl 憑證
  • 設定 nginx, run service

將 domain name 綁定到 ip 上

首先,你得要先取得一個 domain name, 通常這個 domain name 是跟供應商買來的,常見的供應商有:

p.s domain name 購買的期限是以年為單位。

購買了一個 domain name 之後,藉由購買 domain name 的平台網站去管理 DNS,將 A record 的部分設定為你的機器 IP。大概過 3 - 5 分鐘後,就可以利用 domain name 去存取你的網頁服務。

如果你對 DNS 的設定有興趣可以看 這裡

以 Godaddy 為例:

申請 ssl 憑證

ssl 你可以跟供應商購買,GoDaddy, Namecheap 都有在賣。但是如果你跟我一樣窮的話只是單純想要嚐鮮的話,可以試試 Let’s Encrypt 的服務。他可以提供免費的 ssl 憑證,這個憑證有三個月的使用期限,等使用期限快到了再 renewal 就好了。

網路上關於 Let’s Encrypt 的教學都是比較舊版的,現在你只要使用他們提供的 Certbot 服務,按照他們的步驟執行就可以輕鬆取得 ssl 憑證。

首先選擇一下,你的 webserver 和 os 種類

依序執行

$ wget https://dl.eff.org/certbot-auto 
$ chmod a+x certbot-auto
$ ./certbot-auto certonly

這時候會出現藍色的互動式介面,不要慌張,輸入你要填入的東西即可 :)

將所有東西輸入完畢之後,你就已經取得屬於該 domain name 的 ssl 憑證了,是不是很簡單呀?

那些憑證在 /etc/letsencrypt/live/domain/ 下,你可以進入 /etc/letsencrtpy/renewal/ 查看 屬於那個 domain name 的設定,這些會和 nginx ssl_certificate 的設定有關。

稍後設定 nginx 需要用到的是 fullchain.pem, privkey.pem

設定 nginx

接下來開始撰寫 nginx 的設定檔。這份設定檔位於 /etc/nginx/nginx.conf 利用 sudo vim /etc/nginx/nginx.conf 編輯它

基本上,要修改的東西不多,你只需要在 http block 加上這一段:

server {
                   root /usr/share/nginx/html;
                   index index.html index.htm;
                   listen 443 ssl;  # 一般來說 https 服務的 port 是 443
                   server_name your.domain.name; # 這裏要修改變成你的 domain name
                   
                   ssl on;
                   ssl_certificate 剛剛生成的 fullchain 憑證的位址;
                   ssl_certificate_key 剛剛生成 privkey 的位址;
                   
                   location / {
                       proxy_pass http://localhost:8000; # 這是對應到你的 server port,這裡只示範簡易的測試方式。
                   }
                   
           }

設定好了之後,要如何檢驗了是否正確呢?

$ sudo service nginx configtest 

如果顯示 ok 就可以開啟 nginx 的服務了

我們也可以利用 python simple http server 去測試設定的結果

$ python3 -m http.server 

另外,nginx 還可以設定:

  • ssl_protocols
  • ssl_ciphers
  • ssl_dhparams
  • ssl header

後記

以上僅僅是最低限度的 https server, 但是可以確定用來架設你的 line bot

相關內容疑問歡迎討論 or 留言 :)

Reference

[Paper note] Multiagent Bidirectionally-Coordinated Nets for Learning to Play StarCraft Combat Games

Paper:  https://arxiv.org/abs/1703.10069 這篇論文是由 Alibaba & UCL共同發表的,並投稿到 NIPS 2017。他們發表了一個 Multi-agent framework 讓 agents 利用共同的 framew...