本篇是系列博客的第三部分,如果没有看过前面两部分内容的读者建议阅读一下。
在第I部分内容中,主要是讲解人工智能的历史以及它现在高速发展的原因;
在第II部分内容中,将讨论一下人工智能、机器学习和深度学习之间的区别;
在今天的第III部分内容中,将深入研究深度学习以及在为新项目选择数据库时需要评估的关键事项;
在第IV部分内容中,将讨论深度学习为何使用MongoDB,并提供相关使用实例;
由于本文内容是第III部分内容,主要介绍深度学习以及在为新项目选择数据库时需要评估的关键事项。如果读者想快速将四部分的内容全部看完,可以下载本文的附件。
深度学习是什么?
深度学习是机器学习研究领域中的一个分支,近年来在图像识别、自然语言处理和图像分类等领域应用十分火热,受到世界范围内的广泛关注。深度学习是人工神经网络(ANN)的一种改进,正如人工神经网络一样,是模拟人类大脑学习和解决问题的一种方法。
在深入了解深度学习的工作原理前,首先理解人工神经网络(ANN)是如何工作的。人工神经网络是由一组互相连接的神经元组成,类似于人类大脑中的神经元网络。
上图是一个简化的神经元连接示意图。神经网络中的每个神经元接收与之连接的其它神经元的输入信息(Xi),然后通过计算后输出到网络中的其它神经元或节点。神经元之间的连接参数用权重(Wj)表示,权重的大小表示二者连接的强度,权重的值可正可负。将所有的输入信息都与对应的连接权重相乘(X1W1,X2W2等)并进行求和作为该节点的输出。最后一步是对神经元执行计算或激活函数处理。激活函数允许人工神经网络模拟简单模式无法正确表示的复杂的非线性问题,常用的激活函数是Sigmoid函数。
上图表示一个三层的神经网络,从左往右第一层为输入层,输入对应的特征(X1,X2,X3),第二层被称作隐藏层,隐藏层可以有多层,第三层是输出层。对于一个层而言,只要该层不是输入层或输出层,那么该层就可以称作隐藏层。
“深度”学习最初就是这样产生的,因为其含有多个隐藏层,通常包含多于3个的隐藏层。在一些情况下,隐藏层的个数高达1200多个。
多个隐藏层的好处是什么呢?在某些模式下,可能需要更加深入的调查,因此多个隐藏层可以进行额外的特征处理。深度学习在图像分类领域中表现优异,甚至在某些特定任务上超过了人类的表现。现在,通过一个额外隐藏层有助于面部识别的例子来说明这一点。
当一张图片被输入到一个深层次的学习网络中时,它首先被分解成图像像素。然后该算法将在图像中的某些位置寻找特定形状的图案。第一个隐藏层可能试图揭示特定的面部模式:眼睛、嘴巴、鼻子、耳朵等。添加一个额外的隐藏层来解析更加细粒度的属性。例如,“嘴巴”可以进一步分解为“牙齿”、“嘴唇”、“牙龈”等。添加额外的隐藏层可以将这些模式更进一步抽象。最终的结果是一个深层的学习网络可以将一个非常复杂的问题分解成一系列简单的问题。隐藏层的本质是一个层次化的特征学习,它们能够更好地提取特征。目前,大多数深度学习算法都是有监督学习,即对已知的标记数据进行深度学习。
训练是如何工作的?
训练深度学习的最终目的是降低代价函数,即期望输出与实际输出之间的差异尽可能小。节点之间的连接将会有特定的权重,不断修改这些权重参数使得网络的代价函数变小。通过修改权重值,可以将代价函数最小化到全局最小值,这意味着模型的误差降到最小值。深度学习之所以计算如此密集就是因为它需要找到合适的数以十亿的连接权重值,这需要通过不断迭代训练调整得到,以找到使得代价函数全局最小值的权重集。
深度学习中最为常用的训练方法是反向传播梯度下降算法。梯度下降算法是一种有效的数学优化方法,它能有效地处理大量的数据(特征),而不必强力进行维度分析。梯度下降算法根据权重函数的全局最小值来计算梯度(斜率)。在训练过程中,首先随机分配权重并计算出一个误差。然后基于这个误差,通过使用梯度下降算法来修改权重,之后反向逐层调整每层的权重参数,当调整完每层参数后又正向进行传播,计算得到一个新的误差,之后基于新的误差调整每层的参数,一直迭代到代价函数达到全局最小值为止。可能会出现一些例子,梯度下降算法是以局部最小值而不是全局最小值来计算的,减轻这个问题的方法是使用凸的代价函数或对参数产生更多的随机性。
深度学习中对数据库的思考
非关系数据库在促进机器学习和深度学习技术的最新进展中起着不可或缺的作用。收集和存储大量结构化和非结构化的数据的能力为提升深度学习预测提供的必要的原材料。在构建深度学习应用程序时,选择用于管理底层数据的数据库时要牢记一些注意事项。
灵活的数据模型。在深度学习中,数据需要经历三个阶段——输入数据、训练数据和结果数据。深度学习是一个动态的过程,通常涉及大量的实验,比如,实验过程中参数调整是很正常的事情,加上非结构化数据的输入、输出结果的修改是自然而然地发生。随着新的信息和见解被发现,重要的是在灵活数据模型上选择一个合适的数据库,避免在数据结构需要改变时需要执行昂贵的模式迁移。
规模。深度学习面临的最大挑战之一是模型训练耗费的时间比较长,有些模型可能需要几个星期的训练时间,这是由于梯度下降等算法需要通过多次迭代来调整模型的数十亿个参数。为了减少训练次数,深度学习框架尝试并行运算,将训练负荷分布到多个高性能的服务器上。
并行化训练主要有两种方式:数据并行性和模型并行性。
- 数据并行性。通过分布式系统将数据分割成多个节点进行处理并存储,比如Apache Spark、MongoDB和Apache Hadoop。
- 模型并行性。通过相关软件库和框架在多个节点上分割模型及其相关层,如TensorFlow、Caffe和Theano。分裂提供并行性,但是在协调不同节点之间的输出时会产生性能代价。
除了模型训练阶段耗费时间长外,深度学习的另一个大挑战是输入数据集不断增长,这增加了训练参数的数量。这不仅意味着输入数据集可能超过可用的服务器内存,而且还意味着涉及梯度下降的矩阵也能超过节点的内存。因此,缩放比扩展更加重要,这使得工作负载和相关的数据集在多个节点上分布,允许并行执行计算。
容错。许多深度学习算法使用检验点作为故障发生时恢复训练数据的一种方法。然而,频繁设置的检查点需要大量的系统开销。另一种方法是利用驻留在分割节点上的多个数据副本,这些副本提供冗余和数据可用性,而无需消耗系统主节点上的资源。
一致性。对于大多数深度学习算法而言,建议使用强数据一致性模型,具有强一致性的分布式数据库集群中每个节点都运行在最新的数据副本上。虽然有些算法可以容忍一定程度的不一致性,比如随机梯度下降算法(SGD),但强一致性能够提供最精确的结果。然而,在某些情况下,算法更加看重训练时间而不是精度,那么最终的一致性是可以接受的。为了优化精度和性能,数据库应该提供可调的一致性。
作者信息
Mat Keep,产品营销总监,目前就职于MongoDB团队。
个人主页:https://www.linkedin.com/in/matkeep/
本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。
文章原标题《Deep Learning and the Artificial Intelligence Revolution: Part 3》,作者:Mat Keep,译者:海棠,审阅:袁虎。
文章为简译,更为详细的内容,请查看原文