人工智能领域经常听到的一个词就是“神经网络”,“深度学习”一词中的“深度”也来源于神经网络(深度学习指基于深度神经网络的机器学习,深度神经网络指至少具备一个隐层的神经网络。)那么,神经网络到底是什么呢?
让我们从一个机器学习的典型问题出发,看看神经网络这个概念提出的动机是什么,神经网络到底是怎么回事。
机器学习的典型问题就是某个数据具有一系列特征,根据这些特征分类这个数据。这个问题该如何解决?
容易想到的一个思路是给每个特征配上一个分数(权重),然后将这些特征的分数加起来,得到一个总分,再和一个目标分数(阈值)比较,大于阈值结果为1,否则结果为0。
f [f1, f2 .. fn] =
if (w1 * f1 + w2 * f2 + ... + wn * fn > t) then
1
else
0
这个函数f叫做感知器(perceptron)。感知器的定义,受到了神经元的启发。感知器接受多个输入,返回一个布尔值,就像神经末梢接受外部的输入,决定是否激动。
1899年西班牙神经学家Santiago Ramón y Cajal手绘的神经元
我们注意到,感知器主要的工作是计算一个多项式的值:
w1 * f1 + w2 * f2 + ... + wn * fn
那么从直觉上,线性不可分的问题,比如异或(XOR)函数,就无法转化成感知器的形式。
但实际上,感知器并没有这么弱,将感知器组合一下,就可以表达异或函数。
我们准备两个阈值为 0 的感知器,一个是x-y, 另一个是-x+y,将输入分别发给这两个感知器:
输入x-y-x+y输出
(1, 0)10(1, 0)
(0, 1)01(0, 1)
(0, 0)00(0, 0)
(1, 1)00(0, 0)
然后再将输出提供给一个阈值为 0 的x+y感知器:
输入中间结果最终输出
(1, 0)(1, 0)1
(0, 1)(0, 1)1
(0, 0)(0, 0)0
(1, 1)(0, 0)0
比较输入和最终输出,可以看到我们的这三个感知器运算的结果是符合异或的定义的。
这里,前两个感知器(x-y和-x+y)是第一层,最后一个感知器(x+y)是第二层。由此我们看到,通过组合感知器,可以构成一个分层的神经网络,分层的神经网络可以解决线性不可分问题。
但是感知器还是看起来很弱啊。 异或函数这么简单的问题,都要三个感知器,两层网络才能搞定。而稍微正常一点的编程语言,异或函数都能很直接地定义。我们何必要自废武功用感知器和神经网络呢?这不是自虐吗?
实际上,感知器和神经网络看起来很弱,但它也有优点:
感知器的“接口”很齐整,每个感知器都有多个输入,返回一个结果,这就使得它们组合起来很容易。
感知器内部都是在进行多项式运算,而不像普通函数一样千变万化,因此优化起来很容易(特别是现在我们有很强劲的擅长浮点运算的GPU)。
感知器的运算结果只取决于它的输入,因此可以很容易地以分布式的方式跑。
上面那个例子中x-y, -x+y, x+y的确定,来自于我们对异或函数的理解。假设我们对异或函数一无所知,感知器的结构决定了,我们比较容易通过暴力的方式来尝试各种权重和阈值。相反,我们不太可能通过暴力的方式生成字符串恰巧撞对异或函数的一般定义。
神经网络分层的结构,意味着我们可以逐层尝试,来逼近预期的结果。
看起来,神经网络还是有它的优势的。不过还是觉得不怎么靠谱呀。神经网络看起来像是在我们不知道怎么猜比较好的情况下的一种暴力的猜法。这不是乱枪打鸟吗?也难怪神经网络被戏称为黑盒子。
但是,别忘了我们刚才提到的,神经网络可以很方便地在不理解异或函数的前提下撞出一个异或函数的实现。因此,神经网络对领域知识的要求很低。对领域知识的低要求,对神经网络来说,算是“一招鲜,吃遍天”了。而随着计算力的提升,粗暴堆料的成本越来越低,神经网络也就越来越受重视。
另外,以上只是神经网络的基本原理。实际使用的神经网络要复杂很多。
比如,我们的感知器只能输出 0 或者 1,而既然是暴力尝试,那我们就希望整个网络对参数的调整敏感一点。这时候我们就不再比较多项式的值和阈值来输出 0 或者 1,而是将阈值转化成偏置加到多项式上,并使用一个激活函数对多项式的结果进行处理,得到一个浮点数。最简单的激活函数是 ReLU, 定义很简单 max 0 n. ReLu 虽然简单,但出奇地好用。
另外,实际使用的神经网络,无论是规模还是结构都非常复杂。比如 2015年发表、2016年被选为 CVPR 最佳论文的残差网络(residual network) ,不直接拟合目标函数,转而拟合一个残差函数(表示运算值与预期值差异的函数),神经网络的层数(深度)已经丧心病狂地堆到了一千层。
机器人网原创文章,未经授权禁止转载。详情见转载须知
本文来自机器人网,如若转载,请注明出处:https://www.jqr.com/news/008222