神经网络是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具,神经网络通常是通过一个基于数学统计学类型的学习方法(Learning Method)得以优化,所以也是数学统计学方法的一种实际应用,通过统计学的标准数学方法我们能够得到大量的可以用函数来表达的局部结构空间,另一方面在人工智能学的人工感知领域,基于数学统计学的应用,神经网络能够类似人一样具有简单的决定能力和简单的判断能力,这种方法比起正式的逻辑学推理演算更具有优势。
对人类中枢神经系统的观察启发了人工神经网络这个概念。在人工神经网络中,简单的人工节点,称作神经元(Neurons),连接在一起形成一个类似生物神经网络的网状结构。
在深度学习神经网络中,被生物学启发的那种方法已经很大程度上被抛弃了,取而代之的是基于统计学和信号处理的更加实用的方法。在一些现代算法中,神经网络只是大型系统中的一个部分,和传统的连接主义人工智能已经没有任何关联了。不过它们还有一些共同点:非线性、分布式、并行化,局部性计算以及适应性。从历史的角度讲,神经网络模型的应用标志着二十世纪八十年代后期从高度符号化的人工智能(以用条件规则表达知识的专家系统为代表)向低符号化的机器学习(以用动力系统的参数表达知识为代表)的转变。
深度学习的概念是从人工神经网络的研究中发展而来的,早期的感知器模型只能解决简单的线性分类问题,后来发现通过增加网络的层数可以解决类似于“异或问题”的线性不可分问题,这种多层的神经网络又被称为多层感知器。对于多层感知器,我们使用反向传播算法进行模型的训练,但是我们发现反向传播算法有着收敛速度慢,以及容易陷入局部最优等缺点,导致无法很好的训练多层感知器。另外,当时使用的激活函数也存在着梯度消失的问题,这使得人工神经网络的发展几乎陷入了停滞状态。为了让多层神经网络能够训练,学者们探索了很多的改进方案,直到2006年Hinton等人基于深度置信网络(DBN)提出了非监督贪心逐层训练算法,才让这一问题的解决有了希望,而深度学习的浪潮也由此掀起。
初期的深度学习算法,旨在模拟生物学习的计算模型,即大脑怎样学习或为什么能学习的模型。其结果是深度学习以人工神经网络之名而淡去。彼时,深度学习模型被认为是收受生物大脑(无论人类大脑或其他动物的大脑)所启发而设计出来的系统。尽管有些机器学习的神经网络有时被用来理解大脑功能,但它们一般都没有设计成生物的真实模型。
深度学习的观点收两个主要思想启发:
迄今为止深度学习已经经历了3次发展浪潮:
1940 - 1960s, 深度学习的雏形初现在控制论(Cybernetics), 随着生物学习理论的发展和第一个模型感知器(Perceptron)的实现, 能实现单个神经元的训练
1980 - 1990s, 深度学习表现为联结主义(Connectionism), 可以使用反向传播训练具有一两个隐藏层的神经网络
2006 - 持续至今,才真正以深度学习之名复兴
第一次浪潮:感知器
McCulloch-Pitts神经元 (McCulloch and Pitts,1943) 是脑功能的早期模型。该线性模型通过检验函数 f(x,w)f(x,w) 的正负来识别两个不同类别的输出。模型的权重需要正确设置后才能使模型的输出对应于期望的类别。1950年代,感知器 (Rosenblatt, 1956) 成为第一个能根据每个类别的输入样本来学习权重的模型。同一时期,自适应线性单元 (Adaptive Linear Element, ADALINE) 简单地返还函数 f(x)f(x) 本身的值来预测一个实数,并且还可以学习从数据预测这些数。
这两种初代神经网络模型被称为线性模型 (Linear Model)。它本身具有很多局限性,比如无法学习异或函数,即 f([0,1],w) = 1f([0,1],w)=1 和 f([1,0],w) = 1f([1,0],w)=1, 但 f([1,1],w) = 0f([1,1],w)=0 和 f([0,0],w)=0f([0,0],w)=0。最终,线性模型这个缺陷使受生物学启发的神经网络热潮第一次衰退。
第二次浪潮:多层传感器
1980年,神经网络研究的第二次浪潮是伴随这联结主义或并行分布处理 (Parallel Distributed Processing) 潮流而出现的。联结主义的中心思想是,当网络将大量简单的计算单元连接在一起时可以实现智能行为。这种见解同样适用于生物神经系统的神经元,因为其与计算模型中的隐藏单元有相识的作用。与此同时,得益于分布式表示 (Distributed Representation)的思想, 反向传播 (Back Propagation)算法的普及,及长短期记忆 (Long Short-Term Memory, LSTM) 在序列建模的进展,神经网络迎来了持续十年的热潮。多层传感器 (MultiLayer Preceptron, MLP), 或 前馈神经网络 (Feedforwad Neural Network, FNN) 此时应运而生。
遗憾的是,90年代初期无论是数据集、模型规模、机器算力都无法匹配AI创业投资者与日俱增的精度、复杂度需求。同时,机器学习的其他领域取得了突破性进展,比如核方法 (Kernel Method) 和 图模型 (Graph Model) 都在重要任务上展现出了统治性的优势。与之相反,神经网络还需要具备经验的技术人员繁琐而耗时的调试环节,进而导致了神经网络热潮的第二次衰退。
第三次浪潮:深度网络
神经网络研究的第三次浪潮始于2006年的技术突破。Geoffrey Hinton提出深度信念网络 (Deep Belief Network, DBN) 可以使用 贪婪逐层预训练 的策略来有效的进行训练。此项策略很快被证明同样适用于许多其他类型的深度网络,并能系统地帮助提高在测试样例上的泛化能力。神经网络研究的这一次浪潮普及了 深度学习 这一术语,强调当前在硬件技术的革新下,有能力训练以前不可能训练的深度模型。直到此时,人们才意识到1980年代就存在的算法就已经能取得很高的精度,而在20年后才真正体现出来,仅仅由于其计算成本太高,而当时可用的硬件难以支持足够的实验。
现在,当下流行的人工神经网络更多是依据实验与数学原理推导而出的深度模型,而神经科学被视为深度学习的一个重要灵感来源,早已不再是该领域的主要指导。因为人类如今连大脑最简单、最深入研究的部分都还远远没有理解,而根本没有足够的关于大脑的信息来指导人工神经网络如何训练。目前持续至今的第三次深度学习浪潮着眼于传统的监督学习算法,新兴的非监督学习技术,深度模型在小数据集的泛化能力和深度模型充分利用大型标注数据集的能力。
人工神经元 (Artificial Neuron), 简称神经元 (Neuron), 是构成神经网络的基本单元,其主要是模拟生物神经元的结构和特性,接受一组输入信号并产生输出。生物学家在 2020 世纪初就发现了生物神经元的结构。一个生物神经元通常具有多个树突和一条轴突,树突用来接收信息,轴突用来发送信息。当神经元所获得的输入信号的积累超过某个阈值时,它就处于兴奋状态,产生电脉冲。轴突尾端有许多末梢可以给其他神经元的树突以突触的形式产生连接,并将电脉冲信号传递给其他神经元。
假设一个神经元接受 nn 个输入 x_1,x_2,\dots,x_nx1,x2,…,xn ,令向量 x = [x_1;x_2;\dots;x_n]x=[x1;x2;…;xn] 来表示这组输入,并用净输出 z \in \Rez∈ℜ 表示一个神经元所获得的输入信息 xx 的加权和:
z = \sum^n_{i=1}w_ix_i + bz=∑i=1nwixi+b
其中 w = [w_1;w_2;\dots;w_n] \in \Re^nw=[w1;w2;…;wn]∈ℜn 是 nn 维的权重向量,b\in\Reb∈ℜ 是偏置。净输出 zz 在经过一个非线性函数 f(x)f(x) 激活函数 (Activition Function) 后,得到神经元的活性值 yy:
y = f(z)y=f(z)
神经网络的基本数据结构是层,层是一种数据处理模块,将一个或多个输入转换为一个或多个输出张量。换而言之,层从输入数据中提取表示,即需要的信息。大多数深度学习将简单的层逐一链接起来,从而实现渐进式的数据蒸馏。有的层是无状态的,如Dropout层,多用于正规化技术。但多数层是有状态的,即层的权重,是在训练过程中需要学习的值。
不同的张量格式与不同的数据处理类型需要用到不同的层:
2D张量[向量数据] \to→ 密集连接层 (Densely Connected Layer), 或称为全连接层 (Fully Connected Layer)
3D张量[序列数据] \to→ 循环层 (Recurrent Layer)
4D张量[图像数据] \to→ 二维卷积层 (Conv2D Layer)
深度学习模型是层构成的有向无环图。常见的表示形式为层的线性堆叠,将单一输入映射为单一输出。但现代深度网络更多进化为更为复杂的网络拓扑结构,一些常见的拓扑结构有:
双分支 (two-branch) 网络
多头 (multihead) 网络
Inception模块
网络的拓扑结构定义了一个假设控件,即为 “在预先定义好的可能性空间里,利用反馈信号的指引来寻找输入数据的有效表示”。 选定了网络拓扑结构意味着将 可能性空间 限定为一系列特定的张量运算,将输入数据映射为输出数据,再利用张量运算训练出每层的权重。而选择 正确 的网络结构更像是一门艺术而不是科学,需要不断的实践和对不同模型的理解,有时候更依赖对数据和数字的直觉。
神经网络训练阶段两个重要的参数,损失函数与优化器,需要综合考量模型架构、数据集类型与训练目标而确定:
损失函数: 也称为目标函数,能够衡量当前任务是否成功完成,且在模型训练过程中需要将其最小化。
优化器: 通过执行 随机梯度下降 (Stochastic Gradient Descent, SGD)决定如何基于损失函数对网络进行更新
具有多个输出的神经网络可能具有多个损失函数,但梯度下降过程必须基于单个标量损失值。对于具有多个损失函数的网络模型,需要将所有损失函数取平均形成一个标量值。
对于分类、回归、序列预测等常见问题,可以遵循简单的指导原则来选择正确的损失函数:
二分类问题: 二元交叉熵 (Binary CrossEntropy)
多分类问题: 分类交叉熵 (Categorical CrossEntropy)
回归问题: 均方误差 (Mean Squared Error)
序列学习问题: 联结主义时序分类 (Connectionism Temporal Classification)
深度网络 (Deep Network) 作为第三次深度学习浪潮的代表作,得益于科技水平的迭代发展使其在神经网络的基础上从深度与广度上进行了拓展。
3.5.1 数据量
19001900 年世纪初,统计学家使用 100 - 1,000100−1,000 大小的手动制作的度量来研究数
19501950 年- 19801980 年,机器学习研究者使用 100 - 1,000100−1,000 大小的合成数据集,如低分辨率的字母位图
19801980 年- 19901990 年,开始利用包含成千上万个样本的数据集,比如手写扫描数字数据集 MNIST 包含了 60,00060,000 样本
20002000 年世纪初,相同大小更复杂的数据集陆续出现,比如图像数据集 CIFAR-10
20102010 年- 20152015 年,数万至数千万的 10,000,00010,000,000 样本数据集的涌现完全激发了深度学习的潜力,比如大名鼎鼎的ImageNet
与日俱增的数据量是由社会日益数字化驱动的。基于互联网全球范围里的全面普及,大数据时代人类记录变得更容易集中管理,也更容易将其整理为适用于机器学习应用的数据集。如今盛行的经验法则认为,监督深度学习算法在每类未定约 5,0005,000 个标注样本的情况下能达到适用的性能,而当约 10,0000,00010,0000,000 个标注样本的数据集用于训练时,深度网络输出结果将达到或 超过 人类表现。
3.5.2 模型规格
第二次浪潮中,神经网络只能取得相对较小的成功。在核运算算法的统治下沉寂了数十年,而如今再次引领人工智能的潮流很重要的原因是现在拥有的计算资源可以运行更大的模型。联结主义的主要见解之一是,当动物的愈多神经元一起工作时愈发聪明,而单独神经元 (感知器) 或小集合神经元 (多层感知器) 不是特别有用。几十年来,神经网络从感知器逐步进化为深度网络,最终模型中每个神经元的连接数量已经和哺乳动物的大脑在同一数量级上。
由于多核高频CPU与通用GPU的出现、更快的网络连接和更好的分布式计算的软件基础框架,深度网络模型规格随着实践的推移不断增加是深度学习近代发展最重要的趋势。自从 隐藏单元 引入以来,人工神经网络的规模大约 每 2.42.4 年 扩大一倍。更大的网络能够在更复杂的任务中实现更高的精度,但基于当前前沿技术,直到2050年人工神经网络才能具备与人脑相同数量级的神经元。
经典算法模型神经元数量:
感知器 Preceptron 1950s : 101950s:10
多层感知器 MLP 1991s : 10^2 - 10^31991s:102−103 (蛔虫)
初代卷积网络 LeNet-5 1998s : 10^41998s:104 (水蛭)
深度信念网络 DBN 2006s : 10^42006s:104
GPU加速卷积网络 GPU-CNN 2006s : 10^52006s:105 (蚂蚁)
多GPU卷积网络 AlexNet 2012s : 10^62012s:106 (蜜蜂)
青蛙 : 10^7 \dots107…
章鱼 : 10^{8.5}\dots108.5…
人类 : 10^{11}1011
3.5.3 训练精度
1980年以来,深度学习提供精准识别和预测的能力一直在提高。从一开始,最基础的深度模型 MLP 被用来识别裁剪紧凑且非常小的 (28\times28)(28×28) 图像中的单个对象,到丰富的高分辨率照片,并且不需要再被识别的对象附件进行裁剪。最早的神经网络只能处理二分类问题,而再第三次深度学习浪潮中涌现出的现代模型很轻松的就能够识别至少 1000 个不同类别的对象。
对象识别中最大的比赛是每年举行的 ImageNet 大型视觉识别挑战 (ILSVRC)。自从2012年 Alex Krizhevsky的 AlexNet,使用卷积网络结合多台GPU并行训练的模型,将最高水准的 top-5 错误率从 25.8% 降低到 16.4%。此后数年,基于卷积网络、递归网络建立的 更宽更深 的深度模型连续数年将大赛精度降低至 2.3%,这一数字已经低于人类分类精度 5.1%。自此随着 ImageNet 数据集已无法对 state-of-art 深度网络造成挑战,ILSVRC 大赛也于 2017 年宣告结束,并呼吁AI界更多的资源倾向于更复杂的数据集与更难的任务应用上。
深度学习也对语音识别产生了巨大影响。在近 20 年的停止后,深度学习的引入使得语音识别错误率陡然下降,甚至优化了近一倍精准度。同样在 目标跟踪 与 图像分割 也取得了引人注目的表现,并且在交通标志分类上展示出超越人类的精准度。在深度网络的规模与精度逐步提高的同时,它们可以解决的任务也日益复杂。神经网络可以学习输出描述图像的整个字符序列,而不是仅仅识别单个对象。结合强化学习领域的扩展,研究者提出了自我编程技术的构想,展望未来通过人工智能训练人工智能。
张量在计算机科学领域多代表数据容器,其包含的数据几乎总是数值数据,所以其本质是一个 多维数组 (Multidimensional Array), 而张量的目的是能够创造更高维度的矩阵、向量。
张量是一个可用来表示在一些向量、纯量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 nn 维空间内,有 n^rnr 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换
张量是一个定义在一些向量空间和一些对偶空间的笛卡尔积上的多重线性映射,其坐标是|n|维空间内,有|n|个分量的一种量, 其中每个分量都是坐标的函数, 而在坐标变换时,这些分量也依照某些规则作线性变换。
计算机领域 numpy 库中,张量是由以下三个关键属性来定义的:
轴的个数 (rank): 如张量 AA 坐标位于 nn 维中的映射,则 AA 的轴为 nn, 轴同时表示此张量的维度
形状 (shape): 整式元组表示张量沿每个轴的维度大小(元素个数)
数据类型 (type): 张量中所包含数据的类型,可为 float32, unint8, float64float32,unint8,float64 等
4.1.1 标量
仅包含一个数字的张量叫做 标量 (Scalar), 也叫做标量张量,零维张量,0D张量。标量通常被赋予小写的变量名称 aa,而且在介绍标量时,会明确它们的类型。比如在定义实数标量时,会说 令 s\in\Res∈ℜ 表示一条线的斜率,或在定义自然数标量时,会说 令 s\in\Res∈ℜ 表示元素的数目。
在 numpy 中, 一个 float32 或 float64 的数字就是一个标量张量,可以用 ndim 属性查看张量轴的个数。定义明确标量张量有 0 个轴。
import numpy as np x = np.array(10) x
array(10)
print('The rank of scalar x is', x.ndim)
The rank of scalar x is 0
4.1.2 向量
数字组成的数组叫做 向量 (Vector) 或一维张量 (1D 张量)。向量通常被赋予粗体的小写变量名称 \boldsymbol aa ,其中包含的数时有序排列的,可以通过次序中的索引确定每个单独的数。如果每个元素都属于 \Reℜ ,并且该向量有 nn 个元素,那么该向量属于实数集 \Reℜ 的 nn 次笛卡尔乘积构成的集合,记为 \Re^nℜn。
x = \begin{bmatrix}x_1\\x_2\\\dots\\x_n\\\end{bmatrix} \qquadx=⎣⎢⎢⎢⎡x1x2…xn⎦⎥⎥⎥⎤
x = np.array([14,12,34,54,93]) x
array([14, 12, 34, 54, 93])
print('The rank of vector x is', x.ndim)
The rank of vector x is 1
4.1.3 矩阵
向量组成的数组叫做 矩阵 (Matrix) 或二维张量 (2D张量)。矩阵有 2 个轴,通常被称为 行 和 列 。矩阵通常被赋予矩阵粗体的大写变量名称,比如 \boldsymbol AA 。如果一个实数矩阵高度为 mm,宽度为 nn,那么 \boldsymbol A \in \Re^{m\times n}A∈ℜm×n。\boldsymbol A_{i,;}Ai,; 表示 \boldsymbol AA 中垂直坐标 ii 上的一横排元素,即 \boldsymbol AA 的第 ii 行(Row)。同样,\boldsymbol A_{;,i}A;,i 表示 \boldsymbol AA 的第 ii 列(Column)。
\boldsymbol A = \begin{bmatrix}A_{1,1},A_{1,2}\\A_{2,1},A_{2,2}\\\end{bmatrix} \qquadA=[A1,1,A1,2A2,1,A2,2]
x = np.array([[1,2,3], [4,5,6], [7,8,9]]) x
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print('The rank of matrix x is', x.ndim)
The rank of matrix x is 2
数据张量基本类别示例:
4.2.1 向量数据
向量数据是最常见的数据,其每个数据点都被编码为一个向量,因此一个数据批量就被编译为2D张量,其中第一个轴是 样本轴,第二个轴是 特征轴 。
4.2.2 序列数据
序列数据应被存储在带有 时间轴 的 3D张量中,其每个样本可以被编译为一个向量序列即 2D张量。
4.2.3 图像数据
图像通常具有三个维度:高度、宽度和颜色深度(RGB)。灰度图像只有一维的颜色通道,因此可以存储在 2D张量中。因此,给定图像大小为 224 \times 224224×224,100 张灰度图像可以存储在形状为 (100,224,224,1) 或 (100,224,224) 的张量中, 100 张彩色图像可以存储在形状为 (100,224,224,3) 的张量中
图像张量的形状有两种约定:
4.2.4 视频数据
视频数据是现实生活中需要用到 5D张量的少数数据类型之一。视频可以看作一系列帧,而每一帧就都是一张彩色图像,由于每一帧都可以存储在一个形状为 (height,width,channels) 的 3D张量中,因此一系列帧可以存储在一个形状为 (frames,height,width,channels) 的 带有类似 时间轴 的 4D张量中,而不同视频组成的批量就可以存储在一个形状为 (samples,frames,height,width,channels) 的 5D张量中。
本教材会着重讲解
开始实验