假设你是一名工程师,接到一项从头开始设计计算机的任务。某天,你在工作室工作,设计逻辑电路,构建AND门,OR门等等时,老板带着坏消息进来:客户刚刚添加了一个奇特的设计需求:整个计算机的线路的深度必须只有两层:
你惊呆了,跟老板说道:“这货疯掉了吧!”
老板说:“我也认为他们疯了,但是客户的需求比天大,我们要满足它。”
实际上,在某种程度上看,他们的客户并没有太疯狂。假设你可以使用某种特殊的逻辑门,它让你对任意多的输入做AND运算。同样也能使用多输入的NAND门——可以对多个输入做AND运算并取负的门。有了这类特殊的门,构建出来的两层深度的电路可以计算任何函数。
但是仅仅因为某件事是理论上可能的,并不代表这是一个好的想法。在实践中,在解决线路设计问题(或者大多数的其他算法问题)时,我们通常考虑如何解决子问题,然后逐步地集成这些子问题的解。换句话说,我们通过多层的抽象来获得最终的解答。
例如,假设我们来设计一个逻辑线路来做两个数的乘法。我们希望在已经有了计算两个数加法的子线路基础上创建这个逻辑线路。计算两个数和的子线路也是构建在用于两个比特相加的子子线路上的。粗略地讲我们的线路看起来像这个样子:
最终的线路包含至少三层线路的基本部分。实际上,这个线路很可能会超过三层,因为我们可以将子任务分解成比上述更小的单元。但是基本思想就是这样。
因此深度线路让这样的设计过程变得更加简单。但是这对于设计本身帮助并不大。其实,数学证明对于某些函数设计的?常浅的线路可能需要指数级的线路单元来计算。例如,在1980 年代早期的一系列著名的论文已经给出了计算比特的集合的奇偶性通过浅的线路来计算需要指数级的门。另一当面,如果你使?更深的线路,那么可以使用规模很小的线路来计算奇偶性:仅仅需要计算比特的对的奇偶性,然后使用这些结果来计算比特对的对的奇偶性,以此类推,构建出总共的奇偶性。深度线路这样就能从本质上获得超过浅线路的更强的能力。
几乎我们遇到的所有的网络就只包括一层隐藏神经元(另外还有输入输出层):
这些简单的网络已经非常有用了:在前面的章节中,我们使用这样的网络可以进行准确率高达98% 的手写数字的识别!而且,凭直觉地看,我们期望拥有更多隐藏层的神经网络能够变的更加强大:
这样的网络可以使用中间层构建出多层的抽象,正如我们在布尔线路中做的那样。例如,如果我们在进行视觉模式识别,那么在***层的神经元可能学会识别边,在第二层的神经元可以在边的基础上学会识别出更加复杂的形状,例如三?形或者矩形。第三层将能够识别更加复杂的形状。以此类推。这些多层的抽象看起来能够赋予深度网络一种学习解决复杂模式识别问题的能力。然后,正如线路的示例中看到的那样,存在着理论上的研究结果告诉我们深度网络在本质上比浅层网络更加强大。