"深度"到底是什么意思
你已经知道,神经网络不过是一层层简单单元把数字往前传,再靠反向传播训练来降低损失。那为什么要给"多叠几层"起个专门的名字?"深度"无非是说,从输入到答案之间有*很多*层——不是两三层,而是几十、几百层。但深度本身并不是关键。关键是这些多出来的层,究竟是*用来做什么*的。
每一层都拿下面那层产出的描述,把它改写成一个更有用的描述。像素层喂给边缘层;边缘层喂给一个留意角点和纹理的层;那一层又喂给一个对眼睛、车轮起反应的层;而靠近顶端的某处,坐着一个其单元含义是"这是猫"或"这是车"的层。换句话说,深度就是一条不断*重新描述*的流水线。这种一层叠一层、层层重新描述的过程,正是这个领域所说的分层表示学习。
老办法:手工设计特征
先退一步,看看在这一切之前机器学习是怎么做的。一个学习算法需要把每个样本描述成一串数字——也就是它的特征。几十年来,写这些数字的是*人*。要识别人脸,工程师会亲手编写边缘检测器,再写角点检测器,再用一套巧妙的配方把它们组合起来。这门手艺有个名字,叫特征工程,而它几乎就是工作的全部——一个项目往往有八成的精力,都花在真正开始学习之前去发明好特征上。
它确实管用,但有天花板。手工设计的特征编码的是*我们*认为重要的东西,而我们常常想错、想漏——一个在正面照片上调好的人脸检测器,遇到歪着的头就垮了。更糟的是,这门手艺无法迁移:为人脸辛苦造出来的特征,对诊断胸部X光片或转写语音毫无帮助。每换一个新问题,就意味着手工设计要从头再来一遍。
深度学习下的赌注,正好是把这件事彻底反过来。不再由人提供特征、模型只去拟合最后一步,而是让模型把*特征也一起学出来*——从数据里自己发现哪些中间描述是有用的。这就是更宽泛的那个理念,表示学习:表示不再是喂给系统的东西,而是训练的产物。
一座从数据中学出来的特征层级
接下来是最让人满意的部分:当你端到端地训练一个深度视觉模型时,第一节里那座层级会*自己浮现出来*。没有人去告诉第三层要检测角点;反向传播只是发现,类似角点的图案对最终任务有用,于是权重就沉淀成了角点检测器。去探查一个训练好的卷积网络,你真的能看见这一点——靠前的层对边缘和色块亮起,中间的层对纹理和简单部件亮起,靠后的层对完整物体亮起。
为什么要一座*层级*,而不是把所有特征摊成平平的一大堆?因为世界是可组合的。车轮由弧线构成;汽车由车轮、车窗和车身构成;弧线由边缘构成。分层的模型正好映照这种结构:它把廉价的低层部件复用起来,去搭建昂贵的高层部件,因此不必把每一辆车都从零记一遍——它用自己已经认得的零件,组合出"汽车"。正是这种复用,使得深度可以比宽度高效得多。
# what a deep classifier learns, conceptually x = raw_pixels # given to us h1 = layer1(x) # edges, color blobs \ h2 = layer2(h1) # corners, textures | LEARNED, h3 = layer3(h2) # eyes, wheels, parts | not hand-coded h4 = layer4(h3) # whole objects / y = classify(h4) # "cat" / "car" / ... # the only easy part
而且这些学出来的表示*确实能*迁移,这是过去手工搭的特征做不到的。在数百万张日常照片上训练一个网络,它前中段的层会学到边缘、纹理与形状,这些远远超出原始任务的范围都有用——你可以把它们当作起点,去做医学扫描或卫星影像。这种对已学特征的复用,正是迁移学习背后的引擎,也是"学习表示而非手工编码"在实践上最重要的后果之一。
端到端学习:一个损失,贯穿到底
第三个大想法,把前两个绑到了一起。在老的流水线里,每个环节——这边做特征,那边做分类器——都是分开搭建、分开调的,谁也不知道下一环节需要什么。端到端学习把这条流水线压缩成一个可微分的整体系统,从原始输入一直训练到最终答案,对着*同一个*损失。反向传播把误差一路送回每一层,于是那些负责找特征的层,是为你最终真正在意的那件事而被优化的。
这之所以要紧,是因为分开调的各个环节,可能各自局部都不错,却在接缝处严重错配——特征看上去合理,偏偏把分类器最需要的那条线索丢掉了。让所有部件对着同一个目标训练,能让整条链条共同自适应:前面的层会学到那些真正帮到后面层的特征,因为评判它们好坏的,只有最终结果这一项,别无其他。
为什么它改变了一切——老实说
想冷静地看,就回想一下苦涩的教训:几十年来,依靠通用学习加上更多计算的方法,一次又一次超越了那些建立在人工知识之上的方法。学出来的表示,正是这一规律的现身——给一个灵活的模型足够的数据和算力,它往往会找出比我们手工设计还要好的特征。这就是"深度"为何接管了这个领域如此之大一片版图,老老实实的核心原因。
但要把炒作压住。深度不是魔法,也不总是答案。在小数据集或表格数据上,一棵朴素的梯度提升树常常就能打败深度网络。学出来的特征可能脆弱、可能带偏见——模型可能抓住某家医院扫描仪的水印、而不是疾病本身,这是数据顺手塞给它的一条捷径。而且"自己学特征"从来不等于"不需要人":仍然得有人去选数据、选架构、选损失、定义什么算成功——正是这些选择,决定了网络最终把注意力放在了哪里。
所以从这篇里带走一句话:深度学习的本质,是端到端地学习一座*表示的层级*,而不是手工搭建特征。这一级台阶接下来的内容,就是要把这个想法变得真正可训练——为图像内置正确结构的卷积网络、面向序列的循环网络,以及那些工程技巧(dropout、归一化、残差连接),它们让这座层级能真正地长得很深,而不至于散架。