近几年兴起的深度学习技术本质上也是一种机器学习方法,简单来说就是一系列可以训练多层神经网络(multilayered neural network)的算法。人工神经网络(Artificial Neural Network, ANN)早在上世纪四五十年代就已经出现了,随着理论和计算能力的不断提高,ANN在席卷全球的人工智能和深度学习的浪潮下重新焕发青春。今天我们就来学习ANN的基础知识,为日后训练多层神经网络做准备。
生物神经元(Biological Neuron)
人工神经网络实际上是对人类大脑中的神经网络的一种抽象。我们的大脑由无数个神经细胞构成。每个神经细胞主要可以分为3个部分:树突(dendrite),细胞体(soma)和轴突(axon)。
树突的作用是从外界环境或者其他神经细胞接收刺激,细胞体负责处理从树突接受到的信息并将信息通过轴突传递给其他神经细胞。神经细胞之间通过突触(synapse)联系起来。
人工神经元(Artificial Neuron)
人脑中的信息处理单元是神经细胞,而人工神经网络的计算单元就是人工神经元。
一个人工神经元由7个基本单元组成:
- 来自其他神经元的输入信号(x1, x2, ..., xn)
- 每一个输入信号都有一个与之对应的突触权重(w1, w2, ..., wn),权重(weight)的高低反映了输入信号对神经元的重要性
- 线性聚合器(∑)将经过加权的输入信号相加,生成一个"激活电压"(activation voltage)
- 激活阈值(activation threshold)或bias(θ)给神经元的输出设置一个阈值
- 激活电位(activation potential,u)是线性聚合器和激活阈值之差,如果u≥0,神经元产生的就是兴奋信号,如果u<0,神经元产生的是抑制信号
- 激活函数(activation function,g)将神经元的输出限制在一个合理的范围内
-
神经元产生的输出信号(y),可以传递给与之相连的其他神经元
用公式表示:
综上所述,人工神经元的计算可以分成如下几个步骤:
- 将神经元的每一个输入和与之对应的突触权重相乘
- 对加权后的输入求和,然后减去激活阈值
- 使用合适的激活函数来将神经元的输出限制在一定范围内
- 将神经元的输出传递给与之相连的神经元
我们可以把多个神经元链接在一起构成一个人工神经网络,比如下面这个由4个input neuron,3个hidden neuron和1个output neuron组成的简单的神经网络:
神经网络中的神经元不是杂乱无章地组合在一起,通常情况下,神经元会按层(layer)排列。在上面的网络中,input处于第一层,N1和N2是第二层,N3是第三层,最后一层是output。我们所说的“深度”,实际上就是神经网络的层数。层数越多,神经网络越深也越复杂。我们通常把input和output之间的层叫做hidden layer。
下面再来看一个稍微复杂点的网络:
从这个例子中我们可以看到以下几点:
- 每一层中的neuron和它上一层中的所有neuron都有连接。例如hidden layer中的N1和N2和input layer中的4个input neuron都有连接。我们称这样的网络为全连接神经网络(fully connected neural network)
- 同一层中的neuron之间没有连接
- 连接是有方向的,从input到output,网络中没有环。我们称这样的网络为前馈神经网络(feedforward neural network)。有环的神经网络也称为循环神经网络(RNN,Recurrent Neural Networks)
人工神经元通常可以分为以下几类:
- 输入(input)和输出(output)神经元
输入神经元从程序中获取数据,输出神经元将神经网络的计算结果返回给程序。程序通常会将一个array作为input传递给神经网络,array中元素的个数和输入层中的神经元数目一致。程序获得的output也是一个array,array中元素的个数和输出层中神经元的数目一致。输入神经元没有激活函数。 - 隐藏(hidden)神经元
input和output神经元负责对外联系,位于它们中间的神经元只能从网络中的其他neuron获取输入并输出给其他neuron。由于它们“与世隔绝”,因此称为隐藏神经元。 -
偏置(bias)神经元
Bias神经元可以位于输入层和隐藏层,但是它不从上一层的neuron中获取input,bias神经元的输出值通常设置为1。
-
Context 神经元
Context 神经元常用在循环神经网络中,用来处理时间序列(Time Series)问题。
激活函数(Activation Functions)
激活函数的作用是给神经元的输出建立一个边界。一个神经网络可以有多个不同的激活函数,选择合适的激活函数对构建神经网络是非常重要的。下面列举几个常用的激活函数。
线性激活函数(Linear Activation Function)
最简单的激活函数就是线性函数,即神经元的输入和输出相等。
当神经网络的输出是数值(比如回归问题)的时候,它的输出层通常使用的是线性激活函数。
Softmax 激活函数(Softmax Activation Function)
Softmax 激活函数通常用在处理分类问题(classification)的神经网络的输出层。Softmax的作用是让神经网络输出每个类别(class)的概率,而不仅仅是一个简单的数值。由于是概率值,它们的和一定是100%
Softmax函数的公式:
i表示的是输出神经元的index,j表示的是属于某个group/class的输出神经元的index。z表示的是输出神经元输出的array。Softmax与其他激活函数不同的地方在于它的输出依赖于其他神经元的输出(z)。
比如,我们的神经网络处理的分类问题包含了3个类别(A,B,C),它的3个输出神经元分别对应这3个类别,它的输出是一个包含了3个元素的array:[0.9, 0.2, 0.4],由于第一个数字最大,我们认为分类结果应该是A。如果我们使用softmax函数就可以把它们转换成概率值:
sum = exp(0.9) + exp(0.2) + exp(0.4) = 5.17283056695839
j0 = exp(0.9) / sum = 0.47548495534876745
j1 = exp(0.2) / sum = 0.2361188410001125
j2 = exp(0.4) / sum = 0.28839620365112
Step激活函数(Step Activation Function)
Step函数也被称为阈值(threshold)函数,它的输出值只有0或1。当输入值大于某个阈值(比如0.5)的时候,输出值为1,小于阈值的时候就输出0。
Sigmoid激活函数
Sigmoid激活函数也称为logistic激活函数,它的输出值是0到1之间的数。
Hyperbolic Tangent 激活函数
Hyperbolic Tangent 激活函数就是tanh函数,它的输出值是-1到1之间的数。
Rectified linear unit (ReLU) 激活函数
ReLU 函数是目前在神经网络的隐藏层中使用比较多的激活函数(要优于sigmoid和tanh函数,具体原因会在后续文章中讨论),它的公式十分简单:
可以看到当x小于0时,ReLU函数输出的值为0,当x大于0时,ReLU函数的输出为x本身。
参考文献
- Ivan Nunes da Silva et al. Artificial Neural Networks, 2017
- Jeff Heaton. AIFH, Volume 3: Deep Learning and Neural Networks, 2015