[閒聊] 類神經網路應用
我最近要報告的其中一個 lab(等於我的類神經期末考)是 rbfnn,也就
是幅狀基底函數類神經網路。rbfnn 跟其它類神經網路的差別, 就在於
rbfnn 的輸入層→隱藏層神經元之間的權重矩陣是函數型式。
假設戰鬥力數值 d = count_damage(hp,sp,pp);
給定一組 hp, sp, 及 pp, 透過 count_damage 函數即可求得 d.
也就是要算 d 必須要有四個東西: {hp, sp, pp, count_damage函數}
那假設今天我們不知道 hp, 知道其它, 那 hp 可得到嗎?
答案是肯定的, 只要把 hp 設成未知數 x 即可
d = count_damage(x, sp, pp) => 透過反運算即得到 x
(例如 d = 100xhp + 50xsp + 30xpp, hp不知道其它都知道, hp 自然可
求 => hp = (d - 50xsp - 30xpp)/100;
今天的問題, 假如我們不知道的東西是「count_damage函數」,但我們
知道 hp, sp, pp 也知道 d,那可以由這四個東西來產生 count_damage
函數嗎?
================================================================
簡單的概念就是今天我們有 100 位玩家的 hp,sp,pp 資料以及明顯的戰
鬥力數值...
name hp sp pp 戰鬥力
========================================================
lighta 199498 354160 196332 2258062
lannssssyy 241669 645162 301778 4184918
lisung 171868 269255 184953 2461259
angelzz 491312 88050 666080 4265350
fencer 133368 250838 265682 2575765
dust 268032 273151 316214 2854139
cloudwu 238876 267088 389406 3800109
searcher 72213 59448 64352 1098719
golds 244195 161079 319527 2734230
rocken 94915 46883 253283 1989191
juliannohl 165615 274354 325584 3413804
dreamangel 92592 365786 113510 1978848
.
.
.
現在我們知道有個公式可以把 hp,sp,pp(三維的資料) 做綜合的
計算後變成戰鬥力(一維),但我們不知道公式的底細,這時能做
的就是從現有的資料去推估,也就是...
輸入 透過一不知名的黑箱 得到輸出
hp, sp, pp ───────────→ 戰鬥力
所用的其中一種方法,就是設定一權重矩陣 W = (w1, w2, w3)
,然後把 (hp,sp,pp) 這個向量去跟這個權重矩陣向量做內積,
就得到一假定的輸出,.
(hp,sp,pp).(w1,w2,w3) = hp x w1 + sp x w2 + pp x w3
= 假定輸出
然後假定輸出與目標輸出(就是戰鬥力)之間一定會產生差距...
e = 實際戰鬥力 - 假定輸出;
也就是說實際的公式應該是..
hp x w1 + sp x w2 + pp x w3 + e = 實際戰鬥力
然後我們將這差距 /3 後等分到三個輸入.權重裡頭...
[ hp x w1 + (e/3) ] + [ hp x w1 + (e/3) ] + [ hp x w1 + (e/3) ] = 實際戰鬥力
則問題就變成..
hp x w1 + (e/3) = hp x w1' (w1' = w1 + 調整值)
兩邊同除以 hp => w1' = w1 + (e/3)/hp
同理 w2' = w2 + (e/3)/sp
w3' = w3 + (e/3)/pp
這種方法叫做監督式學習法,就是用實際的戰鬥力值來"監督"假定的輸
出值, 讓彼此之間產生的差異(e)來當做權重調整的依據。
於是當我們將一組 (hp,sp,pp) 當做輸入, 並把該組的實際戰鬥力當做
修正依據時, 我們就會得到一個新的 w1', w2', w3'
接著我們再運算第二組 (hp2, sp2, pp2) 又會得到一個假定輸出..
(hp2, sp2, pp2) . (w1', w2', w3') = 假定輸出2
同樣的假定輸出2又會與實際輸出2產生差距...
e2 = 實際輸出2 - 假定輸出2;
仿上面的公式...
w1" = w1' + (e2/3)/hp2;
w2" = w2' + (e2/3)/sp2;
w3" = w3' + (e2/3)/pp3;
這樣一直運算下去, 權重向量就會一直被修正, 資料越多, 權重向量修
正的就越多, 當現有的已知 100 組資料都丟進去跑之後, 得到的最終權
重向量就是我們要的.
因為當我們把第 101 組資料向量 (hp101, sp101, pp101) 與最終權重
向量相乘時, 我們得到的「假定輸出101」就會與「實際輸出101」非常
的近似。
上面是「簡易」的類神經網路概念,實際上的類神經網路導入了活化函
數以及學習速率、均方差等,可以用來近似很多種類型的函數。
我寫了一段小程式, 用了 1x 個玩家的資料, 程式如下...
xx = xlsread('test.xls');
// 去讀我用 excel 儲存的玩家的 hp,sp,pp,戰鬥力資料
inputs = xx(:,1:3);
// 把該資料矩陣的前三行設為輸入矩陣
d = xx(:,4);
// 把該資料矩陣的第四行設為戰鬥力矩陣(目標輸出矩陣)
W = [0.1 0.1 0.1];
// 初始化權重矩陣, 我一開始讓三個權重值都是 0.1 0.1 0.1
n = size(inputs,1);
// 讀資料筆數
for i=1:n
// 開始跑迴圈
ss = inputs(i,:)*W';
e = (d(i) - ss)/3;
for j=1:3
W(j) = W(j) + e/inputs(i,j);
// 修正權重
end
end
W
// 秀出 W
結果為
W = ( 9.7898 , -0.2871 , 6.8862 )
現在我們有一筆新資料...
hp sp pp 實際戰鬥力
76808 382612 72288 1107684
我們套上面的權重..
(hp,sp,pp) . (w1 w2 w3) = 1139862.682
各位應該可以很容易地看出,我們得出的假定戰鬥力 113.9 萬,
與實際戰鬥力 110.7 萬是非常相近的。
這就是類神經網路的好處,有時候我們不見得要去創造戰鬥力公
式,我們只要把玩家做一下分類=>會得到分類的結果,再依玩家
的一些可能影響戰鬥力的數值,以及我們分類的結果丟進去類神
經網路中訓練,它就會跑出我們想要的權重,則其它玩家的分類
就可依據訓練好的網路來進行。
(實際上上面與其說是類神經網路,不如叫簡易迴歸分析可能更
貼切一點)
=========================================================
上例中 W 是一個一維的權重向量 W = (w1, w2, w3); 我最近做
的 lab,多了一層隱藏層神經元,而且輸入層→隱藏層神經元之
間的權重矩陣(rbf 矩陣)是多維的。
但各位應該可以發現,即使是簡易的類神經網路(或迴歸分析)也
能產生不錯的結果,而且訓練樣本越多,其結果越準確。
將來有時間改聖殿時,我會讓很多東西都跟這個有關,類神經網
路可以有許多應用,舉例..
一、藥水店藥水價格自動波動系統
二、制式戰爭自動開啟系統(什麼情況可以讓系統自動開啟什麼
戰爭)
三、國家稅率自動調整系統
.
.
.
而最簡易的應用就是技能的殺傷力,以後不需要定公式,就可以
讓殺傷力輸出具有帶公式的效果。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
留言