一、神经元


1.引子

对于神经元的研究由来已久,1904年生物学家就已经知晓了神经元的组成结构。

一个神经元通常具有多个树突,主要用来接受传入信息;而轴突只有一条,轴突尾端有许多轴突末梢可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接,从而传递信号。这个连接的位置在生物学上叫做“突触”。

人脑中的神经元形状可以用下图做简单的说明:

单神经元监督学习原理 单个神经元的结构_单神经元监督学习原理

 神经元

 

2.结构 

神经元模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。

下图是一个典型的神经元模型:包含有3个输入,1个输出,以及2个计算功能。

注意中间的箭头线。这些线称为“连接”。每个上有一个“权值”。

单神经元监督学习原理 单个神经元的结构_神经网络_02

 神经元模型 

二、神经网络的计算机实现

深度学习根源于类神经网络 ( Artificial Neural Network ) 模型,但今日深度学习的技术和它的前身已截然不同,目前最好的语音识别和影像辨识系统都是以深度学习技术来完成

1、深度学习的技术三个步骤:设定好类神经网络架构、订出学习目标、开始学习

深度学习可以拿来做甚么?怎么用深度学习做语音识别、图片识别、事件预测?

 

单神经元监督学习原理 单个神经元的结构_卷积核_03

 

机器学习:一种实现人工智能的方法

深度学习:一种实现机器学习的技术

单神经元监督学习原理 单个神经元的结构_池化_04

目前比较流行的深度学习算法就只有CNN(卷积神经网络,Convolutional Neural Network),RNN(循环神经网络,Recurrent Neural Networks)和DNN(深度神经网络 Deep Neural Networks)。DNN是整个深度学习的基础,后面的CNN和RNN其实都是基于DNN来做的,CNN(卷积神经网络)比较擅长于提取图片特征,处理图像问题。RNN是把前一次网络的输出作为下一次网络的输入,让整个网络有了前因后果的概念,比较擅长处理有前后时间序列关系的问题,比如语音识别,语义分析等。

1.1 感受神经网络:

神经网络(NN)基本结构

单神经元监督学习原理 单个神经元的结构_单神经元监督学习原理_05


神经网络第一层为input层,最后一层为output层,而在input和output中间的层则被称为hidden层.

1.2 理解DNN

DNN可以理解为有很多隐藏层的神经网络。这个很多其实也没有什么度量标准, 多层神经网络和深度神经网络DNN其实也是指的一个东西,当然,DNN有时也叫做多层感知机(Multi-Layer perceptron,MLP), 名字实在是多。后面我们讲到的神经网络都默认为DNN。

从DNN按不同层的位置划分,DNN内部的神经网络层可以分为三类,输入层,隐藏层和输出层,如下图示例,一般来说第一层是输入层,最后一层是输出层,而中间的层数都是隐藏层。

单神经元监督学习原理 单个神经元的结构_神经网络_06

层与层之间是全连接的,也就是说,第i层的任意一个神经元一定与第i+1层的任意一个神经元相连。虽然DNN看起来很复杂,但是从小的局部模型来说,还是和感知机一样,即一个线性关系z=∑wixi+b 加上一个激活函数σ(z)。

2、CNN

一个典型的图片分类算法就是提取特征,比较特征。CNN网络简单来说就是将这个过程自动化,开发人员不需要告诉网络图片的特征是什么,CNN网络可以自动的从图片中寻找特征,并记录。这个过程是怎么做到的呢,下面来讲。

2D Visualization of a Conv http://scs.ryerson.ca/~aharley/vis/conv/flat.html

输入一张图片,网络通过一系列的运算,提取出图片的特征。它为你解析了卷积神经网络中,各个层次上到底发生了什么。

 

当然,这中间的一系列计算是有算法和参数的。训练的时候我们会给每张图片打上一个对应的标签,CNN通过上面一系列计算出特征后,每个特征就对应着一个标签。比如

特征1 -> 标签A 
特征2 -> 标签B 
特征3 -> 标签A

当下一张图进入训练时,CNN网络仍然以上次训练计算出来的参数去提取特征,假如提取出的是特征2,如果图片的标签是B,那么证明参数正确,无需调整。如果提取出的是特征2,但是图片的标签是A,那么证明参数不准确,需要调整下参数。调整完参数后继续下次训练,以此类推,直到参数大概率准确的时候。

单神经元监督学习原理 单个神经元的结构_单神经元监督学习原理_07

单神经元监督学习原理 单个神经元的结构_单神经元监督学习原理_08

很简单的去解释了CNN卷积神经网络是怎么工作的,当然实际的过程比这要复杂的多,提取特征需要一些算法,比如卷积、池化、激活,算法的参数也不是1个这么简单,而是几百万个。下面的文章中基于Tensorflow中一个很简单的例子MNIST问题的代码来讲一下CNN网络是怎样工作的。

2.1 CNN 推演过程  

卷积神经网络是一个多层的神经网络,其基本运算单元包括:卷积运算、池化运算、全连接运算和识别运算。
这里写图片描述

    卷积运算:前一层的特征图与一个可学习的卷积核进行卷积运算,卷积的结果经过激活函数后的输出形成这一层的神经元,从而构成该层特征图,也称特征提取层,每个神经元的输入与前一层的局部感受野相连接,并提取该局部的特征,一旦该局部特征被提取,它与其它特征之间的位置关系就被确定。l
    池化运算(采样):能很好的聚合特征、降维来减少运算量。它把输入信号分割成不重叠的区域,对于每个区域通过池化(下采样)运算来降低网络的空间分辨率,比如最大值池化是选择区域内的最大值,均值池化是计算区域内的平均值。通过该运算来消除信号的偏移和扭曲。
    全连接运算:输入信号经过多次卷积核池化运算后,输出为多组信号,经过全连接运算,将多组信号依次组合为一组信号。
    识别运算:上述运算过程为特征学习运算,需在上述运算基础上根据业务需求(分类或回归问题)增加一层网络用于分类或回归计算。

 

最为简单的卷积神经网络大概长这个样子:

在输入数据上,移动这个小矩阵,跟原先与矩阵重叠的位置上的数字做乘法后加在一起。这样原先的一个矩阵,就变成了“卷积”之后的一个数字。

下面这张动图,很形象地为你解释了这一过程。

单神经元监督学习原理 单个神经元的结构_卷积核_09

图像中不同数据窗口的数据和卷积核(一个滤波矩阵)作内积的操作叫做卷积。其计算过程又称为滤波(filter),本质是提取图像不同频段的特征,不断从一个矩阵上去寻找某种特征。这种特征可能是某个边缘的形状之类

卷积核 :也称为滤波器filter,带着一组固定权重的神经元,通常是n*m二维的矩阵,n和m也是神经元的感受野。n*m 矩阵中存的是对感受野中数据处理的系数。一个卷积核的滤波可以用来提取特定的特征(例如可以提取物体轮廓、颜色深浅等).TensorFlow卷积核可随机生成的,按照需求,运算速度,训练模型图片大小,自己选择维度

再下一层,叫做“池化层”(Pooling Layer)。这个翻译简直让人无语。我觉得翻译成“汇总层”或者“采样层”都要好许多。下文中,我们称其为“采样层”。

采样的目的,是避免让机器认为“必须在左上角的方格位置,有一个尖尖的边缘”。实际上,在一张图片里,我们要识别的对象可能发生位移。因此我们需要用汇总采样的方式模糊某个特征的位置,将其从“某个具体的点”,扩展成“某个区域”。

如果这样说,让你觉得不够直观,请参考下面这张动图。

单神经元监督学习原理 单个神经元的结构_池化_10

这里使用的是“最大值采样”(Max-Pooling)。以原先的2x2范围作为一个分块,从中找到最大值,记录在新的结果矩阵里。

一个有用的规律是,随着层数不断向右推进,一般结果图像(其实正规地说,应该叫做矩阵)会变得越来越小,但是层数会变得越来越多。

只有这样,我们才能把图片中的规律信息抽取出来,并且尽量掌握足够多的模式。

下一层叫做全连接层(Fully Connected Layer),它其实就是把上一层输出的若干个矩阵全部压缩到一维,变成一个长长的输出结果。

之后是输出层,对应的结果就是我们需要让机器掌握的分类。

如果只看最后两层,你会很容易把它跟之前学过的深度神经网络(Deep Neural Network, DNN)联系起来。

 

在 CNN 的术语中,3x3 的矩阵叫做“滤波器(filter)”或者“核(kernel)”或者“特征检测器(feature detector)”,通过在图像上滑动滤波器并计算点乘得到矩阵叫做“卷积特征(Convolved Feature)”或者“激活图(Activation Map)”或者“特征图(Feature Map)”。记住滤波器在原始输入图像上的作用是特征检测器。

卷积神经网络中的卷积核是从训练数据中学习得来的 如何理解CNN中的卷积

卷积层具体工作过程:
比如我们设计的一个卷积核如下左,想要识别出来的曲线如下右:

单神经元监督学习原理 单个神经元的结构_卷积核_11


现在我们用上面的卷积核,来识别这个简化版的图片——一只漫画老鼠

单神经元监督学习原理 单个神经元的结构_池化_12

 

当机器识别到老鼠的屁股的时候,卷积核与真实区域数字矩阵作用后,输出较大:6600

 

单神经元监督学习原理 单个神经元的结构_卷积核_13

                                                                           

而用同一个卷积核,来识别老鼠的耳朵的时候,输出则很小:0

单神经元监督学习原理 单个神经元的结构_池化_14


我们就可以认为:现有的这个卷积核保存着曲线的特征,匹配识别出来了老鼠的屁股是曲线的。我们则还需要其他特征的卷积核,来匹配识别出来老鼠的其他部分。卷积层的作用其实就是通过不断的改变卷积核,来确定能初步表征图片特征的有用的卷积核是哪些,再得到与相应的卷积核相乘后的输出矩阵

池化层工作原理

池化层的输入就是卷积层输出的原数据与相应的卷积核相乘后的输出矩阵 
池化层的目的:

  • 为了减少训练参数的数量,降低卷积层输出的特征向量的维度
  • 减小过拟合现象,只保留最有用的图片信息,减少噪声的传递

最常见的两种池化层的形式:

  • 最大池化:max-pooling——选取指定区域内最大的一个数来代表整片区域
  • 均值池化:mean-pooling——选取指定区域内数值的平均值来代表整片区域

举例说明两种池化方式:(池化步长为2,选取过的区域,下一次就不再选取)


 

2.2、 MNIST问题

MNIST问题就相当于图像处理的Hello World程序,在Tensorflow的官方教程里已经有一个完整的Demo。

MNIST问题是很常见的图片分类问题,训练集是已经编码过的手写图片,图片中是手写的0~9的数字,模型经过训练后,输入一张图片,可以输出0~9的数字。

输入集

首先我们来看一下MNIST问题的输入集,数据集的介绍传送门

整个数据集由以下四个文件构成,

//训练集-图片数据
train-images-idx3-ubyte.gz:  training set images (9912422 bytes) 
//训练集-label数据
train-labels-idx1-ubyte.gz:  training set labels (28881 bytes) 
//测试集-图片数据
t10k-images-idx3-ubyte.gz:   test set images (1648877 bytes) 
//测试集-label数据
t10k-labels-idx1-ubyte.gz:   test set labels (4542 bytes)

训练集-图片数据的格式如下

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000803(2051) magic number 
0004     32 bit integer  60000            number of images 
0008     32 bit integer  28               number of rows 
0012     32 bit integer  28               number of columns 
0016     unsigned byte   ??               pixel 
0017     unsigned byte   ??               pixel 
........ 
xxxx     unsigned byte   ??               pixel

训练集-label数据的格式如下

[offset] [type]          [value]          [description] 
0000     32 bit integer  0x00000801(2049) magic number (MSB first) 
0004     32 bit integer  60000            number of items 
0008     unsigned byte   ??               label 
0009     unsigned byte   ??               label 
........ 
xxxx     unsigned byte   ??               label
The labels values are 0 to 9.

测试集的数据格式和训练集是一样的。

 

3.RNN

RNN有顺序存储的这个抽象概念,但是RNN如何学习这个概念呢?那么,让我们来看一个传统的神经网络,也称为前馈神经网络。它有输入层,隐藏层和输出层。

单神经元监督学习原理 单个神经元的结构_池化_15

我 们 如何 训练 一个前 馈 神 经 网 络 ,以便能 够 使用以前的信息来影响以后的信息呢?如果我 们 在神 经 网 络 中添加一个可以 传递 先前信息的循 环 它将会变成什么呢?

单神经元监督学习原理 单个神经元的结构_卷积核_16

这基本上就是一个递归神经网络了 。 RNN 让循 环 机制充当高速公路以允 许 信息从一个步 骤 流到下一个步 骤 。

单神经元监督学习原理 单个神经元的结构_神经网络_17

将 隐 藏状 态传递给 下一个步 骤

此信息是隐藏状态,它是先前输入的表示。让我们通过一个RNN用例来更好地理解它是如何工作的。

假设我们想要构建一个聊天机器人,以为它们现在非常受欢迎。假设聊天机器人可以根据用户输入的文本对意图进行分类。

单神经元监督学习原理 单个神经元的结构_神经网络_18

对用户输入的意图进行分类

为了解决这个问题。首先,我们将使用RNN对文本序列进行编码。然后,我们将RNN输出馈送到前馈神经网络中,该网络将对用户输入意图进行分类。

假设用户输入:what time is it?首先,我们将句子分解为单个单词。RNN按顺序工作,所以我们一次只能输入一个字。

将一个句子分成 单词 序列

第一步是将“What”输入RNN,RNN编码“what”并产生输出。

对于下一步,我们提供单词 “time” 和上一步中的 隐 藏状 态 。 RNN 现在有关于 “ what ” 和 “ time ” 这两个词的信息 。

我 们 重复 这 个 过 程,直到最后一步。你可以通 过 最后一步看到 RNN 编码了前面步骤中所有单词的信息 。

由于最 终输 出是从序列的部分 创 建的,因此我 们应该 能 够获 取最 终输 出并将其 传递给 前 馈层 以 对 意 图进 行分 类 。

单神经元监督学习原理 单个神经元的结构_卷积核_19

对于那些喜欢在这里查看代码的人来说,使用 python 展示了控制流程应该是最好的方式。

单神经元监督学习原理 单个神经元的结构_神经网络_20

RNN 控制流的 伪 代 码

首先,初始化网络层和初始隐藏状态。隐藏状态的形状和维度将取决于你的递归神经网络的形状和维度。然后循环输入,将单词和隐藏状态传递给RNN。RNN返回输出和修改的隐藏状态,接着就继续循环。最后,将输出传递给前馈层,然后返回预测。整个过程就是这样!进行递归神经网络的正向传递的控制流程是for循环。

梯度消失

你可能已经注意到隐藏状态中奇怪的颜色分布。这是为了说明RNN被称为短期记忆的问题。

单神经元监督学习原理 单个神经元的结构_神经网络_21

RNN 的最 终隐 藏状 态

短期记忆问题是由臭名昭着的梯度消失问题引起的,这在其他神经网络架构中也很普遍。由于RNN处理很多步骤,因此难以保留先前步骤中的信息。正如你所看到的,在最后的时间步骤中,“what”和“time”这个词的信息几乎不存在。短期记忆和梯度消失是由于反向传播的性质引起的,反向传播是用于训练和优化神经网络的算法。为了理解这是为什么,让我们来看看反向传播对深度前馈神经网络的影响。

训练神经网络有三个主要步骤。首先,它进行前向传递并进行预测。其次,它使用损失函数将预测与基础事实进行比较。损失函数输出一个错误值,该错误值是对网络执行得有多糟糕的估计。最后,它使用该误差值进行反向传播,计算网络中每个节点的梯度。

单神经元监督学习原理 单个神经元的结构_池化_22

梯度是用于调整网络内部权重的值从而更新整个网络。梯度越大,调整越大,反之亦然,这也就是问题所在。在进行反向传播时,图层中的每个节点都会根据渐变效果计算它在其前面的图层中的渐变。因此,如果在它之前对层的调整很小,那么对当前层的调整将更小。

这会导致渐变在向后传播时呈指数级收缩。由于梯度极小,内部权重几乎没有调整,因此较早的层无法进行任何学习。这就是消失的梯度问题。

单神经元监督学习原理 单个神经元的结构_池化_23

梯度向后 传 播 时 收 缩

让我们看看这如何适用于递归神经网络。你可以将循环神经网络中的每个时间步骤视为一个层。为了训练一个递归神经网络,你使用了一种称为通过时间反向传播的方法。这样梯度值在每个时间步长传播时将呈指数级收缩。

单神经元监督学习原理 单个神经元的结构_神经网络_24

随着 时间 的推移,梯度会收 缩

同样,梯度值将用于在神经网络权重中进行调整,从而允许其学习。小的渐变意味着小的调整。这将导致最前面的层没有优化。

由于梯度消失,RNN不会跨时间步骤学习远程依赖性。这意味着在尝试预测用户的意图时,有可能不考虑“what”和“time”这两个词。然后网络就可能作出的猜测是“is it?”。这很模糊,即使是人类也很难辨认这到底是什么意思。因此,无法在较早的时间步骤上学习会导致网络具有短期记忆。

LSTM和GRU

RNN 会受到短期记忆的影响,那么我们如何应对呢?为了减轻短期记忆的影响,研究者们创建了两个专门的递归神经网络,一种叫做长短期记忆或简称LSTM。另一个是门控循环单位或GRU。LSTM和GRU本质上就像RNN一样,但它们能够使用称为“门”的机制来学习长期依赖。

GRU与LSTM总结

总结

总而言之,RNN适用于处理序列数据以进行预测,但却会受到短期记忆的影响。vanilla RNN的短期存储问题并不意味着要完全跳过它们并使用更多进化版本,如LSTM或GRU。RNN具有更快训练和使用更少计算资源的优势,这是因为要计算的张量操作较少。当你期望对具有长期依赖的较长序列建模时,你应该使用LSTM或GRU。