1 人工神经网络
1.1 神经元
神经网络由大量的神经元相互连接而成。每个神经元承受线性组合的输出后,最开始只是简略的线性加权,起初给每个神经元加上了非线性的激活函数,从而进行非线性变换后输入。每两个神经元之间的连贯代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输入。举个手写辨认的例子,给定一个未知数字,让神经网络辨认是什么数字。此时的神经网络的输出由一组被输出图像的像素所激活的输出神经元所定义。在通过非线性激活函数进行非线性变换后,神经元被激活而后被传递到其余神经元。反复这一过程,直到最初一个输入神经元被激活。从而辨认以后数字是什么字。神经网络的每个神经元如下
根本 wx + b 的模式,其中 x1、x2 示意输出向量 w1、w2 为权重,几个输出则意味着有几个权重,即每个输出都被赋予一个权重 b 为偏置 bias g(z) 为激活函数 a 为输入 如果只是下面这样一说,预计以前没接触过的十有八九又必然迷糊了。事实上,上述简略模型能够追溯到 20 世纪 50/60 年代的感知器,能够把感知器了解为一个依据不同因素、以及各个因素的重要性水平而做决策的模型。举个例子,这周末北京有一草莓音乐节,那去不去呢?决定你是否去有二个因素,这二个因素能够对应二个输出,别离用 x1、x2 示意。此外,这二个因素对做决策的影响水平不一样,各自的影响水平用权重 w1、w2 示意。一般来说,音乐节的演唱嘉宾会十分影响你去不去,唱得好的前提下 即使没人陪同都可忍受,但如果唱得不好还不如你下台唱呢。所以,咱们能够如下示意:x1:是否有喜爱的演唱嘉宾。x1 = 1 你喜爱这些嘉宾,x1 = 0 你不喜爱这些嘉宾。嘉宾因素的权重 w1 = 7 x2:是否有人陪你同去。x2 = 1 有人陪你同去,x2 = 0 没人陪你同去。是否有人陪同的权重 w2 = 3。这样,咱们的决策模型便建设起来了:g(z) = g(w1x1 + w2x2 + b ),g 示意激活函数,这里的 b 能够了解成 为更好达到目标而做调整的偏置项。一开始为了简略,人们把激活函数定义成一个线性函数,即对于后果做一个线性变动,比方一个简略的线性激活函数是 g(z) = z,输入都是输出的线性变换。起初理论利用中发现,线性激活函数太过局限,于是人们引入了非线性激活函数。
1.2 激活函数
罕用的非线性激活函数有 sigmoid、tanh、relu 等等,前两者 sigmoid/tanh 比拟常见于全连贯层,后者 relu 常见于卷积层。这里先简要介绍下最根底的 sigmoid 函数(btw,在本博客中 SVM 那篇文章结尾有提过)。sigmoid 的函数表达式如下
其中 z 是一个线性组合,比方 z 能够等于:b + w1x1 + w2x2。通过代入很大的负数或很小的正数到 g(z)函数中可知,其后果趋近于 0 或 1。因而,sigmoid 函数 g(z)的图形示意如下(横轴示意定义域 z,纵轴示意值域 g(z)):
也就是说,sigmoid 函数的性能是相当于把一个实数压缩至 0 到 1 之间。当 z 是十分大的负数时,g(z)会趋近于 1,而 z 是十分小的正数时,则 g(z)会趋近于 0。压缩至 0 到 1 有何用处呢?用途是这样一来便能够把激活函数看作一种“分类的概率”,比方激活函数的输入为 0.9 的话便能够解释为 90% 的概率为正样本。举个例子,如下图(图引自 Stanford 机器学习公开课)
z = b + w1x1 + w2x2,其中 b 为偏置项 假设取 -30,w1、w2 都取为 20
如果 x1 = 0 x2 = 0,则 z = -30,g(z) = 1/(1 + e^-z)趋近于 0。此外,从上图 sigmoid 函数的图形上也能够看出,当 z =-30 的时候,g(z)的值趋近于 0 如果 x1 = 0 x2 = 1,或 x1 =1 x2 = 0,则 z = b + w1x1 + w2x2 = -30 + 20 = -10,同样,g(z)的值趋近于 0 如果 x1 = 1 x2 = 1,则 z = b + w1x1 + w2x2 = -30 + 201 + 201 = 10,此时,g(z)趋近于 1。换言之,只有和都取 1 的时候,g(z)→1,断定为正样本;或取 0 的时候,g(z)→0,断定为负样本,如此达到分类的目标。
1.3 神经网络 将下图的这种单个神经元
组织在一起,便造成了神经网络。下图便是一个三层神经网络构造
上图中最右边的原始输出信息称之为输出层,最左边的神经元称之为输入层(上图中输入层只有一个神经元),两头的叫暗藏层。啥叫输出层、输入层、暗藏层呢?输出层(Input layer),泛滥神经元(Neuron)承受大量非线形输出讯息。输出的讯息称为输出向量。输入层(Output layer),讯息在神经元链接中传输、剖析、衡量,造成输入后果。输入的讯息称为输入向量。暗藏层(Hidden layer),简称“隐层”,是输出层和输入层之间泛滥神经元和链接组成的各个层面。如果有多个暗藏层,则意味着多个激活函数。同时,每一层都可能由单个或多个神经元组成,每一层的输入将会作为下一层的输出数据。比方下图两头暗藏层来说,暗藏层的 3 个神经元 a1、a2、a3 皆各自承受来自多个不同权重的输出(因为有 x1、x2、x3 这三个输出,所以 a1 a2 a3 都会承受 x1 x2 x3 各自别离赋予的权重,即几个输出则几个权重),接着,a1、a2、a3 又在本身各自不同权重的影响下 成为的输入层的输出,最终由输入层输入最终后果。
上图(图引自 Stanford 机器学习公开课)中 示意第 j 层第 i 个单元的激活函数 / 神经元 示意从第 j 层映射到第 j + 1 层的管制函数的权重矩阵 此外,输出层和暗藏层都存在一个偏置(bias unit),所以上图中也减少了偏置项:x0、a0。针对上图,有如下公式
此外,上文中讲的都是一层暗藏层,但理论中也有多层暗藏层的,即输出层和输入层两头夹着数层暗藏层,层和层之间是全连贯的构造,同一层的神经元之间没有连贯。
2 卷积神经网络之层级构造
cs231n 课程里给出了卷积神经网络各个层级构造,如下图
上图中 CNN 要做的事件是:给定一张图片,是车还是马未知,是什么车也未知,当初须要模型判断这张图片里具体是一个什么货色,总之输入一个后果:如果是车 那是什么车 所以 最右边是数据输出层,对数据做一些解决,比方去均值(把输出数据各个维度都核心化为 0,防止数据过多偏差,影响训练成果)、归一化(把所有的数据都归一到同样的范畴)、PCA/ 白化等等。CNN 只对训练集做“去均值”这一步。两头是 CONV:卷积计算层,线性乘积 求和。RELU:激励层,上文 2.2 节中有提到:ReLU 是激活函数的一种。POOL:池化层,简言之,即取区域均匀或最大。最左边是 FC:全连贯层 这几个局部中,卷积计算层是 CNN 的外围,下文将重点论述。
3 CNN 之卷积计算层
3.1 CNN 怎么进行辨认
当咱们给定一个 ”X” 的图案,计算机怎么辨认这个图案就是“X”呢?一个可能的方法就是计算机存储一张规范的“X”图案,而后把须要辨认的未知图案跟规范 ”X” 图案进行比对,如果二者统一,则断定未知图案即是一个 ”X” 图案。而且即使未知图案可能有一些平移或稍稍变形,仍然能分别出它是一个 X 图案。如此,CNN 是把未知图案和规范 X 图案一个部分一个部分的比照,如下图所示 [图来自参考文案 25]
而未知图案的部分和规范 X 图案的部分一个一个比对时的计算过程,便是卷积操作。卷积计算结果为 1 示意匹配,否则不匹配。接下来,咱们来理解下什么是卷积操作。
3.2 什么是卷积
对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又能够看做一个恒定的滤波器 filter)做内积(一一元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字起源。非严格意义上来讲,下图中红框框起来的局部便能够了解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。
OK,举个具体的例子。比方下图中,图中右边局部是原始输出数据,图中两头局部是滤波器 filter,图中左边是输入的新的二维数据。
合成下上图
对应地位上是数字先相乘后相加
= 两头滤波器 filter 与数据窗口做内积,其具体计算过程则是:40 + 00 + 00 + 00 + 01 + 01 + 00 + 01 + -42 = -8
3.3 图像上的卷积
在下图对应的计算过程中,输出是肯定区域大小 (widthheight) 的数据,和滤波器 filter(带着一组固定权重的神经元)做内积后等到新的二维数据。具体来说,右边是图像输出,两头局部就是滤波器 filter(带着一组固定权重的神经元),不同的滤波器 filter 会失去不同的输入数据,比方色彩深浅、轮廓。相当于如果想提取图像的不同特色,则用不同的滤波器 filter,提取想要的对于图像的特定信息:色彩深浅或轮廓。如下图所示 3.4 GIF 动静卷积图 在 CNN 中,滤波器 filter(带着一组固定权重的神经元)对部分输出数据进行卷积计算。每计算完一个数据窗口内的部分数据后,数据窗口一直平移滑动,直到计算完所有数据。这个过程中,有这么几个参数:a. 深度 depth:神经元个数,决定输入的 depth 厚度。同时代表滤波器个数。b. 步长 stride:决定滑动多少步能够到边缘。c. 填充值 zero-padding:在外围边缘补充若干圈 0,不便从初始地位以步长为单位能够刚好滑倒开端地位,艰深地讲就是为了总长能被步长整除。