Skip to content

神经元与神经网络模型

深度学习天然不是神经网络,但神经网络天然是深度学习!(深度学习是理论基础,神经网络是深度学习的具体实现方法)。

人工神经网络(英语:Artificial Neural Network,ANN),简称 神经网络(Neural Network,NN)或 类神经网络,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型,用于对函数进行估计或近似。

一、简单模型实现

1、题目-生活场景

Tom、Lily、Andy 和 Louis 四个人是好朋友,他们经常一起约看电影。下面是他们的看电影记录(1 表示去看电影,0 表示没去看电影)。

序号TomLilyAndyLouis
10010
21101
31011
40110
5110

那么,我们能否预测出第 5 次,Louis 是否去看了电影呢?

通过我们大脑中 1000 亿个神经元,我们很快就学到了这个规律:只要 Tom 去看电影,那么 Louis 也去看了电影。

1、简单程序实现

python
# 使用程序语言理解,即:
if(Tom==1):
    Louis = 1     # 如果Tom去,那么Louis去
else:
    Louis = 0        # 否则,Louis没去

但是,这个程序的逻辑是定死的,而我们人类却是在不断变化的。

后来,又统计了他们四次看电影的情况,结果如下所示。

序号TomLilyAndyLouis
11011
21100
30011
40101
5110
  • 在第 2 次中,Tom 去了,但是 Louis 没有去
  • 在第 3 次中,Tom 没有去,但是 Louis 仍然去了
  • 在第 4 次中,Tom 去了,但是 Louis 没有去

所以我们刚才的程序逻辑就不适用于这个数据。

我们如何写一个程序逻辑,能够让我们根据这些数据,自动推理出 Louis 是否去看了电影呢?

2、神经网络实现

这里面,我们就要使用到深度学习,也就是基于神经网络的机器学习,即自己会学习的算法!

那么,我们如何来编写程序来让机器自己学习呢?

(1)构建数学模型

这道题很简单,我们需要的是通过 Tom、Lily 和 Andy 的数据,来推测 Louis 的数据。

所以,可以把 Tom、Lily 和 Andy 的数据定义为输入,即一个二维数组 x 。

把 Louis 的数据定义为输出,即一个一维数组 y 。如下所示:

么,我们只需要找到一个三行一列的矩阵 w,使得满足 y = wx 即可。

那么,我们只需要求出矩阵 w 即可

(2)正向推测求解

首先,我们假设矩阵 w 为 [1, 0 , 1],则计算结果如下:

但是,通过观察我们发现,输出 y 的值只有 0 和 1 两种情况。

而矩阵的运算,可以包含各种值。那么,这该如何操作呢?

这里我们可以借助 Sigmoid 函数来实现。

其函数图像如下所示:

可以发现,在 Sigmoid 函数中,z 取值是 z ∈ [−∞, +∞],但是 sigmoid(z)的取值,恒在 (0, 1) 之间。

通过下面的代码来计算一下:

python
# 导入numpy库的相关函数
from numpy import array, exp, dot

# 定义数组x
x = array([[1, 0, 1],
          [1, 1, 0],
          [0, 0, 1],
          [0, 1, 0]])

# 定义数组w
weights = array([[1, 0, 1]]).T
z = dot(x, weights)
print(f"z = {z}")

# sigmoid函数(exp: 指数运算 dot: 矩阵点乘)
y_hat = 1/(1+exp(-z))
print(f"y_hat = {y_hat}")

最终,我们就能够得到最终的预测值 y^ ,即:

(3)计算损失误差

现在,我们已经得到了一组预测值 output,那么我们接下来看预测值 y^ 和真实值 y 之间的误差有多大。

所以,我们可以计算出来误差 loss,即:

那么,我们只需要将误差最小化,那么我们的预测值和真实值就就非常接近了。

(4)调整权重参数

如果误差较大,那么我们就要调整我们的权重矩阵 w 。

如何调整权重呢?

首先,我们要知道一点,Sigmoid 函数公式如下:

我们对 Sigmoid 函数进行求导,则最终会得到如下公式:

导数就是这个 Sigmoid 函数的斜率:

那么,知道这个 Sigmoid 函数的斜率有什么作用呢?

我们可以使用这个斜率来调整权重,即斜率大时,我们要快速下降,当斜率小时,我们就慢慢的调整权重。

当权重调整后,我们计算的斜率等于 0 时,我们也就找到了损失函数的最小值。

那么,当斜率不为 0 时,应该如何更新权重呢?

我们可以通过权重增量δ(斜率 × 损失值)来实现。

接下来,我们就可以通过斜率来计算出权重的增量 δ(斜率 × 损失值),来调整权重。

已知,我们的输入 x 如下:

接下来,我们可以对 x 进行矩阵转置,然后与 δ 进行矩阵相乘,在用权重矩阵相加,即得到最新的权重矩阵。

就得出来如下公式:

(5)程序实现

这就是我们写的最简单的「神经网络」代码!

python
from numpy import array, exp, random, dot

# Tom Lily Andy 三人的数据统计
x = array([[1, 0, 1],
          [1, 1, 0],
          [0, 0, 1],
          [0, 1, 0]])

# Louis的数据统计
y = array([[1, 0, 1, 1]]).T

# 初始化随机权重
random.seed(1)
weights = 2 * random.random((3, 1))-1

# 模型训练 10000 次
for i in range(10000):
    z = dot(x, weights)                        # 矩阵相乘
    output = 1/(1+exp(-z))                  # sigmoid函数
    loss = y - output                       # 损失值
    slope = output * (1-output)                # 斜率
    delta = loss * slope                        # 计算增量
    weights = weights + dot(x.T, delta)            # 更新权重

# 最终权重矩阵
print(weights)
# 当 Tom Lily Andy 为 [1,0,0] 时, Louis 去的概率?
print(1/(1+exp(-dot([[1, 0, 0]], weights))))

最终输出结果为:

python
[[-8.10176385]
 [ 4.00397872]
 [12.46111582]]
[[0.00030291]]

然后,我们代入验证

python
# 导入numpy库的相关函数
from numpy import array, exp, dot

# 输入验证集
x = array([[1, 0, 1],
          [1, 1, 0],
          [0, 0, 1],
          [0, 1, 0]])

weights = array([[-8.10176385, 4.00397872, 12.46111582]]).T

# 预测结果
for i in x:
    y = 1/(1+exp(-dot(i, weights)))
    print(f'x={i}, y={y}')

程序输出结果如下:

python
x=[1 0 1], y=[0.98737476]
x=[1 1 0], y=[0.01633806]
x=[0 0 1], y=[0.99999613]
x=[0 1 0], y=[0.98208393]

由此,可以发现,计算的 weights 权重能够完全匹配四条训练数据。

二、神经元

1、生物神经元

人脑可以看做是一个生物神经网络,由众多的神经元连接而成。

神经元(neuron)是这样一种细胞,它能接收、加工或传递信息到体内其他细胞。

神经元的形状、大小、化学成分和功能各异,哺乳动物脑内已确认有 200 多种不同类型的神经元。但是所有的神经元都有着相似的基本结构,如下图。

生物神经元主要由细胞体、树突和轴突组成。

  • 树突: 从细胞体向四周分散开来的突起称之为树突,用于接收神经冲动,神经元细胞有一个或多个树突。与不同神经元连接的树突强度有强有弱;
  • 胞体: 细胞膜上存在受体,可以与神经冲动的神经递质结合,产生兴奋或者抑制。神经元所获得的输入信号的积累超过某个阈值时,处于兴奋状态,否则为抑制状态;
  • 轴突: 将自身的兴奋传递到下一个神经元细胞的树突

在人类的脑内大约有一千亿到一亿亿个神经元。

神经元一般从一端接收信息,再从另一端发出信息。神经元一般只沿一个方向传递信息:神经元通过它的树突接收神经冲动,然后通过轴突把神经冲动传到终扣,在这里释放神经递质去刺激另一个神经元。

神经元细胞只有两种状态:兴奋和抑制。

当神经元“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。

2、人工神经元

人工神经元是人工神经网络的基本单元。

模拟生物神经元,其工作流程如下:

  • 人工神经元有 1 个或者多个输入(模拟多个树突或者多个神经元向该神经元传递神经冲动);
  • 对输入进行加权求和(模拟细胞体将神经信号进行积累和树突强度不同);
  • 对输入之和使用激活函数计算活性值(模拟细胞体产生兴奋或者抑制);
  • 输出活性值并传递到下一个人工神经元(模拟生物神经元通过轴突将神经冲动输入到下一个神经元)。

人工神经元的计算描述。假设人工神经元有 n 个输入 x1,x2,...,xn,则人工神经元的加权求和值:

其中:

  • x1,x2,...,xn:各个输入的分量
  • w1,w2,...,wn: 各个输入的分量的权重参数
  • b:偏置变量
  • f:激活函数,常见的激活函数有 tanh、sigmoid、relu
  • Output:神经元的输出

可见,一个神经元的功能是求得输入向量与权向量的内积后,经一个非线性传递函数(激活函数)得到一个标量结果

3、神经元的工作方式

人工神经元接收到一个或多个输入,对他们进行加权并相加,总和通过一个非线性函数(激活函数)产生输出。

三、神经网络

1、整体结构

神经网络就是按照一定规则将多个神经元连接起来的网络。不同的神经网络,具有不同的连接规则。大体见下图:

在图中,我们看出如下规则:

  • 层次结构为: 通常分为三不分:输入层(Input Layer),隐藏层(Hidden Layer),输出层(Output Layer)。
  • 中间的隐藏层可以设置多层。
  • 同一层的神经元之间没有连接。
  • 全连接的含义: 每一层和下一层中间都有灰色的线,这些线就被称为全连接。第 N 层的每个神经元和第 N-1 层的所有神经元相连,第 N-1 层神经元的输出就是第 N 层神经元的输入。
  • 每个连接都有一个权值,通常用**矩阵 W **来表示。
  • 在每层运算做完后,得到的数据不能直接输入到下一层计算中,需要添加一些非线性函数(大部分也可以叫做激活函数),常用的激活函数有 relu,sigmoid,tanh,就比如说在 Input Layer 在 Hidden Layer1 计算完后不能将数据直接传入 Hidden Layer2,在这之间需要添加一个激活函数。

2、单层神经网络

1958 年,计算科学家 Rosenblatt 提出了由两层神经元组成的神经网络。他给它起了一个名字--“感知器”(Perceptron)。感知器是当时首个可以学习的人工神经网络。Rosenblatt 现场演示了其学习识别简单图像的过程,在当时的社会引起了轰动。

人们认为已经发现了智能的奥秘,许多学者和科研机构纷纷投入到神经网络的研究中。美国军方大力资助了神经网络的研究,并认为神经网络比“原子弹工程”更重要。这段时间直到 1969 年才结束,这个时期可以看作神经网络的第一次高潮。

1、网络结构

  • 单层神经网络是最基本的神经元网络形式,由有限个神经元构成,所有神经元的输入向量都是同一个向量。
  • 由于每一个神经元都会产生一个标量结果,所以单层神经元的输出是一个向量,向量的维数等于神经元的数目。

在“感知器”中,有两个层次。分别是输入层和输出层。

  1. 输入层里的“输入单元”只负责传输数据,不做计算。
  2. 输出层里的“输出单元”则需要对前面一层的输入进行计算。

我们把需要计算的层次称之为“计算层”,并把拥有一个计算层的网络称之为“单层神经网络

有一些文献会按照网络拥有的层数来命名,例如把“感知器”称为两层神经网络。但在本课程中,我们根据计算层的数量来命名。

2、网络影响

感知器只能做简单的线性分类任务。但是当时的人们热情太过于高涨,并没有人清醒的认识到这点。于是,当人工智能领域的巨擘 Minsky 指出这点时,事态就发生了变化。

Minsky 在 1969 年出版了一本叫《Perceptron》的书,里面用详细的数学证明了感知器的弱点,尤其是感知器对 XOR(异或)这样的简单分类任务都无法解决。

Minsky 认为,如果将计算层增加到两层,计算量则过大,而且没有有效的学习算法。所以,他认为研究更深层的网络是没有价值的。

由于 Minsky 的巨大影响力以及书中呈现的悲观态度,让很多学者和实验室纷纷放弃了神经网络的研究。神经网络的研究陷入了冰河期。这个时期又被称为“AI winter”。

接近 10 年以后,对于两层神经网络的研究才带来神经网络的复苏。

3、两层神经网络

Minsky 说过单层神经网络无法解决异或问题。但是当增加一个计算层以后,两层神经网络不仅可以解决异或问题,而且具有非常好的非线性分类效果。

不过两层神经网络的计算是一个问题,没有一个较好的解法。

1986 年,Rumelhar 和 Hinton 等人提出了反向传播(Backpropagation,BP)算法,解决了两层神经网络所需要的复杂计算量问题,从而带动了业界使用两层神经网络研究的热潮。

目前,大量的教授神经网络的教材,都是重点介绍两层(带一个隐藏层)神经网络的内容。

1、网络结构

两层神经网络除了包含一个输入层,一个输出层以外,还增加了一个中间层

此时,中间层和输出层都是计算层。

我们扩展上节的单层神经网络,在右边新加一个层次(只含有一个节点)。

现在,我们的权值矩阵增加到了两个,我们用上标来区分不同层次之间的变量。

例如 ax^y 代表第 y 层的第 x 个节点。z1,z2 变成了 a1(2),a2(2)。

下图给出了 a1(2),a2(2)的计算公式。

计算最终输出 z 的方式是利用了中间层的 a1(2),a2(2)和第二个权值矩阵计算得到的,如下图:

我们使用向量和矩阵来表示层次中的变量。a(1),a(2),z是网络中传输的向量数据。W(1)和W(2)是网络的矩阵参数。如下图:

使用矩阵运算来表达整个计算公式的话如下:

由此可见,使用矩阵运算来表达是很简洁的,而且也不会受到节点数增多的影响(无论有多少节点参与运算,乘法两端都只有一个变量)。

2、偏置单元

需要说明的是,至今为止,我们对神经网络的结构图的讨论中都没有提到偏置节点(bias unit)。事实上,这些节点是默认存在的。它本质上是一个只含有存储功能,且存储值永远为 1 的单元。

在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。正如线性回归模型与逻辑回归模型中的一样。

偏置单元与后一层的所有节点都有连接,我们设这些参数值为向量 b,称之为偏置。如下图。

可以看出,偏置节点很好认,因为其没有输入(前一层中没有箭头指向它)。

在考虑了偏置以后的一个神经网络的矩阵运算如下:

3、网络效果

与单层神经网络不同。理论证明,两层神经网络可以无限逼近任意连续函数

这是什么意思呢?也就是说,面对复杂的非线性分类任务,两层(带一个隐藏层)神经网络可以分类的很好。

下面就是一个例子,红色的线与蓝色的线代表数据。

而红色区域和蓝色区域代表由神经网络划开的区域,两者的分界线就是决策分界。

可以看到,这个两层神经网络的决策分界是非常平滑的曲线,而且分类的很好

有趣的是,前面已经学到过,单层网络只能做线性分类任务。而两层神经网络中的后一层也是线性分类层,应该只能做线性分类任务。

为什么两个线性分类任务结合就可以做非线性分类任务?

我们可以把输出层的决策分界单独拿出来看一下。就是下图。

可以看到,输出层的决策分界仍然是直线。关键就是,从输入层到隐藏层时,数据发生了空间变换。也就是说,两层神经网络中,隐藏层对原始的数据进行了一个空间变换,使其可以被线性分类,然后输出层的决策分界划出了一个线性分类分界线,对其进行分类

这样就导出了两层神经网络可以做非线性分类的关键--隐藏层。联想到我们一开始推导出的矩阵公式,我们知道,矩阵和向量相乘,本质上就是对向量的坐标空间进行一个变换。因此,隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。

两层神经网络通过两层的线性模型模拟了数据内真实的非线性函数。因此,多层的神经网络的本质就是复杂函数拟合。

4、网络影响

两层神经网络在多个地方的应用说明了其效用与价值。10 年前困扰神经网络界的异或问题被轻松解决。神经网络在这个时候,已经可以发力于语音识别,图像识别,自动驾驶等多个领域。

但是神经网络仍然存在若干的问题:尽管使用了 BP 算法,一次神经网络的训练仍然耗时太久,而且困扰训练优化的一个问题就是局部最优解问题,这使得神经网络的优化较为困难。同时,隐藏层的节点数需要调参,这使得使用不太方便,工程和研究人员对此多有抱怨。

90 年代中期,由 Vapnik 等人发明的 SVM(Support Vector Machines,支持向量机)算法诞生,很快就在若干个方面体现出了对比神经网络的优势:无需调参;高效;全局最优解。基于以上种种理由,SVM 迅速打败了神经网络算法成为主流。

4、多层神经网络

在被人摒弃的 10 年中,有几个学者仍然在坚持研究。这其中的棋手就是加拿大多伦多大学的 Geoffery Hinton 教授。

2006 年,Hinton 在《Science》和相关期刊上发表了论文,首次提出了“深度信念网络”的概念。

与传统的训练方式不同,“深度信念网络”有一个 “预训练”(pre-training) 的过程,这可以方便的让神经网络中的权值找到一个接近最优解的值,之后再使用 “微调”(fine-tuning) 技术来对整个网络进行优化训练。

这两个技术的运用大幅度减少了训练多层神经网络的时间。他给多层神经网络相关的学习方法赋予了一个新名词“深度学习”。

很快,深度学习在语音识别领域暂露头角。接着,2012 年,深度学习技术又在图像识别领域大展拳脚。Hinton 与他的学生在 ImageNet 竞赛中,用多层的卷积神经网络成功地对包含一千类别的一百万张图片进行了训练,取得了分类错误率 15%的好成绩,这个成绩比第二名高了近 11 个百分点,充分证明了多层神经网络识别效果的优越性。

在这之后,关于深度神经网络的研究与应用不断涌现。

ImageNet

ImageNet 是一种数据集,而不是神经网络模型。斯坦福大学教授李飞飞为了解决机器学习中过拟合和泛化的问题而牵头构建的数据集。该数据集从 2007 年开始手机建立,直到 2009 年作为论文的形式在 CVPR 2009 上面发布。直到目前,该数据集仍然是深度学习领域中图像分类、检测、定位的最常用数据集之一。

基于 ImageNet 有一个比赛,从 2010 年开始举行,到 2017 年最后一届结束。该比赛称为 ILSVRC,全称是 ImageNet Large-Scale Visual Recognition Challenge,每年举办一次,每次从 ImageNet 数据集中抽取部分样本作为比赛的数据集。

ILSVRC 比赛包括:图像分类、目标定位、目标检测、视频目标检测、场景分类。

在该比赛的历年优胜者中,诞生了AlexNet(2012)、VGG(2014)、GoogLeNet(2014)、ResNet(2015)等耳熟能详的深度学习网络模型。

“ILSVRC”一词有时候也用来特指该比赛使用的数据集,即 ImageNet 的一个子集,其中最常用的是 2012 年的数据集,记为 ILSVRC2012。因此有时候提到 ImageNet,很可能是指 ImageNet 中用于 ILSVRC2012 的这个子集。ILSVRC2012 数据集拥有 1000 个分类(这意味着面向 ImageNet 图片识别的神经网络的输出是 1000 个),每个分类约有 1000 张图片。这些用于训练的图片总数约为 120 万张,此外还有一些图片作为验证集和测试集。ILSVRC2012 含有 5 万张图片作为验证集,10 万张图片作为测试集(测试集没有标签,验证集的标签在另外的文档给出)。

前面提到过 ImageNet 的比赛包含多个项目,下面是下载官网地址:

1、网络结构

延续两层神经网络的方式来设计一个多层神经网络。

在两层神经网络的输出层后面,继续添加层次。原来的输出层变成中间层,新加的层次成为新的输出层。所以可以得到下图:

依照这样的方式不断添加,我们可以得到更多层的多层神经网络。公式推导的话其实跟两层神经网络类似,使用矩阵运算的话就仅仅是加一个公式而已。

在已知输入a(1),参数W(1),W(2),W(3)的情况下,输出z的推导公式如下:

多层神经网络中,输出也是按照一层一层的方式来计算。从最外面的层开始,算出所有单元的值以后,再继续计算更深一层。只有当前层所有单元的值都计算完毕以后,才会算下一层。

有点像计算向前不断推进的感觉。所以这个过程叫做“正向传播”。

下面讨论一下多层神经网络中的参数。

首先我们看第一张图,可以看出W(1)中有 6 个参数,W(2)中有 4 个参数,W(3)中有 6 个参数,所以整个神经网络中的参数有 16 个(这里我们不考虑偏置节点,下同)。

假设我们将中间层的节点数做一下调整。第一个中间层改为 3 个单元,第二个中间层改为 4 个单元。

经过调整以后,整个网络的参数变成了 33 个。

虽然层数保持不变,但是第二个神经网络的参数数量却是第一个神经网络的接近两倍之多,从而带来了更好的表示(represention)能力。表示能力是多层神经网络的一个重要性质

在参数一致的情况下,我们也可以获得一个“更深”的网络。

上图的网络中,虽然参数数量仍然是 33,但却有 4 个中间层,是原来层数的接近两倍。这意味着 一样的参数数量,可以用更深的层次去表达。

2、网络效果

与两层层神经网络不同。多层神经网络中的层数增加了很多。

增加更多的层次有什么好处?

  • 更深入的表示特征: 随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如:
    1. 第一个隐藏层学习到的是“边缘”的特征,
    2. 第二个隐藏层学习到的是由“边缘”组成的“形状”的特征,
    3. 第三个隐藏层学习到的是由“形状”组成的“图案”的特征,
    4. 最后的隐藏层学习到的是由“图案”组成的“目标”的特征。
    5. 通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。
  • 更强的函数模拟能力: 由于随着层数的增加,整个网络的参数就越多。而神经网络其实本质就是模拟特征与目标之间的真实关系函数的方法,更多的参数意味着其模拟的函数可以更加的复杂,可以有更多的容量(capcity)去拟合真正的关系。

通过研究发现,在参数数量一样的情况下,更深的网络往往具有比浅层的网络更好的识别效率。这点也在 ImageNet 的多次大赛中得到了证实。从 2012 年起,每年获得 ImageNet 冠军的深度神经网络的层数逐年增加,2015 年最好的方法 GoogleNet 是一个多达 22 层的神经网络。

在最后一届的 ImageNet 大赛上,目前拿到最好成绩的 MSRA 团队的方法使用的更是一个深达 152 层的网络!

3、网络训练

在单层神经网络时,我们使用的激活函数是 sgn 函数。

到了两层神经网络时,我们使用的最多的是 sigmoid 函数。

而到了多层神经网络时,通过一系列的研究发现,ReLU 函数在训练多层神经网络时,更容易收敛,并且预测性能更好。

因此,目前在深度学习中,最流行的非线性函数是ReLU 函数。ReLU 函数不是传统的非线性函数,而是分段线性函数。其表达式非常简单,就是 y=max(x, 0)。简而言之,在 x 大于 0,输出就是输入,而在 x 小于 0 时,输出就保持为 0。这种函数的设计启发来自于生物神经元对于激励的线性响应,以及当低于某个阈值后就不再响应的模拟。

在多层神经网络中,训练的主题仍然是优化和泛化。当使用足够强的计算芯片(例如 GPU 图形加速卡)时,梯度下降算法以及反向传播算法在多层神经网络中的训练中仍然工作的很好。

目前学术界主要的研究既在于开发新的算法,也在于对这两个算法进行不断的优化,例如,增加了一种带动量因子(momentum)的梯度下降算法。

在深度学习中,泛化技术变的比以往更加的重要。这主要是因为神经网络的层数增加了,参数也增加了,表示能力大幅度增强,很容易出现过拟合现象。因此正则化技术就显得十分重要。目前,Dropout 技术,以及数据扩容(Data-Augmentation)技术是目前使用的最多的正则化技术。

4、网络影响

目前,深度神经网络在人工智能界占据统治地位。但凡有关人工智能的产业报道,必然离不开深度学习。神经网络界当下的四位引领者除了前文所说的 Ng,Hinton 以外,还有 CNN 的发明人 Yann Lecun,以及《Deep Learning》的作者 Bengio(早期 OpenAI 项目的高级顾问)。

多层神经网络的研究仍在进行中。现在最为火热的研究技术包括 RNN,LSTM 等,研究方向则是图像理解方面。图像理解技术是给计算机一幅图片,让它用语言来表达这幅图片的意思。

四、底层原理

1、损失函数

损失函数(Loss Function / Cost Function),也叫做误差函数,就是用来度量模型的预测值 f(x) 与真实值 y 的差异程度的运算函数,它是一个非负实值函数,通常使用 L(y,f(x)) 来表示,损失函数越小,模型的鲁棒性就越好。

公式如下:真实值与预测值的差值的平方

损失函数使用主要是在模型的训练阶段,每个批次的训练数据送入模型后,通过前向传播输出预测值,然后损失函数会计算出预测值和真实值之间的差异值,也就是损失值。得到损失值之后,模型通过反向传播去更新各个参数,来降低真实值与预测值之间的损失,使得模型生成的预测值往真实值方向靠拢,从而达到学习的目的。

2、梯度下降算法

1、定义

梯度下降法(Gradient Descent)在机器学习中常常用来优化损失函数,是一个非常重要的工具。

梯度在数学函数中,其实就是导数,也就是目标函数(一般是损失函数)的导数。

梯度下降是一种优化算法, 常用于训练机器学习模型和神经网络。 训练数据可以帮助这些模型不断学习,梯度下降算法中的损失函数就像是晴雨表,通过每次参数更新的迭代来衡量模型的准确度。该模型持续调整其参数,直至该函数接近于或等于零,以使产生的误差尽可能最小。机器学习模型的准确性经过优化后,这些模型就可以成为人工智能(AI)和计算机科学应用的强大工具。

2、工作原理

在我们深入研究梯度下降算法之前,回顾一下线性回归中的一些概念可能会有所帮助。

大家可能还记得直线斜率公式 y = mx + b,其中 m 表示斜率,b 表示直线在 y 轴上的截距。

梯度下降算法的起点可以是我们评估性能的任意点。我们通过这个起点求出导数(或斜率),可以用切线来观察斜率的大小。斜率将促使一些参数更新,包括权重和偏差。起始点处的斜率比较大,但随着新参数的生成,斜率会逐渐减小,直至达到曲线上的最低点,即收敛点。

与在线性回归中寻找最佳拟合线类似,梯度下降算法的目标是使成本函数最小化,即最大程度减小预测值与实际值之间的误差。 为了做到这一点,需要两个数据点——一个是方向,另一个是学习速率。这些因素决定了未来迭代的偏导数计算,使其逐渐达到局部或全局最小值(即收敛点)。

  • 学习速率(也称为步长或 alpha) 指的是为了达到最小值所采用的步长的大小。 这通常是一个很小的值,根据成本函数的行为进行求值和更新。 较高的学习速率会产生较大的步长,存在错过最小值的风险。 相反,较低的学习速率的步长较小。 虽然较低的学习速率具有更高的精度,但迭代次数的增加会降低整体效率,因为需要更多的时间和计算才能达到最小值。

  • 成本(或损失)函数 用于衡量实际值和预测值在当前位置的差异或误差。 它通过向模型提供反馈,使其可以调整参数以最大程度减少误差,并找到局部或全局最小值,从而提高机器学习模型的有效性。 成本函数会持续迭代,沿着最陡下降方向(负梯度)移动,直到接近或等于零。 到达此位置时,模型停止学习。 此外,虽然成本函数和损失函数这两个术语被认为是同义词,但它们之间存在细微的差别。 值得注意的是,损失函数指的是一个训练示例的误差,而成本函数计算的是整个训练集的平均误差。

3、算法类型

(1)批量梯度下降算法

批量梯度下降算法对训练集中每个点的误差求总和, 只有在所有训练示例都评估后才更新模型。这个过程称为一个训练周期 (training epoc)。

虽然这种批量处理提高了计算效率,但对于大型训练数据集而言,它仍然需要很长的处理时间,因为仍要将所有数据存储到内存中。 批量梯度下降算法通常也会产生稳定的误差梯度和收敛性,但有时在寻找局部最小值和全局最小值时,收敛点并不是最理想。

(2)随机梯度下降算法

随机梯度下降算法(SGD)为数据集中的每个示例运行一个训练周期,并一次性更新所有训练示例的参数。 由于只需保存一个训练示例,所以可以更轻松地将它们存储在内存中。 虽然这些频繁的更新可以使计算更加详细,速度更快,但与批量梯度下降算法相比,这可能会导致计算效率下降。随机梯度下降算法的频繁更新可能导致嘈杂梯度,但这也有助于避开局部最小值,找到全局最小值。

(3)小批量梯度下降算法

小批量梯度下降算法结合了批量梯度下降算法和随机梯度下降算法的理念。 它将训练数据集分成小批次, 并对每批进行更新。这种方法兼顾了批量梯度下降算法的计算效率和随机梯度下降算法的速度。

4、面临挑战

虽然梯度下降算法是优化问题的最常见方法,但其本身也面临着一些挑战。 其中包括:

(1)局部最小值和鞍点

对于凸问题,梯度下降算法可以很容易地找到全局最小值,但出现非凸问题时,梯度下降算法很难找到全局最小值,而模型只有找到该值才能得到最好的结果。

上文中提到过,当成本函数的斜率等于或接近于零时,模型会停止学习。 在一些场景中,除了全局最小值外,局部最小值和鞍点也可能产生这种斜率。 在全局最小值处,成本函数的斜率在当前点的任意一侧都会增加,而局部最小值可以模拟全局最小值处的特征。 而对于鞍点,负梯度只存在于点的一侧,在一侧达到局部最大值,在另一边达到局部最小值。 它的名字来源于马鞍。

嘈杂梯度可以帮助梯度避开局部最小值和鞍点。

(2)消失和爆炸梯度

在更深层次的神经网络中,特别是在递归神经网络中,当使用梯度下降算法和反向传播算法训练模型时,我们还会遇到另外两个问题。

  • 消失梯度: 在梯度过小时发生。 当我们在反向传播过程中向后移动时,梯度将持续变小,导致网络中早期层的学习速度比后期层慢。 当这种情况发生时,权重参数会进行更新,直到它们变得微不足道 — 即等于零,这将导致算法不再学习。

  • 爆炸梯度: 在梯度太大时会发生这种情况,导致创建的模型不稳定。 在这种情况下,模型权重会变得太大,并最终表示为 NaN。 解决这个问题的一种方法是利用降维技术,这有助于最大程度地降低模型中的复杂性。

五、激活函数

激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。

激活函数可以引入非线性因素。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。

没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。

激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。

1、激活函数作用

在前面的神经元的介绍过程中我们提到了激活函数,那么它到底是干什么的呢?

激活函数很重要的一个作用就是增加模型的非线性分割能力。引入非线性激活函数,可使深层神经网络的表达能力更加强大。

激活函数作用

在神经元中引入了 激活函数 ,它的本质是向神经网络中引入非线性因素的,通过激活函数,神经网络就可以拟合各种曲线。

如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,引入非线性函数作为激活函数,那输出不再是输入的线性组合,可以逼近任意函数。

2、激活函数种类

1、Identity 函数

函数表达式如下。

导数表达式如下。

总结

优点

  • 适合于潜在行为是线性(与线性回归相似)的任务。

缺点

  • 无法提供非线性映射,当多层网络使用 identity 激活函数时,整个网络就相当于一个单层模型。

2、Sigmoid 函数

Sigmoid 函数,也叫做 logistics 函数。

函数表达式如下。

曲线图像如下所示:

导数表达式如下:

导数图像如下所示:

总结

优点

  • sigmoid 在定义域内处处可导,且两侧导数逐渐趋近于 0。
  • 输出映射在 (0,1) 之间,单调连续,输出范围有限,优化稳定,可用作输出层。
  • 求导容易。

缺点

  • 如果 x 的值很大或者很小的时候,那么函数的梯度(函数的斜率)会非常小,在反向传播的过程中,导致了向低层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为 梯度消失
  • 幂运算复杂,训练时间长

总结

  • sigmoid 函数可应用在训练过程中。然而,当处理多分类问题作出输出时,sigmoid 却无能为力。
  • 简单地说,sigmoid 函数只能处理两个类(二分类问题),不适用于多分类问题。
  • sigmoid 函数一般只用于 二分类 的输出层。

3、Tanh 函数

tanh 双曲正切曲线,也是一种非常常见的激活函数,数学表达式如下:

曲线图像如下:

导数公式如下所示:

导数图像如下所示:

总结

优点

  • 与 sigmoid 相比,它是以 0 为中心的。
  • 使得其收敛速度要比 sigmoid 快(相比之下,tanh 曲线更为陡峭一些),减少迭代次数。

缺点

  • 从图中可以看出,tanh 两侧的导数也为 0,同样会造成梯度消失。
  • 幂运算复杂,训练时间长。

总结

  • 若使用时可在隐藏层使用 tanh 函数,在输出层使用 sigmoid 函数

4、ReLU 函数

ReLU 是目前最常用的激活函数,数学表达式为:

函数曲线如下所示:

导数公式如下所示:

导数图像如下所示:

总结

优点

  • 当 x ≥ 0 时,则不存在饱和问题,ReLU 能够在 x ≥ 0 时导数为常数,保持梯度不衰减,从而缓解梯度消失问题。 收敛速度远快于 sigmoid 和 tanh,因为 sigmoid 和 tanh 涉及很多幂运算。
  • 收敛速度远快于 sigmoid 和 tanh,因为 sigmoid 和 tanh 涉及很多幂运算。
  • 当 x < 0 时,ReLU 导数为 0,提供了神经网络的稀疏表达能力。即 Relu 会使一部分神经元的输出为 0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生,降低模型复杂度,提高模型泛化能力。
  • 采用 sigmoid 函数,计算量大(指数运算),反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用 Relu 激活函数,整个过程的计算量节省很多。

缺点

  • 和 Sigmoid 激活函数类似,ReLU 的输出不是以 0 为中心的,ReLU 函数的输出为 0 或正数,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率。
  • Dead ReLU 问题,随着训练的推进,部分输入会落入小于 0 区域,导致对应权重无法更新,这种现象被称为“神经元死亡”。
  • Relu 是输入只能大于 0,如果你输入含有负数,Relu 就不适合。

总结

  • 如果输入是图片格式,Relu 就挺常用的,因为图片的像素值作为输入时取值为 [0,255]。

5、LeakyReLu 函数

LeakyReLu 激活函数是对 RELU 的改进,把 x 的非常小的线性分量给予负输入,即 αx 来调整负值的零梯度问题,数学表达式为:

其中,α 通常取值为 0.01 左右。

函数曲线如下所示:

导数公式如下所示:

导数图像如下所示:

总结

优点

  • Leaky ReLU 有 ReLU 的所有优点,外加不会有 Dead ReLU 问题。

缺点

  • 输出不是以 0 为中心的。
  • 无法避免梯度爆炸问题。

总结

  • 在实际操作当中,并没有完全证明 Leaky ReLU 总是好于 ReLU。

6、SoftMax 函数

softmax 用于多分类过程中,它是二分类函数 sigmoid 在多分类上的推广,目的是将多分类的结果以概率的形式展现出来,即对神经网络全连接层输出进行变换,使其服从概率分布,即每个值都位于 [0,1] 区间且和为 1。

数学表达式如下:

其中:

  • K:类别个数
  • Z​i:输入数据
  • Yi:输入数据 Zi 映射到第 i个类别的概率

使用方法如下:

softmax 直白来说就是将网络输出的 logits 通过 softmax 函数,就映射成为 (0,1) 的值,而这些值的累和为 1(满足概率的性质),那么我们将它理解成概率,选取概率最大(也就是值对应最大的)接点,作为我们的预测目标类别。

7、总结对比


8、如何选择激活函数?

  • 隐藏层
    • 优先选择 RELU 激活函数
    • 如果 ReLu 效果不好,那么尝试其他激活,如 Leaky ReLu 等。
    • 如果你使用了 Relu, 需要注意一下 Dead Relu 问题, 避免出现大的梯度从而导致过多的神经元死亡。
    • 避免使用 sigmoid 激活函数,可以尝试使用 tanh 激活函数。
  • 输出层
    • 二分类问题选择 sigmoid 激活函数
    • 多分类问题选择 softmax 激活函数
    • 回归问题选择 identity 激活函数

激活函数的作用除了前面说的增加模型的非线性分割能力外,还有:

  • 提高模型鲁棒性
  • 缓解梯度消失问题
  • 加速模型收敛

8、以 0 为中心的好处?

为了描述方便,我们以二维的情况为例。亦即,神经元描述为:

已知 x0 和 x1 的值,需要找到最佳的权重 w0 和 w1。

假设,参数 w0、w1 的最优解 w0^、w1^ 满足条件如下:

也就是说,我们希望 w0 适当增大,但希望 w1 适当减小,而权重的增大和减小,与输入x 相关( x 为正数,w 减小)。

我们以 sigmoid 函数为例,假设上一层的神经网络激活函数为 sigmoid 函数。

通过导数图像可以发现,sigmoid 的导数输出结果恒大于 0,这就导致 w0、w1 要同时增加和减小,只是增加和减小的幅度不同,Z 字型下降收敛逼近最优解,无疑这会增加迭代次数,降低收敛速度。

最终结果如下所示:

六、网络操作与计算

了解了神经网络后,在神经网络中,神经网络结构就像骨架,而每一层的权重则是神经网络的血肉。

那么,每一层的权重应该如何计算呢?

神经网络的训练计算主要有两种:

  • 前向传播(foward propagation,FP):作用于每一层的输入,通过逐层计算得到输出结果,用于求误差
  • 反向传播(backward propagation,BP):作用于网络的输出,通过计算梯度由深到浅更新网络参数,用于误差回传

1、前向传播(FP)

1、前向传播概念

前向传播,是从神经网络的输入层开始,逐渐往输出层进行前向传播,上一层的神经元与本层的神经元有连接,那么本层的神经元的激活等于上一层神经元对应的权值进行加权和运算,最后通过一个非线性函数(激活函数)如 ReLu,sigmoid 等函数,最后得到的结果就是本层神经元的输出。神经网络逐层逐神经元通过该操作向前传播,最终得到输出层的结果。

简单理解,前向传播就是将上一层的输出作为下一层的输入,并计算下一层的输出,一直到运算到输出层为止。

2、前向传播数学推导

接下来我们用数学公式描述一下:

说明

  • 假设上一层结点 i, j, k ... 等一些结点与本层的结点 w 有连接,那么结点 w 的值怎么算呢?
  • 就是通过上一层的 i,j,k,... 等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项(图中为了简单省略了),最后在通过一个非线性函数(即激活函数),如 Relu,Sigmoid 等函数,最后得到的结果就是本层结点 w 的输出。
  • 最终不断的通过这种方法一层层的运算,得到输出层结果。

3、前向传播作用

  • 前向传播是为反向传播准备好要用到的数值,即根据训练输入的数据 xi,得到预测值 yi^
  • 前向传播计算出了预测值 yi^ ,就可以根据预测值 yi^​ 和真实值 yi 的差别来计算损失 Loss(yi^, yi)。

2、反向传播(BP)

(1)反向传播概念

反向传播就是根据损失函数来反方向地计算每一层的参数,从最后一层逐层向前去改变每一层的权重,也就是更新参数,其核心是损失 Loss(yi^, yi) 对每一层的每一个参数求梯度的链式求导法则。

简单理解,反向传播本质上是一种求梯度的高效方法

(2)反向传播数学推导

说明

由于我们前向传播最终得到的结果,以分类为例,最终总是有误差的,那么怎么减少误差呢,当前应用广泛的一个算法就是梯度下降算法,但是求梯度就要求偏导数,下面以图中字母为例讲解一下:

设最终误差为 E 且输出层的激活函数为线性激活函数,对于输出那么 E 对于输出节点 yi 的偏导数是 yi - ti,其中 ti 是真实值,αyiαzi 是指上面提到的激活函数,zi 是上面提到的加权和,那么这一层的 E 对于 zi 的偏导数为 αEαzi = αEαyi * αyiαzi 。同理,下一层也是这么计算,只不过 αEαyk 计算方法变了,一直反向传播到输入层,最后有 αEαxi = αEαyi * αyiαzj ,且 αziαxi = Wij 。然后调整这些过程中的权值,再不断进行前向传播和反向传播的过程,最终得到一个比较好的结果。

(3)反向传播作用

不断更新模型参数。

3、总结

  • 前向传播是为反向传播准备好要用到的数值
  • 反向传播本质上是一种求梯度的高效方法
  • 求梯度是为了什么呢?就是为了更新模型的参数(权重 w 和偏置 b)

可以把训练神经网络和论文发表做类比:

步骤描述论文写作神经网络训练
1参数初始化论文随机乱写随机初始化参数(权重 w 和偏置 b)
2前向传播提交论文输入 xi ,得到预测值 yi^
3损失函数根据标准进行审稿真实值 yi 与 预测值 yi^ 之间的差距
4反向传播审稿人:第一章不符合标准,改!重新调整参数(权重 w 和偏置 b)
5迭代 N 次重复 2~4 步骤重复 2~4 步骤
6训练完成论文发表模型训练完毕

七、常用概念解释

1、数据集

  • Training Data Set:训练数据集,用于模型学习的样本数据
  • Validation Data Set:验证数据集,模型训练阶段用于调整参数
  • Test Data Set:测试数据集,模型评估阶段使用

2、模型训练

  • Batch:将整个训练样本分成若干个 Batch

  • Batch Size:一次训练所选取的样本数,Batch_Size = 10 指的是每次扔进神经网络训练的数据是 10 个

  • Iteration:训练一个 Batch 就是一次 Iteration,即一次前向传播和反向传播过程

  • Epoch:训练一次所有样本数据的过程,epoch = 10 指的是把整个数据集丢进神经网络训练 10 次

  • Learning Rate:学习率,梯度下降的速率

  • Activation Function:激活函数

  • Regularization:参数正则化,限制其较高次的参数大小不能过大,防止模型过拟合。

    • L2 正则化:对于绝对值较大的权重予以很重的惩罚,对于绝对值很小的权重予以非常非常小的惩罚,当权重绝对值趋近于 0 时,基本不惩罚。
    • L1 正则化:于所有权重予以同样的惩罚,使得较小权重惩罚后结果为 0。因此,大部分模型参数的值等于 0,稀疏化模型,节省训练时间。

    八、总结回顾

    1、曲折发展

回顾一下神经网络发展的历程。神经网络的发展历史曲折荡漾,既有被人捧上天的时刻,也有摔落在街头无人问津的时段,中间经历了数次大起大落。

从单层神经网络(感知器)开始,到包含一个隐藏层的两层神经网络,再到多层的深度神经网络,一共有三次兴起过程。详见下图:

上图中的顶点与谷底可以看作神经网络发展的高峰与低谷。图中的横轴是时间,以年为单位。纵轴是一个神经网络影响力的示意表示。如果把 1949 年 Hebb 模型提出到 1958 年的感知机诞生这个 10 年视为落下(没有兴起)的话,那么神经网络算是经历了“三起三落”这样一个过程,跟“小平”同志类似。俗话说,天将降大任于斯人也,必先苦其心志,劳其筋骨。经历过如此多波折的神经网络能够在现阶段取得成功也可以被看做是磨砺的积累吧。

历史最大的好处是可以给现在做参考。科学的研究呈现螺旋形上升的过程,不可能一帆风顺。同时,这也给现在过分热衷深度学习与人工智能的人敲响警钟,因为这不是第一次人们因为神经网络而疯狂了。1958 年到 1969 年,以及 1985 年到 1995,这两个十年间人们对于神经网络以及人工智能的期待并不现在低,可结果如何大家也能看的很清楚。

因此,冷静才是对待目前深度学习热潮的最好办法。如果因为深度学习火热,或者可以有“钱景”就一窝蜂的涌入,那么最终的受害人只能是自己。神经网络界已经两次有被人们捧上天了的境况,相信也对于捧得越高,摔得越惨这句话深有体会。因此,神经网络界的学者也必须给这股热潮浇上一盆水,不要让媒体以及投资家们过分的高看这门技术。很有可能,三十年河东,三十年河西,在几年后,神经网络就再次陷入谷底。根据上图的历史曲线图,这是很有可能的。

2、神经网络现状

下面说一下神经网络为什么能这么火热?简而言之,就是其学习效果的强大。随着神经网络的发展,其表示性能越来越强。

从单层神经网络,到两层神经网络,再到多层神经网络,下图说明了,随着网络层数的增加,以及激活函数的调整,神经网络所能拟合的决策分界平面的能力。

以看出,随着层数增加,其非线性分界拟合能力不断增强。图中的分界线并不代表真实训练出的效果,更多的是示意效果。

神经网络的研究与应用之所以能够不断地火热发展下去,与其强大的函数拟合能力是分不开关系的。

当然,光有强大的内在能力,并不一定能成功。一个成功的技术与方法,不仅需要内因的作用,还需要时势与环境的配合。神经网络的发展背后的外在原因可以被总结为:更强的计算性能,更多的数据,以及更好的训练方法。只有满足这些条件时,神经网络的函数拟合能力才能得已体现,见下图。

之所以在单层神经网络年代,Rosenblat 无法制作一个双层分类器,就在于当时的计算性能不足,Minsky 也以此来打压神经网络。但是 Minsky 没有料到,仅仅 10 年以后,计算机 CPU 的快速发展已经使得我们可以做两层神经网络的训练,并且还有快速的学习算法 BP。

但是在两层神经网络快速流行的年代。更高层的神经网络由于计算性能的问题,以及一些计算方法的问题,其优势无法得到体现。直到 2012 年,研究人员发现,用于高性能计算的图形加速卡(GPU)可以极佳地匹配神经网络训练所需要的要求:高并行性,高存储,没有太多的控制需求,配合预训练等算法,神经网络才得以大放光彩。

互联网时代,大量的数据被收集整理,更好的训练方法不断被发现。所有这一切都满足了多层神经网络发挥能力的条件。

“时势造英雄”,正如 Hinton 在 2006 年的论文里说道的:

provided that computers were fast enough, data sets were big enough, and the initial weights were close enough to a good solution. All three conditions are now satisfied.

外在条件的满足也是神经网络从神经元得以发展到目前的深度神经网络的重要因素。

除此以外,一门技术的发扬没有“伯乐”也是不行的。在神经网络漫长的历史中,正是由于许多研究人员的锲而不舍,不断钻研,才能有了现在的成就。前期的 Rosenblat,Rumelhart 没有见证到神经网络如今的流行与地位。但是在那个时代,他们为神经网络的发展所打下的基础,却会永远流传下去,不会退色。

3、未来展望:量子计算

回到我们对神经网络历史的讨论,根据历史趋势图来看,神经网络以及深度学习会不会像以往一样再次陷入谷底?我认为,这个过程可能取决于量子计算机的发展。

根据一些最近的研究发现,人脑内部进行的计算可能是类似于量子计算形态的东西。而且目前已知的最大神经网络跟人脑的神经元数量相比,仍然显得非常小,仅不及 1%左右。所以未来真正想实现人脑神经网络的模拟,可能需要借助量子计算的强大计算能力。

各大研究组也已经认识到了量子计算的重要性。谷歌就在开展量子计算机 D-wave 的研究,希望用量子计算来进行机器学习,并且在前段时间有了突破性的进展。国内方面,阿里和中科院合作成立了量子计算实验室,意图进行量子计算的研究。

如果量子计算发展不力,仍然需要数十年才能使我们的计算能力得以突飞猛进的发展,那么缺少了强大计算能力的神经网络可能会无法一帆风顺的发展下去。这种情况可以类比为 80-90 年时期神经网络因为计算能力的限制而被低估与忽视。假设量子计算机真的能够与神经网络结合,并且助力真正的人工智能技术的诞生,而且量子计算机发展需要 10 年的话,那么神经网络可能还有 10 年的发展期。直到那时期以后,神经网络才能真正接近实现 AI 这一目标。

九、常用框架

  • Caffe - 已废
    • 源于 Berkeley 的主流 CV 工具包,支持 C++,python,matlab
    • Model Zoo 中有大量预训练好的模型供使用
  • TensorFlow - 已废
    • Google 的深度学习框架
    • TensorBoard 可视化很方便
    • 数据和模型并行化好,速度快
  • PyTorch - 核心
    • Facebook 用的卷积神经网络工具包
    • 通过时域卷积的本地接口,使用非常直观
    • 定义新网络层简单

十、神经网络可视化

Tersonflow 推出了神经网络的可视化工具—— Tersonflow Playground,能够模拟演示神经网络的运行。

色和蓝色在整个可视化中的使用方式略有不同,但通常橙色显示负值,而蓝色显示正值。

数据点(用小圆圈表示)最初为橙色或蓝色,对应于正数和负数。

在隐藏层中,线条由神经元之间的连接权重着色。蓝色显示正权重,这意味着网络正在使用给定的神经元输出。橙色线表明网络正在分配负权重。

在输出层中,点根据其原始值呈现为橙色或蓝色。背景颜色显示网络对特定区域的预测。颜色的强度表明预测的可信度。

https://cs.stanford.edu/people/karpathy/convnetjs/

Released under the MIT License.