【MindSpore:跟着小Mi一起机器学习吧!】神经网络表述(一)
好久不见,甚是想念!今天小Mi继续带大家学习我们的机器学习系列。相信神经网络这个名词大家都不会陌生,神经网络实际上是一个相对比较古老的算法,沉寂了很长一段时间,不过现在随着硬件计算能力的提升,它又成为许多机器学习问题解决的首要方法。
好了,到这相信大家不由地会问了,既然已经有线性回归、逻辑回归算法了,那么为什么还要研究神经网络这个学习算法呢?为了进一步阐述研究神经网络的目的,小Mi决定带大家先了解几个机器学习问题的例子。
1 非线性假设
假设有一个监督学习分类问题,训练集如上图所示,如果利用logistic回归来解决这个问题,我们可以构造一个包含很多非线性项的logistic回归函数,上述的g仍是sigmoid函数,其中可以包含很多像这样的多项式,当多项式项数足够多时,那么可能就能得到可以分开正样本和负样本的假设。当只有两个特征,比如时,这种方法确实会得到不错的结果。因为我们可以把的所有组合都包含到多项式中。但是,显然许多有趣的机器学习问题的特征远不止两项。例如之前已经讨论过房价预测的问题,假设一个房子有很多特征,想要预测房子在未来半年内能被卖出去的概率,这是一个关于住房的分类问题,而不是回归问题。对于不同的房子有可能就有上百个特征,对于这类问题,如果要包含所有的二次项,即使只包含二次多项式,最终也会有很多项。
好了,既然是这样,那么假使我们只考虑二次项,也就是说,两个项的乘积,那么在n=100的情况下,最终也会有5000个特征,而且渐渐地,二次项的个数大约以的量级增长,其中,n是原始特征的个数,即这些项,事实上二次项的个数大约是,因此要包含所有的二次项似乎并不是一个好方法,而且由于项数过多,最后的结果很有可能是过拟合的。此外,在处理这么多项时,也存在运算量过大的问题,当然,你也可以试试只包含上面这些二次项的子集。例如,我们只考虑这些项,这样就可以将二次项的数量大幅度减少,减少到只有100个二次项,但是由于忽略了太多相关项,在处理类似上图的数据集时,不可能得到理想的结果。实际上,如果只包含这一百个二次项,就不能够拟合出一些特别的假设,比如可能拟合出一个椭圆状的曲线,但是肯定不能拟合出上图中这样复杂的分界线,所以5000个二次项看起来已经很多了,如果现在假设,包括三次项,例如等等,事实上,三次向的个数是的量级,当n=100时,可以计算出来,最后能得到大概17000个三次项。所以,当初始特征个数n很大时,将这些高阶多项式包括到特征里,会使特征空间急剧膨胀,当特征个数n很大时,增加特征来建立非线性分类器并不是一个好做法。对于许多实际的机器学习问题,特征数n是很大的。我们可以看看示例:
关于计算机视觉中的一个问题,假设我们想要使用机器学习算法来训练一个分类器检测图像,判断图像是否为一辆汽车,很多人可能会好奇,为什么计算机视觉很难,当我们自己看这幅图像时,这是什么。一目了然。你肯定会好奇,为什么学习算法竟可能会不知道图像是什么。为了解答这个疑问,取出这幅图像中的一小部分,将其放大,比如图上,这个红色方框内的部分,当人眼看到一辆汽车时,计算机实际上看到的却一个数据矩阵,或者说表示像素强度值的网络,告诉我们图像中,每个像素的亮度值,因此计算机视觉问题就是,根据这个像素点亮度矩阵,来告诉我们这些数值代表一个汽车门把手。
具体而言,当我们用机器学习算法构造一个汽车识别器时,我们要做的就是提供一个带有标签的样本集,其中一些样本是各类汽车,另一部分样本不是车,将这个样本集输入给学习算法来训练出一个分类器。然后我们就进行测试,输入一副新的图片,让分类器判断这是什么东西。理想情况下,分类器能识别出这是一辆汽车。为了理解引入非线性假设的必要性,我们从学习算法的训练样本中,找出一些汽车图片和一些非汽车图片,从图片中选择一组像素点位,一个是像素点1的位置,还有一个是像素点2的位置,在坐标系中,标出这副汽车的位置,车的位置取决于像素点1和像素点2的强度,让我们用同样的方式处理其他图片。观察这两个相同的像素位置,这幅图片中像素1有一个像素强度,像素2也有一个不同的像素强度,所以在这幅图处于另一个位置,我们继续画上两个非汽车样本,这两个不是汽车,接着又继续在坐标系中画上更多的新样本,用“+”表示汽车图片,“-”表示非汽车图片,我们将发现汽车样本和非汽车样本分布在坐标系中的不同区域。因此,我们现在需要一个非线性假设来尽量分开这两类样本,这里的特征空间的维数是多少?假设我们用50*50像素的图片,图片已经很小了,长款只各有50个像素,但这依然是2500个像素点。因此,特征向量的元素数量n=2500。特征向量x就是包含了所有像素强度的列表,包括像素点1的亮度,像素点2的亮度等等,直到最后一个像素点的亮度。来对典型的计算机图片表示方法,如果存储的是每个像素点的灰度值,那么每个元素的值应该在0-255之间,因此,这个问题中n=2500,但是这只是使用灰度图片的情况,如果我们用的是RGB彩**像,每个像素点包含红、绿、蓝三个值,那么n=7500。因此,如果我们要通过包好所有的二次项特征来学习得到非线性假设,那么这就是式子中的所有条件,由于有2500像素,总共就有约300万个特征,这个数字就大得有点离谱了。对于每个样本都要找到并表示所有这300万个特征,这样的计算成本太高了。因此,只是包括平方项或者立方像特征,简单的logistic回归算法,并不是一个在n很大时,学习复杂的非线性假设的好办法,因为特征过多。后面将讲解神经网络在学习复杂的非线性假设上被证明是一种好得多的算法,即使输入特征空间,或者n很大,也能轻松搞定。
2 神经元和大脑
神经网络是一种很古老的算法,它最初产生的目的是制造能模拟大脑的机器,它能很好地解决不同的机器学习问题,而不只因为它们在逻辑上行得通,不管是将其应用到现代的机器学习问题上,还是应用到那些你可能会感兴趣的问题中。从某种意义上说如果我们想要建立学习系统,那为什么不去模仿我们所认识的最神奇的学习机器——人类的大脑呢?
神经网络逐渐兴起于二十世纪八九十年代,应用得非常广泛。但由于各种原因,在90年代的后期应用减少了。但是最近,神经网络又东山再起了。其中一个原因是:神经网络是计算量有些偏大的算法。然而大概由于近些年计算机的运行速度变快,才足以真正运行起大规模的神经网络。当你想模拟大脑时,是指想制造出与人类大脑作用效果相同的机器。大脑可以学会去以看而不是听的方式处理图像,学会处理我们的触觉。
我们能学习数学,学着做微积分,而且大脑能处理各种不同的令人惊奇的事情。似乎如果你想要模仿它,你得写很多不同的软件来模拟所有这些五花八门的奇妙的事情。不过能不能假设大脑做所有这些,不同事情的方法,不需要用上千个不同的程序去实现。相反的,大脑处理的方法,只需要一个单一的学习算法就可以了?
大脑的这一小片红**域是你的听觉皮层,你现在正在理解我的话,这靠的是耳朵。耳朵接收到声音信号,并把声音信号传递给你的听觉皮层,正因如此,你才能明白我的话。
神经系统科学家做了下面这个有趣的实验,把耳朵到听觉皮层的神经切断。在这种情况下,将其重新接到一个动物的大脑上,这样从眼睛到视神经的信号最终将传到听觉皮层。如果这样做了。那么结果表明听觉皮层将会学会“看”。这里的“看”代表了我们所知道的每层含义。所以,如果你对动物这样做,那么动物就可以完成视觉辨别任务,它们可以看图像,并根据图像做出适当的决定。它们正是通过脑组织中的这个部分完成的。下面再举另一个例子,这块红色的脑组织是你的躯体感觉皮层,这是你用来处理触觉的,如果你做一个和刚才类似的重接实验,那么躯体感觉皮层也能学会“看”。这个实验和其它一些类似的实验,被称为神经重接实验,从这个意义上说,如果**有同一块脑组织可以处理光、声或触觉信号,那么也许存在一种学习算法,可以同时处理视觉、听觉和触觉,而不是需要运行上千个不同的程序,或者上千个不同的算法来做这些大脑所完成的成千上万的美好事情。也许我们需要做的就是找出一些近似的或实际的大脑学习算法,然后实现它大脑通过自学掌握如何处理这些不同类型的数据。在很大的程度上,可以猜想如果我们把几乎任何一种传感器接入到大脑的几乎任何一个部位的话,大脑就会学会处理它。
下面再举几个例子:
这张图是用舌头学会“看”的一个例子。它的原理是:这实际上是一个名为BrainPort的系统,它现在正在FDA (美国食品和药物管理局)的临床试验阶段,它能帮助失明人士看见事物。它的原理是,你在前额上带一个灰度摄像头,面朝前,它就能获取你面前事物的低分辨率的灰度图像。你连一根线到舌头上安装的电极阵列上,那么每个像素都被映射到你舌头的某个位置上,可能电压值高的点对应一个暗像素电压值低的点。对应于亮像素,即使依靠它现在的功能,使用这种系统就能让你我在几十分钟里就学会用我们的舌头“看”东西。
这是第二个例子,关于**回声定位或者说**声纳。你有两种方法可以实现:你可以弹响指,或者咂舌头。不过现在有失明人士,确实在学校里接受这样的培训,并学会解读从环境反弹回来的声波模式—这就是声纳。如果你搜索一下,就会发现有些视频讲述了一个令人称奇的孩子,他因为癌症眼球惨遭移除,虽然失去了眼球,但是通过打响指,他可以四处走动而不撞到任何东西,他能滑滑板,他可以将篮球投入篮框中。注意这是一个没有眼球的孩子。
第三个例子是触觉皮带,如果你把它戴在腰上,蜂鸣器会响,而且总是朝向北时发出嗡嗡声。它可以使人拥有方向感,用类似于鸟类感知方向的方式。
还有一些离奇的例子:
如果你在青蛙身上插入第三只眼,青蛙也能学会使用那只眼睛。因此,这将会非常令人惊奇。如果你能把几乎任何传感器接入到大脑中,大脑的学习算法就能找出学习数据的方法,并处理这些数据。从某种意义上来说,如果我们能找出大脑的学习算法,然后在计算机上执行大脑学习算法或与之相似的算法,也许这将是我们向人工智能迈进做出的最好的尝试。人工智能的梦想就是:有一天能制造出真正的智能机器。
神经网络可能为我们打开一扇进入遥远的人工智能梦的窗户,对于现代机器学习应用。它是最有效的技术方法。因此接下来,我们将开始深入到神经网络的技术细节中。
3 模型表示1
为了构建神经网络模型,我们需要首先思考大脑中的神经网络是怎样的?每一个神经元都可以被认为是一个处理单元/神经核(processing unit/Nucleus),它含有许多输入/树突(input/Dendrite),并且有一个输出/轴突(output/Axon)。神经网络是大量神经元相互链接并通过电脉冲来交流的一个网络。
下面是一组神经元的示意图,神经元利用微弱的电流进行沟通。这些弱电流也称作动作电位,其实就是一些微弱的电流。所以如果神经元想要传递一个消息,它就会就通过它的轴突,发送一段微弱电流给其他神经元,这就是轴突。
这里是一条连接到输入神经,或者连接另一个神经元树突的神经,接下来这个神经元接收这条消息,做一些计算,它有可能会反过来将在轴突上的自己的消息传给其他神经元。这就是所有人类思考的模型:我们的神经元把自己的收到的消息进行计算,并向其他神经元传递消息。这也是我们的感觉和肌肉运转的原理。如果你想活动一块肌肉,就会触发一个神经元给你的肌肉发送脉冲,并引起你的肌肉收缩。如果一些感官:比如说眼睛想要给大脑传递一个消息,那么它就像这样发送电脉冲给大脑的。
神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型。这些神经元(也叫激活单元,activation unit)采纳一些特征作为输出,并且根据本身的模型提供一个输出。下图是一个以逻辑回归模型作为自身学习模型的神经元示例,在神经网络中,参数又可被成为权重(weight)。
我们设计出了类似于神经元的神经网络,效果如下:
其中是输入单元(input units),我们将原始数据输入给它们。 是中间单元,它们负责将数据进行处理,然后呈递到下一层。 最后是输出单元,它负责计算。
神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。下图为一个3层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏差单位(bias unit):
下面引入一些标记法来帮助描述模型:代表第层的第个激活单元。代表从第层映射到第层时的权重的矩阵,例如代表从第一层映射到第二层的权重的矩阵。其尺寸为:以第层的激活单元数量为行数,以第层的激活单元数加一为列数的矩阵。例如:上图所示的神经网络中的尺寸为 3*4。
对于上图所示的模型,激活单元和输出分别表达为:
上面进行的讨论中只是将特征矩阵中的一行(一个训练实例)喂给了神经网络,我们需要将整个训练集都喂给我们的神经网络算法来学习模型。
我们可以知道:每一个a都是由上一层所有的x和每一个x所对应的决定的。(我们把这样从左到右的算法称为前向传播算法( FORWARD-PROPAGATION ))
把分别用矩阵表示:
我们可以得到。
4 模型表示2
( FORWARD PROPAGATION ) 相对于使用循环来编码,利用向量化的方法会使得计算更为简便。以上面的神经网络为例,试着计算第二层的值:
令,则,计算后添加。 计算输出的值为:
令,则。 这只是针对训练集中一个训练实例所进行的计算。如果我们要对整个训练集进行计算,我们需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列里。即:
为了更好了了解Neuron Networks的工作原理,我们先把左半部分遮住:
右半部分其实就是以, 按照Logistic Regression的方式输出:
其实神经网络就像是logistic regression,只不过我们把logistic regression中的输入向量变成了中间层的, 即: 。 我们可以把看成更为高级的特征值,也就是的进化体,并且它们是由与决定的,因为是梯度下降的,所以a是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将次方厉害,也能更好的预测新数据。这就是神经网络相比于逻辑回归和线性回归的优势。
好啦,今天关于神经网络的简单介绍就到这里啦,下期小Mi将会带着大家进一步地进行一个更为直观的理解。我们下期再见呦~(挥手十分钟!)