我们的游戏难度要加大了,现在每次执行轰炸的飞机速度都不一样,
为了更好的解决这个问题,我们需要学习多输入神经元的概念
上一节我们讲到了一个输入对应一个输出的神经元,这种是一个特例,更多的神经元是多输入的,就是多个输入对应一个输出。就像函数有多个参数,但是只有一个输出。
多输入的神经元的数学表达式是这样的
f(x1,x2…xn)=w1x1 + w2x2 + … + wnxn + b
这个表达式中每一个输入都对应一个w超参,但只有一个b参数
对应的代码
//神经元
private static int neuron(int[] xArr,int[] wArr,int b){
int res = 0;
for (int i = 0; i < xArr.length; i++) {
res += wArr[i] + xArr[i];
}
res += b;
return res;
}
多神经元输入在神经网络的应用中非常常见,比如课程刚开始我们看到的那张神经网络图就是由一个输入层+三个隐藏层+一个输出构成由众多神经元组成的神经网络(这里神经网络分成的细节我们会在后面学习,这里只做了解),其中隐藏层和输出层的神经元都是多输入单输出的。
回到升级的轰炸机游戏这个问题上,飞机每次起飞的速度都不相同,所以这个数就不再是常量
结合投弹点公式 y = x - v * Math.sqrt(2 * h / g)
我们依然知道Math.sqrt(2 * h / g)是一个常量,我们令 w2 = Math.sqrt(2 * h / g)
可以得到 y = x - v * w2 => 也就是 f(x,v) = x - v * w2
已知两个输入的的神经元表达式 f(x1,x2) = w1 * x1 + w2 * x2 + b
本例中相对简单一点,其中w1 = 1,b = 0,我们只需要找到w2的值就可以了
运行实例代码
public static void main(String[] args) {
PlaneFire.lv2Ready((velocity,targetX) -> {
float location = PlaneFire.lv2Demo(velocity, targetX);
System.out.printf("velocity = %s, targetX = %s => location = %s \n", velocity, targetX, location);
PlaneFire.fireLv2(velocity,targetX, (int)location);
});
//velocity = 173, targetX = 452 => location = 126.0
}
得到 velocity = 173, targetX = 452 => location = 126.0
可以计算出w2 = 1.88
于是我们编写多输入神经元计算代码
public static void main(String[] args) {
PlaneFire.lv2Ready((velocity,targetX) -> {
float location = ai(velocity,targetX);
PlaneFire.fireLv2(velocity,targetX, (int) location);
});
}
//AI
private static float ai(int velocity, Integer targetX){
float w1 = 1f,w2 = -1.88f,b = 0f;
float[] xArr = {targetX,velocity};
float[] wArr = {w1,w2};
return neuron(xArr,wArr,b);
}
//神经元
private static float neuron(float[] xArr,float[] wArr,float b){
float res = 0;
for (int i = 0; i < xArr.length; i++) {
res += wArr[i] * xArr[i];
}
res += b;
return res;
}
经过试验可以看到飞机准确的命中了目标,到此同学们可能会有疑问,我耐着性子看了半天你用的都是数学方法来编写代码?是的ai框架的基本原理就是使用了这些基本的数学运算,并没有多么高不可攀,ai框架的优势不在这些简单的问题上,相反在这些简单的甚至在复杂10倍的问题上数学计算都更加高效稳定,但是当输入的参数多大100或者1000的时候,比如一张1010像素的图片识别的问题是,一张100100的图片的输入就高达10000个输入,这时传统的数学方法就显得捉襟见肘。
好了,我预告一下,下一节我们的飞机投弹游戏难度会进一步增加,这回轰炸目标会同时在xy轴上变化,同学们可以尝试采用数学方法找出投弹点,思考如何用神经元方法实现。