好的,这是第三讲。今天的内容可能会像用消防水管喝水一样,信息量巨大,因为我试图在一个统一的框架下,讲完深度学习中的主要模型架构。希望你们有些人已经接触过其中一些架构,不至于完全陌生。
讲正事前,先说下项目安排:请务必在今晚前提交你们的四页项目提案,发邮件给我,我会回复反馈意见。如果你们在最终确定项目想法前还需要更多建议,下课后3点到5点,我还会在实验室。阅读作业明天截止。
本周四我们将进行第一次阅读和讨论,主题是“数据与学习”。有两篇必读论文,每个人都应该读一读,思考并回答我们提出的问题。第一篇是关于所谓的“苦涩的教训”,现象是:越来越多的问题中,那些不依赖太多归纳偏置和领域知识的大模型,表现反而最好。你如何理解这个现象?这对你自己的AI实践有什么启示?第二篇论文讲的是“双重下降”现象,这同样是现代AI中一个非常新的现象,与传统观念相悖——模型似乎过拟合了、效果不佳,但继续训练更长时间后,突然又表现得很好了。这对你部署和训练模型有什么启示?这是两篇非常新的论文,体现了现代AI的新范式,与传统机器学习或AI课程教的内容很不同,非常精彩。
关于阅读作业的流程:每个人都需要完成一个表格,回答一些问题,写下反思。但每周会选出10个人承担额外的任务,角色包括同行评审等,所有说明都在PDF里。其他角色包括:深入研究该研究的原因、查看代码并给出实现建议、评估该工作的社会影响等。有一个电子表格每周随机分配这10个角色。请确保你们都知道这件事,任务链接里都有。如果你某周因出行无法承担,请尽快告诉我,我会重新安排。
好的,今天我们将讲四部分内容。首先,我会提出一个统一的范式来审视不同的模型架构。与传统的AI/ML课程每周讲一个不同的模型算法不同,我会尝试统一视角,告诉你如何看待不同架构,以及如何设计你自己的定制架构。然后我们会看一些常见的案例:非常适合时间序列的顺序模型、适合空间数据的卷积模型,以及针对集合和图数据的模型。
总的来说,你可以把这些建模范式看作一个光谱。一端是更领域特定的方法,充分利用问题的结构和专家知识;另一端是更通用的模型,依赖更多的数据和计算,较少利用特定领域或问题的结构。比如,你设计一个非常专门的、定制化的神经网络架构,这属于领域特定。你设计一个定制的训练目标,嵌入了你对问题的理解或数据应有的属性,这也属于领域特定。而通用端的方法包括:拿一个现成的模型直接应用(非常通用),或者对预训练的通用模型进行微调或适配。
所有基于数据、架构、训练目标设计的方法,都位于这个光谱的某个位置上。具体位置取决于很多因素。
什么是好模型?首先,它应该能捕捉正确的语义信息。无论你是做预测、生成具有特定属性的数据,还是做预测。同时,粒度也要合适,有些问题需要非常精细的定位,有些则需要高层次的信息摘要。好模型还应使用适量的数据和标签,这是非常重要的因素。光谱上不同位置的方法,所需的无标签数据和标签数据量根本不同。它还要遵守部署时的资源限制,有些模型适合在大型GPU上运行,有些适合在边缘小设备上运行。最后,它应提供适当的可用性,比如你关心的可解释性,或者易于使用。这些都会影响模型在光谱上的位置。在你开始设计模型之前,这可能是你首先应该考虑的事情:什么是好模型?有哪些属性是好的?哪些是你绝对不能妥协的?
接下来几节课将覆盖整个光谱。今天的课更偏向领域特定,讲一些定制的模型架构。如果你选择偏向领域特定路线,之后我们会讲多模态架构,那处于光谱中间,既有定制架构,也有通用架构。春假回来后,我们会更多关注通用架构,以及如何将它们微调和适配到你的任务上。
进入具体模型方法的讨论前,我们先回顾一下两周前关于数据的内容。当时我们提出了“模态画像”的概念。你收集的每个数据、尝试建模的每个任务,都具有一些特征。我发现将问题分解成这些特征很有用。你需要理解数据的每一个特征,以及你将如何建模该特征。第一是基本元素及其表示方式;第二是元素的分布,比如你关注的是图像中的两三个部分还是高频数据?数据是空间结构还是图结构?数据中的噪声类型有哪些?你的模型需要对哪些噪声鲁棒?你的任务是什么?数据与任务的相关性如何?模态画像就是对你的数据的一个总结,是你应该首先审视和理解的东西。
理解了数据,包括分解成基本元素、它们的组成方式、分布等之后,你就开始构建深度学习模型。对深度学习模型的一个统一看法是:这些模型总是包含几个步骤。
第一步是学习表示。定义是:你拿原始数据(可能是高维的),试图学习从中提取信息的、更抽象的特征。这可以是一个模型,将数据转换成更紧凑、更低维的特征,捕获其中的重要信息。
第二个关键属性是表示的“组合”。比如,一幅图像中,我有了天空的表示、地面的表示、上面有房屋的表示——每个都代表一个含义。如何将它们组合起来理解整个场景?模型在深入的过程中,总是在“提取特征/学习表示”和“组合特征”这两个步骤之间交替,逐层学习更信息丰富、更概括的表示。
明白了这两个目的,你就可以将不同的深度学习模块视为实现这两个目的的不同方式。学习表示的模块包括:全连接网络(本质上是多次矩阵乘法),再加上非线性激活函数(如ReLU)。如果全是线性函数,最终只能学到线性模型。激活函数让你能够逼近复杂的非线性函数。层归一化有助于标准化数据。卷积和自注意力我们稍后会讲。这些都是学习特征表示的基本构建块。
第二个是信息聚合的模块。你从图像的一个部分学到了特征,从另一个部分也学到了特征,如何将它们组合成整个图像的特征?拼接是一种非常简单的方式。还有交叉注意力,甚至逐元素相加、逐元素取最大值等,都是组合信息的方式。本质上,你为你的应用设计的任何现代AI模型,都可能是这些模块的某种简单或复杂的组合。
你有了数据(小三角形代表一些元素,如图像中的某些部分、段落中的句子、句子中的单词),然后迭代地应用提取特征的层(学习表示),以及组合信息的层(学习更丰富的语义特征)。设计好前向传播后,你计算损失函数。如果有标签数据,就计算预测值与真实标签之间的差异,这个差异就是要最小化的损失函数。通过计算梯度并应用随机梯度下降来最小化损失,更新参数。
这些对学过深度学习基础的人来说并不新鲜。我只是用一种更统一的方式呈现:这些是你可以定义和组合的不同构建块。只要大部分是可微的,你就可以任意组合它们,计算前向传播、损失、梯度,并更新参数。任何深度学习论文,无论是Transformer还是CNN,都是这些模块的某种组合。关键就在于如何放置这些模块。
我们从一个简单的例子开始:集合(Sets)和点云(Point Clouds)。假设你有一组图像,都是人物,可能有一些属性,你想检测异常,找出某个人口统计属性与其他人不同的人。或者你有3D点云,每个点是XYZ坐标,组成一个3D形状,你的目标是对点云进行分类(如不同种类的家具),甚至生成新的3D模型。你该如何设计神经网络?它会是这些模块的某种组合。你需要从集合和点云中提取特征,并且可能需要聚合信息,因为你有多个图像或多个点。问题是如何做特征提取、学习表示,以及如何聚合信息。
关键是,当你处理集合或图数据时,最重要的结构是:你构建的任何模型都应该对集合中元素的顺序具有不变性(invariance)。无论我以ABCDE的顺序还是以ECBDA的顺序向你展示这组图像,并问你哪个是异常的,你的模型应该给出相同的答案。异常图像不应该取决于展示顺序。因此,成功的设计有两个关键思想:第一,编码每个集合元素的模型应该共享参数(相同颜色代表相同参数)。第二,你应该用一个置换不变(permutation invariant)的函数来聚合从每个元素学习到的信息,例如加法(逐元素相加)。有了聚合后的特征,再通过更多层,做出预测。
为什么重要?想象我用不同顺序展示五张图像。每个元素经过完全相同的特征提取器,得到相同的表示。聚合函数(无论是加法还是别的)也不依赖于顺序。因此最终学到的特征完全相同,预测的异常图像也完全相同。这意味着,如果你给你的模型一个按顺序ABDCE的训练样本,你实际上在隐式地给它所有可能的排列。模型学到相同的表示,与输入顺序无关。
如果不满足这两个约束会怎样?如果不共享参数,对每个元素用不同的特征提取器,那么同样集合的不同排列,模型会学到不同的特征,输出不同。这意味着你需要给模型每种顺序都看一遍才能学会,需要5! = 120倍的数据量。如果共享了参数但用了置换敏感的聚合函数(比如拼接),那么AB和BA拼接出的向量不同,标签也会不同,同样需要120倍的数据量。所以,如果你仔细设计模型架构,你将需要少得多的样本。
到目前为止有问题吗?很好。概括一下:当你处理数据和任务时,有两个非常重要的概念,通常归在“结构”这一理念下。
第一个是数据不变性(data invariances):对数据进行哪些变换,标签或输出应该保持不变?例如,手写数字3的图像,你把它上下左右平移几个像素、旋转45度或90度、从彩色变成黑白,它仍然应该是3。理想情况下模型应该捕捉这些不变性。如果模型对颜色、旋转、微小平移敏感,你就需要更多的数据来学习这个任务。
与之相对的是等变性(equivariance):对输入数据进行的某些变换,模型输出应该以同样的方式变化。比如,做语义分割:图像上有数字3,背景,树,海洋。如果我把图像上移2个像素,语义地图也应该上移2个像素;旋转45度,语义地图也应旋转45度。平移和旋转是等变的变换。而颜色(RGB vs 黑白)则应该是不变的。
所以在集合分类的例子中,你必须尊重置换不变性——对元素顺序任意排列,模型输出不变。
问题:有没有一个资料库,把这些算子映射到构建块上?比如置换不变性相关的算子。答:有一篇论文《几何深度学习》,讲群、图等,是我见过最好的参考文献,对不变性和等变性做了形式化定义。但通常不一定需要那么复杂,处理集合数据时,像加法或逐元素最大值这样的简单技巧就够用了。
下面我们来看一些常见模型架构,它们都受到这些概念的启发。
第一类是时间序列模型。元素可能是单词,组成一个长序列,也可能是时间步的序列、代码、基因组数据。目标是分类(如主题分类)、预测下一个词等。关键问题仍然是:如何学习表示?如何聚合信息?
对于时序数据,一个关键概念是“局部性”。要预测下一个词,很可能要看它前面的那个词,那是最重要的。当然,也要考虑更长的上下文,取决于你的计算资源。这引出了序列分类的经典模型。
模型输入一个单词序列(或时间序列、基因组数据),输出一个预测。同样要考虑不变性和等变性。任何时序模型应该对“时间本身”具有不变性:把序列向前或向后平移一个时间步,不应太大影响输出。但模型应该对“顺序”具有等变性:如果把“狐狸跳过”变成“跳过狐狸”,模型应该非常敏感。处理这两点,几乎所有时序模型都有两个属性:第一,跨时间步共享参数,处理每个单词的函数应该相同(参数共享)。否则你把序列平移几个时间步,输出会完全不同。第二,要跨时间聚合信息(循环)。先提取第一个词的特征,然后看第二个词,提取特征并与之前的累积,依此类推。这种累积方式使模型对单词顺序敏感(等变)。所以共享参数带来时间不变性,递归聚合带来顺序等变性。
数学上,数据x,第一层线性变换U乘以x,加激活函数tanh,再应用下一层V,最后计算损失。这些循环模型就是在时间步上展开,相同的参数U、V应用于x1, x2, x3...,信息不断累积。
也可以扩展到序列生成。输入一个词(如“狐狸”),让模型续写故事或生成音乐。同样共享参数,每一步将上一步的输出y1作为输入生成y2,依次类推,这叫自回归解码。这其实就是循环神经网络(RNN)。有人说RNN过时了,但我不这么认为,因为RNN演变为LSTM,LSTM演变为时间卷积网络,再演变为现代状态空间模型(仍然很流行),用于处理时间序列或连续数据,作为Transformer的替代。
![]()
序列到序列模型则结合了前两者:输入一个序列,输出另一个序列。机器翻译就是典型应用。将三个英文单词翻译成三个法文单词(也可能更多)。注意力机制在这里很关键。一篇经典的机器翻译论文展示了热力图,显示输入英文词与输出法文词之间的对应关系,大部分在对角线附近(顺序保留),但也有非对角线(词序变化)。注意力机制在做生成时,会问:生成第一个输出词时,输入词中哪个最重要?生成第二个时呢?由此得到注意力矩阵。如果语言差异更大,如英汉、英日,注意力矩阵会更偏离对角线。
注意力机制的核心是给不同元素动态权重。为词“lazy”生成新特征时,我会看前面四个词,计算注意力分数,表示每个词对新特征的贡献程度。然后这些分数作为权重,对各个词的特征进行加权求和。在Transformer中,这通过矩阵乘法实现。数据X(3个词,每个词D维),乘以可学习的Wq,再做其他变换,得到一个3x3的注意力矩阵,表示每对词之间的注意力分数。然后除以sqrt(D)归一化(防止点积过大),再对每一行做softmax,使得每一行的注意力权重非负且和为1,可以解释为概率分布。最后,将这个注意力矩阵乘以特征向量(另一个线性变换),得到新的表示。这就是五分钟讲完的Transformer。
虽然Transformer看起来和循环模型不同,但其实没那么大差别。回到统一框架:时序模型必须对时间不变、对词序等变。Transformer依然做到了这点:共享参数(同一个W矩阵应用于所有词),所以对时间平移不变;信息聚合不是顺序进行(可以并行矩阵乘法),但注意力矩阵依赖于顺序,所以对词序等变。
最后是空间数据(图像)。如何为图像的每个部分学习特征?如何聚合不同区域的特征来做预测?理想情况下,我们希望对空间变换具有不变性(分类任务平移/旋转几像素,输出不变)或等变性(分割任务)。但注意,这取决于任务本身。
一个朴素方法是把图像展平为像素序列,然后用全连接网络。但200x200的图像有4万像素,下一层的权重矩阵巨大,不高效。另一个问题是,全连接网络对微小平移非常敏感,而理想模型应具有平移不变性。
卷积神经网络(CNN)的关键思想:第一,稀疏连接。输出某个位置的响应只依赖于输入图像中附近一个小区域(由滤波器大小决定)。这节省参数、计算量,也尊重局部性。第二,共享参数。应用于不同位置的同一个滤波器,使用相同的权重。这带来了平移不变性:只要物体移动不超出滤波器窗口,输出就不会变。具体操作:用一个3x3的窗口提取特征,然后滑动窗口到下一个3x3区域,每次用相同的权重。这就是卷积层。池化层(如取2x2区域的最大值)进一步增强了不变性,迫使模型关注更大范围的图景。卷积层让模型学习“部分之组合”:从像素到边缘,到直线边缘,到形状,再到更复杂的概念(如人脸)。池化层让模型学习更抽象的信息。
现在很多人用视觉Transformer(ViT)。它们把图像切成3x3的块,将这些块作为序列(像单词一样),应用Transformer,学习每个块的表示。同样,参数在各个块之间共享,信息在块之间聚合。如果块大小设计得当,模型对微小平移也不敏感。ViT就是把图像序列化,加位置嵌入,然后用Transformer得到整体表示。
最后是图数据。有节点和边。同样,要共享参数(每个节点用相同的函数),否则无法泛化到新节点或新图。信息聚合:要学习节点A的表示,先看它的邻居(如社交网络中A的朋友),从它们那里提取特征;而邻居的表示又依赖于它们的邻居,递归进行。所以图网络就是:所有节点共享同一个函数,信息基于连通性聚合。注意,集合可以看作没有边的图,空间数据(图像)可以看作在局部区域上下左右相连的图,序列可以看作链状的图。因此,所有这些模型(序列、图像、图、集合)都统一在这个框架下:跨元素共享参数,信息聚合基于邻居。
总结一下,今天的量很大。幻灯片我会传到网上。希望这个统一框架能帮你看待多种深度学习架构,并知道如何设计自己的模型。
上周讲了“如何对待数据”:决定收集和标注多少数据(非常关键)、清洗、归一化、去除异常值、可视化数据以理解标签与数据的关系,以及初步评估。
今天,我们看了针对不同模态的领域特定方法,也让你了解了如何为集合、图等构建定制架构。接下来几节课,我们会看更通用的模型以及如何适配它们。你必须为一个AI问题做的重要决策是:是否存在可以适配或微调的通用模型?不存在的话,要在多大程度上构建领域特定的模型(无论是架构还是训练目标)?你要弄清楚基本元素及其表示:复杂数据如何分解成基本元素?这些元素是按顺序组织、空间组织,还是集合或图?弄清楚数据的不变性和等变性——模型不应该对什么敏感、应该对什么敏感。这非常关键,如果不小心,模型训练所需样本量会爆炸。同时,模态画像的其他部分也要考虑,如模型应该对什么噪声鲁棒、信息量大小等。最后,你通常需要在数据收集、模型设计、训练、调参、评估之间迭代,直到满意为止。
总结完毕。记住阅读作业明天截止,为周四讨论做准备。请今晚提交项目提案,即使晚点发给我也行。接下来的一个小时我会在实验室答疑。谢谢大家。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.