吴恩达《机器学习》学习笔记九——神经网络相关(1)
- 一、 非线性假设的问题
- 二、 神经网络相关知识
- 1.神经网络的大致历史
- 2.神经网络的表示
- 3.前向传播:向量化表示
- 三、 例子与直觉理解
- 1.问题描述:异或XOR、同或XNOR
- 2.单个神经元如何计算逻辑函数:以AND、OR为例
- 3.多层神经网络计算复杂函数
- 四、 神经网络实现多分类
课程链接:https://www.bilibili.com/video/BV164411b7dx?from=search&seid=5329376196520099118
前面的几次笔记,较详细地学习了机器学习里有监督学习的两个最具代表性的模型,分别是解决回归问题的线性回归以及解决分类问题的逻辑回归。这两个模型最初的形态都是线性的,但是由于问题的复杂性,它们又可以推广到非线性的形态,即多一些高次幂项特征。这次笔记就由此非线性假设函数引入,学习神经网络的相关知识。如今人工智能能够得到如此的发展,神经网络可以说是功不可没。
一、 非线性假设的问题
首先课程中提出的问题是,既然已经有了线性回归和逻辑回归来分别解决回归和分类问题,即使是较为复杂的问题,也可以推广假设函数到非线性形式来解决,那么为什么还要学习神经网络呢?
那么我们就来看一看非线性假设存在的问题:
如上图所示,是一个非线性的分类问题,数据样本有两个特征x1和x2,那么要分类这样的数据集,假设函数就需要设置成如图中所示,以此来达到非线性决策边界的目标。这样做唯一的代价就是通过特征映射将原来两个特征变成了多项非线性特征,看起来没有太大问题。
我们可以回顾一下笔记七中特征映射的代码,最高次幂设置成了6次,特征的数量从原来的2个变成了28个,当时的计算量看似也不大,也能得到较好的结果。
但是问题就在于,很多情况,特征的数量远远不止2个,上百上千上万甚至百万的都很常见,如果都通过这样特征映射将线性变成非线性假设去解决非线性问题,那么特征映射后的特征数量将飞速变大。
举一个有100个特征的例子:
它的一次幂特征项是100个,而二次幂特征项就已经有5000个:
再看三次幂项,有170000个:
就不往更高次幂算了,只会更加庞大,而很多问题需要用到高次幂的项。
所以,当初始特征数量很大时,将其映射到高阶特征项,特征空间将会急剧膨胀,可能会带来严重的过拟合问题,以及沉重的计算和存储负担。所以用这种特征映射的方法来建立非线性模型,并不是一种好方法。
课程中还提供了CV领域图像分类的一个例子:
假设一张图像数据包含2500个特征(每个像素算一个),用逻辑回归的这种非线性假设的方法,仅仅算二次幂的特征数量都已经有三百万个,而50*50的图像已经算是很小的图片,所以这种方法过于简单粗暴,特征数一大,就会非常吃力。
而神经网络很好的克服了这个问题,即使初始特征空间庞大,也能很好的求解。
二、 神经网络相关知识
1.神经网络的大致历史
神经网络起初是一种模仿人脑运行机制的算法。曾在80年代以及90年代早期比较流行,但是因为一些原因,在90年代末又沉寂了下去。而近些年,神经网络在各大领域上的应用,又使得它流行起来,主要是因为计算性能的飞速发展,使得计算机可以支持神经网络计算的庞大数据量。目前,许多领域最新技术都会应用到神经网络的知识。
2.神经网络的表示
人脑的自然神经网络的运行原理,如下图所示:
如图所示为一个神经元结构,主要包括三个部分:
树突:信号的输入部分,其他神经元的信号经过树突来接收;
细胞体:许多外来信号经过树突传入后由细胞体处理,并产生一个输出信号,即反应;
轴突:信号的输出端。神经元可以看成是一个计算单元,对众多外来信号进行处理后,产生一个输出。
而机器学习中的神经网络模型是指人工神经网络,就是模仿自然神经网络构造了功能相似的计算单元,如下图所示:
x1,x2,x3分别是计算单元的输入,黄色的圆圈是计算中心,h(x)是输出的计算结果。这边具体输出什么形式的函数被称之为激活函数,此处激活函数是sigmoid函数的形式。以sigmoid函数这个例子为例,黄色圆圈首先计算的是z =θ ^ T x,然后用sigmoid激活函数进行的计算是g(z) = 1/(1 + e^(-z)),最后的输出也就是g(z)。黄色圆圈包含了计算z和g(z)的两部分,其中的计算涉及到一些参数,那么优化神经网络模型的过程,就是优化这些参数的过程,这些参数也叫权重(weights)。
以上是单个的神经元,那么与人脑类似,多个神经元可以组合成神经网络,其结构如下图所示:
第一列被称为输入层,它都是输入的数据,最后一层被称为输出层,而中间的被称为隐藏层,不论是一层还是多层,统称为隐藏层。隐藏层中包含了要优化的参数。
我们看一下它具体是怎么工作的,如下图所示:
首先定义a_i ^ (j)是第 j 层第 i 个计算单元的激活器;θ ^ (j)是从第 j 层映射到第 j+1 层的权重矩阵,如果第 j 层有 s_j 个计算单元,第 j+1 层有 s_(j+1) 个计算单元,那么θ^(j)的维度是 s_(j+1) × (s_j+1) 。这边的1是指偏置项x0。
然后看图中的一些计算过程,每一层都要按照激活函数来计算结果,直到计算到最后一层的输出,如果层数较多,那么也要一层层的嵌套计算下去。
3.前向传播:向量化表示
为了实现向量化表示,将第一个式子里的
表示为z_1 ^ (2),与此相似,第二、三个式子里的部分也分别表示为z_2 ^ (2) 、z_3 ^ (2)。而且,我们将输入x与参数进行向量化:
那么,z ^ (2) 、a ^ (2)都将进行向量化,这里z ^ (2) 、a ^ (2)都是三维向量:
这边的x向量也可以看作是a ^ (1)向量,以上是输入层到隐藏层的计算过程,下面再看一下由隐藏层推到输出层的计算,其实与之前的计算非常类似:
上面的这种由输入层一层层往输出层计算输出的过程,称之为前向传播,从向量化的形式来看,是一次次嵌套计算的过程。
这种前向传播的方法,也可以帮助我们了解神经网络的作用,以及它为什么能够学习非线性假设函数。将上面提到的神经网络的输入层遮住,如下图所示:
剩下的结构其实就是一个逻辑回归的模型,假设函数如图中所示,只是逻辑回归单元得到的输入不是真正数据的输入,而是隐藏层的计算结果,而这些隐藏层的计算结果,是通过前面层学习得到的函数输入值,具体来讲,就是它们是从第一层映射到第二层的函数中学习到的结果,这个函数由前面的参数θ^((1))决定。
总结一下,神经网络中没有直接使用输入x来训练逻辑回归,而是自己先训练逻辑回归的输入a,这个过程中因为θ^(1)选择的不同参数,有时可以学习到一些复杂、有趣的特征,这样就可以得到一个更好的假设函数,比直接使用原始输入数据得到的假设函数更好。
再看一个层数更多的例子,第二层先学习了一些原始数据的特征,第三层再学习第二层的特征,第四层则可以根据前两层抽象过的特征进行拟合,得到的假设函数更加复杂。第一层还叫输入层,最后一层还叫输出层,中间层都叫隐藏层。
三、 例子与直觉理解
通过一个例子来详细地介绍神经网络是如何计算复杂非线性函数的输入的,帮助理解为什么神经网络可以用来学习复杂的非线性假设模型。
1.问题描述:异或XOR、同或XNOR
下面是一个非线性的分类例子:同或,这个问题的数据分布如下图所示,特征x1和x2都只能取0/1,当x1和x2同为0或同为1时类别为1,反之为0,这个问题不能用线性的模型来解决,需要非线性的决策边界来划分,也就是需要非线性的假设函数。
2.单个神经元如何计算逻辑函数:以AND、OR为例
输入特征x1和x2的取值只能是0/1,寻找一个假设函数,使得经过神经元后的预测结果和真值表的结果匹配。图中给定了模型的结构,单个神经元其实也可以看作是逻辑回归,参数如图中所示为-30,20,20,则假设函数或者说神经元的输出为h(x)=g(-30+20x_1+20x_2)。将x1和x2的可能取值组合一一代入,得到预测结果为0,0,0,1,与真值表的结果完全符合。
下面看另一个线性的例子:
OR的计算原理和过程类似上面的AND模型,不再赘述。
从这两个例子可以看到,神经网络中的单个神经元是如何用来计算逻辑函数的,比如上面的AND和OR。下面将介绍,一个拥有多层神经元的神经网络是如何被用来计算更复杂的函数的比如XOR或XNOR。
3.多层神经网络计算复杂函数
首先有三个单个神经元的模型,如下图所示:
它们分别能解决三个不同的逻辑计算。
为了能解决更复杂的问题,将它们组合到一起,变成一个三层的神经网络,如下图所示:
红色、蓝色和绿色的神经元分别对应上面的三个功能,看右边的真值表变化,这样组合的一个三层神经网络就完成了非线性的同或XNOR问题。
还能这样理解,输入都放在输入层,然后在中间放一个隐藏层,用来计算一些关于输入的略微复杂的功能,然后再增加一层,用于计算一个更复杂的非线性函数。这就是为什么神经网络可以计算这种复杂的函数。
在一层层往后计算的过程中,能够计算的函数也会越来越复杂。
四、 神经网络实现多分类
多输出单元:一对多:
这是一个图片分类的例子,需要将图片分成行人、汽车、摩托车和货车四类。相应地,建立了一个具有四个输出单元的神经网络,所以输出是一个四维向量,这四个神经元的作用分别为,判断图中是否为行人、图中是否为汽车、图中是否为摩托车、图中是否为货车。如果为行人,输出向量为[1 0 0 0],如果为汽车,则为[0 1 0 0],以此类推。只是这里数据集中的标签y也要表示成一个四维向量才能与预测结果h(x)匹配。