Learn R  |  机器学习中的人工神经网络(一)

Learn R | 机器学习中的人工神经网络(一)

前言

如果对机器学习有所了解的话,相信“深度学习”这个词对你来讲应该并不陌生,作为ML领域内最为火热的研究方向,无论是在理论前沿的发展上还是在现实场景中的应用上,深度学习理论都有着非常可观的前景。而我们今天所要学习的人工神经网络系列,正是深度学习的重要基础内容之一。

提及神经网络,很多人会自然而然的想到生物学上的神经元与神经网络知识,这样的想法虽然不是完全契合,但也是有一定的道理的,因为机器学习中的这一类算法正是受到对生物神经元研究的启发。一般认为,神经网络的高维非线性模型会倾向于给出较高精准的分类预测情况,我们的人脑拥有大致10^{11}个相互连接的神经元,这些神经元之间相互连接,使人脑成为一个高度复杂的非线性并行处理系统,从而具有联系、推理和判断决策等能力。

人工神经网络(Artificial Neural Network ANN)就是一种模拟人脑思维的抽象算法。在模式识别、优化计算等人工智能领域,神经网络已经有着不俗的表现。接下来我们所要学习的,是将神经网络应用在数据挖掘中的分类与预测问题中。



一、不同类型的神经网络概述

神经网络的种类繁多,我们可以从以下两个角度进行具体的类型划分。

1. 拓扑结构划分

根据网络的层次数,神经网络可分为两层神经网络和多层神经网络,神经网络的底层称为输入层,顶层称为输出层,中间层为隐层。两层与多层的区别就在隐层上:两层神经网络是没有隐层的,而多层神经网络则相反(有一层隐层则称为三层神经网络,以此类推),并且神经网络的层数与每一层处理单元的数量,决定着我们所构建的神经网络模型的复杂度。


一个简单的三层神经网络如下图所示(图片来源

在神经网络中,处理单元通常按层次分布于神经网络的输入层、隐层和输出层中,因此分别称之为输入节点、隐节点和输出节点,各自的功能如下所示:

  • 输入节点:接受与处理训练数据集中的各输入变量值
  • 隐节点:实现非线性数据的线性变换
  • 输出节点:给出输出变量的分类或预测结果

2. 连接方式划分

神经网络的连接包括层间连接与层内连接,连接的强度大小使用权重进行表示。这里我们着重介绍下基于层间连接方式的神经网络划分:

  • 前馈式神经网络:其节点类型是单向的,上层节点的输出就是下层节点的输入,后面所要学习的B-P(Back-Propagation)反向传播网络就是非常典型的前馈式神经网络
  • 反馈式神经网络:在前馈式神经网络的单向连接基础上,输出节点的输出又可作为输入节点的输入,具体包括离散型(DHNN)和连续型(CHNN)反馈神经网络等

除此之外还有层内连接方式,它是指神经网络同层节点之间进行连接,SOM网络就是其中的典型(由于这一块知识目前不是我们学习的重点,所以暂且不做过多的解释)



二、神经网络的核心处理器——节点

在对神经网络有一个大概的认识后,本节我们通过“节点”来对神经网络的基本原理与运行机制进行深入的掌握。

在上图中,输入层有x_1x_4四个节点,隐层有H_1,H_2两个节点,输出层仅有y一个节点,节点与节点之间有着各自对应的连接权重,经过层层递进,得到最终的输出结果。

正如标题所言,在这整个过程中,节点是神经网络的核心处理器,将它放大来看的话,一个完整的节点由加法器与激活函数组成,这两个部件的配合运用使节点完成相应的计算任务。

1. 加法器

加法器非常好理解,假设节点接受的输入用向量X=(x_1,x_2,...,x_n)表示,节点输出的结果用y表示,节点与上层连接的连接权重用W=(w_{11},w_{12},...,w_{1n})表示,且节点的偏差用\theta 表示。那么在第j个节点上的加法器U_j则定义为:U_j=\sum_{i=1}^{n}{w_{ij}x_i+\theta_j}

在这个公式中,n表示上层节点的个数,x_i为上层第i节点的输出(由于上一层每一个节点的输出都可以作为这一层节点的输入,所以输入节点数为n个),w_{ij}为输入输出层之间的连接权重(ij分别对应两层的序号)。

从上述定义中我们可以得知,加法器的作用就是对输入层输入的数据进行线性组合,其关键就在于线性组合系数w_{ij}的确定。

2. 激活函数

在节点中,激活器被定义为y_j=f(U_j),这里的y_j就是激活函数值,也是节点j的输出。在神经网络中,激活函数的具体形式通常为以下两种:

  • [0,1]阶跃函数:f(U_j)=\left\{\begin{matrix} 1~~U_j>0\\ 0~~U_j<0 \end{matrix}\right.
  • (0,1)型Sigmoid函数:f(U_j)=\frac{1}{1+e^{-U_j}}

如下图所示(图片来源:机器学习 (豆瓣)):

由此可见,激活函数的作用就是将之前加法器输出的函数值进行相应转换,或转为(0,1)型,或映射到(0,1)取值范围内。对于分类问题而言,上述两种激活函数都可使用;但要是回归问题的话,Sigmoid函数是唯一的选择。

最后用一个简单的例子来阐述加法器与激活函数的综合运用,观察下图:

假设在这个神经网络节点中,偏差均为0,激活函数采用(0,1)Sigmoid函数,那么就有以下计算过程:

  • 节点1:U_1=1\times 0.2+0.5\times 0.5=0.45y_1=f(0.45)=\frac{1}{1+e^{-0.45}} =0.61
  • 节点2:U_2=1\times -0.6+0.5\times -1.0=-1.1y_2=f(-1.1)=0.25
  • 节点3:U_3=0.61\times 1.0+0.25\times -0.5=0.735y_3=f(0.735)=0.68

这样,我们就得到了最终的输出值,虽然看起来神经网络的计算比较简单,但随着处理单元个数和层数的增多,那么相应的计算工作量也将剧增。所以,从这个角度来看,神经网络的处理难度、运行效率如何,和数据本身的复杂程度有着很大的关系。


未完待续



References:

  1. R语言数据挖掘(豆瓣)
  2. 机器学习 (豆瓣)
  3. 零基础入门深度学习 - 神经网络和反向传播算法
  4. 神经网络浅讲:从神经元到深度学习
发布于 2017-04-13 13:46