本说明书涉及使卷积神经网络的训练并行化。
卷积神经网络通常包括两种类型的神经网络层:卷积神经网络层和全连接神经网络层。卷积神经网络层具有稀疏连接性,其中卷积层中的每个节点从仅次最低神经网络层中的节点的子集接收输入。一些卷积神经网络层具有与该层中的其它节点共享权重的节点。然而,全连接层中的节点从次最低神经网络层中的每个节点接收输入。
技术实现要素:
一般而言,本说明书描述用于在多个批量的训练样例上训练卷积神经网络(CNN)的技术。CNN由多个工作器(worker)训练。每个工作器被配置成维护CNN的卷积层中的每个卷积层的相应的副本以及CNN的全连接层中的每个全连接层的相应的不相交分区。卷积层的每个副本包括卷积层中的节点中的全部,并且全连接层的每个不相交分区包括全连接层的节点的一部分。每个工作器在指派给该工作器的批量的训练样例上训练由该工作器维护的卷积层副本,同时在多个批量的训练样例中的全部训练样例上训练由该工作器维护的全连接层分区。
能够实现本说明书中所描述的主题的特定实施例以便实现以下优点中的一个或多个。通过在卷积神经网络的训练期间与全连接层不同地使卷积层并行化,能够通过利用两种类型的层的不同结构来高效地且迅速地训练网络。附加地,通过使中间通信与训练交叠,例如,通过与工作器处理其它训练样例的数据并行地从一个工作器向另一工作器发送激活数据、与工作器处理其它训练样例的数据并行地从一个工作器向另一工作器发送梯度数据或两者,能够减少训练时间并且能够减轻由于数据在训练卷积神经网络的工作器之间的传输而导致的训练延迟。
在下面在附图和描述中阐述本说明书的主题的一个或多个实施例的细节。主题的其它特征、方面和优点从本描述、附图和权利要求书中将变得显而易见。
附图说明
图1是用于训练卷积神经网络(CNN)的示例系统的框图。
图2是用于训练CNN的示例过程的流程图。
图3是用于通过由工作器维护的全连接层分区来处理激活数据的示例过程的流程图。
图4是用于通过由工作器维护的全连接层分区来反向传播梯度的示例过程的流程图。
图5是用于在工作器之间传送激活数据和梯度数据的示例过程的流程图。
图6是用于在工作器之间传送激活数据和梯度数据的另一示例过程的流程图。
图7是用于在工作器之间传送激活数据和梯度数据的另一示例过程的流程图。
各个附图中的相同的附图标记和名称指示相同的元件。
具体实施方式
图1是用于训练卷积神经网络(CNN)的示例系统150的框图。CNN包括神经网络层的序列,其中CNN的输入由序列中的最低层接收并且通过序列中的所有层来处理以从输入生成输出。例如,输入可以是图像并且输出可以是一组类别中的每个类别的分数的集合。针对给定类别而生成的分数表示所输入的图像包含属于该类别的对象的图像的可能性。
CNN中的每个神经网络层包括节点集合。每个节点即从直接在序列中的神经网络层下面的层中的一个或多个节点接收输入,或者,如果所述层是序列中的最低层,则接收CNN的输入中的全部或一部分,并且从输入产生激活。由给定神经网络层中的节点所生成的激活然后作为输入被提供给序列中的次最高层中的节点,或者,如果所述层是序列中的最高层,则被视为CNN的输出。
特别地,神经网络层的序列包括卷积神经网络层集合,卷积神经网络层集合后面有全连接神经网络层集合。通常,全连接层中的每个节点从序列中的次最低层中的每个节点接收输入并且依照针对该节点的权重集合从所接收到的输入产生激活。由给定全连接层中的每个节点所生成的激活被作为输入提供给序列中的次最高全连接层中的每个节点,或者,如果全连接层是序列中的最高层,则被视为CNN的输出。
与全连接层不同,卷积层通常是稀疏连接的神经网络层。也就是说,卷积层中的每个节点从前面神经网络层中的节点的一部分(即,少于全部)接收输入,或者,如果卷积层是序列中的最低层,则接收CNN的输入的一部分,并且从输入产生激活。通常,卷积层具有通过依照针对每个节点的权重集合使接收到的输入卷积来产生激活。在一些情况下,卷积层中的节点可以被配置成共享权重。也就是说,所述层中的节点的一部分可能受约束以总是具有与所述层中的其它节点相同的权重值。
一些CNN使其它类型的层散布在这些层的序列中。例如,其它层可以包括池化层,即,包括从序列中的次最低层中的节点的一部分接收输入并且通过池化所接收到的输入(例如,通过计算所接收到的输入的最大值或均值)来产生激活的节点。作为另一示例,其它层可以包括定标层,即,从序列中的次最低层接收输入并且对每个接收到的输入中的每个元素应用标量函数的层。因为这些其它层不具有在CNN的训练期间被修改的权重,所以它们在序列中的存在或不存在不影响在下面所描述的CNN训练技术。因此,为了描述的清楚起见在下面所描述的CNN将被描述为不包括这些其它类型的层。然而,本领域的普通技术人员将认识到其它类型的层可以被包括在CNN中,而不影响训练过程。
系统150包括多个工作器,即工作器1 100a、工作器2 100b以及工作器3 100c。每个工作器100a-100c可以是例如计算机、具有多个核心的计算机内的核心,或计算机内能够执行用于训练CNN的分区或副本的计算的其它硬件或软件。
工作器100a-100c中的每个被配置成维护CNN的每个卷积层的相应的副本。在图1的示例中,每个工作器维护四个卷积层106a-106c、108a-108c、110a-110c以及112a-112c的副本。每个卷积层的每个副本是卷积层的单独实例,即,每个副本包括卷积层的节点中的全部。
工作器100a-100c中的每个还被配置成维护CNN的全连接层中的每个的相应的分区。在图1的示例中,每个工作器维护CNN的第一全连接层的相应的分区114a-114c以及CNN的第二全连接层的相应的分区116a-116c。全连接层的每个分区包括该全连接层的节点的不相交分区。因此,共同地由工作器100a-100c维护的给定全连接层的分区组成该全连接层的单个实例,即,虽然每个分区包括给定层的节点的仅一部分,但是分区共同地包括该层的节点中的全部。
工作器100a-100c在从训练数据102中选择的训练样例上训练CNN。例如,训练样例可以是已被分类为包括来自特定类别的对象的图像的图像。训练数据102包括多个批量的训练样例104a-104c,其中每个批量包括预定数目的训练样例。
为了使用训练样例来训练CNN,每个工作器100a-100c被指派不同批量的训练样例并且执行神经网络训练技术以在训练数据上训练CNN。例如,训练技术可以是使用随机梯度下降(SGD)来使CNN的目标函数最小化或最大化的训练技术。在下面参考图3更详细地描述在具有多个工作器的系统中在一批训练数据上训练CNN。一旦每个工作器已对该工作器的指派批量执行了训练技术,每个工作器就能够被指派新批量的训练样例并且能够执行训练技术的附加迭代以在新批量上训练CNN,例如,以继续试图使目标函数最小化或最大化。
图2是用于训练CNN的示例过程200的流程图。过程200能够由作为用于训练CNN的技术的一部分适当地编程的多个工作器的每个工作器(例如,图1的工作器100a-100c中的每个工作器)来执行。如上所述,每个工作器被配置成维护CNN的卷积层中的每个卷积层的相应的副本以及CNN的全连接层中的每个全连接层的相应的分区。
工作器接收已被指派给工作器的一个批量的训练样例(步骤202)。
工作器通过由该工作器维护的卷积层副本的全部来处理该批量中的每个训练样例以针对该批量中的每个训练样例计算相应的卷积激活(步骤204)。也就是说,工作器通过最低卷积层副本来处理每个训练样例以为该训练样例生成初始卷积激活,并且然后通过序列中的每个卷积层副本来处理最低卷积激活以便为该训练样例计算卷积激活。
工作器将自己的卷积激活数据发送到正在训练CNN的其它工作器并且从正在训练CNN的其它工作器接收其它卷积激活数据(步骤206)。通常,自己的卷积激活数据针对每个自己的训练样例(即,针对指派给工作器的批量中的每个训练样例)包括针对训练样例的卷积激活。类似地,给定的其它训练样例(即,指派给训练CNN的其它工作器中的一个工作器的训练样例)的其它卷积激活数据包括由另一个工作器为该训练样例所计算的卷积激活。在下面参考图5、图6和图7描述用于确定要向其它工作器发送哪些卷积激活数据以及卷积激活数据何时将被发送的示例技术。
工作器通过全连接层分区的全部来处理自己的训练样例和其它训练样例的卷积激活数据,以计算每个自己的训练样例和每个其它训练样例的相应的输出分区(步骤208)。特别地,训练样例的输出分区包括训练样例的由工作器维护的最高全连接层分区的激活。在下面参考图3更详细地描述处理卷积激活数据以计算输出分区。
工作器针对每个自己的训练样例和每个其它训练样例获得相应的梯度部分(步骤210)。在一些实施方式中,每个工作器将由该工作器计算的输出分区发送到工作器中的指定工作器。该工作器然后能够计算目标函数的梯度并且将适当的梯度部分发送到工作器中的每个工作器。在一些其它实施方式中,每个工作器针对每个训练样例计算相应的梯度部分。例如,对于每个训练样例,工作器确定由工作器计算的输出部分与训练样例的已知输出的对应部分之间的误差,即,应该已通过训练样例的由工作器维护的最高全连接层分区中的节点来计算的激活。工作器然后使用误差来计算训练样例的目标函数的梯度。因为工作器仅维护最高全连接层的节点的分区,所以由工作器计算的梯度是训练样例的总梯度的仅一部分。
工作器通过由该工作器维护的全连接层分区中的全部来反向传播梯度部分并且使用经反向传播的梯度来计算由工作器所维护的最高卷积层副本的梯度部分(步骤212)。在下面参考图4描述通过全连接层分区来反向传播梯度部分。
工作器将自己的梯度数据(即,由工作器所维护的最高卷积层副本的梯度部分)发送到其它工作器并且从其它工作器接收其它梯度数据(即,由其它工作器所维护的最高卷积层副本的分区的梯度部分)(步骤214)。在下面参考图5、图6和图7描述用于确定要向其它工作器发送哪些梯度数据以及梯度数据何时将被发送的示例技术。通常,工作器将给定训练样例的自己的梯度数据发送到该训练样例被指派给的工作器。为了这样做,每个工作器跟踪哪一个数据与哪一个训练样例相关联,并且因此,哪一个数据必须被发送到哪一个工作器。在一些实施方式中,为了让工作器确定正由工作器处理的哪一个数据对应于哪一个训练样例,每个工作器按照定义哪一个数据对应于哪一个训练样例以及哪些训练样例被指派给哪一个其它工作器的固定次序维护从其它工作器接收到的数据。在一些其它实施例中,每当工作器向另一工作器发送训练样例的数据时,该工作器还能够向该另一个工作器发送使数据与训练样例相关联的元数据。
一旦被接收到,工作器就能够将由工作器为指派给该工作器的每个训练样例所计算的自己的梯度部分与由其它工作器计算的训练样例的其它梯度部分组合,以针对被指派给工作器的该批量的训练样例中的每个训练样例为最高卷积层副本生成相应的全梯度。
工作器通过由该工作器维护的剩余卷积层副本中的全部来反向传播全梯度(步骤216)。也就是说,工作器计算在每个卷积层副本处的全梯度并且然后将这些全梯度反向传播到次最低卷积层副本以用于在为该副本计算全梯度时使用。
工作器使用每个副本和分区的对应梯度来更新由工作器维护的卷积层副本和全连接层分区的权重值(步骤218)。一般而言,工作器如何更新权重值取决于正在使用的训练技术。例如,在一些训练技术中,使用给定训练样例的梯度所计算的给定权重的新值wn可以满足:
wn=wo-αΔQ(wo),
其中wo是权重的当前权重值,α是常数值,并且ΔQ(wo)是用于训练样例的权重的梯度。
通常,因为仅一个工作器维护给定全连接层中的每个节点,所以对于全连接层中的每个节点,每个工作器使用由该工作器计算的梯度部分来更新由该工作器维护的节点的权重值。
然而,因为卷积层的权重的值由每个工作器单独地维护,所以在每个工作器更新卷积层的其副本的权重之前必须使卷积层的梯度同步。为了使梯度同步,可以给每个工作器指派要使权重同步的每个卷积层的不同部分。每个其它工作器能够将给定节点的梯度发送到该节点已被指派给的工作器。受让方工作器能够累积梯度并且然后将经累积的梯度发送到每个其它工作器。每个工作器然后能够使用与每个其它工作器相同的累积梯度来更新卷积层中的节点的权重。
可选地,不是给每个工作器指派每个卷积层的不同部分,而是每个工作器能够将每个卷积层副本的每个节点的梯度发送到中央服务器。中央服务器能够累积服务器从工作器接收到的节点中的每个节点的梯度,然后将经累积的梯度发送到每个工作器。
一旦每个工作器已完成过程200,每个工作器就能够被指派新批量的训练样例并且能够对于该新批量重复过程200。工作器能够继续重复过程200,例如,直到已满足CNN的训练的收敛准则为止或者直到已执行该过程的预定次数迭代为止。
图3是用于通过由工作器维护的全连接层分区来处理激活数据的示例过程300的流程图。然后过程300能够由作为用于训练CNN的技术的一部分适当地编程的多个工作器的每个工作器(例如,图1的工作器100a-100c中的每个工作器)来执行。
工作器获得训练样例的卷积激活数据(步骤302)。
工作器通过初始全连接层分区来处理卷积激活数据(步骤304)以针对激活数据中所标识的每个训练样例计算相应的初始全连接层部分激活。特别地,工作器通过激活数据中的初始全连接层分区来处理每个样例的卷积激活,以针对每个样例生成相应的初始全连接层部分激活。每个样例的初始全连接层部分激活包括通过由工作器维护的初始全连接层的分区中的每个节点所生成的相应的激活。
工作器将自己的初始全连接层激活数据提供给其它工作器并且从其它工作器接收其它初始全连接激活数据(步骤306)。也就是说,工作器针对每个训练样例将该训练样例的初始全连接层激活提供给每个其它工作器。工作器也从其它工作器接收每个训练样例的初始全连接层激活。因此,在工作器接收到其它激活之后,工作器对于训练样例中的每个训练样例,具有训练样例中的每个训练样例的完整初始全连接层激活。类似地,工作器将自己的初始全连接层激活数据提供给每个其它工作器以允许其它工作器处理针对训练样例中的每个训练样例的完整初始全连接层激活。
系统通过由工作器维护的次最高全连接层分区来处理每个训练样例的完整初始全连接层激活以生成每个训练样例相应的后续全连接层分区激活(步骤308)。给定工作器的后续全连接层部分激活包括通过由工作器维护的次最高全连接层的分区中的每个节点所生成的相应的激活。
如果后续层是CNN中的最高全连接层,则工作器将后续全连接层分区激活视为该工作器的最终全连接激活。如果在序列中存在比后续层高的一个或多个层,则工作器能够对于每个更高层重复步骤304和步骤306,即,通过将自己的当前全连接层分区激活数据提供给其它工作器并且从其它工作器接收其它当前全连接层分区激活数据以生成组合的当前全连接层激活并且然后使用序列中的次最高层来处理该组合激活。
图4是用于通过由工作器维护的全连接层分区来反向传播梯度的示例过程400的流程图。然后过程400能够由作为用于训练CNN的技术的一部分适当地编程的多个工作器的每个工作器(例如,图1的工作器100a-100c中的每个工作器)来执行。
工作器接收最高层梯度数据(步骤402)。对于多个训练样例的每个训练样例,最高层梯度数据包括由工作器维护的最高全连接层分区的目标函数的相应的梯度。
工作器将自己的最高层梯度数据(即,每个训练样例的最高层梯度)发送到其它工作器并且从其它工作器接收其它最高层梯度(步骤404)。对于每个训练样例,工作器能够将训练样例的其它最高层梯度与训练样例的自己的最高层梯度组合以生成训练样例的组合最高层梯度。
工作器使用每个训练样例的组合最高层梯度来计算直接在最高全连接层分区下面的全连接层分区的梯度部分(步骤406)。如果直接在最高全连接层分区下面的全连接层分区是序列中的最低分区,则工作器将直接在最高分区下面的该分区的梯度视为序列中的最低全连接层分区的梯度。如果存在附加的全连接层分区,则工作器能够对于每个更低的全连接层分区重复步骤404和406。
工作器使用最低全连接层分区梯度来为每个训练样例计算最高卷积层的梯度部分(步骤408)。也就是说,工作器使用由工作器维护的最低全连接层分区的节点的权重的值以及已通过全连接层分区反向传播的数据来计算最高卷积层的梯度部分。
图5是用于在工作器之间传送激活数据和梯度数据的示例过程500的流程图。过程500能够由作为用于训练CNN的技术的一部分适当地编程的多个工作器的每个(例如,图1的工作器100a-100c中的每个)来执行。
工作器将所有自己的卷积激活数据(即,针对指派给工作器的训练样例的批量中的每个训练样例的激活)发送到正在训练CNN的每个其它工作器(502)。
工作器从正在训练CNN的每个其它工作器接收其它卷积激活数据(步骤504)。一旦已接收到卷积激活中的全部,工作器就具有针对在训练技术的当前迭代中被指派给训练CNN的工作器中的任一个的每个训练样例的卷积激活。
工作器通过全连接层分区中的全部来处理自己的激活数据和其它激活数据来计算每个训练样例的梯度数据(步骤506),例如,如参考图2、图3和图4上面所描述的。
工作器将自己的梯度数据发送到其它工作器(步骤508)。也就是说,工作器针对由工作器计算的每个最高全连接层副本梯度部分来识别所对应的训练样例以及从其接收到该训练样例的激活数据的工作器。工作器然后将每个训练样例的最高全连接层副本梯度部分发送到从其接收到该训练样例的激活数据的工作器。
工作器从其它工作器接收其它梯度数据(步骤510)。也就是说,对于指派给工作器的批量中的每个训练样例,工作器从正在训练CNN的每个其它工作器接收训练样例的最高全连接层副本梯度部分。对于指派给该工作器的批量中的每个训练样例,系统将训练样例的自己的梯度数据以及训练样例的其它梯度数据组合以生成训练样例的组合梯度。
工作器通过由该工作器维护的剩余卷积层副本来反向传播指派给该工作器的批量中的训练样例的组合梯度(步骤512),例如,如参考图2上面所描述的。
在一些实施方式中,不是每个工作器在开始通过由该工作器维护的全连接层分区来处理激活数据之前发送和接收训练样例中的全部的激活数据,而是可以使操作中的一些并行化。也就是说,工作器可以在其它训练样例的激活数据正被工作器接收的同时处理一些训练样例的激活数据。
图6是用于在工作器之间传送激活数据和梯度数据的另一示例过程600的流程图。过程600能够由作为用于训练CNN的技术的一部分适当地编程的多个工作器的每个工作器(例如,图1的工作器100a-100c中的每个工作器)来执行。
工作器从训练CNN的另一工作器接收批量的训练样例的其它卷积激活数据或者将指派给工作器的该批量的自己的卷积激活数据发送到训练CNN的每个其它工作器(步骤602)。训练CNN的每个工作器被指派工作器的定序中相应的位置,在该位置工作器将发送自己的卷积数据而不是接收其它卷积数据。如果定序中的当前位置是指派给工作器的位置,则工作器发送自己的数据。如果不是,则工作器接收其它数据。一旦当前工作器已将自己的数据发送到每个其它工作器,定序中的当前位置递增到下一个位置。
工作器通过由该工作器维护的全连接层分区来处理自己的批量或其它批量的卷积激活数据并且计算该批量的最高全连接层副本梯度部分(步骤606),例如,如参考图2、图3和图4上面所描述的。
与工作器处理该批量的激活数据并行地,工作器从不同的工作器接收指派给该工作器的批量的其它激活数据或者发送自己的激活数据(步骤602)。也就是说,工作器再次确定定序中的当前位置是否和指派给该工作器的位置匹配,并且在当前位置匹配的情况下发送自己的数据而在当前位置不匹配的情况下接收自己的数据。
一旦工作器已计算了该批量的最高全连接层副本梯度部分,工作器就将自己的梯度数据发送到其它工作器或者从其它工作器接收其它梯度数据(步骤606)。
与发送或者接收梯度数据并行地,工作器处理卷积激活数据以生成梯度数据(步骤604),所述卷积激活数据是与该工作器处理先前的激活数据并行地发送或者接收到的。
一旦指派给工作器中的任一个工作器的批量中的全部批量已被工作器处理并且工作器具有指派给该工作器的批量中的每个训练样例的完整梯度数据,工作器就通过由该工作器维护的剩余卷积层副本来反向传播该完整梯度数据,例如,如参考图2上面所描述的(步骤608)。
图7是用于在工作器之间传送激活数据和梯度数据的另一示例过程700的流程图。过程700能够由作为用于训练CNN的技术的一部分适当地编程的多个工作器的每个工作器(例如,图1的工作器100a-100c中的每个工作器)来执行。
工作器向每个其它工作器发送N/K个训练样例的卷积激活数据,其中N是指派给该工作器的批量中的训练样例的总数并且K是训练CNN的工作器的总数(步骤702)。
工作器从每个其它工作器接收N/K个其它训练样例的其它卷积激活数据(步骤704)。因此,工作器接收(N)*(K-1)/K个总训练样例的卷积激活数据。
工作器通过由该工作器维护的全连接层分区来处理N个训练样例(即,(N)*(K-1)/K个其它训练样例以及N/K个自己的训练样例)的卷积激活数据并且为每个训练样例计算最高全连接层副本梯度部分(步骤706),例如,如参考图2、图3和图4上面所描述的。
与工作器处理N个训练样例的卷积激活数据并行地,工作器确定是否存在要发送到其它工作器的更多卷积激活数据(步骤708)。特别地,工作器确定在指派给该工作器的批量中是否存在尚未被发送到训练CNN的其它工作器的训练样例。
如果存在要发送到其它工作器的更多卷积激活数据,则工作器与处理当前N个训练样例的卷积激活数据并行地向每个其它工作器发送N/K个更多训练样例的卷积激活数据(步骤702)并且从每个其它工作器接收N/K个更多训练样例的其它卷积数据(步骤704)。
一旦已计算了当前N个训练样例的最高全连接层副本梯度部分,工作器就向训练样例被指派给其的工作器发送N个训练样例中的每个训练样例的梯度数据(步骤710)并且从其它工作器接收指派给工作器的训练样例的梯度数据(步骤712)。
与发送和接收梯度数据并行地,在工作器在步骤708处确定了存在要发送的更多卷积激活数据的情况下工作器开始处理接下来N个训练样例的卷积激活数据(步骤706)。
如果工作器在步骤708处确定了不存在要发送的更多卷积数据,则一旦接收到指派给该工作器的所有N个训练样例的梯度数据,工作器就通过由该工作器维护的剩余卷积层副本来反向传播梯度数据,例如,如参考图2上面所描述的。
以上描述通常描述了工作器等待更新全连接层的权重,直到指派给该工作器的训练样例中的全部训练样例的梯度数据已通过由工作器维护的卷积层副本中的全部被反向传播为止。然而,在一些实施方式中,工作器能够以与卷积层的权重被更新不同的间隔来更新全连接层的权重。例如,在过程700被用来在卷积层副本与全连接层分区之间交互数据的实施方式中,每个工作器能够在N个训练样例的每个集合的梯度已被计算之后更新由该工作器维护的全连接层分区的权重,同时等待更新由工作器维护的卷积层副本的权重直到指派给该工作器的批量中的所有N个训练样例的梯度已通过卷积层副本中的全部卷积层副本被反向传播为止。类似地,在过程600被用来在卷积层副本与全连接层分区之间交换数据的实施方式中,每个工作器能够在当前正由工作器处理的训练样例的梯度已被计算之后更新由该工作器维护的全连接层分区的权重,同时等待更新由该工作器维护的卷积层副本的权重直到指派给该工作器的批量中的所有N个训练样例的梯度已通过卷积层副本中的全部卷积层副本被反向传播为止。
本说明书中所描述的主题和功能操作的实施例能够用数字电子电路、用有形地具体实现的计算机软件或固件、用计算机硬件(包括本说明书中所公开的结构及其结构等同物)或者用它们中的一个或多个的组合加以实现。本说明书中所描述的主题的实施例能够作为一个或多个计算机程序(即,在有形非暂时性程序载体上编码以用于由数据处理设备执行或者控制数据处理设备的操作的计算机程序指令的一个或多个模块)被实现。可替选地或此外,能够将程序指令编码在人工生成的传播信号(例如,被生成来对信息进行编码以便传送到适合的接收器设备以用于由数据处理设备执行的机器生成的电、光学或电磁信号)上。计算机存储介质可以是机器可读存储装置、机器可读存储基底、随机或串行存取存储器装置,或它们中的一个或多个的组合。
术语“数据处理设备”包含用于处理数据的所有类型的设备、装置和机器,作为示例包括可编程处理器、计算机或多个处理器或计算机。设备能够包括专用逻辑电路,例如,FPGA(现场可编程门阵列)或ASIC(专用集成电路)。设备除了包括硬件之外,还能够包括为所述的计算机程序创建执行环境的代码,例如,构成处理器固件、协议栈、数据库管理系统、操作系统或它们中的一个或多个的组合的代码。
计算机程序(其还也可以被称为或者描述为程序、软件、软件应用、模块、软件模块、脚本或代码)能够用任何形式的编程语言(包括编译或解释语言)或者描述性或过程语言编写,并且它能够被以任何形式(包括作为独立程序或者作为适合于在计算环境中使用的模块、组件、子例程或其它单元)部署。计算机程序可以但不必对应于文件系统中的文件。能够在保持其它程序或数据的文件的一部分(例如,存储在标记语音文档中的一个或多个脚本)中、在专用于所述的程序的单个文件中或者在多个协调文件(例如,存储一个或多个模块、子程序或代码的部分的文件)中存储程序。能够将计算机程序部署成在一个计算机上或者在位于一个站点处或跨多个站点分布并通过通信网络互连的多个计算机上执行。
本说明书中所描述的过程和逻辑流程能够由执行一个或多个计算机程序的一个或多个可编程计算机来执行以通过对输入数据进行操作并且生成输出来执行功能。过程和逻辑流程还能够由专用逻辑电路执行,并且设备还能够作为专用逻辑电路被实现,所述专用逻辑电路例如FPGA(现场可编程门阵列)或ASIC(专用集成电路)。
作为示例,适合于执行计算机程序的计算机能够基于通用微处理器或专用微处理器或两者,或任何其它类型的中央处理单元。通常,中央处理单元将从只读存储器或随机存取存储器或两者接收指令和数据。计算机的必要元件是用于执行或者实行指令的中央处理单元以及用于存储指令和数据的一个或多个存储器装置。通常,计算机还将包括或者在操作上耦合以从用于存储数据的一个或多个大容量存储装置(例如,磁盘、磁光盘或光盘)接收数据或者向一个或多个大容量存储装置转移数据或两者。然而,计算机不必具有这些装置。而且,能够将计算机嵌入在另一装置(例如,移动电话、个人数字助理(PDA)、移动音频或视频播放器、游戏控制台、全球定位系统(GPS)接收器或便携式存储装置(例如,通用串行总线(USB)闪存驱动器)等等)中。
适合于存储计算机程序指令和数据的计算机可读介质包括所有形式的非易失性存储器、介质以及存储器装置,作为示例包括:半导体存储器装置,例如,EPROM、EEPROM和闪存装置;磁盘,例如,内部硬盘或可移动磁盘;磁光盘;以及CD ROM和DVD-ROM盘。处理器和存储器能够由专用逻辑电路补充或者结合在专用逻辑电路中。
为了提供与用户的交互,能够将本说明书中所描述的主题的实施例实现在具有用于向用户显示信息的显示装置(例如,CRT(阴极射线管)或LCD(液晶显示)监视器)以及用户能够用来向计算机提供输入的键盘和指示装置(例如,鼠标或轨迹球)的计算机上。其它类型的装置也能够被用来提供与用户的交互;例如,提供给用户的反馈可以是任何形式的感觉反馈,例如,视觉反馈、听觉反馈或触觉反馈;并且能够以包括声学输入、语音输入或触觉输入的任何形式接收来自用户的输入。此外,计算机能够通过向由用户使用的装置发送文档并且从由用户使用的装置接收文档(例如,通过响应于从web浏览器接收到的请求而向用户的客户端装置上的web浏览器发送网页)来与用户交互。
本说明书中所描述的主题的实施例能够被实现在计算系统中,所述计算系统包括后端组件(例如,作为数据服务器),或者包括中间件组件(例如,应用服务器),或者包括前端组件(例如,具有用户能够用来与本说明中所描述的主题的实施方式交互的图形用户界面或web浏览器的客户端计算机),或一个或多个这些后端组件、中间件组件或前端组件的任何组合。本系统的组件能够通过任何形式或介质的数字数据通信(例如,通信网络)来互连。通信网络的示例包括局域网(“LAN”)和广域网(“WAN”),例如,互联网。
计算系统能够包括客户端和服务器。客户端和服务器通常远离彼此并且典型地通过通信网络来交互。客户端和服务器的关系借助于在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序而产生。
虽然本说明书包含许多特定实施方式细节,但是这些不应该被解释为对任何发明的范围或可能要求保护的范围构成限制,而是相反被解释为可能特定于特定发明的特定实施例的特征的描述。还能够在单个实施例中相结合地实现在本说明书中在单独的实施例背景下所描述的特定特征。相反地,还能够分离地在多个实施例中或在任何适合的子组合中实现在单个实施例背景下所描述的各种特征。而且,尽管特征可以被以上描述为按照特定组合行动并且因此甚至最初要求保护,但是来自要求保护的组合的一个或多个特征在一些情况下能够被从组合中删除,并且所要求保护的组合可以针对子组合或子组合的变化。
类似地,虽然按特定次序在附图中描述操作,但是这不应该被理解为要求这些操作被以所示出的特定次序或者以顺序次序执行,或者要求所有图示的操作被执行,以实现所希望的结果。在特定情况下,多任务处理和并行处理可能是有利的。而且,上面所描述的实施例中的各种系统模块和组件的分离不应该被理解为在所有实施例中要求这种分离,并且应该理解的是,所描述的程序组件和系统能够通常被一起集成在单个软件产品中或者封装到多个软件产品中。
已经描述了本主题的特定实施例。其它实施例在以下权利要求的范围内。例如,权利要求中所记载的动作能够被以不同的次序执行并且仍然实现所希望的结果。作为一个示例,附图中所描绘的过程未必要求所示出的特定次序或顺序次序以实现所希望的结果。在特定实施方式中,多任务处理和并行处理可能是有利的。