您知道怎样使用卷积神经网络吗?

卷积神经网络(CNN)究竟是什么,鉴于神经网络在工程上经历了曲折的历史,您为什么还会在意它呢? 对于这些非常中肯的问题,我们似乎可以给出相对简明的答案。

简言之,CNN是神经网络中的卷积步骤,是很多应用的关键方法,例如,视觉处理、笔迹识别、声纹分析、机器人,以及汽车辅助驾驶系统等。还能扩展到范围更广的嵌入式系统中。如果您希望掌握这一越来越广泛的应用的最新信息,那么,您应该非常关注它,因为CNN通常是这些问题的最佳解决方案,已经摆脱了在学术界的长期停留,进入了实际应用。

CNN某些重要的特性使其与传统的信号处理工具完全不同,体现在其功能以及您怎样设计它们上。相应的,CNN第一次的实际应用不是作为一种通用方法,而是专用黑盒,或者是工作台——对于使用它们的设计团队而言,大部分内部复杂的东西都是隐藏的。但还是让我们从头开始阐述。

卷积什么?

i-Abra CTO Greg Compton解释说:“了解CNN最简单的方法是开发一个功能非常强大的多对一滤波器。”例如,您会设计一个处理一帧高清晰视频的CNN,输出一个比特代表帧中是否有行人出现。

过去通过很多方法实现了这种目标识别工作。最常用、最直观的方法是基于规则的:针对预定义形状搜索图像,把形状位置置入到一个分类器中,设定分类器规则,哪些形状组合会是一个人。在抽象测试中,这类系统能够很好的执行。但是,在位置、姿势、灯光和噪声水平发生变化的真实图像中,这些还不够。

另一个极端则是神经网络。1940年,研究人员开始研究动物某些特殊的神经细胞是怎样工作的。这导致上世纪60年代的电子化发展,最终出现计算机、神经元模型,应用于小规模网络中,旨在解决某些具体的问题。这些问题的特征一般是极低的信噪比,要寻找的图案在很宽的范围内出现,或者很难定义要探测的目标。

到1990年,研究人员建立了神经网络——特别是深度学习神经网络,在图像识别和目标分类上非常成功。而深度学习网络包括了人工神经元连续层,每一个神经元处理前一层所有神经元输出的加权和。结果非常好——但是,如果输入是高清晰扩展动态范围摄像机输出的每秒120帧图像,那么计算负载是惊人的。

为解决计算问题,CNN结合了来自数字处理领域的两种方法:采用小卷积内核来搜索输入图像的某些视觉特性,极大的减少了数组非常大的一端的网络连接。他们采用了神经网络后端来解释卷积层出现的图案特性。更重要的一点:CNN采用了关键的后向传播学习神经网络技术,不仅仅训练神经元连接,而且还有卷积内核。结果(图1)是混合了前端卷积层和子采样以及后端神经元层的网络。

图1.一个常见卷积神经网络设计包括卷积连续层,具有映射和子采样功能,随后是卷积神经网络组织层。

common_cnn_design

 

内部有什么

从这里,我们可以更详细的了解CNN内部。一切都是从到达网络第一层的数据二维帧开始。使用小卷积内核熟悉的方法——即,4*4像素,第一个卷积层卷积内核和4*4单元,图像中每一像素一个,采用卷积结果替代像素值。结果实际上是稍小一些的帧,每一像素值代表单元中的像素与卷积内核特征的相似程度。这可以是线段、角度、T,或者其他的;我们稍后会讨论它来自哪里。

现在,CNN中的每一个卷积层都会将这一过程重复几次,每一次采用不同的内核。每一次都会产生不同的输出,CNN研究人员称其为特征图。那么,在我们CNN中的第一层会含有8个特征图,每一个特征图描述了最初图像中某一特性的可能位置。例如,如果我们进行印刷字符识别,我们最终会得到一个特征图,有水平、垂直和对角线段,不同内核合起来会有几张特征图。这些图的每一张的像素数都与最初图像几乎完全相同。但是,图像中的每一像素连接到每一个神经元,产生所有这些所需处理量只是一个神经元层所需要的一小部分。

卷积层最后一个不太明显的功能是去线性化。在很多CNN设计中,每一层采用了超越函数——流行的是双曲正切,限制像素值的范围,保证输出不是输入的线性组合。这对于后面的训练目的非常重要。

一个CNN通常含有多个卷积层。如果的确是这样,那么,更深的层会有多个特征图。但是这些特征图来自3D,而不是2D卷积。特征图中的每一个像素都是小3D内核加权和,乘以前一层中特征图相应的单元像素(图2)。直观地看——这里所应用的数学会让大家感到畏缩,后续层中的特征图是前面层中特征图所识别的特征位置的映射:在我们的字符识别实例中,即,最邻近的垂直线,对角线,连接点。

2.内部卷积层对3D内核与前一层中每一特征图的2D单元进行卷积。

internal_convolution_layers

原理上,我们可以一层层堆起来,堆叠大量的卷积层,构建非常复杂的特征识别网络。但是在很多应用中,这是很大的浪费。当您希望知道邻近组合特征点的位置时,您不需要把位置设定到高清晰像素级。您可以简单的说,这一特征图的线段、角度和连接点的某些组合接近最初图像。换言之,在每一卷积层的最后,您可以仅保留一个小单元中所有像素的最大值,对每一特征图进行子采样。这意味着,每一层需要卷积的数据量大幅度下降,经验表明,并没有降低结果的精度。

分类

两个或者三个这些卷积加上子采样层对之后,我们得到了大量的小特征图。每一张图都代表了最初图像中非常复杂的图案可能出现的位置:一个字符串或者一个行人形状的物体。但是,我们需要的不止是一张图——我们需要的是提取出所代表的含义。这一个手写的文字是代表美国第一任总统,George Washington? 是否有行人在前面路上徘徊? 我们需要得到是或者不是的答案。

这不是识别,而是分类。为进行分类,CNN在卷积层之后采用了全连接神经网络层。在第一个神经元层,每一个神经元处理来自最终卷积/子采样层的每一特征图的每一像素值,每一数值与预定的权重相乘,对求和去线性化。实际上,每一神经元的输出现在代表了对整个最初图像的判断。是不是有人写下了文字G. Washington? 路边上的物体会是一个行人吗?

当我们要求图像越来越多的抽象结论时,我们就增加了更多的神经元层。每一层都是全连接的,而某些CNN体系结构在最后一层转换为高斯连接方式。目前为止,层中的神经元相对较少,但是可能会代表非常复杂的判断:这是Washington总统在其第一任期内写下的文字吗? 在我到达交叉路口之前,前面是不是有个要倒下的醉汉?

如果您一直跟踪下去,会发现CNN的每一新帧都会触发雪崩式的计算,大部分计算都需要浮点格式。在输入层,图像中的每一个4*4单元都需要一个小规模的有限冲击响应(FIR)滤波器:16次乘法,一些加法,以及tanh(x)赋值。在输入层,每一特征图都得完成这些。对于新层中的每一特征图,在后续层中,来自前一层的每一个特征图的每一个单元(包括所有叠加的),被送入到卷积引擎中。子采样功能可以使其不会成为一项巨大的工作,但是规模仍然很大。但是在这一级,与评估全连接层的工作相比,这仍然微不足道。

训练

我们无意间跳过了一个非常关键的问题:这些卷积内核中的系数来自哪里——定义内核要识别的图案的数字? 相似的,神经元输入的权重来自哪里? CNN的性能很大程度上取决于所选择的这些图案。“否则,您得有一间大房子,里面到处都是猴子和打印机,但是没有莎士比亚。”

基于规则的系统性能一般,导致研究人员尝试一些大胆但是很难理解的方法。如果应用专家都很难选择相应的内核,纯神经网络中使用的训练迭代过程能做的更好吗? 事实证明,答案是肯定的。

原理上,神经网络训练非常简单,只需要四种东西。需要一些训练图像,表示您希望CNN解出的场景。需要每一幅图像都有理想的正确输出。需要一个误码函数,衡量所需输出与实际输出之间的差别。需要CNN中每一个卷积内核系数和神经元输入权重的初始值。原理上,这些都很简单。实际上,每一条都有些难度。

让我们从训练图像开始。Compton提醒说:“训练图像必须代表真实世界。”如果太简单,CNN结果可能会过分简单。如果太复杂,训练可能根本无法工作。如果忽略重要的情形——不同风格的书法,背着大箱子的一个人,当遇到这类输入时,CNN的行为会是不可预测的。然而,选择训练规模和选择图像的唯一工具是经验和判断。相似的,但问题不大的是,您应该知道您希望CNN从每一幅训练图像中得到什么。

然后,需要初始值。选择的方式不会停止部分CNN;例如,全零和全一都不是好的猜测。经验表明,从某一统计分布中随机选择数值能够很好的工作。

这就给我们带来了误差函数。如果您针对某一训练图像来评估CNN,知道所需的输出,那么,可以写出微分,以其乘积与双曲正切很多求和的形式来表达:表示误差大小,是输入图像像素、系数卷积以及神经元权重的函数。

现在是最有趣的部分。通过这些信息,您可以针对CNN最后一层所有神经元权重来计算误差函数的所有偏微分。这些斜率会告诉您怎样调整下一次的权重。然后,您可以把这一过程后向传送给前一层,调整这些权重,以此类推。CNN中真正的创新是,到达卷积层后,继续向前即可——使用误差函数相对于每一内核系数偏微分计算这一相同过程,对系数稍作调整。您不必根据CNN应需要的特性来猜测系数是什么。

您一直重复训练过程直至误差小到可以接受。然后,转到下一副图像,重复这一过程。不需要数学计算来预测收敛或者最终的精度。但是经验表明,这一过程通常是收敛的,精度也是可接受的。

只是感觉不对

这一过程有几方面让工程师感觉很困难。首先,它是非常不确定的。如果想预测训练网络实际输入的响应、其总体精度、在某些关键环节下的响应,甚至所需的训练时间等,这些大部分都会失败。很大程度上依赖于您为CNN所选择的结构,您的误差函数,特别是您选择的训练图像。第二,很难甚至不可能直观的理解受训CNN中特征图和神经元的含义。它们不像每一数组那样有明确的含义。它们只是能工作。

简言之,您建立了一个可能适合也可能不适合的网络,通过图像训练它,希望有足够的代表性,您并不完全知道为什么它能工作,不知道什么时候可能会得到非常错误的结果。一名优秀的工程师究竟为什么要这样做?

研究人员,而且越来越多的嵌入式系统开发人员都涉足到这些麻烦中的原因很简单:CNN的确能工作。训练结果一般能够预测实际结果。在目标识别和分类一系列标准问题上,CNN通常要优于所有其他算法。它们对目标大小、位置和照明的变化相对不太敏感。谷歌和斯坦福大学研究人员最近公开的工作表明,不同CNN群不仅在图像目标分类上精度非常高,而且对于场景中描述的文字精度也非常高。目前还没有已知的其他算法能够做到这一点。

Compton同意,“这种非确定性是混乱的,特别是在安全关键的应用中。但是在实际中,工程中已经有很多不确定的东西。没有非常理想可靠的系统。目的是实现可接受的失败率。采用CNN,通过进行足够的测试使您对错误率估算有信心。”

我怎样做到这一点?

不论有没有结果,目前为止,所有方法都让人感到没有信心。首先,您选择一个体系结构:多少次卷积,多少个全连接层,采用哪种去线性化函数,每一卷积层有多少特征图,内核大小是多少等。但是,怎样实现?

Compton说:“研究人员倾向于重新使用他们最早学到的网络设计。这里有很多手动操作,研究解空间。只是最近有一些工作开始研究自动求解。所以,人们倾向于仍然采用以前的工作。

目前,还没有方法预测您所需要的网络规模——是3层还是20层。您也无法预测性能。您不得不构建自己的CNN,训练它。”

实现是另一个问题。在学术研究中,执行时间不是大问题,因此,您可以构建自己的CNN,占用很大的软件空间。Compton解释说:“实际上,卷积层是FIR滤波器,全连接层是矩阵间乘法器。” 训练是另一个问题。在设计过程中,一般是一次完成,因此,训练时间并不是导致CNN延时的因素。它先要评估偏微分,获得误差函数的斜率,每次迭代时进行矩阵乘法,对所有训练图像进行重复。不断重复直至网络收敛到可接受的错误率范围内。

但是在嵌入式系统中,您非常关心延时,一般没有数据中心,值得采用服务器来进行计算。而且,每次输入变化后,您不得不计算所有这些特征图和神经元数值——除非您非常清楚输入图像中哪些区域变化了,减少CNN中那些静止区域不必要的计算。要满足实时要求则需要硬件帮助,采用定制嵌入式处理器:DSP芯片、FPGA中的流水线加速器,或者专用合成神经元芯片。

平台的出现

这一设计过程仍然还不能让大部分设计团队感到满意。Compton指出,训练材料并不是针对某一研究项目,或者目前主要的应用,网络搜索。那么,CNN就注定仍然只出现在学术论文中? 不是,Compton坚信。它们分两个阶段逐步走向实用。

第一阶段涉及到使用现有专业技术。Compton继续说,“如果您的问题在图案位置变化时需要模糊图案匹配,那么应该考虑CNN。” 这类问题存在于机器视觉中,不太引人注意,例如声纹分析或者互联网内容过滤等。您一旦找到问题后,下一步是约束它——实际上,控制外部环境和成像系统,减小识别和分类任务的难度,最终您找到已经成功解决了类似问题的专家。专家在CNN体系结构选择和训练方法上有成熟可靠的经验。

但是Compton认为,业界需要更高效的解决方案。因此,包括在i-Abra的工作,发展趋势是为CNN开发设计工作台:体系结构研究和设计工具,实现平台,支持服务等。目标是让没有神经网络背景的设计团队能够向平台描述其问题,让平台扮演专家的角色:选择体系结构,评估训练图像,预测性能,帮助实现。

Compton说:“CNN已经为工程解决方案开辟了新应用。随着我们的知识和硬件平台的成熟,新应用会越来越多。”


CATEGORIES : 系统体系结构, 设计挑战/ AUTHOR : Ron Wilson

Write a Reply or Comment

Your email address will not be published.