神经网络的基础理论

神经网络”是一种机器学习算法。

我们将首先讨论,神经网络的表层结构,后续,再来具体讨论具体细节算法。

神经网络实际上是一个相对古老的算法,并且在后来沉寂了一段时间,不过到了现在,他又称为许多机器学习问题的首选技术。

 

Motivations

Non-linear Hypotheses

首先考虑几个问题。。。

我们为什么还需要这个新的学习算法?我们已经有了线性回归和逻辑回归算法,为什么还要研究神经网络呢?

为了阐述研究神经网络算法的目的,我们首先来看几个机器学习问题作为例子。这几个问题的解决,都依赖于研究复杂的非线性分类器。

我们来考虑这个监督学习分类的问题。我们有对应的训练集,如果利用逻辑回归算法来解决这个问题,首先需要构造一个包含很多非线性项的逻辑回归函数。这里g仍是s型函数,也就是gz=1/(1+e^-z)。我们可以让函数包含很多像这样的多项式项。正如在之前讲的,当多项式项足够多时,那么可能我们可以得到一个完美地分开正样本和负样本的分界线。

当只有两项时,比如x1,x2。 这种方法确实能得到不错的结果。因为我们可以把x1和x2的所有组合都包含到多项式中。但是对于许多复杂的机器学习问题,涉及的特征往往多余两项。

比如我们很熟悉的关于房子的特征,它就可以有非常多的特征。对于这种情况,如果要包含所有的二次项,那么最终的函数也可能有很多项,比如x1^2, x1x2, x1x3 …

因此,即使只考虑二阶项,也就是说两个项的乘积,x1乘以x1等等类似于此的项,那么在n=100的时候,最终也有5000个二次项。

而且,渐渐地,随着特征个数n的增加。二次项的个数大约以n^2的量级增长。其中n是原始项的个数。比如,我们刚才说的x1到x100,这些项,它们的二次项的个数大约是(n^2)/2.

因此,要包含所有的二次项是很困难的。所以这可能不是一个好的做法,而且由于项数过多,最后的结果很有可能是过拟合的。此外,在处理这么多项时,也存在运算量过大的问题。

当然,我们可以试试,只包含上边这些二次项的子集。例如我们只考虑x1^2 x2^2 x3^2直到x100^2这些项。这样就可以将二次项的数量大幅减小到100个。但是由于忽略了太多相关项,在处理类似左上角的数据时,不可能得到理想的结果。实际上如果只考虑x1的平方到x100的平方,这100个二次项,那么你可能会拟合出一些特别的假设,比如可能拟合出一个椭圆状的曲线。但是肯定不能拟合出像左上角这个数据集的分界线。

所以,5000个二次项看起来已经很多了,而现在假设包括三次项或者三阶项,例如x1x2x3, x1^2 x2等等,类似的三次项,所以,当初始特征个数n增大时,这些高阶多项式的项数将以几何级数递增,特征空间也随之急剧膨胀,当特征个数n很大时,如果使用这种方法来建立分类器,并不是一个好做法。

对于许多实际的机器学习问题,特征个数n’是很大的。举个例子。

关于计算机视觉中的一个问题。假设我们想要使用机器学习算法来训练一个分类器。使它检测一个图像,然后来判断是否是一辆汽车。

很多人可能会好奇,这对计算机视觉来说有什么难的?当我们自己看到这幅图像时,它是什么是一目了然的事情,你肯定会奇怪,为什么学习算法竟可能不知道这个图像是什么。

为了解答这个疑问,我们取出这幅图片的一小部分,将其放大,比如图中这个蓝色方框内的部分。当人眼看到一辆汽车时,计算机实际上看到的却是这个——一个数据矩阵,它们表示了像素。

具体而言,当使用机器学习算法构造一个汽车识别软件时,我们需要有一个带标签的样本集,其中一些样本是各类汽车,另一部分样本是其他任何东西,将这个样本集输入给学习算法,然后训练出一个分类器。训练完以后,我们输入一幅新的图片,让分类器判断“这是什么东西?”

理想情况下,分类器能识别出这是一辆车。

为了理解引入非线性分类器的必要性,我们从学习算法的训练样本中,挑出一些汽车图片和一些非汽车图片。

让我们从其中每幅图片中挑出一组像素点。这是像素点1的位置,这是像素点2的位置,在坐标系中标出这辆车的位置。在这个坐标系中,图片的位置完全取决于像素点1和像素点2的值。

我们用同样的方法标出其他图片的位置。

我们使用”+”表示汽车,用”-”表示非汽车。我们将发现,汽车样本和非汽车样本,分布在坐标系中的不同区域。因此,我们现在需要一个非线性分类器来尽量分开这两类样本。

这个分类问题中特征的维数是多少呢?假设我们用50*50像素的图片,这样的图片已经很小了,长宽只有50个像素,但这依然多达2500个像素点。

因此,我们的特征向量的元素数量n=2500,特征向量X包含了所有像素点的值,这是像素点1的值,这是像素点2的值,以此类推,直到最后一个。像素点的值,对于典型的计算机图片表示方法,如果存储的是每个像素点的灰度值,那么每个元素的值应该在0~255之间,因此这个问题中n=2500,但是这只是使用灰度图片的情况,如果我们用的是RGB彩色图像,每个像素点包含红、绿、蓝三个子像素,那么n=7500.

因此,如果我们通过包含所有的二次项来解决这个非线性问题,那么这就是式子中的所有项,xi*xj,连同开始的2500像素,总共大约有300万个。这个数字大的有点离谱了,对于每个样本来说,要表示所有这300万个项,计算成本太高了。

因此,只是简单的增加二次项或者三次项之类的逻辑回归算法,并不是解决复杂非线性问题的好办法。因为当n很大时,将会产生非常多的特征项,在接下来的内容中,我将跟大家一起学习神经网络,它在解决复杂的非线性分类问题上,被证明是一种好得多的算法。

即使我们的特征维度n很大也能轻松搞定。

神经网络

Nuerons and the Brain

神经网络是一种很古老的算法。

它最初产生的目的是:制造能模拟大脑的机器。在这门课中,我们将一起学习神经网络,因为它能很好地解决不同的机器学习问题,而不只因为他们在逻辑上行得通。

在这里,我们还会了解一些神经网络的背景知识,由此我们能知道可以用他们来做什么,不管是将其应用到现代的机器学习问题上,还是应用到哪些你可能会感兴趣的问题中。

神经网络产生的原因,是人们想尝试设计出,模仿大脑的算法,从某种意义上说,如果我们想要建立学习系统,那么为什么不去模仿我们所认识的最神奇的学习机器——人类的大脑呢?

神经网络逐渐兴起于二十世纪八九十年代,应用得非常广泛,但由于各种原因,在90年代后期减少了。但是最近,神经网络又东山再起。

其中一个原因是,神经网络是计算量有些偏大的算法,然而大概由于近些年,计算机的运行速度变快,才足以真正运行起大规模的神经网络。正式由于这个原因,和其他一些我们后面会讨论的技术因素,如今的神经网络对于许多应用来说是最先进的技术。

当我们想模拟大脑时,是指想造出与人类大脑作用效果相同的机器,对吧?

大脑可以学会去 以看而不是听的方式处理图像。学会处理我们的触觉。

我们能学习数学,学着做微积分,而且大脑能处理各种不同的令人惊奇的事情,似乎如果你想要 模仿它 你得写很多不同的 软件来模拟所有 大脑告诉我们的这些 五花八门的奇妙的事情。 不过能不能假设,大脑做所有这些 不同事情的方法 不需要用上千个不同的程序去实现,相反的 大脑处理的方法 只需要一个单一的学习算法就可以了? 尽管这只是一个假设,不过让我们看看一些这方面的证据。

Neural Networks

Model Representation I

在一个神经网络里,或者说在我们的电脑上,实现的人工神经网络里,我们将使用非常简单的模型来模拟神经元的工作,我们将神经元模拟成一个逻辑单元,当我画一个这样的 黄色圆圈时,你应该把它想象成 作用类似于 神经元的东西,然后我们通过它的树突或者说它的输入神经 传递给它一些信息,然后神经元做一些计算,并通过它的输出神经,也就是它的轴突,输出计算结果。

当我们画一个神经网络时,通常我们只会画输入节点x1,x2,x3,但有时也会增加一个额外地节点X0。这个x0节点有时也被称为偏置单位[写出来],或者偏置神经元,但是因为x0总是等于1,所以有时候我们会把它画出来,有时候不会把它画出来,这取决于它是否对例子有利。现在来讨论,最后一个关于神经网络的术语,有时候我们会说,这是一个神经元,一个s型函数或者逻辑函数作为激活函数的人工神经元。在神经网络术语中,激活函数知识对类似非线性函数g(z)的另一个术语称呼。

到目前为止,我们一直成θ为模型的参数,以后大概还会继续使用这个术语,而在很多神经网络的文献中,有时你可能会看到人们谈论一个模型的权重,而这里说的权重其实和模型的参数是同一个事物。

神经网络其实就是这些不同的神经元组合在一起的集合。

具体来说,这里是我们的输入X1,x2,和x3,有时也可以画上额外的x0节点。[第二层]这里有3个神经元,我在里面写了a(2)1, a(2)2, a(2)3,然后再次说明,我们可以在这里添加一个a0,它的值永远是1。最后,我们在最后一层有三个节点,正是这三个节点输出了假设函数h(x)计算的结果。

再多说一点关于神经网络的术语,网络中的第一层,也被称为输入层,因为我们在这一层,输入我们的特征项x1, x2, x3。最后一层,也成为输出层,因为这一层的神经元输出假设的最终计算结果。中间的这第二层,也被称作隐藏层,隐藏层不是一个很合适的术语,但是直觉上我们知道,在监督学习中,你能看到输入也能看到输出,而隐藏层的值我们在训练集中是看不到的,它的值不是x也不是y,所以我们叫它隐藏层,稍后我们会看到神经网络,可以有不止一个的隐藏层,但在这个例子中,我们有一个输入层,也就是第一层。一个隐藏层,也就是第二层,以及一个输出层,也就是第三层。但实际上,任何非输入层或非输出层的层,就被称为隐藏层。

接下来,我们希望明白神经网络究竟在做什么,让我们逐步分析,这个图所代表的计算步骤。

为了解释这个神经网络具体的计算步骤,这里还有些标记需要解释。

我们使用a上标(j)下标i 表示第j层的第i个神经元或单元。具体来说,这里 a上标(2)下标1,表示第2层的第一个激活单元 即隐藏层的第一个激活单元。所谓的激活是指,有一个具体的神经元读入,计算并输出的值,此外,我们的神经网络被一些矩阵化的参数theta控制。比如,从第一层到第二层,由一个参数矩阵控制,第二层到第三层也有一个参数矩阵控制,而这个矩阵的上标j表示的就是它控制的是第j层到第j+1层。

所以,这就是这个神经网络所表示的计算。

这里的第一个隐藏单元,是这样计算它的值的:a(2) 1等于 sigmoid函数或者说logistic函数,作用在这种输入的线性组合上的结果。

第二个隐藏单元,等于sigmoid函数作用在这个线性组合上的值。

同样,对于第三个隐藏单元,它是通过这个公式计算的。

这里,我们有三个输入单元和三个隐藏单元。

这样一来,参数矩阵控制了我们来自三个输入单元三个隐藏单元的映射,因此θ1的维数将变成3,θ1将变成一个3*4的矩阵。

更一般的,如果一个网络在第j层有sj个单元,在j+1层有sj+1个单元,那么矩阵θ j也就是控制第j层到j+1层映射的矩阵的维度将是s j+1 乘以 sj +1。这里要搞清楚下标。第一维表示的是j+1层有多少个神经元,而第二维表达是第j层有多少个神经元,同时额外的+1是因为我们会有偏置项。

以上,我们讨论了三个隐藏单元是怎么计算它们的值。最后,在输出层,我们还有一个单元,它计算h(x),这个也可以写成a(3) 1。

注意到,我这里写了个上标2,因为theta上标2 是参数矩阵或者说是权重矩阵,该矩阵控制从第二层即隐藏层的3个单元到第三层的一个单元,即输出单元的映射。

以上我们展示了像这样的一个结构图是怎么定义一个人工神经网络的,这个神经网络定义了函数h: 从输入x到输出y的映射,我们将这些假设的参数 记为大写的θ,这样一来,不同的theta对应了不同的假设,所以我们有不同的函数。这就是神经网络的基本的逻辑。

Model Representation II

我们解释了怎样用数学来定义或者计算神经网络算法的假设函数。

这里,我们来看看怎么高效地进行计算,并展示一个向量化的实现方法。

更重要的是,我们可以理解为什么这样表示神经网络是一个好的方法,并且理解它们怎样帮助我们学习复杂的非线性假设。

以这个神经网络为例,以前我们说,计算出假设函数输出的步骤,是左边的这些方程。通过这些方程,我们计算出,三个隐藏单元的激活值,然后利用这些值来计算假设函数h(x)的最终输出。接下来,我们要定义一些额外的项以更加简化地描述我们的问题。

因此,划线的项,把它定义为z上标(2)下标1,那么a(2) 1就等于g(z(2), 1)。另外,顺便提一下,这些上标2,的意思是,它们与第二层相关。

接下来,这里的项[红线],我们同样定义为z(2) 2。

最后,这个[粉线],我们把它定义为z(2) 3,这样我们有a(2) 3等于g(z(2), 3)。

这样,这些z值实际上都是线性组合,是输入值x0, x1, x2, x3的加权线性组合。它将会进入一个特定的神经元。

这个计算hx的过程,也被称为前向传播。这样命名是因为,我们从输入层开始,然后进行前向传播给隐藏层并计算隐藏层的激活值,然后我们继续向前传播,并计算输出层的激活。这个从输入层到隐藏层再到输出层一次计算激活的过程叫做前向传播。

我们刚刚得到了这一过程的向量化实现方法,如果我们实用右边这些公式实现它,就会得到一个有效地计算hx的方法,这种前向传播的角度,也可以帮助我们了解神经网络的原理,以及它为什么能够帮助我们学习非线性假设。

看一下这个神经网络,我会暂时盖住左侧部分,如果你观察图中剩下的部分,这看起来很像逻辑回归,在逻辑回归中,我们用这个节点[输出节点]即逻辑回归单元来预测hx的值。

具体来说,假设输出的hx将等于sigmoid函数[手写的蓝色式子]g(θ0*a0 + θ1*a1 + θ2*a2 + θ3*a3),其中a1, a2, a3由这三个单元给出,为了和我们之前的定义保持一致,需要在这里还有这些地方都填上上标(2)[手写的粉色上标]。

同样还要加上这些下标1[手写的粉色下标]。因为我们只有一个输出单元,所以如果观察蓝色的部分,这看起来,非常像标准的逻辑回归模型,不同之处在于,我们现在用的是大写的θ,而不是小写的θ。这样做完,我们只得到了逻辑回归。

但是,逻辑回归的输入特征是通过隐藏层计算的。再说一遍,神经网络所做的就像逻辑回归,但是它不是使用x1, x2, x3作为输入特征,而是用a1, a2, a3作为新的输入特征。

有趣的是,特征项a1,a2,a3它们是作为输入的函数来学习的。

具体来说,就是从第一层映射到第二层的函数,这个函数由其他一组参数θ1决定,所以在神经网络中,它没有用输入特征x1, x2, x3来训练逻辑回归,而是自己训练逻辑回归的输入a1,a2,a3。 可以想象,如果在θ1中选择不同的参数,有时可以学习到一些很有趣的复杂特征,就可以得到一个更好的假设,比使用原始输入x1 x2或x3时得到的假设更好,虽然我们也可以选择多项式作为输入,但这个算法可以灵活地快速学习任意的特征项,把这些a1,a2,a3输入这个最后的单元。

在神经网络中,层数,层与层之间的连接方式,被称为神经网络的架构,所以说,架构是指,不同的神经元是如何相互连接的,这里我们看到有一个不同的神经网络架构。

我们可以意识到,这个第二层是如何工作的,在这里,我们有三个隐藏单元,它们根据输入层计算一个复杂的函数,然后第三层,可以将第二层训练出的特征项作为输入,并在第三层计算一些更复杂的函数,这样在到达输出层之前,也就是第四层,就可以利用第三层训练出的更复杂的特征项作为输入,以此得到非常有趣的非线性假设。

到这里,希望大家对前向传播在神经网络里的工作原理有了大致的理解:从输入层开始,向前传播到第一隐藏层,然后传播到第二隐藏层,最终达到输出层,而且我们也讨论了如何向量化这些计算。

虽然可能大家仍然会觉得有些抽象,不过接下来我们还会讨论下具体的例子,来看看神经网络如何计算出一些非线性函数,以便更好的理解神经网络如何得到复杂的非线性假设。

Applications

Examples and Intuitions I

 

在接下来,我要通过讲解一个具体的例子来解释,神经网络是如何计算 关于输入的复杂的非线性函数。希望这个例子可以 让大家理解为什么 神经网络可以用来 学习复杂的非线性假设。

考虑下面的问题。我们有二进制的输入特征x1, x2。 它们的取值,要么是0,要么是1.

在这个例子中,我只画出来两个正样本和两个负样本,但可以被认为是一个更复杂的学习问题的简化版本。[上图]在这个复杂问题中,我们可能在右上角和左下角有一堆正样本,在左上方和右下方有一堆用圆圈表示的负样本。我们想要学习一种非线性的决策边界来区分正负样本。

那么,神经网络是如何做到的呢?为了描述方便,我们不用右边这个例子,我们用左边这个例子,这样更容易说明。具体来说,这里需要计算的是,目标函数y等于x1异或x2,或者y也可以等于x1 异或非 x2,一种异或非 表示X1异或x2后取反。

X1异或x2 为真,当且仅当这两个值有且仅有一个为1. 如果我用XNOR作为例子,比用NOT作为例子结果会好一些,但这两个其实是相同的,这就意味着x1异或x2后再取反 即当它们同时为真 或者同时为假的时候,我们将获得y=1. 如果它们中仅有一个为真,y=0.

那么我们关心的是,是否能找到一个神经网络模型来拟合这种训练集。

 

为了建立能拟合异或非运算的神经网络,我们先讲一个稍微简单的神经网络,它能够拟合“且”运算。

逻辑与

假设我们,有输入x1和x2,并且都是二进制,也就是它们的取值要么是0,要么是1. 我们的目标函数y正如你所知道的等于 x1 and x2 这么一个逻辑与。那么我们怎样得到一个具有单个神经元的神经网络来计算这个逻辑与运算呢?

为了做到这一点,我们需要画出偏置单元。

现在,让我们给这个网络分配一些参数或者权重。

现在,让我们来看看,这个小神经元是怎样计算的。我们先回忆一下s型激活函数,它从0开始光滑上升穿过0.5,渐进到1.

所以,我们通过上面的多张图就弄清楚了神经网络如何计算出逻辑与运算。

逻辑或

运算其实也非常简单,我们通过类似的计算可以得到对应的真值表,它就能表达逻辑或的运算。

所以,希望大家通过这两个例子,能够明白神经网络里的单个神经元在计算如逻辑与 和逻辑或 运算时时怎样发挥作用的,在接下来的内容中,我们将继续讲解更加复杂的例子,我们将讨论一个多层的神经网络,怎样被用于计算更复杂的函数,比如异或 或者 异或非 函数。

Examples and Intuitions II

前面讨论了怎么实现逻辑与和逻辑或。这里我们再来看看怎么实现逻辑非。

逻辑非

逻辑非其实很简单,边上的权重分别使用10和-20即可。它对应g(10-20x1)

我们可以看看它的真值表,当x1等于0的时候,我们计算的是g(10),非常接近于1.而当x1等于1的时候,我们计算的是g(-10),接近于0. 所以,这个计算实际上就是在计算”非X1”这个逻辑。

所以,如果要计算逻辑非运算,总体思路是,在你希望取非运算的变量前面,放一个绝对值大的负数作为权值,因此如果放一个-20,那么和x1相乘,很显然,最终结果就得到了对x1进行非运算的效果。另外,我们再给一个例子,计算这样一个函数 (非x1)与(非x2)。

现在,大家应该清楚了,怎样建立一个小规模的神经网络来计算这个逻辑函数的值。

把前面我们讨论的三部分内容放在一起,”x1,x2”的逻辑与运算,上面的 (非x1)与(非x2) 网络,以及x1,x2的或运算,把这三个网络放在一起,我们就能计算异或非运算了。

我们使用下面这个网络来计算,首先,我们需要一个计算逻辑与的单元,我们称之为a(2) 1[图中红色网络],然后我们再把第二个网络复制过来。

看到这里,我们知道我们还需要一个逻辑或运算得到我们最终的结果,于是我们在输出层使用表达逻辑或的小网络。这样,我们就可以得到异或非的逻辑运算了。

通过观察这个网络,我们可以得到更加通用的理解,那就是,在输入层中,我们只有原始输入值,然后我们建立一个隐藏层,用来计算稍微复杂一些的 关于输入数据的函数,比如我们这里的a(2) 1,a(2) 2等。然后,通过添加另一个层,我们得到了更复杂一点的函数。

这就是关于神经网络可以计算较复杂函数的一种直观理解。

我们知道,当层数很多的时候,我们有一个相对简单的关于输入数据的函数作为第二层,而第三层可以建立在此基础上,并计算更加复杂一些的函数,然后再下一层,又可以计算再复杂一些的函数。

在这里,我们展示一个通过运用更深的层数来计算更加复杂函数的例子。

它来自于纽约大学的燕乐昆教授。这个动态图片,实际上是他使用神经网络算法进行的手写数字的识别。左下方是输入,我们可以看到是一个个的手写数字,上方则是神经网络判断出来的预测分类,其实也就是数字。而左侧是展现了隐层网络权值可视化的效果。这个可视化效果表现出来的是,通过第一个隐藏层,可视化结果显示的是探测出不同的边缘和边线。而下一个隐藏层的可视化结果,似乎很难看出是什么。如果我们想弄明白网络到底在进行怎样的运算,还是比较困难的。但是不管怎样,最终这些学习后的特征量将被送到最后一层,也就是输出层,并且在最后作为结果显示出来,最终预测得到结果。

Multiclass Classification

多分类

现在让我们看看如何用神经网络做多分类。手写数字的识别就是一个多分类问题。因为识别的数字是从0-9,一共10个类别。所以,大家刚才在看动图的时候就已经想问,究竟应该怎样处理这个问题。

让我们来看个例子,在这个例子中,我们的目标不像前面那样只要识别汽车。这里,我们要处理的是四个类别的分类问题。给定一副图片,我们需要确定图上是什么,是行人,汽车,摩托车还是卡车。对于这样的问题,我们的做法是,建立一个具有四个输出单元的神经网络,也就是说,这样的神经网络的输出是一个四维向量。

所以,现在的输出,需要使用一个向量来表示。这个向量中有四个元素,而我们要做的是,对第一个输出元素进行分辨,图上是不是汽车,然后对第二个元素,分辨它是不是摩托车,同样地,第三个元素是不是卡车,第四个元素是不是行人。因此,当图片上是汽车时,我们希望这个神经网络输出1 0 0 0,当图片是摩托车时,希望输出是0 1 0 0,当图片是卡车时,希望输出是0 0 1 0,以此类推。

所以,这和我们学习逻辑回归时 讨论过得一对多的方法,其实是一样的。只不过现在我们有四个逻辑回归的分类器,而我们需要对四个分类器中的每一个都分别进行识别分类。

我们重新整理一下,这是我们的神经网络结构,有四个输出单元,这是针对不同的图片,我们hx的表达式,此时,我们需要用如下的方法来表示训练集,在这个例子中,当我们要表征一个这些类别的时候,我们不使用1 2 3 4来表示y,而是用以下的方法来代表y,那就是

Y(i)表示1 0 0 0或者0 1 0 0,或者0 0 1 0,以及0 0 0 1. 

我们的训练目标是,让我们的神经网络的输出尽量等于相对应的标注向量y。

所以,这就是我们如何使用神经网络进行多分类的方法。

到这里,我们就介绍完了神经网络的基础。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值