2013年4月30日 星期二

看書也會靈肉分離嗎?


黃心健在<科技蜃樓>這本書說到「靈肉分離」,他提到電玩界的「雷神派對」(Quake party)或「區網派對」(LAN party)中,有一群人(20~30位)會24小時不間斷地玩「雷神之槌」(Quake)或是「絕對武力(Counter Strike)遊戲,他們看著驚險充滿血腥畫面,聽著爆炸音效,大腦會覺得處於危險的環境中,便持續分泌腎上線素,但事實上,他們只有手在動,身體是休眠狀態。長時間下來,身體和思考出現斷層,就是大腦極度興奮,身體卻像是在睡眠。

當遊戲結束後,大腦和身體重新連線時,高速思考的大腦和休眠身體連接的瞬間,產生一種無可言喻的違和感,他稱為「靈肉分離」現象。
難道只有電玩產生這樣感覺,看書也會嗎?

2013年4月17日 星期三

QUnit方便去單元測試

寫在前頭

看完這篇文章後,也許會得到這樣的想法:
  • 使用QUnit強大工具完成單元測試。 
  • 如何根據Location的hash屬性所指的頁面,執行對應Test Case。
自訂類別
  • BaseTestCase
    只有兩個功能,新增測試函式及依序執行,預設是使用QUnit執行test。   
  • BaseTestCaseSuite
    同樣也是負責新增及執行BaseTestCase實體,執行時會先抓現在Location的hash屬性,在依照hash值找出對應BaseTestCase執行。
  • TestView&TestRouter
    硬是要用Backbone來助陣XD
加入一些測試
先假設有3個頁面,然後分別加入測試函式。
GO TO DEMO

結論
這篇算是自己的筆記,其用意是作單元測試時,可以把全部測試內容寫在一起,在切換不同頁面情況下,能自動找出對應測試函式並執行,預計後續不會只有局限抓取hash值,還能抓整個URL去解析,使整個測試流程會比較順。

完整程式碼

參考資料


2013年2月23日 星期六

PCA for Reduce Dimensions


寫在前頭
你會從這篇文章看到:

  • 使用R軟體執行主成份分析(Principal Components Analysis, PCA)減少資料維度。


但無法從這裡得到:

  • 嚴謹又完整的PCA教學內容。


單刀直入砍維度
情境:假設有一個m╳n的資料集,因n個屬性太多,該如何縮減?(為快速說明,就使用100╳2的資料集,縮減為100╳1)

總結
PCA的優點是將用k維的向量來代表n維空間的資料點,可以節省儲存空間,加速演算法計算,但值得注意的地方,該如何降低維度才能保留資料特性,這又是另一個討論議題,就先擱著囉!

參考資料

  1. Tan, Steinbach, Kumar, ”Introduction to Data Mining”,2005

2013年1月11日 星期五

倒傳遞神經網路(BACKPROPAGATION NETWORK, BPN)


寫在前頭

2017/08/03 編輯:

1. 修正計算錯誤。
2. 備註加入新連結。

你可以從這篇文章得到:

1.          BPN基本概念。
2.          如何實作BPN,並應用在遊戲裡。
3.          提供一個使用BPN決策的DEMO NPC

BPN簡介

BPN的網路架構為多層感知器(multilayer perceptron, MLP),就是輸入層與輸出層之間多一層隱藏層(hidden layer),使用誤差倒傳遞演算法(Error Back Propagation, EBP)為學習演算法,屬於多層前饋式網路,以監督式學習方式,處理輸入輸出之間非線性映射關係。

1 BP網路圖

簡單說,BPN是由向前傳遞(forward pass)及向後傳遞(backward pass)兩個部份組成,向前傳遞(如圖1 由左至右黑線)是先將訓練資料丟進網路去跑,在計算出輸出結果與對應目標之間誤差,而向後傳遞(如圖1 由右至左紅線)是依誤差值去調整網路權重,經過這樣多次訓練後,就會將網路修正到誤差極小範圍內的輸出結果。其主要特性如下:
1.      學習精確度高
2.      回想速度快
3.      可處理非線性問題

提一下BPN會用到的數學公式。
l   向前傳遞

1.使用sigmoid為激活函數:
$$f(x)=1/{1+e^{-x}$$

2.以均平方誤差(mean squared error,MSE)為計算誤差值方法
$$MSE={{(O_desired-O_actual)}^2}/2$$




l   傳遞

1.計算輸出層及隱藏層誤差值:
$$δ_o={(C_i-u_i)} u_i{(1-u_i)}$$
$$δ_i=(∑↙{m:m>i}w_{m,j}δ_o)u_i(1-u_j)$$

2.調整隱藏到輸出層和隱藏層到輸入層的權重:

$$w*_{i,j}=w_{i,j}+ρδ_o u_i$$
$$w*_{i,j}=w_{i,j}+ρ{δ_i}{u_i}$$
看了一大推數學算式,也不知道該怎麼實作。最後,可以參考AI Application Programming, 2ed這本書提供的倒傳遞演算法例子。


2 BP實例
l   The Feed-Forward Pass
計算各隱藏層的值和MSE
$$\table u_3,=,f(w_{3,1}u_1+w_{3,2}u_2+w_{3,b}*bias_3);,=,f(1*0+0.5*1+1*-1);,=,f(-0.5);,=,0.377541$$

$$\table u_4,=,f(w_{4,1}u_1+w_{4,2}u_2+w_{4,b}*bias_4);,=,f(-1*0+2*1+1*1);,=,f(3);,=,0.952574$$
$$\table u_5,=,f(w_{5,3} u_3+w_{5,4}u_4+w_{5,b}*bias_5);,=,f(1.5*0.377541+-1.0*0.952574+1*1);,=,f(0.613738);,=,0.648793$$

$$\table MSE,=,0.5*(1.0-0.648793)^2;,=,0.0616733$$

l   The Error Backward-Propagation Pass
計算出輸層誤差值,在調整輸出層和隱藏偏差值(習率為 ρ=0.5 )
$$\table δ_o,=,(1.0-0.648793)*0.648793*(1.0-0.648793);,=,0.080026$$

$$\table δ_{u4},=,(δ_o*w_{5,4})*u_4*(1.0-u_4 );,=,(0.080026*-1.0)*0.952574*(1.0-0.952574);,=,-0.00361531$$

$$\table δ_{u3},=,(δ_o*w_{5,3})*u_3*(1.0-u_3 );,=,(0.080026*1.5)*0.377541*(1.0-0.377541);,=,0.0282096$$

$$\table w_{5,4},=,w_{5,4}+(ρ*δ_o*u_4);,=,-1+(0.5*0.080026*0.952574);,=,-0.961885$$

$$\table w_{5,3},=,w_{5,3}+(ρ*δ_o*u_3);,=,1.5+(0.5*0.080026*0.377541);,=,1.51511$$

$$\table w_{5,b},=,w_{5,b}+(ρ*δ_o*bias_5);,=,1+(0.5*0.080026*1);,=,1.04001$$

$$\table w_{4,2},=,w_{4,2}+(ρ*δ_{u4}*u_2 );,=,2+(0.5*-0.00361531*1);,=,1.99819$$

$$\table w_{4,1},=,w_{4,1}+(ρ*δ_{u4}*u_1);,=,-1+(0.5*-0.00361531*0);,=,-1.0$$

$$\table w_{4,b},=,w_{4,b}+(ρ*δ_{u4}*bias_4 );,=,1.0+(0.5*-0.00361531*1);,=,0.998192$$

$$\table w_{3,2},=,w_{3,2}+(ρ*δ_{u3}*u_2);,=,0.5+(0.5*0.0282096*1);,=,0.514105$$

$$\table w_{3,1},=,w_{3,1}+(ρ*δ_{u3}*u_1);,=,1.0+(0.5*0.0282096*0);,=,1.0$$

$$\table w_{3,b},=,w_{3,b}+(ρ*δ_{u3}*bias_3 );,=,1.0+(0.5*0.0282096*-1);,=,0.985895$$


經過調整後,再跑一次向前傳遞,重MSE有明顯變低。
$$\table u_3,=,f(w_{3,1}u_1+w_{3,2}u_2+w_{3,b}*bias_3);,=,f(1*0+0.514105*1+0.985895*-1);,=,f(-0.47179);,=,0.384193$$

$$\table u_4,=,f(w_{4,1}u_1+w_{4,2}u_2+w_{4,b}*bias_4);,=,f(-1.0*0+1.99819*1+0.998192*1);,=,f(2.99638);,=,0.952411$$

$$\table u_5,=,f(w_{5,3}u_3+w_{5,4}u_4+w_{5,b}*bias_5);,=,f(1.51511*0.384193+-0.961885*0.952411+1.04001*1);,=,f(0.705995);,=,0.669516$$

$$\table MSE,=,0.5*(1.0-0.669516)^2;,=,0.0546099$$

BPN如何應用在NPC決策行為

首先,容許我說明一下遊戲設定,在遊戲中會有一位NPC和玩家對抗,基本上,NPC會有下列屬性:

1.      生命值:0~2之間,~生命值=0時,NPC就會消失不見。
2.      NPC必須要擁有小刀,才能與玩家進行近距離攻擊,其01
3.      :除了要佩帶手槍外,NPC還要有足夠的子以射玩家,數值為01
4.      子彈數:範圍會介於0~2每發射一次,就會耗損一枚子彈,若子彈數為0時,就不能要填充子彈後,才可射擊。

當賦予NPC這些屬性後,會在遊戲中與玩程中會產生連串決策行為其下列NPC設定之行為:
1.      :當NPC有佩帶手槍且子彈數夠(大於0),就會發動射擊玩家,若玩家被射中,就會損失一點生
2.      小力攻沒有手槍可以攻擊,若NPC身上還有小刀時NPC會選擇小刀來攻擊玩家,直到NPC低,就會選擇逃跑模式。
3.      裝彈:當NPC身上佩帶手槍的子彈用盡時,就會到裝彈的地方補充彈藥,繼續攻擊玩家。
4.      逃跑:如果NPC無計可施,就會採最壞打算「逃跑模式」,直到自己被消滅為止。

將上述邏輯轉成MN的數值矩陣(如表1所示),前四欄為輸入屬性,而後四欄是輸出目標,即為NPC對應的行為,當輸出目標的其中之一欄為1時,NPC就會去執行該動作。
1 訓練資料
生命值
小刀
手槍
子彈數
射擊
小刀攻擊
裝彈
逃跑
2.0
0.0
1.0
0.0
0.0
0.0
1.0
0.0
2.0
0.0
1.0
1.0
1.0
0.0
0.0
0.0
2.0
0.0
1.0
2.0
1.0
0.0
0.0
0.0
2.0
1.0
0.0
0.0
0.0
1.0
0.0
0.0
2.0
1.0
0.0
1.0
0.0
1.0
0.0
0.0
2.0
1.0
0.0
2.0
0.0
1.0
0.0
0.0
2.0
1.0
1.0
1.0
1.0
0.0
0.0
0.0
2.0
0.0
0.0
0.0
0.0
0.0
0.0
1.0
2.0
1.0
1.0
2.0
1.0
0.0
0.0
0.0
1.0
0.0
1.0
0.0
0.0
0.0
1.0
0.0
1.0
0.0
1.0
1.0
1.0
0.0
0.0
0.0
1.0
0.0
1.0
2.0
1.0
0.0
0.0
0.0
1.0
1.0
0.0
0.0
0.0
1.0
0.0
0.0
1.0
1.0
1.0
0.0
0.0
0.0
1.0
0.0
1.0
0.0
0.0
0.0
0.0
0.0
0.0
1.0
1.0
1.0
1.0
1.0
0.0
0.0
0.0
1.0

從這些NPC訓練資料中, BPN會去找出它們之間的Pattern,在利用這些訓練好的Pattern去完成決策。

略談遊戲程式碼

這個DEMO中所用的程式碼,如下列所示:
名稱
說明
Backpropagation.cs
BPN運作核心,先將訓練資料讀入,並把網路權重訓練好,傳入參數至action方法,得到對應指令。
BulletCollision.cs
當子彈碰撞時,會產生爆炸效果,若子彈是和PlayerNPC發生碰撞,並計算扣血值。
Detection.cs
NPC跑到補充點,就會補充NPC手槍彈藥。
FireBullet.cs
PlayerNPC發射子彈時,會丟出剛建立的子彈物件。
KnifeCollision.cs
NPC拿小刀攻擊時,如果發生碰撞,就會傷害Player
MainGUI.cs
顯示Player的生命值。
NPC.cs
定義NPC所有屬性和對應行為。
PlayerScript.cs
定義Player所有屬性和對應行為。


總結

這一篇主要核心是利用BPN作分類器,由訓練資料集去劃分四個對應動作類別,在有限訓練資料筆數中,其分類準確度極高,但缺點是若輸入參數超出訓練資料集的數值圍,就會造成誤判的問題,故必須要時時擴充訓練資料集,若能將所有發生的可能都放進去,就可避免此情形發生。


參考資料

1.          M. Tim Jones, “AI Application Programming”, Second Edition, 2005
2.          Brian Schwab, “AI Game Engine Programming”, Second Edition, 2009
3.          Neural Networks - An Introduction

備註