神经网络是什么?


人工神经网络(ANNs)或连接系统是计算系统,其模糊地受到构成动物脑的生物神经网络的启发。这些系统通过考虑实例“学习”(即逐步提高性能),通常没有特定于任务的编程。例如,在图像识别中,他们可能会通过分析手动标记为“猫”或“无猫”的示例图像并使用结果识别其他图像中的猫来识别包含猫的图像。他们没有任何先验知识就这样做关于猫,例如,他们有毛皮,尾巴,胡须和猫般的面孔。相反,他们从他们处理的学习资料中演变出自己的一套相关特征。

人工神经网络基于一组称为人造神经元(在动物脑中的生物神经元的简化版本)的连接单元或节点。人造神经元之间的每个连接(简化版本的突触)可以将信号从一个传输到另一个。接收信号的人工神经元可以处理它,然后发出信号传递与之相连的人造神经元。

在常见的ANN实现中,人造神经元之间的连接处的信号是实数,并且每个人造神经元的输出通过其输入之和的非线性函数来计算。人工神经元和连接通常具有随着学习进行而调整的权重。重量增加或减少连接处信号的强度。人造神经元可能有一个阈值,只有当汇总信号超过该阈值时才会发送信号。通常,人造神经元是分层组织的。不同的层可能会对其输入执行不同类型的转换。信号从第一个(输入)到最后一个(输出)层传播,可能在多次穿越层之后。

ANN方法的最初目标是以与人类大脑相同的方式解决问题。然而,随着时间的推移,注意力集中在匹配具体任务上,导致生物学的偏差。人工神经网络已用于各种任务,包括计算机视觉,语音识别,机器翻译,社交网络过滤,游戏板和视频游戏以及医疗诊断。


了解更多硅谷前沿深度讯息请看 硅发布 微信公众号。


硅发布

下面我们来点通俗易懂的几个概念。如果想系统性学习,建议买一些相关的书籍看一看。

神经网络

神经网络技术是机器学习下属的一个概念,本质上是从信息处理的角度对人脑神经元网络进行抽象模拟,从而建立计算模型。

基于神经连接的计算模型在上世纪40年代开始受到重视,大量的训练数据(包括图像、视频和语音)成功的实现了数据分析。在深度学习发展之前,神经网络通常只有3到5层,和几十个神经元/节点;深度学习之后,神经网络扩展到7到10层,甚至更多层,模拟神经元数目增至百万量级,从而面向更为复杂的问题实现更为可靠的处理。当下兴起的人工智能,主要就是大规模的深度学习。

具体来看,神经网络有三类主要形式:

1.1 前馈神经网络

前馈神经网络(Feed forward neural networks)是最常见的人工神经网络。在这种结构下,信息只向一个方向(向前)移动,即从输入层经过“隐藏层”到输出层,没有循环网络。首个单节神经网络在1958年提出,经过计算能力和训练算法的大发展,前馈神经网络展现出了更高的性能水平。

1.2 循环神经网络

循环神经网络(Recurrent neural networks)指结构中包含节点定向连接成环(loops)的人工神经网络,非常适合于处理(手写、文本、语音形式的)任意时序的输入序列。2016年11月,牛津研究报告显示,基于神经网络(和卷积神经网络)的系统在唇语识别应用中实现了95%的准确率(有经验的人类唇语者准确率近52%)。

1.3 卷积神经网络

卷积神经网络(Convolutional neural networks)是一种深度前馈人工神经网络,其逻辑结构受动物视觉大脑皮层的启发,对于大型图像处理(视觉感知任务)有出色表现。

▲最好的AI系统识别能力已经超过人类


智东西

以分类垃圾邮件为例。

如果用传统程序做,怎么做?

容易想到的一个思路是在邮件中搜索一些关键词,比如“代开发票”之类的,然后给每个关键词分配一个分数,再将这些特征的分数加起来,得到一个总分。将这个总分和一个目标分数比较,大于这个分数结果为真(分类为垃圾邮件),小于这个分数结果为假(分类为正常邮件)。

Boolean detectSpam(f1, f2, ..., fn) {

if (w1 * f1 + w2 * f2 + ... + wn * fn > t) {

return true;

} else {

return false;

}

}

其中,f1 ... fn 代表匹配到的关键词,w1 ... wn 代表相应的分数。

正如你所说:

传统程序就是循环判断什么的

那上面就是一个判断。detectSpam是分类一封邮件的,将它应用到所有邮件上,不正是循环嘛。所以说,这是一个标准的传统程序。

好了,现在我们给上面提到的东西起些新名字。分配的分数,我们起名叫权重,目标分数,我们起名叫阈值。最后我们再把返回的布尔值(true、false)改成数字1和0。

那么上面的detectSpam变成了什么,感知器(perceptron)!

所以说,你可以将感知器看成传统程序中某类具有一些特定性质的函数。感知器接受多个输入,计算一个多项式的值(输入乘以权重并相加),返回一个输出(1或0)。

之所以叫感知器,是因为它借鉴了神经末梢接受外部的输入,决定是否激动的思路。

由于感知器主要是计算多项式的值,那么从直觉上,线性不可分的问题,比如异或(XOR)函数,就无法转化成感知器的形式。

但实际上,感知器并没有这么弱,将感知器组合一下,就可以表达异或函数。

我们准备两个阈值为 0 的感知器,一个是x-y, 另一个是-x+y,将输入分别发给这两个感知器:

然后再将输出提供给一个阈值为 0 的x+y感知器:

比较输入和最终输出,可以看到我们的这三个感知器运算的结果是符合异或的定义的。

这里,前两个感知器(x-y和-x+y)是第一层,最后一个感知器(x+y)是第二层。由此我们看到,通过组合感知器,可以构成一个分层的神经网络,分层的神经网络可以解决线性不可分问题。

但是感知器还是看起来很弱啊。 异或函数这么简单的问题,都要这么复杂才能搞定。而稍微正常一点的编程语言,异或函数都能很直接地定义。我们何必要自废武功用感知器和神经网络呢?直接用传统程序不行吗?

实际上,感知器和神经网络看起来很弱,但它也有优点:

感知器的“接口”很齐整,每个感知器都有多个输入,返回一个结果,这就使得它们组合起来很容易。

感知器内部都是在进行多项式运算,而不像传统程序一样千变万化,因此优化起来很容易(特别是现在我们有很强劲的擅长浮点运算的GPU)。

感知器的运算结果只取决于它的输入,因此可以很容易地以分布式的方式跑。

上面那个例子中x-y, -x+y, x+y的确定,来自于我们对异或函数的理解。假设我们对异或函数一无所知,感知器的结构决定了,我们比较容易通过暴力的方式(所谓训练神经网络)来尝试各种权重和阈值。相反,我们不太可能通过暴力的方式生成字符串恰巧撞对异或函数的一般定义。

神经网络分层的结构,意味着我们可以逐层尝试,来逼近预期的结果。

以上只是神经网络的基本原理。实际使用的神经网络要复杂很多。

比如,我们的感知器只能输出 0 或者 1,而既然是暴力尝试,那我们就希望整个网络对参数的调整敏感一点。这时候我们就不再比较多项式的值和阈值来输出 0 或者 1,而是将阈值转化成偏置加到多项式上,并使用一个激活函数对多项式的结果进行处理,得到一个浮点数。最简单的激活函数是 ReLU, 定义很简单 max(0, n). ReLu 虽然简单,但出奇地好用。

同时,实际工程中使用的神经网络,无论是规模还是结构一般都非常复杂。