书名:代码本色:用编程模拟自然系统
作者:Daniel Shiffman
译者:周晗彬
ISBN:978-7-115-36947-5
第10章目录
10.2 感知器
1、感知器
-
感知器是由就职于Cornell航空实验室的Frank Rosenblatt于1957年发明的,它可以被视为最简单的神经网络:单神经元计算模型。
-
一个感知器由一个或多个输入、一个处理器和单个输出构成。
-
感知器遵循“前馈”模式,即神经元接收输入并处理输入,最后产生输出。
在上图中,我们应该按照从左向右的方式解读这个神经网络(单个神经元):接收输入,产生输出。
2、处理步骤
下面我们来详细讨论每个处理步骤。
1)第一步:接收输入
假设某个感知器有两个输入——x1和x2。
- 输入0:x1 = 12
- 输入1:x2 = 4
2)第二步:输入加权
每个被送入神经元的输入首先要被加权,也就是将它乘以某个权重(通常是介于-1~1的某个数)。当感知器被创建时,我们会为每个输入分配随机权重。假设本例的输入
权重如下。
- 权重0:0.5
- 权重1:-1
将每个输入乘以它的权重:
- 输入0 × 权重0 = 12 × 0.5 = 6
- 输入1 × 权重1 = 4 × -1 = -4
3)第三步:输入求和
对加权后的输入求和:
- 总和 = 6 + -4 = 2
4)第四步:产生输出
- 将总和传入一个激励函数(activation function)后,我们就能得到感知器的输出。输出可以是一个简单的二进制数,这相当于让激励函数告诉感知器是否“激发”某种操作。你可以在输出端连接一个LED灯:如果感知器被激发,灯亮;反之,灯不亮。
- 激励函数可以很复杂,人工智能书籍中的激励函数一般会涉及微积分的相关知识。但本例的激励函数非常简单,我们只是让它返回总和的符号。换句话说,如果总和是正数,输出结果就是1;如果是负数,输出结果就是-1。
- 输出 = sign(总和) => sign(2) => +1
3、感知器算法:
- 1.对每个输入,将它乘以对应的权重;
- 2.对加权后的输入求和;
- 3.把总和传入一个激励函数(返回符号),得到感知器的输出。
4、代码实现
- 假设我们将输入和权重分别放到两个数组中,比如:
float[] inputs = {12, 4};
float[] weights = {0.5,-1};
- “对每个输入”这句话暗示了一个循环,在每一轮循环中,我们将输入乘以权重,然后在循环中对它们求和。
float sum = 0; 步骤1和步骤2:将所有加权后的输入相加
for (int i = 0; i < inputs.length; i++) {
sum += inputs[i]*weights[i];
}
- 得到总和之后,我们就可以用激励函数计算最后的输出。
float output = activate(sum); 步骤3:用一个激励函数处理总和
int activate(float sum) { 激励函数
if (sum > 0) return 1; 如果是正数,就返回1;负数时返回-1
else return -1;
}
网友评论