作者laechan (小太保)
看板mud_sanc
标题[闲聊] 类神经网路应用
时间Thu May 14 16:34:01 2009
我最近要报告的其中一个 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)
1F:推 hermis :嗯....这跟去年我在中研院学的东西很像 05/14 21:49
2F:→ hermis :不过我始终搞不懂权重的意义orz.. 05/14 21:49
※ 编辑: laechan 来自: 118.170.105.114 (05/20 00:20)