神经网络与深度学习简介

神经网络是一门重要的机器学习技术。它是目前最为火热的深度学习的基础。同时也是一些大热领域的理论基础,如图像、语音、NLP 等。本文简单介绍了神经网络的基本构成和计算迭代的方法。

1. 什么是神经网络

人们对于神经网络的追寻最早可以追溯至 1943 年,Warren McCulloch 和 Walter Pitts 发表题为《A Logical Calculus of the Ideas Immanent in Nervous Activity》的论文,首次提出神经元的M-P模型。该模型借鉴了在当时已知的神经细胞的生物过程,是第一个神经元数学模型,同时也是人类历史上第一次对大脑工作原理描述的尝试。(1)

不同算法对数据的要求

提到神经网络,人们往往将其同传统的机器学习算法进行对比,例如 LR,SVM,Decision Tree, GBDT 及 最近大热的 XGBoost 等。同其相比,深度学习算法往往需要更多的数据,强大的计算能力,以及优秀的迭代和激活的方式。虽然神经网络往往需要消耗更多资源,但其往往可拓展性更强,在一些场景下的表现也往往更加优异:如卷积神经网络在图像、视频以及文字上的表现,循环神经网络在序列数据、医学上的表现。

不同的神经网络

神经网络是由多个神经元结构构成的,在网络中我们往往称其为感知机(perceptron)。如同动植物的神经元结构,每个感知机可分为三个部分:

  • 输入(input):用于接收外界输入的信号
  • 神经单元(neuron):用于对输入的信号进行计算,并判断是否输出信号
  • 输出(output):对外输出计算好的信号
神经单元及感知机结构

将多个感知机组合,便可成为一个基本的神经网络。如下图:在这个基本的神经网络中,输入层(input layer)和输出层(output layer)都是数据相关的层,分别用于接收数据和输出数据,中间的隐藏层(hidden layer)用于将输入的数据进行计算。

由于用多个感知机,多组感知机,多层感知机组成隐藏层,所以对数据的信息的抓取能力也更强。同时,由于每个神经网络内藏激活函数(active function),其对数据是非线性的拟合,所以神经网络对数据的拟合能力也更强。

2. 神经网络的训练过程

2.1 前向传播算法和后向传播算法

同传统的机器学习算法一样,神经网络的训练过程也是基于数据标签的迭代。岂可分为两个过程:对数据由输入层至输出层的计算过程中,其称为前向传播算法(forward propagation);反之,从输出层至输入层的计算过程中,其成为后向传播算法(backward propagation)

前向传播算法中,数据由输入层进入模型,通过初始化的隐藏层,最终得到输出层的结果,其为在本轮迭代中得到的预测标签(predict label)。

得到预测标签后,我们同其与真实标签(true label)做对比,通过损失函数的计算(loss function),得到本轮迭代的损失。之后依次,对其临近的隐藏层计算导数,对其权重进行迭代。

2.2 优化器

深度学习的优化器同线性模型相同:

一阶优化:

  • Gradient Descent
  • Stochastic Gradient Descent
  • Mini-Batch Gradient Descent
  • Mini-Batch Stochastic Gradient Descent
  • Momentum
  • Nesterov Momentum

二阶优化:

  • Newton’s Method
  • Adagrad
  • RMSprop
  • Adam

2.3 激活方程

前面在介绍感知机单元的时候简单介绍过激活函数(active function),其会判断当前输入的信息是否要对外输出信息,也就是基于输入的信息,这个单元是否要被激活。这个机制使得感知机更符合生物机制,试想很多时候,我们对一些外界不刺激的感知并不会做出反应,例如轻风吹拂手臂,我们可能不会移动手臂;但如果换火焰灼烧,或者尖锐的物品刺激,我们便会立刻弹开。激活函数在感知机中的角色就是决定是否传递信号。在学习过程中,一些神经元的输出会发生改变,后面的感知机会接受这些输出,将这些神经元进行重新结合,并通过内部的转化和激活方程的判断对外输出,使其将前面的信息整合,并从中得到新的信息。

同时,由于激活方程的存在,损失 (loss) 和 权重(weight)之间是非线性的变化,其可以更好的拟合高维度数据;如果没有激活函数,两者之间就只是线性变换,相当于线性回归模型,而线性方程解决问题能力有限,往往不能解决一些复杂的问题。

激活方程有很多种,下面简单介绍几个比较常见的激活方程:

Sigmoid 函数

sigmoid 函数是较为基础,也是较为常见的激活函数,其原理同 LR 模型相同。但其拥有较大的缺陷:

  1. 非原点对称,并且输出全部为正,和生物机制不符合。
  2. 在饱和神经元中(saturated neurons)梯度为 0,此时会杀死梯度,该函数的梯度为 0,其会导致部分感知机在训练过程中停止更新参数。
  3. exponential 方程计算相对还是较为复杂。

tanh (x)

tanh 是基于 Sigmoid 函数所优化的激活函数,其修正了 Sigmoid 非远点对称的缺点,但是另外两个问题仍然没有存在。

Relu

Relu 函数虽然不是中心对称,但其更符合生物机制:只在正刺激中进行激活。并且其计算简单,在大型网络中资源开销较小。其问题是,在负刺激中,该函数的梯度为 0,也就是说其仍然会杀死梯度,部分感知机在训练过程中会停止更新参数。

Leaky Relu

Leaky Relu 是在 Relu 函数上的优化,使其在负刺激中也会有存在梯度。这样就可以将靠前感知机在训练中持续优化。

在这些激活函数中,我们该如何选择呢? 一般来说,在分类神经网络的输出层中,我们可以使用 Sigmoid 或 Softmax 作为最后一个判断节点的输出;而因为梯度消失问题,应避免使用 Sigmoid 及 Tanh 在隐藏层中。Relu 一般可以满足要求,但如果出现死神经元,可以使用 LRelu 进行优化。

2.4 正则化

机器学习模型的过拟合问题一直是在实际应用的一个问题,神经网络中也有一些方式可以减少模型在训练集上的拟合程度,增强其泛化能力。

神经网络一般情况下,可以用如下方式进行正则:

  1. Loss Function L1 / L2 / elastic 正则函数:同 LR 和 回归模型一样,我们可以使用正则函数,对模型的损失函数进行优化,从而将权重降低,使其不会过分拟合数据。
  2. Dropout:我们在训练过程中随机杀死一些神经节点,使其不会参与后续迭代。
  1. Drop Connection:同 Dropout 相同,但这里是杀死一些神经连接。
  2. 池化 pooling:在一些特定的网络中,如卷积神经网络,池化降低特征的维度并保留有效信息。
  3. 提前停止(Early Stopping):在训练中,如果发现每一次迭代的损失和前一次相差低于特定阈值,则将训练过程直接停止,防止过分训练导致模型过拟合。

发表评论

电子邮件地址不会被公开。 必填项已用*标注