介绍:
深度学习(DL)和神经网络(NN)正在推动本世纪一些最有创意的发明。他们不可思议的从数据和环境中学习的能力,使他们成为机器学习科学家的首选。
深度学习和神经网络是自动驾驶汽车、图像识别软件、推荐系统等产品的核心。显然,作为一种强大的算法,它对各种数据类型也具有很强的适应性。
人们认为神经网络是一个非常难学的课题。因此,要么一些人不使用它,要么使用它的人将它用作black box。在不知道一个事物是如何实现的情况下使用它有什么意义吗?显然是无意义的。
在这篇文章中,我试图用简单的语言来解释神经网络的概念。理解这篇文章需要一点生物学知识和很多耐心。在本文结束时,你将成为一名自信的分析师,准备开始使用神经网络。
目录:
1.什么是神经网络?
2.一个单独的神经元如何工作?
3.为什么多层神经网络有用?
4.一个神经网络的常用结构
5.反向传播
1.什么是神经网络?
神经网络(Neural Networks,NN)又称人工神经网络(Artificial Neural Network),是以人工表示人类神经系统的工作状态而命名的。还记得这张图吗?大多数人都在高中学过!(神经系统由数百万个神经细胞或神经元组成。神经元具有以下结构:)
主要组成部分有:
树突:它以电脉冲的形式接受来自其他神经元的输入
细胞体:它从这些输入中产生推论,并决定采取什么行动
轴突终端:它以电脉冲的形式传输输出
简单地说,每个神经元通过树突接收来自大量其他神经元的输入。然后,它对输入执行所需的处理,并通过axiom向终端节点发送另一个电脉冲,电脉冲从终端节点传输到其他大量神经元。
ANN的工作方式与神经系统非常相似。神经网络的一般结构看起来如下:
这幅图描绘了一个典型的神经网络,并单独解释了单个神经元的工作原理。
每个神经元的输入就像树突。就像人类的神经系统一样,人工神经元整理所有输入并对其执行操作。最后,它将输出传输到它所连接的所有下层神经元。
神经网络分为3种层:
1.输入层:训练观察通过这些神经元传入。
2.隐藏层:这些是输入和输出之间的中间层,帮助神经网络学习数据中的复杂关系。
3.输出层:最后的输出是从前两层中提取出来的。例如:对于一个有5个类的分类问题,后面的输出将有5个神经元。
2.一个单独的神经元如何工作?
在这一部分,我们将用简单的例子探讨单个神经元的工作。关于神经元如何使用输入计算输出,给你一些直观的感受。
一个典型的神经元如下:
不同的部分有:
1.x1,x2,……,xN:神经元的输入。这些可以是来自输入层的实际观测值,也可以是来自其中一个隐藏层的中间值。
2.x0:偏置单元。这是添加到激活函数输入的常量值。它的工作原理类似于截距项,通常具有+1值。
3.w0,w1,w2,……,wN:每一个输入的权值。偏置单元也有权值。
4.a:神经元的输出。用下式计算:
这里的f是一个激活函数。它使得神经网络非常灵活,并赋予神经网络估计数据中复杂非线性关系的能力。它可以是高斯函数,logistic函数,双曲函数,甚至简单的情况下可以是线性函数。
让我们使用神经网络实现3个基本功能:或、与、非。这将帮助我们了解它们是如何工作的。你可以假设这些问题类似于一个分类问题,我们将预测不同输入组合的输出(0或1)。
我们将用以下激活函数对这些线性分类器进行建模:
例1:与
这个神经元的输出为:a=f(-1.5+x1+x2)
真值表为:
在这里我们可以看到与函数已经成功实现。列“a”符合“X1 AND X2”。注意,这里的偏置单位权值是-1.5。直观地说,我们可以把它理解为只有当x1和x2都为正时,总值才为正的任何数值。所以(-1,-2)之间的任何值都有效。
例2:或
这个神经元的输出为:a=f(-0.5+x1+x2)
真值表为:
列“a”符合“X1 OR X2”。我们可以看到,只要改变偏置单位权重,就可以实现或函数。这和上面的与函数很相似。直观地,你可以理解,这里的偏置是这样的:如果x1或x2中的任何一个变为正,则加权和将为正。
例3:非
这个神经元的输出为:a=f(1-2*x1)
真值表为:
同样,符合期望值。我希望通过这些例子,你对神经网络中的神经元是如何工作的有了一些直观感受。这里我使用了一个非常简单的激活函数(通常用logistic函数,因为它可微分,可以确定梯度,同时输出为小数)。
3.为什么多层神经网络有用?
在理解了单个神经元的工作原理之后,让我们来尝试理解神经网络如何使用多层来模拟复杂的关系。为了进一步理解这一点,我们将以XNOR函数为例。真值表为:
这里我们可以看到,当两个输入相同时,输出为1,否则为0。这种关系不能用单个神经元来模拟。因此,我们将使用多层网络。使用多层的思想是,复杂的关系可以分解成更简单的函数,进行组合。
例如:
我将用两个例子向你展示如何实现。
Case1:X1 XNOR X2 = (A非.B非) + (A.B)
A与B的运算在上文已经介绍过,难点在于设计一个神经元模拟A非与B非的运算。
输出为:a=f(0.5-x1-x2)
真值表为:
现在我们已经对各个部分进行了建模,我们可以使用多层网络将它们组合起来。首先,让我们看看这个网络的语义图:
整个神经网络为:
如果你仔细观察,会发现,这只不过是我们已经画出的不同神经元的组合。不同的输出代表不同的单元:
1.a1代表A非与B非
2.a2代表A与B
Case 2: X1 XNOR X2 = NOT [ (A+B).(A’+B’) ]
神经网络为:
1.a1代表 A
2.a2代表A非
3.a3代表 B
4.a4代表 B非
5.a5代表A与B
6.a6代表A非与B非
7.a7代表与运算
8.a8代表非运算,
最后,我们成功地实现了XNOR函数。这种方法比情况1更复杂。因此,你会更喜欢案例1。但这里展示了复杂的功能可以分解成多个层次。我希望多层的优点现在更清楚了。
4.一个神经网络的常用结构
既然我们已经看了一些基本的例子,让我们定义一个通用的结构,每个神经网络都属于这个结构。我们还将看到确定给定输入的输出所遵循的方程式。这称为前向传播。
一个通用的神经网络结构如下:
既然每一层的输出是下一层的输入,让我们定义一个式子,用第i层的输出作为输入来确定第i+1层的输出。
第i+1层的输入为:
第i层到第i+1层的权值矩阵为:
第i+1层的输出可以这样计算:
利用这些方程,我们可以确定最终输出。输出层中的神经元数量将取决于问题的类型。对于回归或二元分类问题,它可以是1;对于多类分类问题,它可以是多个。
但这只是确定一次运行的输出。最终目标是更新模型的权值,使损失函数最小。我们将在下一步研究反向传播算法,来更新权重。
5.反向传播
反向传播(BP)算法的工作原理是确定输出的损失(或误差),然后将其传播回网络。权值被更新,以此最小化每个神经元产生的误差。我不会详细介绍这个算法,但我会尽量让你了解它是如何工作的。
最小化误差的第一步是确定输出对于每个节点的梯度。因为它是一个多层网络,所以确定梯度并不简单。
让我们了解多层网络的梯度。从神经网络后退一步,考虑一个非常简单的系统,如下所示:
d = a – b
e = d * c = (a-b)*c
确定梯度:
使用链式法则:
并且,这种方法可以通过简单地将节点的输入的梯度乘以该节点的输出的梯度来计算梯度。如果你还不明白,只要把这个方程式仔细读5遍,你就会明白的!
但是,实际并不是那么简单。再举一个例子。考虑这样一种情况:一个输入被输入到下一层的多个神经元中。神经网络几乎总是这样。
在这种情况下,除了“m”之外,所有其他节点的梯度都与上述示例非常相似,因为m被送入2个节点。在这里,我将展示如何确定m和rest的梯度,你应该自己计算。
在这里你可以看到梯度是两个不同梯度的总和。
在继续之前,让我们总结一下神经网络优化的整个过程。各个步骤包括:
1.选择一个神经网络结构,包括隐藏层数量、每一层的神经元个数以及激活函数
2.随机初始化权值
3.用前向传播确定输出
4.用已知结果确定差错
5.反向传播差错
6.更新权值
其中:
第4步:
y是训练数据的真实输出。
第5步:
第L-1层的差错
我们看到一个节点的梯度是下一层所有节点梯度的函数。这里,一个节点上的误差是基于下一层所有节点上的误差加权和,这些节点的输出作为输入。由于误差是用每个节点的梯度来计算的,所以这个因子就出现了。
f’(x)(i)指进入该节点的输入的激活函数的导数。注意,x是在应用激活函数之前,当前节点中所有输入的加权和。
这里的链式规则是用当前节点的梯度的乘积来实现的。
第6步:
1.l = 1,2,……, (L-1) 是层的编号
2.i = 0,1,……, Nl 是第i层中节点的编号
3.k = 1,2,…., Nl+1是第i+1层中节点的编号
4.Wik(l)是指从第l层第i个节点到第l+1层第k个节点的权值