构建简单的AI .NET库 - 第4部分 - 超越感知器





5.00/5 (13投票s)
本系列文章的第4部分,从头开始演示.NET AI库
系列介绍
这是创建.NET库的第4篇文章。以下是本系列之前文章的链接
我的目标是创建一个简单的AI库,涵盖几个高级AI主题,如遗传算法、ANN、模糊逻辑和其他进化算法。完成此系列文章的唯一挑战是是否有足够的时间来处理代码和文章。
代码本身可能不是主要目标,然而,理解这些算法才是。希望它有一天能对某人有所帮助。
文章介绍 - 第2部分“超越感知器”
在上一篇文章中,我们创建了一个充当二元线性分类器的感知器。我们将继续讨论感知器,以创建更复杂的布局来解决更复杂的问题。
我强烈建议您在继续阅读本文之前,先回顾一下《构建简单的AI .NET库 - 第2部分 - 机器学习入门》。
更多感知器示例
如前所述,感知器是ANN中最简单的处理单元,但它仍然是一种强大的算法,但它非常有限。请记住,它主要仅用作二元线性分类器。
那么其他复杂的分类问题呢?二元但非线性的分类问题呢?我们将通过几个例子来了解如何开发更复杂的感知器布局。
为了使大家在同一水平线上;让我们验证一些定义
- 二元分类器 - 是一个输出只有2个可能答案、分类或组的问题。然而,分类可以是线性的,也可以是非线性的。
- 线性分类器 - 如果输入是线性可分的,您可以画一条直线来区分两组。
- 非线性分类器 - 如果无法通过直线进行分类。
- 问题维度 - 输入矩阵(向量)可以被视为待优化问题的特征,对于第3篇文章的最后一个例子,我们有两个输入:一个是X,另一个是Y,它们是每个点的坐标。另一种看待输入的方式是将输入的数量视为问题的维度。因此,4D问题意味着它有4个不同的特征(AI可以解决人脑无法可视化的更高维度的问题)。
使用感知器优化二元函数
为了更好地理解感知器及其局限性,我们将检查它在优化二元函数(如NOT
、OR
、AND
和XOR
)中的应用。
NOT 函数
这是一个1维问题。让我们设计如下感知器
h(x) = W0 + W1 * X1
由于输出是0或1,步进激活函数是一个不错的选择。
然后 Y=StepFunction (h(x))
从上面的NOT真值表可以看出,当X为0时,输出Y为1,所以当X=0时,h(x)应该>= 0。
h(x) = W0 + W1 * X1 >= 0 当 X=0
对于 X =0,W0 >= 0,让我们选择W0 =1
h(x) = 1 + W1 * X1
现在,当 X = 1 时,Y 的第二个可能值为 0
h(x) < 0 当 X =1
1 + W1 * X1 < 0 当 X =1
1 + W1 < 0 当 X=1
W1 < -1,所以让我们选择W1 = -1.5
最后,h(x) = 1 - 1.5 * X
OR 函数
这是一个2维问题,我们来绘制X1和X2。
这些是线性可分的组,可以画一条直线将两组分开,如下所示
同样,我们将为这个感知器使用步进激活函数
h(x) = W0 + W1 * X1 + W2 * X2
Y= Step(h(x)
从真值表可知,当X1=X2=0时,Y=0,这意味着
h(x) < 0 当 X1=X2=0
当 X1=X2=0 时,W0 < 0,让我们选择W0为 -0.5
h(x) = -0.5 + W1 * X1 + W2 * X2
从图中选择一条线,该线在X1处截距为0.5,在X2处截距为0.5(其他线也可以作为分隔线)
根据真值表,当X1=1且X2=0时,Y=1,则当X1=1且X2=0时,h(x) >= 0
-0.5+ W1 * X1 + W2 * X2 >= 0 当 X1=1 且 X2 =0
-0.5+ W1 * 1 + W2 * 0 >= 0 当 X1=1 且 X2 =0
-0.5+ W1 >= 0 当 X1=1 且 X2 =0
当 X1=1 且 X2 =0 时,W1 >= 0.5,让我们选择W1 = 1
h(x) = -0.5 + 1 * X1 + W2 * X2
同样,当X1=0且X2=1时,Y=1,则当X1=0且X2=1时,h(x) >= 0
-0.5 + 1 * X1 + W2 * X2 >= 0 当 X1=0 且 X2 =1
-0.5 + W2 >= 0 当 X1=0 且 X2 =1
当 X1=0 且 X2 =1 时,W2 >= 0.5,让我们选择W2 = 1
最后h(x) = -0.5 + X1 + X2
让我们确认真值表
X1 | X2 | 期望值 | h(x) = -0.5 + X1 + X2 | Y |
1 | 1 | 1 | 1.5 | 1 |
1 | 0 | 1 | 0.5 | 1 |
0 | 1 | 1 | 0.5 | 1 |
0 | 0 | 0 | -0.5 | 0 |
AND 函数
类似地,这是一个2D问题,感知器应为
通过遵循上述OR
过程,我们可以得出W0
、W1
和W2
的值
一种可能的组合是h(x) = -1.5 + X1 + X2
验证真值表
X1 | X2 | 期望值 | h(x) = -1.5 + X1 + X2 | Y |
1 | 1 | 1 | 0.5 | 1 |
1 | 0 | 0 | -0.5 | 0 |
0 | 1 | 0 | -0.5 | 0 |
0 | 0 | 0 | -1.5 | 0 |
所以,最终的感知器应为
XOR 函数
这是一个问题,该函数无法线性分离;没有一条直线可以分离这两个组。
那么感知器就无法解决这个问题,这是感知器的主要局限性(仅限于二元线性分类)。
然而,感知器是一种强大的算法,也许可以在其他形式中使用来优化复杂的问题。
让我们回到XOR
函数,并尝试更深入地理解它。我们将使用文氏图来帮助我们。文氏图是不同逻辑运算的图形表示(文氏图的更多信息)。
OR
门的文氏图应为
这是AND
的文氏图
这是XOR
从文氏图可以看出,XOR
门的含义是UNION
(OR
)的结果,排除INTERSECTION
区域,换句话说
A XOR B = (A + B) - (A.B)
我们已经在上面使用感知器实现了AND
和OR
函数,那么为什么不使用多个感知器来实现上述函数呢?一种可能的实现方式是
AND 函数
2D AND
函数已经实现,我们可以使用它
OR 函数
我们还没有实现3D OR
函数。为了做到这一点,让我们先简化XOR
函数的真值表
X1 | X2 | X1 AND X2 | 期望值 |
1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 |
0 | 0 | 0 | 0 |
所以我们需要找到OR
函数感知器h(x)的权重,以满足上表,其中
h(x) = W0 +W1 * X1 + W2 * X2 + W3 * X3 (X3 = X1 AND X2)
激活函数也将是步进函数。
让我们从X1=0, X2=0 & X1 AND X2 = 0的最后一个组合开始,则Y = 0
h(x) = W0 +W1 * X1 + W2 * X2 + W3 * X3 <0 当 X1=0, X2=0 & X1 AND X2 = 0
当 X1=0, X2=0 & X1 AND X2 = 0 时,W0 <0,让我们选择W0 = -1
对于X1=1, X2=0 & X1 AND X2 = 0 的组合,则Y = 1
h(x) = -1 +W1 * X1 + W2 * X2 + W3 * X3 >= 0 当 X1=1, X2=0 & X1 AND X2 = 0
-1 +W1 >= 0 当 X1=1, X2=0 & X1 AND X2 = 0
W1 >= 1,让我们选择W1 = 2
对于X1=0, X2=1 & X1 AND X2 = 0 的组合,则Y = 1
h(x) = -1 + 2 * X1 + W2 * X2 + W3 * X3 >= 0 当 X1=0, X2=1 & X1 AND X2 = 0
-1 +W2 >= 0 当 X1=0, X2=1 & X1 AND X2 = 0
W1 >= 1,让我们选择W2 = 2
对于X1=1, X2=1 & X1 AND X2 = 1 的组合,则Y = 0
h(x) = -1 + 2 * X1 + 2 * X2 + W3 * X3 < 0 当 X1=1, X2=1 & X1 AND X2 = 1
-1 + 2 + 2 +W3 < 0 当 X1=1, X2=1 & X1 AND X2 = 1
3 +W3 < 0 当 X1=1, X2=1 & X1 AND X2 = 1
W3 < -3 当 X1=1, X2=1 & X1 AND X2 = 1,让我们选择W3 = -4
最终h(x) =-1 +2 * X1 + 2 * X2 - 4 * X3 (X3 = X1 AND X2)
最终的感知器网络应为
好了,让我们尝试重新构建上述布局的图形表示。每个感知器将由其函数表示。
我们不使用1个AND
感知器,而是添加1个生成X1
的感知器,以及另一个生成X2
的感知器
现在,让我们添加虚拟感知器来接收输入,并将它们传递到下一层感知器
显然,上面的表示更好,它被称为MLP(多层感知器网络)。这正是ANN(人工神经网络)的常见布局。
输入由一组等于输入数量的感知器接收,这被称为输入层。
输出由感知器生成,每个输出一个感知器。这被称为输出层。
位于输入层和输出层之间的处理感知器称为隐藏层。
每个ANN只能有1个输入层和1个输出层,但可以有一个或多个隐藏层。隐藏层的数量取决于待优化问题的复杂度。
我们已经证明,通过添加1个感知器以及输出感知器,可以增加网络的额外能力。
有许多算法可用于ANN训练,ANN本身也有许多类型。我们将在未来的文章中讨论最常见的类型和算法。
然而,这一切都始于感知器的概念并在此基础上构建,因此,即使示例可能看起来不复杂,获得有关感知器的尽可能多的细节也很重要。
历史
- 2017年9月17日:初始版本