CMU-11-777-多模态机器学习笔记-全-

CMU 11-777 多模态机器学*笔记(全)

课程 P1:L1.1 - 多模态机器学*介绍 🎬

欢迎各位。这是本课程有史以来规模最大的一届。这门课是多模态机器学*,我非常激动能开始这个新学期。这大概是我们第六次教授这门课程,但今年我们做了一些调整。课程完全以远程方式进行录制和教学。

如果你在任何时候有问题,我非常欢迎提问。由于这是一个非常大的群体,我请求大家将问题输入到聊天框中。助教们会监控聊天,他们可能会直接回答问题。如果问题没有被直接回答,我会在后续进行解答。

我们现在就开始。本学期我们有五位助教将与我们合作,我非常高兴能有他们五位。他们都是精心挑选的,在之前学*过这门课程或直接从事多模态研究方面有经验。

我们还将有几位客座讲师。Paul 将在强化学*方面进行几次讲座,我非常高兴他能接受邀请。其余大部分时间将由我主讲,课程后期还会有更多客座讲师,包括 Prakhar、Martin、Shakib 和 Thorsten。

今天,我的目标首先是分享我对多模态的热情。我绝对对这个话题充满热情,你们会在我的讲座中感受到。我想给你们一个多模态的定义,回顾其历史,并分享涉及许多模型研究的五个技术挑战。最后,我会详细介绍课程大纲。

什么是多模态?🤔

从数学角度看,多模态可以看作是多模态分布,即一个分布有多个峰值。但在本课程中,我们更多地关注与感官模态相关的内容:声音、触觉、言语、视觉等。这些都是感官模态。

多年来,我自己做了很多研究,主要集中在这些模态的一个子集上。虽然我对一般的多模态机器学*感到兴奋,但我个人专注于其中三个对交流至关重要的模态,我称之为交流的“3V”:言语、声音和视觉。

  • 言语:指所说的词语、措辞方式以及词语背后的意图。
  • 声音:一方面指韵律,即你说话的方式;另一方面指声音表达,如笑声或填充词,这些是非言语方面。
  • 视觉:包括手势、身体语言、眼神交流和面部表情。

这些都是多模态的例子。在给出具体模态之前,需要区分“多模态”和“多媒体”。模态是某事发生或体验的方式,几乎是其内容。而媒介是存储和传播的方式。音频可以是一种媒介,声音可以是一种模态。多年来,这两个术语重叠很多,人们开始交替使用它们。

当思考多模态时,必须想到多学科性。它来自许多不同的领域,汇集在一起。人工智能的各个领域在此交汇:语音、视觉、语言,还有触觉和机器人学、学*理论,以及从医学和心理学中获取的应用和知识。

除了自然语言、视觉和听觉,还有触觉。如今,我们的手机上有许多传感器。在医学领域,有脑电图、红外摄像头、核磁共振成像等。本课程将主要关注语言和视觉,作为我们许多示例的基础构件。但我们会尽可能引入其他模态的例子。

历史视角 📜

有时我们认为超过五到十年的研究就太旧了,但我认为多模态是多年来真正演变的,回顾以前的工作很有价值。根据我的研究,多模态有四个时代。

  1. 行为时代:很多工作受到心理学和跨文化交流的启发。
  2. 计算时代:在80年代中后期,突然不再仅仅从心理学或语言学角度看待多模态行为,而是开始采用计算方法,例如视听语音识别。
  3. 交互时代:重点从人机交互转向多人社交互动。
  4. 深度学*时代:大约2010年左右,随着神经架构的复兴,多模态研究进入了新阶段。

本课程将更侧重于深度学*时代的部分,但广泛地了解整个历史也是有益的。

如果你要读一篇这个时代的论文,David McNeill 在语言和手势方面做了很多有趣的工作,他认为手势是人们思想的展示。CMU 的 Justine Cassell 教授曾与他密切合作。

从心理学、语言学转向计算方法的一个关键时刻是“麦格克效应”。这个效应表明,我们所看到的会影响我们所听到的。我将播放两个视频片段,你需要同时观看和聆听。

(播放第一个视频片段)
(播放第二个视频片段)

有趣的是,对于没有仔细观看的人来说,可能两次听到了相同的声音。原因是这两个片段的音频是完全相同的,唯一的区别是视频。在第一个片段中,你可能听到了更接*“ba”的声音,而在第二个片段中,可能听到了更接*“fa”或“va”的声音。这非常令人兴奋,它表明为了很好地识别语音,我们可能需要同时看和听。

这推动了计算时代,特别是视听语音识别的研究。在这个时代,一个有趣的发现是,虽然视听结合确实有帮助,但在许多情况下,音频和视觉信号编码了相同的信息,存在大量冗余,这使得系统更加鲁棒。当然,也存在互补的情况,需要两种模态才能推断出信息。

与此同时,在人机交互领域,人们对多模态产生了浓厚兴趣,因为人类与计算机的交互方式应该与人类彼此交互的方式相同。情感计算也是这个时代的一个子领域,它关注感知、生成和建模情感,因为情感对决策至关重要。

多媒体计算也在大约同一时期兴起,其核心思想是理解视频的内容,而不仅仅是基于关键词搜索。CMU 的 Informedia 项目就是一个里程碑。

然后是交互时代,我们希望建模人与人之间的互动。AMI 项目是一个标志性项目,他们录制了会议中人们的交谈。随后,出现了更多关注社交互动和社交信号处理的项目。

接着,我们进入了深度学*时代。深度学*时代对多模态如此重要的原因有几个。首先是出现了更多、更大的多模态数据集。其次是更快的计算机和 GPU 使我们能够重新审视90年代的理论和模型,并在更大规模上应用。

但我认为真正带来改变的是另外两点。对于视觉这种高维模态,神经表示和卷积神经网络的复兴,使得我们可以将空间和纹理信息编码到一个更小的向量中。对于语言,分布式假设(即一个词的含义可以通过其周围的词来*似)被重新审视,特别是通过 Word2Vec 等工作,我们可以将离散的词语编码成向量表示。

现在,对于语音,虽然过去已有很好的表示(如频谱图、MFCC),但总体上,这些模态的表示空间虽然不同,但比以前更接*了。我们从非常异构的表示转向了相对不那么异构的表示,这为多模态研究带来了新的机遇。

为什么研究多模态机器学*?🎯

你可能会想,为什么要专门研究多模态机器学*,而不只是研究一般的机器学*?我们在大约六年前开始教授这门课程,目标是研究机器学*中已有的内容以及多模态研究中已有的内容,并试图找出多模态中那些在机器学*中未被充分研究的核心技术挑战。

我们确定了五个核心挑战,并将在今天的讲座中重点介绍它们。我们也将以此作为本课程的结构框架。当然,课程内容会远远超出这些,因为研究在不断发展。

五大核心技术挑战 ⚙️

1. 表示学*

对于许多问题,包括多模态,一个核心挑战是如何将言语、声音和视觉等信息结合起来。在表示学*层面,这尤为重要。深度学*的研究者都理解表示学*的挑战。在多模态中,有一些与表示相关的关键挑战。

我的一个梦想是学*一种表示,使得“我喜欢它”、“我有一张快乐的脸”或“欢快的语调”都能在表示中被编码,并体现出相似性。在2010-2011年左右,这个梦想变得更接*现实。人们突然能够学*联合表示,即一个共享的表示空间,使得不同模态的数据(如图像和描述)可以共存。

一个经典的例子是,通过成对的图像和描述数据集,模型学*到一个联合表示(一个向量)。成功训练后,你可以将任何句子或图像编码到这个空间。有趣的是,你可以进行向量算术运算。例如,取一张“蓝色汽车”的图像向量,减去“蓝色”的词向量,再加上“红色”的词向量,得到的新向量在最*邻搜索中可能会找到“红色汽车”的图像。虽然这并非总是有效,但在某些情况下可行,这非常令人兴奋。

因此,表示学*的挑战可以形式化为:学*如何表示和总结多模态数据,以利用其互补性和冗余性。在视听语音识别中,两种模态间存在大量冗余,利用这种冗余可以提高效率和鲁棒性。同时,也需要利用互补性,就像麦格克效应那样,单一模态不足,需要结合两者。

除了联合表示,还有协调表示的思路。不是强迫所有模态进入同一个空间,而是让每种模态有自己的表示空间,然后协调这些空间中的某个子集。协调是一个谱系,一端是强协调(*乎联合表示),另一端是分离表示,中间是相关表示(如典型相关分析 CCA)或仅对齐子集。

2. 对齐

对齐是多模态中非常核心的挑战。我说话、做手势是同时发生的,你需要能够对齐语音和手势。从多视图学*的角度看,多模态可以看作是它的一个特例,其中视图就是模态。多语言翻译也是多视图问题,同样涉及对齐。

对齐有两种类型:

  • 显式对齐:你的目标函数或任务直接要求对齐,例如给定一堆图像和文本,要求进行匹配。
  • 隐式对齐:对齐是中间步骤或潜在过程,真正的损失函数可能是其他任务(如图像生成文本)。注意力模型和 Transformer 中的自注意力机制就是隐式对齐的例子。

3. 翻译

从对齐出发,分支出来两个方向:翻译或融合。翻译是指将一种模态转换为另一种模态,例如图像描述(图像到文本)、语音到手势生成等。

翻译的挑战在于,模态间的翻译关系通常是开放式的、一对多的,并且是主观的。这与任何翻译任务(如机器翻译、语音生成)一样,评估是一大挑战。

翻译方法大致可分为两类:

  • 非参数方法:例如最*邻方法,在测试时参考训练样本。
  • 参数方法:试图减少参数数量,并研究训练和测试之间的泛化。

4. 融合

融合是指将所有模态的信息结合起来,以推断出更高层次的新信息,例如识别视频中的情感或事件。这与翻译不同,翻译的目标是生成另一种模态。

融合可能是最古老的多模态挑战。在我开始读博时,多模态研究几乎可以总结为早期融合和晚期融合。早期融合是指在处理早期就将模态连接起来,适用于存在低层次多模态现象的情况。晚期融合是指先对每种模态进行内部处理,然后再进行融合,适用于数据量较小的时期。

如今,有了更多方法,包括深度神经架构的各种变体、基于核函数的方法以及图模型。图模型具有可解释性,并且可以融入领域知识。

5. 协同学*

协同学*背后的直觉是,有时我们最感兴趣的问题本质上是单模态的,例如图像中的目标检测。但也许在训练时,可以利用其他模态的信息来帮助这个单模态任务,从而在测试时(仅使用单模态)表现得更好。

协同学*在数据有限(如小样本学*)的场景中特别有用。语言可以帮助视觉,视觉也可以帮助语言,这就形成了双向协同学*,在多视图设置中这被称为协同训练。

协同学*的一大挑战是配对数据的关联强度。配对可以是强配对(如每个词都有对应翻译),也可以是弱配对(如只知道一个语料库中的句子与另一个语料库中的句子相关,但不知道具体对应关系)。在多模态中,你可能有大量图像和文本,但只在语料库级别关联。

一个例子是学*语言嵌入。对于书面语料库,数据很多。但对于口语,数据可能相对较少。我们可以利用说话时的额外信息(如手势、语调)来帮助训练语言表示。在测试时,我们只使用语言。这可以通过翻译框架结合循环一致性损失来实现,确保中间表示既包含源模态信息,又能重建目标模态。研究表明,这种方法的效果几乎与在训练和测试时都使用多模态信息一样好。

以上是对五大挑战的高度概括。我们将在接下来的15周里深入研究细节和最新技术。需要指出的是,多模态研究有许多应用。虽然我强调了情感计算部分,但真正推动*期复兴的是语言与视觉研究,如图像描述、视频描述和视觉问答。

课程安排与要求 📚

我们的目标是让这门课的学*方式充满吸引力。考虑到虚拟远程教学的挑战,我们设定了三种主要的学*模式。虽然成绩占比不同,但三者同样重要。

  1. 课程讲座与参与:通过“讲座重点总结”来评估。从第二周开始,每次讲座后,你需要提交对每30分钟左右时段的主要收获总结(需完整句子),并可以提问。提交截止时间为讲座结束后42小时。我们会评分,但要求宽松。我们也会尽力回答提出的问题。
  2. 阅读任务:为了让大家了解前沿研究,我们设置了阅读任务。我们会将学生分成9-10人的学*小组。每次阅读任务会提供三篇论文,小组内成员分工阅读,然后通过讨论论坛互相帮助、提问和解答。你需要至少深入阅读一篇论文,并参与两次讨论。
  3. 课程项目:这是课程的核心。我们强烈建议项目包含语言和视觉两种模态。建议团队规模为3-5人。项目需要探索建模方面的新想法。项目进程分为几个阶段:
    • 预提案:很快截止,需要确定数据集和任务偏好,并开始组队。
    • 提案:进行文献综述,并对数据集进行单模态分析。
    • 中期:实现该领域的现有先进模型,并进行误差分析。
    • 最终项目:尝试两到三个新的想法。

课程项目有严格的时间要求,无法在截止日期前两三天突击完成,需要团队每周至少开会一次,提前规划。

课程成绩构成:讲座参与占16%,阅读任务占24%,课程项目占60%。

关于课程资源,我们将使用 Canvas(有限功能)、Zoom(直播)、Panopto(录播)、Piazza(公告、问答、讨论)和 Gradescope(作业提交)。我们还有一个对外公开的课程网站,会发布清理掉个人信息的讲座资料。

目前有约70多人在等候名单中。好消息是,明年春季学期将开设新的多模态机器学*课程,由 Jonathan Bisk 教授主讲。如果你秋季无法选上,可以考虑春季课程。

最后,有一项作业:项目偏好选择,详细信息将很快在 Piazza 上发布,截止日期是周二。

总结

在本节课中,我们一起学*了多模态机器学*的基本介绍。我们探讨了多模态的定义,回顾了其从行为时代、计算时代、交互时代到深度学*时代的历史发展。我们重点介绍了多模态研究中的五大核心技术挑战:表示学*、对齐、翻译、融合和协同学*。最后,我们了解了本课程的学*模式、安排和要求。希望这门课能带领大家深入这个令人兴奋的领域。

课程 P10:L5.2 - 对齐与表示 🧠

在本节课中,我们将学*如何扩展对齐和注意力的概念,并开始研究句子级别的嵌入方法。我们将重点介绍一种在自然语言处理中极为流行,并逐渐在多模态领域普及的技术:自注意力机制,特别是 Transformer 架构。我们还将探讨在大规模数据上进行预训练的思想,并了解多模态预训练的基本概念。


上下文序列编码

在之前的课程中,我们讨论了序列编码,即如何编码整个句子。本节中,我们将探讨一种序列编码类型,其目标是编码每个单词,但每个单词的编码都考虑了其他单词的上下文信息。例如,单词“plant”的含义可以通过其上下文来消除歧义。

另一种序列编码是为整个句子或序列生成一个单一的嵌入表示,这也是我们将要学*的内容。

那么,如何使用我们已经掌握的工具来实现这种序列嵌入呢?一种方法是使用双向LSTM。你可以想象使用一个LSTM或循环神经网络,先从一个方向进行上下文编码,再从另一个方向进行编码,从而得到考虑了其他单词信息的新版本嵌入。

ELMo 就是一个例子,我们之前已经讨论过它。ELMo 等方法虽然很好,但并行化处理较难。对于很长的句子,为了嵌入某个单词,需要先处理完所有其他单词的嵌入,这种顺序处理使得并行化变得困难。

另一个可能来自计算机视觉领域的方法是卷积。我们可以使用多个卷积核,通过时间延迟卷积网络来处理序列。这种方法的好处是可以并行化,因为要推断某个位置的嵌入,只需要局部的卷积核信息,就像处理图像一样高效。

然而,卷积的挑战在于难以直接建模长距离依赖关系。除非使用多层卷积,否则默认的局部感受野意味着无法直接考虑长距离依赖。多层卷积虽然可以解决这个问题,但会增加计算复杂度。

此外,需要记住的是,这些卷积核在训练时是固定的模板,用于寻找特定类型的模式。在测试时,这些模式是相同的,即用于分析不同单词的卷积核是相同的。

因此,也许还有其他方法可以研究,而自注意力就是一种很好的上下文编码方式。它可以并行化,并且其注意力权重(几乎可以看作是动态的卷积核权重)是动态的,这带来了更大的灵活性。当然,它也有代价,例如参数数量可能更大,但它带来了巨大的优势。


自注意力机制

接下来,我们看看如何实现自注意力。我们的目标是:已经获得了每个单词的初始嵌入,但我们希望得到新的嵌入,这些新嵌入应该考虑其他单词的信息。

例如,如果我们想为第一个单词“I”获取新的嵌入,我们还需要知道其他单词的有用程度。直觉上,我们会使用注意力机制

具体来说,对于这个单词“I”,我们会计算一个注意力权重,告诉我第二个单词“do”与它的相关程度有多高,第三个单词“not”与它的相关程度有多低。然后,我们使用这些注意力权重,乘以对应的单词嵌入,再进行求和,从而得到“I”的新嵌入。

我们对句子中的每个单词都重复这个过程。例如,对于单词“do”,我们会计算一套新的注意力权重,看看“do”与“I”、“not”等单词的相关性。然后,同样进行加权求和,得到“do”的新嵌入。

这就是自注意力的核心思想:我们动态地计算这些注意力权重,以确定其他单词对当前单词的重要性,然后利用所有这些注意力权重来计算新的嵌入表示。

到目前为止,这看起来很像普通的注意力机制,只是现在我们为每个单词都计算了一套注意力权重。基本概念是相同的:取注意力权重,乘以单词嵌入,然后求和得到新的嵌入 h'

那么,如何计算这些注意力权重呢?这正是 Transformer 架构的精妙之处。


Transformer 自注意力模块

在标准的自注意力中,输入是相同的。但对于 Transformer 架构,我们需要一种方法来计算注意力权重。一种非常流行的方法是 Transformer 的自注意力实现。

在原始论文中,他们决定将单词的初始嵌入投影到一个新的空间中。这个新嵌入不仅有助于生成当前单词的新表示,也有助于其他单词的计算。

具体操作是:取相同的输入,但用三个不同的矩阵进行投影,分别得到查询。目前,这三者都来自相同的输入,因此称为“自”注意力。

那么,如何得到注意力权重 α 呢?关键在于相似度计算

对于当前单词(例如“I”),我们将其投影为查询向量 q。对于句子中的其他每个单词(例如“not”),我们将其投影为键向量 k。然后,我们计算查询向量 q 与每个键向量 k 的相似度。在 Transformer 中,这通常通过缩放点积注意力来实现:相似度 = (q · k) / sqrt(d_k),其中 d_k 是键向量的维度。

这个相似度分数就代表了当前单词与另一个单词的相关性 α。然后,我们对所有 α 进行 softmax 归一化,得到注意力权重。

最后,我们用这些注意力权重对对应的值向量 v(由单词嵌入投影而来)进行加权求和,从而得到当前单词新的上下文嵌入表示。

这个过程可以紧凑地表示为矩阵运算。对于所有单词,我们同时计算所有查询、键和值,然后通过一次矩阵运算得到所有单词的新嵌入。

Transformer 自注意力模块的美妙之处在于,它扩展了注意力的概念,使得句子中的每个部分都能被所有其他部分上下文化。这几乎就像图像中的每个像素都能被图像中所有其他像素上下文化一样。


多头自注意力

如果我们希望同时关注多个不同的子空间呢?例如,在句子“I do not like it”中,可能有一种上下文化方式专门关注否定关系(如“do not”),另一种方式关注共指关系(如“it”指代前面的某个事物),还有一种方式关注词汇消歧

我们可能希望自注意力机制能有多个“头”,每个头专注于一种特定类型的上下文关系。这就是多头自注意力的直觉。

在实践中,我们并不强制每个头学*特定的关系,而是让模型自动学*。我们设置多个并行的自注意力层(即多个“头”),每个头都有自己的查询、键、值投影矩阵。这样,每个头可能会学*到不同类型的上下文信息。

最后,我们将所有头的输出拼接起来,并通过一个线性投影层,融合成最终的单一嵌入表示。

公式上,对于第 i 个头:
head_i = Attention(Q * W_q_i, K * W_k_i, V * W_v_i)

最终输出为:
MultiHead(Q, K, V) = Concat(head_1, ..., head_h) * W_o

其中 W_o 是输出投影矩阵。


位置编码

现在思考一个问题:在当前的 Transformer 架构中,如果我们改变句子的词序会怎样?例如,将“I do not like it”改为“it like not do I”,单词“not”的新嵌入 h_3 会不同吗?

在目前描述的基本自注意力中,如果不做任何处理,输出将是完全相同的。因为自注意力机制只关注词与词之间的关系,而不考虑词的绝对或相对位置。这相当于一个“词袋”模型,失去了顺序信息。

显然,我们需要解决这个问题。一种简单有效的方法是位置编码

最直接的方法是为每个位置分配一个独热编码向量。例如,第一个位置是 [1, 0, 0, ...],第二个位置是 [0, 1, 0, ...],依此类推。

更常用的方法是使用正弦和余弦函数来生成位置编码向量,使其包含丰富的相对位置信息。对于位置 pos 和维度 i
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))

然后,我们将单词的初始嵌入 x 与位置编码 p 相加,作为 Transformer 的输入:input = x + p

这样,当词序改变时,即使单词相同,其输入表示也会因位置编码不同而不同,从而让模型感知到顺序信息。


编码器-解码器与掩码自注意力

我们如何将 Transformer 用于序列到序列的任务,比如机器翻译或图像描述生成?

对于输入序列(编码器部分),我们可以直接使用之前介绍的自注意力。

对于输出序列(解码器部分),生成过程是自回归的:我们根据已生成的部分来预测下一个词。在训练时,为了模拟这个过程并防止模型“偷看”未来的信息,我们需要使用掩码自注意力

在掩码自注意力中,当计算某个位置(例如第三个词)的嵌入时,我们只允许它关注该位置之前的所有位置(第一、二个词),而屏蔽掉之后的位置。这通过一个掩码矩阵来实现,将未来位置的注意力权重设置为负无穷大,这样经过 softmax 后其权重就为 0。

此外,在标准的 Transformer 解码器中,还有一层编码器-解码器注意力。在这一层中,查询来自解码器上一层的输出,而则来自编码器的最终输出。这使得解码器在生成每个词时,都能有选择地关注输入序列中最相关的部分。

所以,完整的 Transformer 模型包含:

  1. 编码器:由多层自注意力层和前馈网络层组成。
  2. 解码器:由掩码自注意力层、编码器-解码器注意力层和前馈网络层组成。

扩展到多模态

如何将自注意力思想扩展到多模态任务,例如同时处理语言、视觉和听觉信息?

最简单的方法是将所有模态的输入拼接成一个长序列。例如,将6个词嵌入、5个图像区域特征和10个声学特征拼接成一个包含21个向量的序列。然后,直接在这个拼接序列上应用一个大的自注意力 Transformer。最后,我们可以从这个 Transformer 的输出中,取出对应不同模态的部分,作为各自的上下文嵌入。

为了区分不同模态和不同位置,我们可以在输入中加入模态嵌入位置嵌入。模态嵌入可以是一个简单的独热向量,表示该输入属于语言、视觉还是听觉。

另一种更精细的方法是使用跨模态注意力。例如,如果我们想用视觉信息来增强语言表示,我们可以让语言表示作为查询,视觉特征作为,计算一个注意力上下文向量。然后,通过残差连接将这个上下文信息加到原始的语言表示上。我们可以为每对模态之间都建立这样的跨模态注意力连接。


预训练:BERT

如何以无监督的方式训练这样的 Transformer 模型,并使其能够用于下游任务?这里我们介绍 BERT

BERT 的核心思想是利用分布假说进行预训练。它使用两种主要的无监督任务:

  1. 掩码语言模型:随机掩盖输入句子中15%的单词,然后训练模型根据上下文来预测这些被掩盖的单词。这迫使模型学*强大的双向上下文表示。
    Loss_MLM = - Σ log P(masked_word | context)

  2. 下一句预测:给定两个句子 A 和 B,训练模型判断 B 是否是 A 的下一句。这帮助模型学*句子间的关系,并获得句子级别的表示。
    Loss_NSP = - [y * log(p) + (1-y) * log(1-p)],其中 y=1 表示 B 是 A 的下一句。

BERT 的输入格式很特别:在每个序列开头添加一个 [CLS] 标记,其最终的隐藏状态可用于句子级别的分类任务;在不同句子之间添加一个 [SEP] 标记作为分隔。此外,输入嵌入是词嵌入段嵌入(区分句子A和B)和位置嵌入三者的和。

经过在大规模语料上预训练后,BERT 可以很容易地通过微调适应各种下游任务:

  • 句子分类:使用 [CLS] 标记的最终输出,接一个分类层。
  • 词性标注:使用每个词对应的最终输出,分别接分类层。
  • 问答:将问题和篇章拼接输入,模型输出两个向量分别预测答案在篇章中的开始和结束位置。

总结

本节课中,我们一起深入学*了自注意力机制和 Transformer 架构。我们从上下文序列编码的需求出发,探讨了自注意力的基本原理,以及如何通过查询、键、值的投影和相似度计算来实现动态的上下文编码。我们了解了多头自注意力如何让模型同时关注不同类型的信息,以及位置编码如何让模型感知序列顺序。

我们还探讨了 Transformer 在编码器-解码器架构中的应用,包括掩码自注意力和跨模态注意力的思想。最后,我们介绍了如何通过 BERT 式的预训练任务,在大规模无监督数据上训练 Transformer,并将其微调到各种下游任务中,包括多模态场景。

Transformer 及其衍生模型已成为现代自然语言处理和多模态理解的基石,其灵活性和强大能力值得我们深入理解和掌握。

课程 P11:L7.1 - 对齐与平移(映射) 🎯

在本节课中,我们将要学*多模态对齐与翻译的核心概念。我们将首先探讨语音识别中的对齐问题,特别是连接主义时序分类(CTC)方法。接着,我们会研究视频对齐中的时序循环一致性方法。最后,我们将转向多模态翻译任务,重点分析视觉问答(VQA)及其相关的注意力机制与神经模块网络。


概述 📋

对齐与翻译是多模态学*中的两个基本任务。对齐关注如何在不同模态(如音频与文本、视频与视频)之间建立对应关系。翻译则涉及将信息从一种模态转换到另一种模态,例如从图像生成描述或回答关于图像的问题。


语音识别中的对齐 🔉

上一节我们概述了对齐任务,本节中我们来看看它在语音识别中的具体应用。语音识别是一个典型的多模态翻译任务,它将声学信号(音频)转换为语言(文本)。这个过程涉及从高粒度、连续的音频信号到低粒度、离散的语言符号的映射。

挑战:从帧到音素的映射

音频信号通常以高帧率(如每秒100帧)表示,而音素(语言的基本声音单位)的出现频率则低得多(如每秒10-12个)。这造成了多对一映射的挑战:许多连续的音频帧可能对应同一个音素。

核心问题:如何将一系列音频帧 \(X = [x_1, x_2, ..., x_T]\) 对齐并映射到一系列音素 \(Y = [y_1, y_2, ..., y_U]\),其中 \(T > U\)

解决方案:连接主义时序分类(CTC)

CTC是一种专门为解决这种多对一对齐问题而设计的损失函数和算法。它允许模型在不需要帧级别精确标注的情况下进行训练。

CTC的核心思想

  1. 模型为每个输入帧预测一个音素分布,并额外引入一个特殊的 空白(blank) 标签。
  2. 模型考虑所有可能的音素对齐路径(允许重复和空白)。
  3. 通过动态规划(前向-后向算法)高效地计算所有有效路径的总概率。
  4. 训练目标是最大化正确音素序列(合并重复音素并移除空白后)的概率。

CTC损失函数公式
\(L_{CTC} = - \log P(Y|X) = - \log \sum_{\pi \in \mathcal{B}^{-1}(Y)} P(\pi|X)\)
其中,\(\pi\) 是一条可能的对齐路径,\(\mathcal{B}\) 是一个操作,用于合并路径中的重复字符并移除空白标签。

CTC的优势:它不要求精确的音素边界,只关注音素之间的转换。这使得模型对音频和文本之间的微小时间错位更加鲁棒。


视频对齐中的时序循环一致性 🎬

上一节我们介绍了CTC这种针对序列的特定对齐方法,本节中我们来看看一种更通用、可学*的对齐方法,它适用于视频等模态。

时序循环一致性(Temporal Cycle Consistency)是一种自监督学*方法,用于对齐两个未标注但内容相关的视频序列(例如,两个人执行相同的动作)。

核心直觉

其核心思想是循环一致性:如果视频A中的一帧在视频B中找到了最相似的帧(最*邻),那么这帧B中的帧也应该在视频A中把原始的那帧A作为它的最*邻。

方法步骤

  1. 编码:使用神经网络编码器(如CNN)将每个视频帧编码为特征向量。
  2. 软最*邻查找:对于视频A中的一帧 \(f_a\),计算它与视频B中所有帧的相似度(如余弦相似度),得到一个注意力分布(软对齐)。
  3. 循环验证:通过步骤2找到视频B中与 \(f_a\) 最相关的帧 \(\hat{f}_b\)。然后,反过来查找视频A中与 \(\hat{f}_b\) 最相关的帧 \(\hat{f}_a\)
  4. 损失函数:目标是让 \(\hat{f}_a\) 尽可能接*原始的 \(f_a\)。损失函数惩罚这个距离,鼓励编码器学*到使循环一致的对齐更容易的特征。

损失函数示意
\(L_{TCC} = \text{Distance}(f_a, \hat{f}_a)\)
其中,\(\hat{f}_a\) 是通过“A->B->A”的循环查找得到的。

优势与应用

  • 自监督:不需要人工标注的对齐数据。
  • 联合学*:在学对齐的同时,也学*到了更好的视频帧特征表示,这些特征可用于下游任务(如动作识别)。
  • 可扩展性:此思想可被扩展到多模态对齐(如视频-语言),但挑战在于如何设计跨模态的相似度度量。

多模态翻译:以视觉问答为例 ❓🖼️

前面我们讨论了对齐,现在我们将焦点转向翻译。在多模态语境中,翻译的一个典型例子是视觉问答

什么是视觉问答?

VQA任务要求模型根据给定的图像和一个关于该图像的自然语言问题,生成或选择一个正确的答案。

示例

  • 图像:一张街景图。
  • 问题:“天空中有云吗?”
  • 答案:“是。”

VQA的优势在于其评估相对客观(对于分类式答案),避免了图像描述生成任务中存在的多种合理答案带来的评估难题。

关键技术:注意力机制

解决VQA的核心是让模型学会在问题和图像之间建立联系,即对齐问题中的词语与图像中的区域。

堆叠注意力网络
这是一种进阶的注意力机制。模型不是只做一次图像-问题对齐,而是进行多轮(堆叠)的注意力。

  1. 第一轮注意力根据问题初步聚焦图像的某些区域。
  2. 基于第一轮聚焦的结果和原始问题,模型生成一个更新的查询向量。
  3. 用这个更新的查询向量进行第二轮注意力,进一步细化聚焦的区域。
  4. 这个过程可以重复多次,使模型能够迭代地推理,逐步找到回答问题所需的确切视觉信息。

引入先验知识:神经模块网络

为了处理更复杂的推理问题,神经模块网络(NMN)被提出。它不将问题视为一个整体,而是根据问题的语法结构(如依存句法分析树)将其分解为多个子步骤。

工作原理

  1. 解析:将问题(如“公共汽车上坐满乘客了吗?”)解析成语法树。
  2. 模块化:预定义一系列可微的神经“模块”,每个模块执行一个特定功能(如“查找物体”、“合并属性”、“判断是否存在”)。
  3. 组装:根据语法树,将对应的神经模块组装成一个可执行的“程序”(计算图)。例如,先调用“查找[公共汽车]”模块,再调用“查找[乘客]”模块,最后调用“判断[是否满]”模块。
  4. 执行与学*:这个组装好的网络在图像上执行,端到端地进行训练。模型同时学*每个模块的参数以及如何根据问题组装它们。

优势

  • 可解释性:推理过程清晰,类似于分步解题。
  • 样本效率:引入了语言结构先验,可能更擅长处理复杂、长尾的推理问题。
  • 灵活性:可以为特定领域设计专门的模块。

进一步发展:神经符号学*

神经符号学*是NMN的延伸,旨在获得更高的可解释性。其核心思想是:

  1. 将视觉特征(如来自Mask R-CNN的区域特征)进一步抽象为符号化属性(如颜色、形状、材质、空间关系)。这些属性是人类可读的。
  2. 同样根据问题生成一个符号化的程序(如 filter(color=‘red’)relate(left_of))。
  3. 在符号属性上执行该程序,得到答案。

这种方法将神经网络的感知能力与符号系统的推理可解释性结合起来。


应用与思考 💡

对齐与翻译技术催生了许多有趣的应用,例如:

  • 声音定位:仅从视频学*物体发声的位置(如“像素的声音”)。
  • 语音转面部:从声音预测说话者的面部特征(需注意此类技术可能带来的偏见问题)。

在研究这些应用时,我们必须积极思考其伦理影响潜在偏见,确保技术被负责任地使用。


总结 🎓

本节课我们一起学*了多模态中的对齐与翻译。

  • 我们首先深入探讨了语音识别中的CTC方法,它通过允许空白和重复标签,优雅地解决了音频帧与音素之间的多对一对齐问题。
  • 接着,我们学*了时序循环一致性这一自监督对齐方法,它通过强制循环一致性约束,在视频对齐中学*有意义的特征表示。
  • 最后,我们转向多模态翻译,以视觉问答为范例,分析了如何通过注意力机制建立视觉与语言的桥梁,以及如何利用神经模块网络神经符号学*引入先验知识,实现更复杂、可解释的推理。

理解这些基础方法,是构建更强大、更智能的多模态系统的关键一步。

课程 P12:L7.2 - 生成模型 🧠

在本节课中,我们将学*生成模型。我们将从概率图模型入手,理解其如何将领域知识融入模型设计,并探讨其在数据有限情况下的优势。接着,我们会介绍神经生成模型,特别是生成对抗网络,了解其如何生成逼真的数据。


概率图模型 📊

上一节我们概述了生成模型,本节中我们来看看概率图模型。概率图模型是一种形式化方法,它通过图结构来紧凑地表示联合概率分布,并直观地展示变量间的依赖关系。

概率图模型是一种图表示形式,它能在数学和视觉上紧凑地建模联合概率分布。这种紧凑建模的优点是,同一个图模型既能提供紧凑的表示,也能清晰地展示变量间的依赖关系。

联合概率分布的重要性

为了深入理解,我们先聚焦于一种特定的概率分布:所有存在变量的联合分布。学*完整的联合分布非常重要,因为它是一个强大的工具。例如,如果你有五个离散随机变量,其联合分布可以表示为一个五维张量。这个张量中的每个元素都代表一个特定事件(例如,A=1,B=‘汽车’,C=2,D=‘香蕉’,E=10)的概率。

一旦学*了联合概率,你就可以进行多种操作。例如,你可以计算条件概率。假设我们有一个查询变量集合 X 和已知赋值的变量集合 Y,同时存在其他我们不关心的变量 Z。我们可以通过边缘化(对 Z 求和或积分)和利用逆概率规则来计算条件概率 P(X|Y)。其通用公式如下:

P(X|Y) = α * Σ_{Z} P(X, Y, Z)

其中,α 是一个归一化常数,与 Y 的先验概率有关。

知识的引入与模型简化

然而,当变量数量很多时,显式建模所有交互可能会非常庞大且低效。这时,我们可以利用关于问题的先验知识来简化模型。概率图模型正是为此而生,它允许我们利用条件独立性假设,将庞大的联合概率分解为多个更小、更简单的因子乘积。

以下是两种基本的独立性关系:

  • 独立性:如果两个变量 XY 独立,则 P(X, Y) = P(X) * P(Y)
  • 条件独立性:在已知变量 Z 的条件下,XY 独立,即 P(X|Y, Z) = P(X|Z)

利用这些简单的规则,我们可以将任何问题的依赖关系用图表示出来,这就是图模型。图模型与数学形式化存在一一对应关系,是可视化这些条件依赖关系的工具。


贝叶斯网络 🕸️

上一节我们介绍了概率图模型的基本思想,本节中我们具体探讨一种重要的有向图模型——贝叶斯网络。

贝叶斯网络为条件独立性断言提供了一种简洁的图形化表示,从而能够紧凑地指定完整的联合分布。其定义包含三个部分:

  1. 一组随机变量(节点)。
  2. 一个连接这些节点的有向无环图。
  3. 每个节点都有一个条件概率分布,该分布由其父节点决定,即 P(节点 | 父节点)

构建你的第一个贝叶斯网络

让我们通过一个例子来实践如何构建贝叶斯网络。假设我们要从学生与辅导系统的交互日志中推断其情绪。我们拥有的数据包括:学*能量、表现分数、专注度、个性特征,以及我们希望预测的情绪。

根据情绪评估理论,情绪是对外部事件与个人目标之间兼容性的评估结果。基于此理论,我们可以设计以下贝叶斯网络:

  • 学*能量表现分数共同影响平衡(即目标与结果的兼容性)。
  • 专注度个性也影响平衡
  • 平衡直接影响情绪

这个网络结构融入了我们的领域知识(情绪评估理论),使得我们能够在数据有限的情况下进行更有效的学*。

动态贝叶斯网络

贝叶斯网络还可以扩展为动态贝叶斯网络,以建模序列或时间依赖关系。典型的动态贝叶斯网络采用一阶马尔可夫假设,即当前状态只依赖于前一个状态。

最著名的动态贝叶斯网络是隐马尔可夫模型。在HMM中,我们有一系列观测值 X 和一系列未观测的隐状态 H。HMM假设:

  • 当前隐状态 H_t 只依赖于前一个隐状态 H_{t-1}
  • 当前观测值 X_t 只依赖于当前隐状态 H_t

其图结构类似于一个链式的朴素贝叶斯分类器,但隐状态是潜在的、需要推断的变量。HMM可以看作是沿着时间轴进行“聚类”,每个隐状态对应一个生成观测值的概率分布。

多模态扩展

动态贝叶斯网络可以进一步扩展以处理多模态数据(如同时包含音频和视频的数据流)。早期的一些多模态神经网络架构就受到了这些图模型思想的启发。

例如:

  • 因子化HMM:假设单个观测流是由多个独立的隐状态过程共同生成的。
  • 耦合HMM:两个模态(如音频和视觉)的隐状态序列相互影响。
  • 玻尔兹曼机及其变体:提供了更灵活的建模方式。

这些模型中的耦合程度(如一个模态的隐状态如何影响另一个)等设计选择,后来在多模态LSTM等神经网络中也有所体现。


神经生成模型与GANs 🤖

上一节我们讨论了基于概率图模型的生成方法,本节中我们来看看基于神经网络的生成模型,特别是生成对抗网络。

在神经网络领域,有一类模型也旨在生成数据,它们有时被称为“生成式”神经模型。需要注意的是,这里的“生成式”术语有时用法更宽泛,不一定严格指建模联合分布的模型。

从自编码器到生成

一个简单的神经生成思路是使用自编码器。自编码器包含一个编码器(将输入数据压缩到潜在空间 Z)和一个解码器(从 Z 重建数据)。训练完成后,我们可以丢弃编码器,仅使用解码器,并通过在潜在空间 Z 中插值来生成新数据。

然而,直接这样做的问题在于,潜在空间 Z 可能结构不佳(例如,数据点聚集成簇,簇之间存在空白区域),导致插值产生的点没有意义。变分自编码器通过强制潜在空间 Z 的分布接*某个先验分布(通常是标准正态分布)来解决这个问题,使得整个潜在空间变得连续且可采样。

生成对抗网络

尽管VAE能生成数据,但生成样本的逼真度有时不足。生成对抗网络提供了一种不同的、非常强大的生成方法。

GAN的核心思想是让两个网络——生成器 G 和判别器 D——相互竞争(博弈):

  • 生成器 G:接收一个随机噪声向量 z,并尝试生成一张逼真的假图像 G(z)
  • 判别器 D:接收一张图像(可能是真实的,也可能是生成器生成的),并尝试判断它是“真实的”还是“伪造的”。

训练目标是达成一个纳什均衡:生成器生成的数据如此逼真,以至于判别器无法区分(即对于任何输入,判别器都给出50%的真实概率)。这可以通过一个极小极大博弈公式来描述:

min_G max_D V(D, G) = E_{x~p_data(x)}[log D(x)] + E_{z~p_z(z)}[log(1 - D(G(z)))]

其中,判别器 D 试图最大化这个目标(正确识别真实和伪造数据),而生成器 G 试图最小化这个目标(让判别器将其生成的数据误判为真实)。

GAN的变体与应用

基础GAN可以扩展为条件GAN,通过额外输入条件信息(如图像类别、音频等)来控制生成的内容。这只需在生成器和判别器的输入中同时加入条件变量即可。

以下是几个有趣的应用方向:

  • 音频到场景生成:根据输入音频生成对应的视觉场景。
  • 说话头生成:根据输入的人脸标志点和身份图像,生成该人物说话的视频。
  • 双向GAN:不仅学*从噪声 z 到图像 x 的生成器,还学*从图像 x 到潜在编码 z 的编码器,使模型具备编码和解码双重能力。
  • 循环一致性GAN:用于解决未配对数据间的转换问题(例如,将马转换为斑马,而没有成对的马-斑马图片)。它引入一个循环重建损失,确保转换后的图像能够再转换回原始域。

总结 🎯

本节课中我们一起学*了生成模型的两大主要范式。

首先,我们深入探讨了概率图模型,特别是贝叶斯网络和动态贝叶斯网络。我们了解了它们如何通过图结构紧凑地表示联合概率分布,并利用条件独立性整合领域知识。这对于数据有限或需要强解释性的场景非常有用。我们还看到了它们如何扩展到序列和多模态数据建模。

其次,我们介绍了神经生成模型,重点是生成对抗网络。GAN通过一个生成器和一个判别器之间的对抗博弈,学*生成高度逼真的数据。我们讨论了基础GAN、条件GAN以及一些高级变体(如CycleGAN)的原理和应用。

这两种方法各有优势:概率图模型更注重可解释性和融入先验知识,而神经生成模型(如GAN)在生成复杂、高维数据(如图像、音频)的逼真度方面表现卓越。理解这两种思路将为你在不同场景下选择合适的生成方法奠定坚实的基础。

📘 课程 P13:L8.1 - 判别式图模型

在本节课中,我们将学*判别式图模型,特别是基于马尔可夫随机场的模型。我们将探讨它们如何与神经网络结合,并介绍条件随机场及其扩展。


🔄 回顾与衔接

上一周我们讨论了贝叶斯网络作为一种概率图模型。本节中,我们将探讨另一类基于马尔可夫随机场的模型。这些模型在优化视角下与神经网络有更好的兼容性,并能提供一些自然的构建模块。

首先,我们简要回顾上节课的最后几页内容,并对过去七周的学*进行总结,为后续内容打下基础。


🖼️ 生成模型回顾

我们回顾了生成对抗网络及其变体。生成对抗网络的核心是通过生成器和判别器的对抗来生成逼真的图像。

以下是生成对抗网络的两种重要扩展:

  • 双向生成对抗网络:该架构同时训练生成器和编码器。生成器从随机向量生成图像,编码器将真实图像编码为低维表示。判别器的任务是区分“真实图像与真实编码”和“生成图像与生成编码”的组合。
  • 循环生成对抗网络:该模型用于处理未配对的数据。它学*两个生成器:一个从域X映射到域Y,另一个从域Y映射回域X。通过引入循环一致性损失,即使没有精确配对的数据,也能训练出有效的跨域转换模型。

🧩 融合与图模型

在课程中,我们探讨了多模态学*的五大挑战:表示、对齐、翻译、融合和协同学*。融合是更接*最终预测的步骤,它涉及整合不同模态的信息以进行预测。

概率图模型在融合阶段特别有用,因为它们允许我们融入领域知识。例如,在情感分析中,我们可以利用关于情感潜在结构的理论来构建模型。图模型还能在预测标签时强制执行一致性,例如在语义分割或词性标注中,相邻像素或单词的标签应该具有连贯性。

上周我们讨论了贝叶斯网络,但将其与神经网络结合优化时存在一些挑战。马尔可夫模型及其公式化在优化方面更为流畅,能更好地与神经网络集成。


⚛️ 受限玻尔兹曼机

作为马尔可夫模型的引入,我们回顾受限玻尔兹曼机。这是最早用于多模态的神经网络模型之一,是一种生成模型。

受限玻尔兹曼机是一种无向图模型,其连接仅定义在可见层和隐藏层之间,同层内没有连接,这简化了推断。它是一个基于能量的模型。

其联合概率分布由以下公式定义:
P(x, h; θ) = (1/Z(θ)) * exp(-E(x, h; θ))
其中,E(x, h; θ) 是能量函数,Z(θ) 是归一化常数(配分函数)。能量函数通常包含可见单元与隐藏单元之间的交互项以及各自的偏置项。


🕸️ 马尔可夫随机场

马尔可夫随机场与玻尔兹曼机非常相似,但提供了更大的灵活性。它也是一种无向图模型。

其概率分布同样采用吉布斯分布的形式:
P(X) = (1/Z) * exp( -∑_c E_c(X_c) )
其中,E_c 是定义在团 c 上的能量函数,Z 是配分函数。能量函数越低,该配置的概率越高。

完全连接的马尔可夫随机场很少见,通常我们只根据领域知识定义部分连接(即因子)。因子图是表示马尔可夫随机场的一种强大方式,它允许我们显式地表示涉及两个以上变量的因子(团)。


🔗 从马尔可夫随机场到条件随机场

基本的马尔可夫随机场是生成模型,它建模联合概率 P(Y, X)。然而,我们通常更关心判别任务,即建模条件概率 P(Y|X)

条件随机场正是这样一种判别式模型。它直接对给定输入 X 时输出 Y 的条件概率进行建模,其形式与马尔可夫随机场类似,但条件是 X
P(Y|X) = (1/Z(X)) * exp( ∑_k λ_k f_k(Y, X) )
其中,f_k 是特征函数(可以看作势函数),λ_k 是其权重,Z(X) 是依赖于 X 的归一化常数。

在序列标注等任务中,我们通常使用链式条件随机场,并绑定不同时间步的权重参数,以处理任意长度的序列。


🧠 潜在动态条件随机场

有时,在观测值 X 和标签 Y 之间引入潜在变量 H 是有益的。潜在动态条件随机场就是这样一种模型。

它假设每个标签 Y 对应一组潜在的隐藏状态 H。模型学*将观测值聚类到这些隐藏状态中,并同时学*隐藏状态内部(类内)和隐藏状态之间(类间)的转移动态。这类似于隐马尔可夫模型,但以判别方式训练。


🌐 多视图与神经网络集成

对于多模态数据(如音频和视频),我们可以构建多视图条件随机场,每个模态有自己的潜在动态,并通过势函数进行耦合。这种模型可以处理异步的多模态数据。

更重要的是,我们可以将神经网络与条件随机场结合起来。神经网络擅长从高维原始数据(如图像、文本)中学*好的表示,而条件随机场则擅长在输出标签上施加结构约束(如时序一致性、空间一致性)。

这种组合通常采用以下模式:使用神经网络(如CNN、LSTM)作为特征提取器,然后将其输出送入条件随机场进行结构化预测。训练时,可以通过反向传播联合优化神经网络和条件随机场的参数。


📈 扩展:连续与高阶条件随机场

条件随机场可以扩展到预测连续值输出,例如在时间序列回归中。这需要选择特定的特征函数,使得配分函数 Z(X) 有闭式解(例如,通过将其表述为多元高斯积分)。

此外,我们还可以构建全连接条件随机场,其中每个输出变量都与其他所有输出变量相连。这在图像语义分割中非常有用,每个像素的标签都与所有其他像素的标签相关。由于精确推断困难,通常采用均值场*似等方法进行高效*似推断。


✅ 总结

本节课我们一起学*了判别式图模型。我们从回顾生成对抗网络开始,然后介绍了马尔可夫随机场和条件随机场的基本概念。我们探讨了如何将领域知识融入图模型的结构中,以及如何将强大的神经网络表示学*与条件随机场的结构化预测能力相结合。最后,我们了解了条件随机场的一些扩展,如潜在动态模型、多视图模型、连续输出模型以及全连接模型。这些模型为处理复杂的多模态预测任务提供了强大的工具。

课程 P14:L8.2 - 深度生成模型 🧠

在本节课中,我们将要学*深度生成模型。我们将从生成模型的基本概念开始,介绍它与判别式模型的区别,然后深入探讨两种非常流行的深度生成模型:变分自编码器和生成对抗网络。我们将学*它们的原理、推导过程、训练方法以及在实际多模态数据中的应用。


1. 生成模型简介 📖

上一节我们回顾了课程的整体安排,本节中我们来看看什么是生成模型。

生成模型通常只给定数据 x(例如图像、视频、文本),而没有对应的标签 y。其目标是建模数据的概率分布 p(x)。这与判别式学*或监督学*不同,后者同时给定数据 x 和标签 y,目标是估计条件概率 p(y|x)

当我们谈论学*和评估生成模型时,通常关注以下几个方面:

  • 评估问题:学* p(x) 后,对于新的数据 x,我们应该能够评估其概率 p(x)。看起来真实的数据(如图像)应具有较高的 p(x) 值,而不真实的数据则具有较低的 p(x) 值。这对于异常检测等任务非常有用。
  • 采样问题:学* p(x) 后,我们希望能够根据 p(x) 采样新的数据 x。这意味着高概率密度区域(对应真实图像)应被更频繁地采样。
  • 表示学*:生成模型和一般无监督学*的目标通常是学*有用的特征表示。例如,对于狗的图像,我们希望模型不仅能生成新的狗图像,还能学*到“狗有耳朵、尾巴”等特征。

除了无条件生成 p(x),人们还关心条件生成 p(x|c)(例如,根据类别“人脸”生成图像)和风格迁移(在保留内容的同时改变风格)。许多生成模型方法都可以扩展到这些任务。


2. 潜在变量模型 🎯

上一节我们介绍了生成模型的目标,本节中我们来看看实现这些目标的常用方法:潜在变量模型。

潜在变量是指那些未被观测到、但希望显式建模的变量。例如,在人脸图像中,性别、眼睛颜色、头发颜色、姿势等都是潜在的变异因素。除非图像被标注,否则这些信息并不显式可用。

我们通常用贝叶斯网络来建模生成过程。其中,观测变量 x(如图像)是阴影节点,潜在变量 z 是非阴影节点。有向边 z -> x 建模了条件分布 p(x|z),即从潜在变量生成数据的过程。

理想情况下,如果我们有足够的领域知识,可以手动定义这个生成模型的结构和条件分布。但现实中,我们通常只有大量未标注的数据。因此,目标转变为学*这些未观测的潜在变量,包括它们的值、分布和结构。

神经网络因其强大的非线性函数拟合能力,非常适合用来学*这些复杂的条件分布。我们可以为连续潜在变量 z 设置一个先验分布(如标准高斯分布),然后使用神经网络参数化生成过程 p(x|z) 的均值和方差。这样,训练后 z 有望对应有意义的变异因素。同时,我们也希望有一个编码器,能够将新数据 x 编码为潜在表示 z,用于特征提取。

然而,直接使用神经网络建模会带来优化上的挑战,我们将在后续章节看到。


3. 从混合高斯模型到变分自编码器 🔄

上一节我们介绍了使用神经网络学*潜在变量的想法,本节中我们从一个简单的生成模型——混合高斯模型开始,逐步引出变分自编码器。

混合高斯模型包含两组参数:

  1. 潜在变量 z,代表所属的聚类,服从一个分类分布。
  2. 给定聚类 z,数据 x 服从一个高斯分布,该分布由均值 μ_z 和方差 σ_z 参数化。

生成过程是:首先从分类分布中采样 z,然后从对应的高斯分布中采样 x。混合高斯模型虽然每个分量简单,但混合后能覆盖数据的多个模态,表达能力很强。它可以通过期望最大化算法进行拟合。

混合高斯模型的一个问题是它缺乏编码过程。它只定义了从 zx 的生成过程,但没有一个从 xz 的编码器来学*数据的特征表示。

变分自编码器可以看作是混合高斯模型的一种扩展。它不再使用简单的高斯分布作为 p(x|z),而是用神经网络来学*这个条件分布的参数,从而极大地增强了模型的表达能力。同时,它引入了编码器网络 q(z|x) 来学*数据的潜在表示。


4. 变分自编码器推导 🧮

上一节我们看到了VAE的动机,本节中我们来详细推导其训练过程。这些推导技巧不仅适用于VAE,也适用于许多*似推断方法。

我们的起点是最大化数据的对数似然:log p(x)。我们有一个联合分布 p(x, z),但只观测到 x。为了引入 z,我们对 z 进行边际化:p(x) = ∫ p(x, z) dz。然而,这个积分在高维空间中是难以处理的。

关键思路:引入一个易于处理的提议分布 q(z),并使用詹森不等式推导出证据下界。

具体步骤如下:

  1. 将对数似然重写为包含 q(z) 的期望形式。
  2. 应用詹森不等式(因为 log 是凹函数),将 log 移到期望内部,得到证据下界
    • log p(x) >= E_{z~q(z)} [log (p(x, z) / q(z))]
    • 这个下界对于任何分布 q(z) 都成立。
  3. q(z) 恰好等于真实后验 p(z|x) 时,等号成立。但真实后验通常难以计算。
  4. 因此,我们的目标是选择 q(z) 使其尽可能接* p(z|x),从而让证据下界尽可能紧,进而通过最大化ELBO来*似最大化数据似然。

为了衡量两个分布的接*程度,我们引入KL散度KL(q(z) || p(z|x)) = E_{z~q(z)} [log (q(z) / p(z|x))]

  • 选择 KL(q||p) 而非 KL(p||q) 是因为前者是 q 下的期望,而 q 是我们选择的简单分布,便于采样计算。
  • KL散度是非负的,当且仅当两分布相同时为零。

通过代数变换,我们可以得到重要关系:
log p(x) = ELBO + KL(q(z) || p(z|x))
其中,ELBO = E_{z~q(z)} [log p(x|z)] - KL(q(z) || p(z))

这个关系式清晰地表明:

  • 数据对数似然 log p(x) 是固定的。
  • 通过优化变分参数 φ 来最小化 KL(q(z) || p(z|x)),可以最大化ELBO。
  • ELBO越紧,对数据似然的*似就越好。

5. VAE的损失函数与重参数化技巧 ⚙️

上一节我们推导了ELBO,本节中我们将其分解为具体的损失函数,并解决梯度计算的关键问题。

根据推导,ELBO可以写为:
ELBO = E_{z~q_φ(z|x)} [log p_θ(x|z)] - KL(q_φ(z|x) || p(z))

这自然分解为两项:

  1. 重构损失E_{z~q_φ(z|x)} [log p_θ(x|z)]。它鼓励解码器 p_θ(x|z) 能够从编码器产生的潜在变量 z 中准确地重构出原始数据 x
  2. 先验损失-KL(q_φ(z|x) || p(z))。它鼓励编码器产生的潜在分布 q_φ(z|x) 接*我们预设的先验分布 p(z)(通常是标准高斯分布)。这起到了正则化的作用,使得潜在空间具有良好结构(如各维度独立)。

从自编码器的视角看,q_φ(z|x) 是编码器,p_θ(x|z) 是解码器。

训练中的挑战:我们需要计算ELBO关于参数 θ(解码器)和 φ(编码器)的梯度。

  • 对于 θ,梯度计算是直接的,因为期望不依赖于 θ,梯度可以移入期望内部。
  • 对于 φ,问题在于ELBO中包含对 q_φ(z|x) 的期望,而 q_φ 本身依赖于 φ。我们不能简单地将梯度符号移入期望内,因为采样操作 z ~ q_φ(z|x) 是不可微的。

解决方案:重参数化技巧
假设 q_φ(z|x) 是一个高斯分布,即 z ~ N(μ_φ(x), σ_φ(x)^2)
我们可以将采样过程重参数化为:
z = μ_φ(x) + σ_φ(x) ⊙ ε,其中 ε ~ N(0, I)
这里,ε 是从标准高斯采样的随机噪声, 表示逐元素相乘。

这样做的妙处在于:

  • 随机性被转移到了噪声变量 ε 上。
  • z 现在成为 εφ确定性函数
  • 原本对 q_φ 的期望 E_{z~q_φ}[f(z)],可以转化为对 ε 的期望 E_{ε~N(0,I)}[f(μ_φ(x) + σ_φ(x)⊙ε)]
  • 现在,梯度 ∇_φ 可以移入对 ε 的期望内部,因为期望不再直接依赖于 φ。我们可以通过采样多个 ε 来估计这个梯度。

VAE训练流程总结

  1. 输入数据点 x_i
  2. 编码器 q_φ(z|x_i) 输出均值 μ 和方差 σ
  3. 采样噪声 ε ~ N(0, I),通过重参数化计算潜在变量 ẑ = μ + σ ⊙ ε
  4. 解码器 p_θ(x|ẑ) 重构数据。
  5. 计算损失:L = 重构损失(x_i, p_θ(x|ẑ)) + β * KL(q_φ(z|x_i) || p(z))β 是可选权重)。
  6. 通过梯度下降同时更新编码器参数 φ 和解码器参数 θ


6. VAE的应用:解耦表示与多模态学* 🎨

上一节我们完成了VAE的理论构建,本节中我们来看看它的几个有趣应用。

1. 学*解耦表示
解耦表示是指潜在空间的每个维度对应数据中一个独立且可解释的变化因素(如物体颜色、大小、背景等)。VAE天然倾向于学*解耦表示,因为其先验损失 KL(q(z|x) || p(z)) 鼓励潜在变量各维度独立(如果 p(z) 是各向同性高斯)。
通过调整KL项的权重 β(即β-VAE),可以控制解耦的强度。更大的 β 施加更强的独立性约束,通常能获得更好的解耦效果。这在风格迁移等任务中非常有用,我们可以分离内容变量和风格变量,然后单独操纵风格。

2. 多模态数据中的解耦学*
在多模态场景(如同时包含语言、视觉、音频的数据)中,我们可以设计VAE来学*共享的跨模态因子(如情感、主题)和模态特定因子(如语言风格、视觉背景)。

  • 共享因子 z_y:负责生成所有模态的数据并预测标签。
  • 模态特定因子 z_m:只负责生成对应模态的数据,捕捉该模态内部的变异。
    损失函数包括:
    • 各模态的重构损失。
    • 从共享因子 z_y 预测标签的分类损失。
    • 对所有潜在因子的KL正则化损失(鼓励服从先验)。
      这种模型不仅能提升判别任务(如情感分类)的性能,还能实现可控生成,例如保持内容(数字“5”)不变,单独改变SVHN风格或MNIST风格。

3. 超越重构:结合自监督任务
在某些任务中,直接重构高维输入(如视频)可能很困难或不必要。我们可以让VAE的解码器预测一些有意义的、低维的自监督信号(如光流、是否接触、多模态对齐),而不是重构原始输入。
这样,编码器学*到的表示会更专注于对下游任务有用的信息。这种方法在机器人等领域被证明是有效的,并且通过融合多模态信息,模型对单模态的遮挡或噪声具有更强的鲁棒性。


7. 生成对抗网络简介 ⚔️

上一节我们探讨了VAE及其应用,本节我们转向另一种强大的生成模型:生成对抗网络。VAE依赖于像素级重构损失,这可能导致生成的图像模糊。GAN则采用了完全不同的思路。

GAN的动机源于一个统计学问题:如何在不直接估计概率密度 p(x) 的情况下,判断两组样本是否来自同一分布?
这可以通过双样本检验来实现。GAN的思想是:训练一个生成模型 G,使其产生的样本分布 p_G 尽可能接*真实数据分布 p_data,同时训练一个判别器 D 来区分真实样本和生成样本。这形成了一个极小极大博弈

GAN的目标函数
min_G max_D V(D, G) = E_{x~p_data}[log D(x)] + E_{z~p_z}[log(1 - D(G(z)))]

  • 判别器 D:试图最大化该目标,即正确分类真实样本为真(D(x)->1),生成样本为假(D(G(z))->0)。
  • 生成器 G:试图最小化该目标,即欺骗判别器,使其将生成样本误判为真(D(G(z))->1)。

理论上,当训练达到最优时,生成器的分布 p_G 会匹配真实数据分布 p_data,此时判别器对所有输入都输出0.5(无法区分)。

GAN的训练算法

  1. 从真实数据中采样一批样本。
  2. 从先验噪声分布 p_z 中采样一批噪声 z
  3. 使用生成器 G 将噪声 z 转换为生成样本 G(z)
  4. 固定 G,更新 D:最大化 log D(x) + log(1 - D(G(z)))
  5. 固定 D,更新 G:最小化 log(1 - D(G(z)))(或最大化 log D(G(z)),实践中后者梯度更稳定)。
  6. 重复步骤1-5。


8. GAN的改进:从JS散度到Wasserstein距离 📈

原始的GAN使用JS散度作为衡量 p_datap_G 之间差异的度量。然而,JS散度在高维空间中存在严重问题:

  • 支撑集问题:如果真实数据分布 p_data 和生成分布 p_G 的支撑集(概率非零的区域)没有重叠或重叠部分测度为零,那么JS散度会是一个常数(log 2),其梯度为零。这导致生成器无法获得有效的训练信号,即“梯度消失”问题。
  • 这在实践中很常见,因为高维数据通常位于低维流形上,两个随机分布几乎没有重叠。

Wasserstein GAN 的改进
WGAN提出使用Wasserstein距离(也称推土机距离)来代替JS散度。Wasserstein距离衡量的是将一个分布“搬移”成另一个分布所需的最小“工作量”。

  • 优点
    1. 即使两个分布的支撑集不重叠,Wasserstein距离仍然能提供有意义的、平滑的度量。
    2. 其梯度几乎处处非零,为生成器提供了更稳定的训练信号。
  • 实现:通过其对偶形式,WGAN的判别器(在WGAN中常称为“评论家”)不再输出0/1分类概率,而是输出一个实数分数。其目标函数变为:
    max_D E_{x~p_data}[D(x)] - E_{z~p_z}[D(G(z))]
    同时,需要约束判别器 D 为1-Lipschitz函数(通常通过权重裁剪或梯度惩罚来实现)。

直观上,对于支撑集不重叠的两个分布,原始GAN的判别器梯度很快饱和为零;而WGAN的评论家会给出一个线性变化的分数,引导生成器向真实分布移动。


9. 总结与展望 🚀

在本节课中,我们一起学*了深度生成模型的核心内容。

我们首先理解了生成模型与判别模型的根本区别,以及生成模型在评估、采样和表示学*方面的目标。然后,我们深入探讨了两种主流的深度生成模型:

  1. 变分自编码器:通过引入变分推断和重参数化技巧,将生成模型训练转化为一个可优化的证据下界最大化问题。VAE具有编码器-解码器结构,能同时学*生成数据和数据的低维表示,在多模态学*和解耦表示方面有很好的应用。
  2. 生成对抗网络:通过生成器和判别器的对抗博弈来学*数据分布,无需显式定义似然函数。我们从原始GAN的JS散度问题,讲到了其改进版WGAN如何利用Wasserstein距离来提供更稳定的训练。

这些模型都结合了图模型的结构化建模能力和神经网络的强大表达能力。VAE训练稳定且有编码器,但生成样本可能较模糊;GAN生成样本质量高,但训练过程可能不稳定且缺乏编码器。

在接下来的课程中,我们将探讨如何将这些生成模型应用于离散数据(如文本),并会引入强化学*技术(如策略梯度)来解决离散输出带来的梯度计算挑战。我们还将看到GAN和VAE在更多实际场景中的应用。

🎓 课程 P15:L9.1 - 强化学*基础

在本节课中,我们将学*强化学*的基本概念、核心框架以及一些基础算法。我们将从马尔可夫决策过程开始,逐步深入到如何在实际问题中应用这些理论。


📖 概述

强化学*是机器学*的一个重要分支,它关注智能体如何通过与环境的交互来学*最优策略。*年来,深度强化学*的结合在许多领域取得了显著成功,例如自动驾驶、游戏AI和机器人控制。


🤖 什么是强化学*?

强化学*涉及两个关键组成部分:智能体和环境。智能体从初始状态 s0 开始,根据当前状态采取行动 a。环境随后返回一个奖励 r 和下一个状态 s'。这一系列交互构成了智能体在环境中的轨迹。

核心交互循环

状态 s -> 行动 a -> 奖励 r & 新状态 s'

例如,在足球游戏中:

  • 状态 s0: 开球时所有球员的位置。
  • 行动 a: 球员移动、传球或射门。
  • 奖励 r: 进球(正奖励)、犯规(负奖励)。

这个框架非常通用,几乎涵盖了任何形式的智能体与环境交互。


📐 马尔可夫决策过程

为了形式化地描述强化学*问题,我们使用马尔可夫决策过程。一个MDP由以下七元组定义:

  • 状态集合 S: 智能体可能处于的所有状态。
  • 行动集合 A: 智能体可以采取的所有行动。
  • 转移函数 T(s'|s, a): 在状态 s 采取行动 a 后,转移到状态 s' 的概率分布。
  • 奖励函数 R(s, a, s'): 在状态 s 采取行动 a 并到达状态 s' 后获得的奖励。
  • 起始状态 s0: 交互的起点。
  • 折扣因子 γ: 介于0和1之间,用于权衡即时奖励和未来奖励的重要性。
  • 时间范围 H: 智能体与环境交互的总步数。

MDP必须满足马尔可夫性质,即未来状态仅依赖于当前状态和行动,而与历史无关。例如,如果指令是“去厨房拿苹果”,那么每个状态都需要同时包含当前位置和这条指令信息,才能满足马尔可夫性质。


🎯 强化学*的目标

智能体的目标是最大化其在整个交互过程中获得的累积折扣奖励。其数学表示为:

公式

G_t = R_{t+1} + γ * R_{t+2} + γ^2 * R_{t+3} + ...

其中,γ 是折扣因子。

  • γ 接* 0:智能体更关注即时奖励(短视)。
  • γ 接* 1:智能体更重视未来奖励(长远规划)。

折扣因子在理论和实践上都有助于算法收敛,并鼓励智能体更快地达成目标。


🗺️ 策略:智能体的行为指南

策略 π(a|s) 定义了在给定状态 s 下,智能体采取每个可能行动 a 的概率分布。策略完全决定了智能体的行为。

强化学*的终极目标就是找到那个能最大化累积折扣奖励的最优策略 π*。


🔍 价值函数:评估状态与行动

为了评估策略的好坏,我们引入了价值函数。

  • 状态价值函数 V^π(s): 从状态 s 开始,始终遵循策略 π 所能获得的期望累积回报。
    公式V^π(s) = E_π[ G_t | S_t = s ]

  • 行动价值函数 Q^π(s, a): 在状态 s 采取行动 a,然后遵循策略 π 所能获得的期望累积回报。
    公式Q^π(s, a) = E_π[ G_t | S_t = s, A_t = a ]

最优价值函数则是在所有可能策略中取最大值:

  • V*(s) = max_π V^π(s)
  • Q*(s, a) = max_π Q^π(s, a)

如果我们知道了最优行动价值函数 Q*,就可以直接得到最优策略:在状态 s 下,选择使 Q*(s, a) 最大的行动 a


⚙️ 算法一:动态规划(已知MDP)

当MDP完全已知(即状态、行动、转移概率、奖励都已知)且规模较小时,我们可以使用动态规划方法精确求解。

上一节我们介绍了价值函数,本节我们来看看如何利用贝尔曼方程进行迭代求解。

贝尔曼期望方程

它描述了特定策略下价值函数自身的递归关系。
对于 V^π(s)
公式

V^π(s) = Σ_a π(a|s) Σ_s‘ T(s'|s, a) [ R(s, a, s') + γ * V^π(s') ]

对于 Q^π(s, a)
公式

Q^π(s, a) = Σ_s‘ T(s'|s, a) [ R(s, a, s') + γ * Σ_a‘ π(a'|s') Q^π(s', a') ]

贝尔曼最优方程

它描述了最优价值函数之间的递归关系,无需指定策略。
对于 V*(s)
公式

V*(s) = max_a Σ_s‘ T(s'|s, a) [ R(s, a, s') + γ * V*(s') ]

对于 Q*(s, a)
公式

Q*(s, a) = Σ_s‘ T(s'|s, a) [ R(s, a, s') + γ * max_a‘ Q*(s', a') ]

利用这些方程,我们可以设计出迭代算法:

  • 策略迭代

    1. 策略评估:给定当前策略 π_k,通过迭代求解贝尔曼期望方程,计算其价值函数 V^{π_k}
    2. 策略改进:根据 V^{π_k},采用贪心策略生成一个更好的新策略 π_{k+1}
      重复以上两步直到策略收敛。
  • 价值迭代
    直接迭代求解贝尔曼最优方程,不断更新 V(s) 的估计值,直到收敛。收敛后,最优策略可通过一步前瞻得到:π*(s) = argmax_a Σ_s‘ T(s'|s, a) [ R(s, a, s') + γ * V*(s') ]

局限性:需要完全已知的MDP模型,且必须能枚举所有状态和行动(表格法),无法处理高维或连续状态空间。


🔄 算法二:蒙特卡洛与时序差分学*(未知MDP)

在现实世界中,MDP模型通常是未知或过于复杂而无法精确建模的。我们需要通过与环境的实际交互来学*。

上一节我们讨论了在已知模型下的精确求解,本节我们来看看如何在未知模型下通过采样进行学*。

核心思想是将贝尔曼最优方程中的期望用采样均值来*似。

以下是基于Q学*的一种经典算法:

表格Q学*

  1. 初始化一个表格 Q(s, a),为所有状态-行动对赋初值。
  2. 对于每一步交互:
    • 使用 ε-贪心 策略选择行动:以概率 ε 随机探索,以概率 1-ε 选择当前 Q 值最大的行动(利用)。
    • 执行行动 a,观察奖励 r 和下一个状态 s‘
    • 更新 Q 值:
      公式
      Q(s, a) ← Q(s, a) + α * [ r + γ * max_a‘ Q(s‘, a‘) - Q(s, a) ]
      
      其中 α 是学*率。r + γ * max_a‘ Q(s‘, a‘) 被称为目标值[...] 内的部分是时序差分误差

ε-贪心探索至关重要:初期需要大量随机探索(ε 较大)以发现高奖励区域,随后逐渐减少 ε 以利用学到的策略。

优势:即使遵循非最优策略(ε-贪心)收集数据,Q学*也能保证收敛到最优策略(离策略学*)。
局限性:仍需维护 Q(s, a) 表格,无法处理大规模或连续状态/行动空间,也无法泛化到未见过的新状态。


🧠 算法三:深度Q网络(高维状态空间)

为了克服表格法的限制,我们引入函数逼*器(如神经网络)来*似 Q 函数。

上一节我们介绍了通过采样更新表格Q值的方法,本节我们来看看如何用神经网络来拟合这个Q表。

深度Q网络

我们用一个参数为 w 的神经网络 Q(s, a; w) 来*似 Q*(s, a)。网络的输入是状态 s(如图像),输出是所有可能行动 a 对应的Q值。

训练目标是最小化贝尔曼最优方程两侧的差异。我们定义损失函数为:
公式

L(w) = E_{(s,a,r,s‘)} [ ( r + γ * max_a‘ Q(s‘, a‘; w^-) - Q(s, a; w) )^2 ]

这里 w^-目标网络的参数,它定期(如每1000步)从当前网络 w 复制而来,用于计算稳定的目标值。

直接训练DQN面临两大挑战:

  1. 样本相关性:连续交互得到的样本序列高度相关。
  2. 非平稳目标:用于计算目标值的网络 Q(s‘, a‘; w) 本身也在不断变化。

解决方案:

  • 经验回放:将交互得到的数据 (s, a, r, s‘) 存储在一个缓冲池中。训练时,从池中随机抽取小批量样本,打破了数据间的相关性。
  • 固定目标网络:使用一个独立的、更新缓慢的目标网络 Q(s‘, a‘; w^-) 来计算目标值,缓解了目标值波动的问题。

DQN在诸如Atari游戏等高维状态空间任务上取得了超越人类的性能,尤其是在奖励密集、需要快速反应的游戏上。然而,在需要长期规划、探索难度大的游戏(如蒙特祖马的复仇)中,传统DQN仍面临挑战,后续研究通过引入好奇心驱动等内在奖励机制来改善探索。


💬 强化学*与自然语言处理

强化学*与自然语言处理的结合是一个活跃的研究领域。主要可以分为两类:

  1. 任务无关方法:任务本身不需要语言,但使用语言预训练的知识(如词向量)来辅助智能体理解环境中的物体(如“钥匙”、“梯子”)。
  2. 任务相关方法:任务执行过程中依赖语言信息。
    • 语言条件式:任务由语言指令定义(如“去拿绿色的火炬”)。没有指令,任务就不成立。研究重点在于多模态(视觉-语言)对齐与融合。
    • 语言辅助式:没有语言指令也能完成任务,但语言提供了额外辅助信息,使任务更容易完成(如用语言描述游戏中的子目标)。

这些方法在视觉问答、指令跟随、复杂游戏探索等任务上展示了巨大潜力。


📝 总结

本节课我们一起学*了强化学*的基础知识:

  1. 我们了解了强化学*的基本框架:智能体、环境、状态、行动、奖励。
  2. 我们学*了用马尔可夫决策过程来形式化描述强化学*问题。
  3. 我们定义了策略、状态价值函数和行动价值函数,并明确了最大化累积折扣奖励的目标。
  4. 我们推导了贝尔曼期望方程和最优方程,它们是许多强化学*算法的基石。
  5. 我们介绍了三种主要算法:
    • 动态规划(策略迭代、价值迭代):适用于已知且规模小的MDP。
    • 表格Q学*:通过采样与环境交互,适用于未知但状态-行动空间离散且不大的MDP。
    • 深度Q网络:利用神经网络进行函数逼*,能够处理高维状态空间并具备一定的泛化能力,是深度强化学*的代表算法。
  6. 我们简要探讨了强化学*在自然语言处理领域的应用前景。

下节课我们将继续深入,学*策略梯度等更多强化学*算法,并进一步探讨其在多模态任务和文本生成中的应用。

课程 P16:L9.2 - 多模态强化学* 🧠🤖

概述

在本节课中,我们将深入学*多模态机器学*中的强化学*,并探讨如何将强化学*的思想应用于文本生成等涉及离散符号的任务。我们将从回顾上周的内容开始,逐步介绍基于策略的强化学*方法,并将其与基于价值的方法进行对比,最后探讨其在文本生成等领域的应用。


课程管理与回顾

上一节课我们介绍了深度生成模型及其在图像生成中的应用,但未涉及文本生成部分。本节课我们将完成对强化学*的讨论,并探讨如何利用强化学*的思想来生成离散的文本标记。

首先是一些课程管理事项。期中报告和期中演示的说明已在 Piazza 上发布。请注意,您需要先完成一个预先录制的演示,截止日期是 11 月 13 日(周五),大约还有两周时间。同时,您还需要撰写一份期中报告,截止日期大约在 11 月 15 日。请确保现在就开始着手准备这两项期中作业,不要拖延到最后一刻。期中报告的主要目标是针对您的问题实现一些多模态基线模型,并对这些模型进行深入的误差分析。

此外,Piazza 上还发布了关于阅读作业“通配符”的帖子。我们已经宣布项目作业可以使用通配符(即 24 小时免费延期),现在阅读作业也引入了这一机制。每位学生可以获得一张通配符,用于将一次阅读作业的截止日期延长最多 24 小时。请务必查看 Piazza 上的详细信息。

在讲座期间,欢迎随时在聊天区提问,我会实时查看。您也可以在 Piazza 上发布问题,其他助教也会跟进解答。


强化学*问题回顾

让我们开始今天的讲座。首先,感谢伯克利和卡内基梅隆大学的 DeepARA 课程提供的素材。我将从高层次介绍强化学*,并重点讨论其多模态应用。如果您想深入了解,我鼓励您查看其他大学开设的学期课程。

快速回顾一下上周的内容。我们探讨了强化学*问题:一个智能体处于某个环境中,从某个初始状态开始,持续采取行动、观察奖励并转移到下一个状态。这个状态、行动和奖励的序列被称为轨迹。

我们还回顾了强化学*的形式化定义:存在一组状态 S,智能体可以处于其中;智能体从一组行动 A 中采样行动;存在一个转移函数 T(s'|s, a),它定义了在给定状态 s 和行动 a 时,转移到下一个状态 s' 的概率分布;以及一个奖励函数 R(s, a, s'),它定义了在状态 s 采取行动 a 并转移到状态 s' 时获得的奖励。智能体从某个初始状态开始,强化学*的目标是最大化长期累积折扣奖励。

我们看到了马尔可夫决策过程如何概括许多现实世界中的强化学*应用,例如机器人在环境中探索,或多智能体强化学*(如两名球员踢足球)。


目标与折扣因子

在强化学*中,目标是最大化长期累积奖励。在特定时间步 t,我们将其表示为 G_t,其计算公式为:

G_t = R_{t+1} + γ * R_{t+2} + γ^2 * R_{t+3} + ...

其中,γ 是折扣因子,用于对未来奖励进行折现。折扣因子 γ 的目的是确保在经验上和理论上都能构建策略并使其收敛。这个概念借鉴自经济学,即未来的货币价值会折现。

强化学*的目标是最大化总折扣奖励。这与监督学*的主要区别在于:监督学*只关心即时奖励,而强化学*关心长期折扣奖励。

回顾一下,折扣因子 γ 接* 0 意味着未来的奖励被大幅折现,智能体更关心短期奖励;而 γ 接* 1 意味着智能体更关心长期奖励,可能以牺牲短期奖励为代价。

强化学*的整个目标是学*一个策略 π(a|s),它描述了在给定状态 s 下采取行动 a 的概率分布。策略告诉我们在特定状态下应该采取哪些行动。


强化学*与监督学*的区别

以下幻灯片总结了所有内容:智能体处于某个环境中,MDP 中的重要术语是找到最佳策略,即对所有策略取 argmax,以最大化期望长期奖励。

上周二我们还探讨了强化学*与监督学*的主要区别:

  • 强化学*涉及序列决策,允许查看累积奖励,而监督学*只关注单步决策和最大化即时奖励。
  • 强化学*还会遇到稀疏奖励问题,即在很长的时间范围内采取多个行动,只在最后观察到奖励。而在监督学*中,每个预测都有密集的奖励。
  • 在强化学*中,环境可能是未知的(例如 MDP 中的转移概率未知),而在监督学*中,环境(即您的预测集)总是已知的。

已知 MDP 的求解方法

快速回顾上周二的内容。我们首先研究了完全已知的马尔可夫决策过程,即我们可以枚举所有状态,知道转移概率和奖励。我们推导了贝尔曼最优性和期望方程。这些方程涉及 Q*Q_π

Q*(s, a) 表示在最优策略下,从状态 s 采取行动 a 的期望长期奖励。
V*(s) 表示从状态 s 开始,遵循最优策略的期望长期奖励。

这些是您想要计算的 MDP 的价值。我们展示了可以使用方程推导出这些最优性方程,将特定状态和行动的 Q* 与未来其他状态和行动的 Q* 联系起来。因此,我们可以优化我们的 Q* 以符合这个最优性方程。

如果您处理的是最优性方程,则称为 Q 值迭代和价值迭代;如果您处理的是期望方程(即计算特定策略 π 下的 Q_πV_π),则称为 Q 策略迭代或策略迭代。

我们展示了至少在可以完全枚举状态、精确计算转移期望的简单情况下,可以保证收敛到最优策略。但在现实世界中,这些假设并不成立。这只适用于小型离散状态和行动空间,不适用于高维状态(如图像)和连续行动。同样,它要求 MDP 中的转移概率已知,而这在现实世界中是无法获得的。


未知转移 MDP 与 Q 学*

为了放宽这个假设,我们研究了转移未知的 MDP。我们从贝尔曼最优性方程转向用*似期望(即下一个状态的样本)替换真实期望。换句话说,当您处于某个状态并采取特定行动时,您只需将其交给环境,观察环境返回的下一个状态,而无需知道确切的转移概率。

我们看到了探索环境的重要性,需要使用 ε-greedy 方法。即以 ε 的概率随机探索环境,而不是完全依赖当前策略,因为当前策略可能不好。

同样,一旦用样本替换了这个期望,您就想求解满足贝尔曼最优性方程的 Q*。您可以将右侧视为目标,左侧视为旧估计,计算差异,并希望更新 Q 值。问题在于,您必须分别保存所有 Q(s, a),即维护一个具有 S 行和 A 列的表。这仍然需要小型离散的状态和行动空间,尽管现在您不需要使用真实的转移概率来计算期望,而是使用样本。


深度 Q 学*

下一个问题是如何将其推广到处理未见过的状态以及大型连续状态和行动空间。这就是为什么我们将表格 Q 学*扩展到深度 Q 学*。其思想是,不再为所有状态和行动维护一个 Q 值表,而是通过学*一个单一的权重函数(在实践中是一组神经网络参数)来分摊成本。这个网络接收状态 s,并预测所有可能行动的 Q(s, a)

这样做的好处是,由于拥有强大的函数逼*器,如果您已经针对特定状态训练了模型来预测其 Q 值,那么对于非常相似的状态,您也可以通过函数逼*得到相似的 Q 值。因此,现在它可以处理高维状态空间(无论是卷积网络、循环模型还是 Transformer)。

优化思想相同:将右侧视为目标,左侧视为先前的估计。我们知道左右两侧的 Q* 应该相等,因此可以计算差异并尝试使用梯度下降将其最小化到零。

我们发现这种简单方法可能存在样本相关性和非平稳目标的问题。我们还探讨了如何通过使用经验回放缓冲区来缓解这些问题:采样一小批不相关的转移,并固定一组权重(目标网络)来解决非平稳目标问题,只更新预测网络的权重,并每隔一定迭代次数(例如 1000 次)用最新的权重替换旧的权重。

这些都是周二讨论过的内容。这只是对深度 Q 学*的快速回顾:结合梯度下降、探索(ε-greedy)、经验回放和固定 Q 目标,这种方法可以处理高维状态和行动空间,并能泛化到未见过的状态。我们已经看到它至少可以用于 Atari 游戏等场景,其中图像作为状态输入。


从价值函数到策略

回顾一下我们目前所做的:我们研究了三种基本估计 Q* 的方法。我们从策略迭代和价值迭代开始,精确求解;然后研究了 Q 学*,*似求解;最后是深度 Q 学*,进一步涉及深度网络。所有这些都是为了找到 Q*,即特定状态和行动的行动价值函数。

如果我们有了 Q*,我们知道可以通过 ε-greedy 方法获得最优策略:如果行动满足对所有行动的 argmax,则以高概率采取该行动;否则,以很小的概率随机采取行动。

同样,另一种方法是求解 V*(价值迭代)。我们也可以将 Q*V* 联系起来。如果我们求解了 V*,我们也可以获得最优策略,但现在需要进行一步前瞻。换句话说,给定一个状态 s,我将对所有可能的行动取最大值,对于每个行动,计算对可能的下一个状态的期望(获得的奖励加上下一个状态的最优价值函数)。这允许我们计算每个行动的效用,满足 argmax 的行动将是最优策略采取的行动。

在周二讨论的所有方法中,我们将 Q*V* 定义为获得策略之前的中间步骤。


基于策略的方法:直接优化策略

在今天的讲座中,我们将从另一个角度看待强化学*。我们将尝试直接优化策略,而不是先优化价值函数(Q*V*),然后再推导策略。我们将忘记所有这些 Q*V* 和 MDP,直接优化这个策略。我们将看看是否能为此推导出一些好的算法。

之后,我们将研究一组称为“行动者-评论家”的方法,它结合了上周二讲座和今天讲座的内容。然后,我们将探讨一些应用。

周二我们研究了所有这些状态价值函数和行动价值函数(V 和 Q),在获得这些最优的 V 和 Q 之后,我们再推导出策略。这通常被称为基于价值的强化学*,因为我们试图推导这些最优的状态和行动价值函数。

强化学*的另一个视角被称为基于策略的强化学*。换句话说,我们将完全忘记这些价值函数(Q 和 V),而是直接学*一个策略。


策略参数化与动机

那么策略会是什么样子呢?策略会接收一个状态,并尝试输出一组行动。通常,我们假设有一组参数化的策略,给定一个状态(例如图像),通过一系列神经网络参数 θ,输出行动的概率分布。

例如,在一个简单的上下移动游戏中,您可能只有一个输出神经元,代表向上移动的概率,而 1 减去该值就是向下移动的概率。在这种情况下,您完全不涉及 Q 和 V,只是直接通过一组参数将状态映射到行动。

为什么我们要这样做呢?有几个原因:

  1. 通常,您的策略 π 可能比 Q 和 V 更简单。例如,训练机械臂抓取物体。如果要为机械臂定义 MDP,可能需要定义所有状态(所有关节的可能参数),您的 Q(s, a)V(s) 可能维度非常高。但您的策略可以抽象所有这些低维状态,只定义一些高级语义策略,例如“张开手”或“闭合手”。因此,您可以训练一个只有两个输出神经元(张开手的概率和闭合手的概率)的模型。
  2. 另一个问题是,对于 V 和 Q,一旦计算出来,在推导最优策略之前还需要额外步骤。对于 V*,您需要进行一步前瞻,如果可能转移到的下一个状态数量非常多,计算这个期望可能很困难。同样,即使计算一步前瞻不困难,您也需要对行动取 argmax 才能获得最佳策略,这对于连续和高维行动空间可能并不容易。

因此,有时直接优化策略比计算 Q*V* 更有意义。这就是今天讲座的主要动机:周二我们研究了基于价值的方法,今天我们将深入基于策略的方法。我们将学*一个策略,并在讲座最后研究“行动者-评论家”方法,它结合了这两种思想。


价值方法与策略方法的权衡

显然,既然强化学*有基于价值和基于策略两个分支,那么必然存在一些权衡。

概念上

  • 基于策略的方法直接学*策略,优化您关心的目标。
  • 基于价值的方法间接解决问题,因为它首先求解 MDP(这很好,因为它利用了问题结构),但在某种意义上,您是间接求解最优策略。

经验上

  • 基于策略的方法在实践中与深度网络更兼容,更通用、更灵活。我们还将看到如何将这些基于策略的方法扩展到强化学*之外的文本生成。
  • 基于价值的方法更兼容探索(如定义 ε-greedy)、离策略学*,并且因为它们利用了 MDP 的问题结构,所以在有效时样本效率更高。

因此,两者之间存在一系列权衡。


基于策略的方法实践:Pong 游戏示例

现在让我们详细看看这些基于策略的方法具体如何工作。我们将看一个非常简单的游戏:Pong 游戏。对手控制一个球拍,您控制另一个球拍。目标是将球弹到对手区域,同时防止对手将球弹到您的区域。

这是一个非常简单的 Pong 游戏,我们将看看如何设计一个基于策略的方法来解决它。这个游戏基于原始像素运行:图像显示您和对手的得分、球拍位置以及球的位置。这是一个 80x80 的图像。

我们将定义一个模型(可以是神经网络或带有隐藏层的卷积模型),其参数为 θ,预测向上移动的概率。由于只有两个行动,您可以只定义一个神经元代表向上移动的概率,向下移动的概率则是 1 减去该值。

在这个游戏中,如果您成功将球弹过对手,则获得 +1 的奖励;如果球被对手弹过您这边,则获得 -1 的奖励。目标是如何学*这组参数 θ,使其能够规定一系列好的行动,从而赢得比赛。


从监督学*到策略梯度

现在假设为了简单起见,我们拥有训练标签。换句话说,给定所有状态 x1, x2, x3...,我们知道应该做什么。也许我们可以让人类专家来玩这个游戏,对于所有状态,给出获得奖励的完美行动序列。那么您可能会将这个问题视为监督学*问题:给定一些输入和人类专家给出的目标(应该向上还是向下移动),您将尝试最大化正确行动的对数概率。这简单地就是交叉熵损失,您将对数据点取平均,这将是您的目标函数,并使用基于梯度的方法求解。

但主要问题是我们没有标签,我们不想或没有人类专家为我们标注。那么问题是我们应该向上还是向下移动?我们应该采取什么行动?

让我们尝试根据当前策略行动。这个模型定义了一个策略,即给定状态下向上和向下的概率。我将遵循这个策略。也许在初始状态,它输出较高的向上移动概率,采样后您实际上向上移动,这使您进入一个新状态。给定这个新状态,我将其放回当前模型,模型描述当前策略,可能告诉我再次向上移动,依此类推。根据当前策略规定的一系列状态,您会采取一系列行动。

如果您回想一下,由当前策略定义的状态行动序列被称为轨迹。经过长时间的游戏,显然我们在强化学*中会遇到稀疏奖励问题:我们花费每个时间步,但在一系列步骤之后,也许我们最终观察到一些奖励。例如,经过六个步骤,您成功将球弹到对手一侧并获胜,获得 +1 奖励。

我将继续这样做:使用我的当前策略,最终获胜;重置初始状态,再次遵循策略,可能更快结束因为我输了;再试一次,输了;第四次,赢了。我可以根据当前策略收集许多这样的“回合”。

使用这些回合,我能做什么?我们知道,在这个行动序列中,我们最终获得了正奖励,所以我们知道它总体上是好的。同样,对于这个序列,我们最终获得了负奖励,所以我们知道它总体上是坏的。

我们要做的是假装对这个轨迹中采取的所有行动给予同等的功劳。对于获胜的轨迹,我将最大化再次看到相同状态时采取那些行动的对数概率,因为我知道那些是好的行动,过去采取它们让我获得了正奖励。另一方面,对于最终失败的轨迹,我会说在这些状态下采取这些行动最终导致了 -1 奖励,因此我将尝试降低未来采取这些行动的概率。换句话说,我将最大化 -1 乘以采取那些行动的对数概率。

这非常直观,对吧?因为我们想在强化学*环境中工作,我们将结合折扣奖励。换句话说,我将对过去的奖励进行折现。对于最后一步采取的行动,我将用 -1 缩放;对于之前的行动,我将用 γ 折现(例如 -0.9,然后 -0.81,等等)。这将简单地修改我们的目标函数:您将尝试优化在给定状态下采取那些行动的对数概率,但现在奖励被缩放为 +1 或 -1,并乘以折扣因子。


REINFORCE 算法

这提出了一个非常简单的算法。您定义一个策略 π,它接收状态,通过参数 θ,输出行动。您随机初始化策略网络(参数随机)。然后我将重复:使用该策略进行一系列回合(轨迹采样)。使用该策略,我将采样一系列行动,观察最终进入的状态和获得的奖励。我们知道,其中一些回合会获得高奖励的好行动序列,而另一些则会获得低奖励的坏行动序列。

给定我采取的所有行动和获得的所有奖励,我将增加那些效果好的行动(即获得高奖励的行动)的概率,最大化所有这些行动的对数概率(带有折扣因子)。对于所有失败的回合,我将通过乘以 -1 和某个折扣因子来降低这些行动的对数概率。

这提出了一个非常简单的算法。这里我们也可以加入 ε-greedy 探索:不是总是从当前策略中采样行动,而是保留 ε 的概率进行随机探索。

这种方法的一些好处是:它不需要转移概率(我们的 Q*V* 最优性方程涉及转移概率和期望),它直接预测策略。这实际上是一个非常简单的算法。

您可能会想,经过上周二推导 Q*V* 的所有麻烦之后,如果这种方法效果很好,那将是一个惊喜,对吧?但在实践中,它确实有效。训练一段时间后,您可以看到智能体实际上表现得很好,能够持续击败对手。

那么问题是:为什么这样一个简单的算法会有效?如果它真的效果这么好,为什么我们还要经历周二推导价值和策略迭代方法的所有麻烦?如果它有效,在什么场景下有效?在什么场景下这种方法可能存在缺陷?我们将更详细地研究这个方法,看看是否

课程 P17:L10.1 - 融合、协同学*与新趋势 🚀

在本节课中,我们将要学*多模态机器学*中的融合与协同学*,并探讨该领域的一些新兴趋势。我们将首先回顾模型无关的融合方法,然后深入探讨基于核函数的局部融合,接着介绍协同学*的概念及其在强配对与弱配对数据下的应用,最后会简要介绍小样本学*和弱监督学*这两个新趋势。

多模态融合快速回顾 🔄

上一节我们介绍了多模态融合的基本概念。融合是指将两个或多个模态的信息结合起来,以执行某些预测任务的过程。例如,结合音频和视觉信息进行语音识别,或者结合声音和面部表情来推断情绪。

在之前的课程中,我们讨论了基于神经网络的融合方法和基于图模型的融合方法。本节课,我们将重点介绍模型无关的融合方法,并探讨基于核函数的局部融合

模型无关的融合 🧩

模型无关的融合是早期多模态研究中的两种主要范式:早期融合和晚期融合。它们代表了融合过程的两个极端。

早期融合

早期融合的核心思想是在特征层面进行早期连接。

  • 方法:将来自不同模态的特征向量在输入阶段直接拼接起来,然后输入到一个统一的分类器或回归器中进行处理。
  • 优点:实现简单,可以直接利用现有的机器学*模型。分类器内部有望学*到不同特征之间的交互。
  • 挑战:当特征维度很高或不同模态的特征粒度不一致时(例如,语言符号与视觉像素),模型学*可能变得困难。

公式表示
假设有两个模态的特征向量 x_ax_v,早期融合后的联合特征为:
x_fused = concat(x_a, x_v)

晚期融合

晚期融合的核心思想是让每个模态先独立地进行预测,然后在决策层面进行融合。

  • 方法:为每个模态单独训练一个模型(分类器)。这些模型在各自模态上针对同一任务进行训练。训练完成后,固定这些单模态模型,设计一个融合机制来整合它们的输出,以做出最终决策。
  • 优点:每个模态的模型可以独立训练,甚至可以利用不同数据集(例如,某些数据集只有文本,某些只有图像)。这提供了更大的灵活性。
  • 缺点:流程多步,通常不是端到端训练。由于融合发生在高层表示之后,可能无法捕捉低层次的跨模态交互。

代码表示(简单投票融合)

# 假设有三个单模态模型的预测概率
pred_audio = model_audio(input_audio) # 形状: (batch_size, num_classes)
pred_visual = model_visual(input_visual)
pred_text = model_text(input_text)

# 晚期融合:平均投票
final_prediction = (pred_audio + pred_visual + pred_text) / 3

现代视角:神经架构搜索与中间融合

现代方法更倾向于“中间融合”,即在神经网络的中间层进行信息交互。一种有趣的方法是使用神经架构搜索来自动寻找最优的融合结构。

其基本思想是:

  1. 将每个模态的处理网络视为由多个层组成的栈。
  2. 融合单元可以连接任意两个模态的任意中间层。
  3. 搜索空间随着层数和模态数指数级增长,直接枚举不可行。
  4. 使用一个代理模型来预测不同融合架构的性能。先从简单的融合层级开始评估,用这些数据训练代理模型,然后让它指导对更复杂融合层级的搜索,逐步迭代。

这种方法不仅自动化了设计过程,还带来了一定程度的可解释性,例如,可以揭示是早期特征还是晚期特征对融合更重要。

基于核函数的局部融合 ⚙️

现在,让我们从局部融合的角度,重新审视一些流行的模型,特别是自注意力机制Transformer。我们可以将它们核心的相似度计算部分视为一种核函数

核函数简介

核函数是一种衡量两个数据点相似度的函数。其关键思想是,通过一个映射函数 φ 将数据从原始空间转换到另一个高维(甚至无限维)特征空间,然后在该空间计算内积相似度。

核技巧在于,我们无需显式计算复杂的映射 φ(x),而可以直接通过一个核函数 K(x, y) 计算出在高维空间的内积结果。

常见核函数示例

  • 线性核:K(x, y) = x^T y
  • 径向基函数核:K(x, y) = exp(-γ * ||x - y||^2)

将Transformer注意力视为核函数

在Transformer的自注意力机制中,计算注意力权重的关键步骤是计算查询向量 q 和键向量 k 的相似度。

标准Transformer中的相似度计算
相似度(q, k) = softmax( (q * W_q) * (k * W_k)^T / sqrt(d_k) )
其中,q * W_qk * W_k 是线性投影。点积操作 (q * W_q) * (k * W_k)^T 本质上就是一种线性核。

通过这个视角,我们可以思考:对于多模态数据,查询和键可能来自不同模态,具有异构性。标准的点积相似度(线性核)可能不是最优的。

改进思路:我们可以用更复杂的核函数来替换标准的点积,以更好地捕捉跨模态的相似性关系。例如,一些研究尝试使用高斯核(RBF)的变体,或者在计算注意力时,对位置编码的相似度也使用独立的核函数进行处理。实验表明,即使是在机器翻译这样的单模态任务中,改进相似度核函数也能带来性能提升。

多核学*用于晚期融合

核函数的理念也可以直接应用于晚期融合。多核学* 方法为每个模态(或模态内的不同方面)分配一个或多个核函数,然后学*这些核函数的最佳组合,以构建一个跨模态的联合相似度度量或分类器。

这启发了我们,在多模态融合中,相似性可以从多个角度衡量(例如,句法相似性、语义相似性、情感相似性),而核函数提供了形式化这些度量的强大工具。

协同学* 🤝

协同学*是多模态机器学*的第五大挑战,其核心思想是利用一个模态的知识来帮助另一个模态的学*。即使在测试时可能只使用一个模态,训练时利用的跨模态知识迁移也能提升该模态模型的性能。

根据模态间数据的配对强度,协同学*可分为两类。

强配对数据下的协同学*

强配对数据指每个数据样本在不同模态间都有精确的对应项(例如,一张图片及其对应的详细描述)。

示例:利用视觉属性改进词嵌入

  • 目标:学*更好的词向量表示。
  • 方法:许多词的含义包含视觉或物理属性(如“柔软”、“粗糙”),这些属性在纯文本的上下文共现中难以充分学*。我们可以利用已标注的“词-视觉属性”配对数据,在训练词嵌入时,通过一个双线性模型等结构,将视觉属性信息融入词向量的学*过程中。这样得到的新词向量能更好地编码视觉相关的语义属性。

示例:通过视觉进行语音情感编码的循环一致学*

  • 目标:从语音中学*更好的情感表示。
  • 方法:训练一个编码器-解码器框架。编码器将语音编码为一个表示,这个表示要能同时完成两个任务:1)重构输入语音;2)预测与之同步的面部表情(视觉模态)。关键是要引入循环一致性损失,即从预测的面部表情再解码回的语音也应接*原始语音。这确保了学*到的语音表示是信息丰富的,而不仅仅是面部表情的“转码器”。测试时,仅用语音即可进行情感分析,并且性能可能超过同时使用多模态输入的模型。

弱配对数据下的协同学*

弱配对数据指模态间存在关联,但不是精确对齐(例如,一个教学视频和它的整体解说文本,但不知道每一句话具体对应哪一帧画面)。

示例:教学视频中的自监督对比学*

  • 挑战:视频片段与语音解说在时间上未精确对齐。
  • 方法:采用多示例学*对比学*框架。
    • 将一个短视频片段视为一个“包”,将一段时间窗口内的所有语音句子视为该包的“实例”。
    • 假设至少有一个句子实例是与视频内容相关的。
    • 目标是通过对比学*,拉*视频表示与其相关句子表示的距离,同时推远它与不相关句子表示的距离。
  • 优势:这种自监督方式无需人工标注对齐数据。学到的视频表示不仅能用于跨模态检索,还能提升纯视觉下游任务的性能,体现了协同学*的知识迁移本质。

新趋势展望:小样本学*与弱监督学* 🌟

最后,我们简要介绍两个与协同学*紧密相关的新趋势。

小样本/零样本学*

  • 核心问题:如何让模型在只看到极少(小样本)甚至没有(零样本)某个类别示例的情况下,识别该类别。
  • 多模态的作用:利用其他模态的知识进行迁移。例如,在零样本学*中,通过类别的语言描述(属性、定义)来建立视觉类别与已见类别之间的联系,从而识别未见过的视觉对象。
  • 进阶研究:结合元学*与多模态。例如,让智能体在强化学*环境中,通过语言指令快速学*操作新物体。模型采用“慢速”和“快速”两种权重,慢速权重从大量任务中学*通用知识,快速权重则根据新任务的语言指令进行快速适配,实现小样本下的高效学*。

弱监督学*

  • 核心问题:如何使用不完整、不精确或噪声较大的标注进行学*。
  • 多模态应用示例:短语定位。给定一张图片和一段描述性文本,目标是确定文本中每个短语对应图片中的哪个区域。强监督需要标注每个短语的边界框,成本高昂。弱监督方法则只提供图片-文本对,不提供短语-区域的对齐信息。
  • 方法:一种方法是利用对比学*。通过建模短语和图像区域之间的相似性,在训练中拉*匹配的短语-区域对,推远不匹配的对。这可以看作是一种在两种模态间进行细粒度对齐的协同学*,最终能学到更好的视觉和语言表示。

总结 📚

本节课我们一起深入探讨了多模态机器学*中的融合与协同学*。

  • 我们回顾了模型无关的融合,包括早期融合和晚期融合,并介绍了利用神经架构搜索自动化设计融合结构的方法。
  • 我们从核函数的视角重新审视了Transformer等模型中的注意力机制,理解了局部融合的相似度计算本质,并探讨了改进多模态相似度计算的可能。
  • 我们重点学*了协同学*,了解了如何利用强配对或弱配对数据,将一个模态的知识迁移到另一个模态,以提升模型性能,特别是在数据稀缺或测试时模态不全的场景下。
  • 最后,我们展望了小样本学*弱监督学*这两个与协同学*密切相关的新兴趋势,看到了多模态技术在这些前沿方向上的应用潜力。

这些内容展示了多模态机器学*如何通过巧妙地结合不同模态的信息,来构建更强大、更灵活、更具通用性的AI系统。

课程P18:L10.2 - 多模态机器学*的新研究方向 👨‍🔬

在本节课中,我们将探讨过去一年中多模态机器学*领域涌现的一些新研究趋势。我们将介绍八个主要方向,并为每个方向提供两篇代表性论文作为示例。这些趋势涵盖了从抽象推理、因果推断到模型理解、社会影响等多个方面,旨在帮助初学者了解该领域的前沿动态。

1. 抽象与逻辑推理 📊

上一节我们概述了课程内容,本节中我们来看看第一个趋势:抽象与逻辑推理。这一趋势的核心是,研究者们正重新审视如何将密集的神经表示与更离散、可解释的符号化知识(如知识图谱)相结合,以进行更复杂的推理。

其核心思想是,将原始的高维数据(如图像和文本)转化为更结构化的表示(如场景图),然后在这些结构化表示上进行逻辑推理。这有助于模型更好地泛化到新的、未见过的任务表述方式。

以下是实现这一思路的关键步骤:

  • 图像结构化:首先,将图像转化为结构化表示,例如场景图。这通常涉及检测图像中的对象,并识别对象之间的关系。
    • 对象检测:识别图像中的实体(如“男孩”、“咖啡机”)。
    • 属性关联:为每个实体关联一组可能的属性(如“棕色”、“红色”),这可以看作是一个概率分布。
    • 关系识别:定义实体之间的可能关系(如“在...右边”、“在...里面”),并计算这些关系存在的概率。
  • 文本结构化:同时,将自然语言问题也转化为结构化的指令序列,例如通过句法分析将其分解为短语或操作。
  • 基于状态的推理:将生成的结构化图视为一个状态机。模型根据文本指令,逐步遍历这个状态机(图),每一步都基于当前节点和指令决定下一个状态(节点),最终得出答案。

公式/代码示意:推理过程可以形式化为在状态机 G(场景图)上,根据指令序列 I 进行状态转移,最终到达答案节点 A

状态 S_t = (节点 N_t, 指令 I_t)
下一个状态 S_{t+1} = Transition_Network(S_t, G)
答案 A = Node_Representation(S_final)

这种方法的一个优势是能提高模型对问题表述变化的鲁棒性(例如,处理否定或不同句式),因为它学*的是在抽象表示上的操作,而非依赖于数据中的表面相关性。

2. 因果推断 🔗

在了解了基于抽象表示的推理后,我们转向另一个深刻影响模型性能和理解的方向:因果推断。因果图是分析多模态任务中变量间因果关系的有力工具。

一个典型的视觉问答(VQA)或视觉对话任务可以建模为包含问题 Q、图像 I、历史 H 和答案 A 的因果图。当前许多模型隐含的因果假设是:QIH 共同导致一个更好的图像表示 V,进而与 QH 一起导致 A

然而,数据中可能存在混淆变量,导致模型学到虚假关联而非真正的因果关系。例如:

  • 历史长度偏差:在视觉对话中,如果模型在预测答案时直接使用历史 H,它可能仅仅学会生成与历史回答长度相似的答案,而不是基于问题内容。
  • 标注者偏差:问题和答案可能由同一位标注者创建,导致答案风格与问题存在虚假关联,而非由问题内容本身决定。

研究通过显式地对这些混淆变量建模或移除虚假的因果链接,来迫使模型学*更真实的因果关系。例如,一篇论文通过移除从历史 H 到答案 A 的直接链接,并引入一个代表混淆因素的潜在变量,从而减少了模型对历史长度的依赖,提升了泛化能力。

3. 理解多模态模型 🧠

既然我们讨论了模型可能存在的偏差,接下来自然要问:我们如何更好地理解多模态模型为何有效或失效?这一研究方向旨在诊断和改进模型的训练与泛化。

一个反直觉的现象是,在多模态学*中,简单地融合更多模态的信息并不总是带来性能提升,有时甚至会导致更严重的过拟合。

以下是导致这一问题的两个可能原因及解决方案:

  • 过拟合与泛化失衡:不同模态的过拟合和泛化速度可能不同。使用单一的优化策略联合训练所有模态可能不是最优的。
  • 解决方案:动态调整训练:一篇论文提出计算每个模态的“过拟合-泛化比率”(OGR),即验证损失与训练损失之间的差距变化率。这个比率反映了该模态的过拟合程度。在训练多模态模型时,同时并行地训练每个单模态模型,利用单模态模型的 OGR 来动态调整多模态训练中对应模态的学*率或关注度,从而更平衡地优化所有模态。

4. 常识推理 🧩

多模态系统要真正理解世界,需要具备常识。常识推理研究关注如何让模型掌握关于物理世界和社会互动的基本知识。

例如,在情感分析对话中,仅仅根据当前文本上下文可能不足以准确判断说话者的情感或意图。模型需要结合常识:如果一个人之前很悲伤,然后被嘲笑,他更可能变得愤怒。

一篇相关的研究通过扩展数据集,不仅标注对话中的情感,还标注了话语的意图(如“讽刺”、“安慰”)和可能引发的听者反应。模型在预测时,不仅考虑上下文,还利用外部常识知识库(如 COMET)来推断当前话语对对话双方心理状态的影响,从而做出更符合人类常识的判断。

5. 社会影响:公平性与虚假信息 ⚖️

构建强大的多模态模型也带来了重大的社会责任。我们必须关注其社会影响,特别是公平性和虚假信息问题。

  • 公平性与偏见:多模态模型可能从训练数据中学*并放大社会偏见(如性别、种族偏见)。例如,一个根据视频内容筛选简历的系统,如果训练数据存在偏差,可能会对特定群体产生不公平的结果。研究社区正在创建带有偏见标注的数据集,并开发方法来检测和缓解模型中的偏见。
  • 虚假信息检测:“假新闻”通常结合具有误导性的文本和图像/视频来传播。多模态虚假信息检测旨在识别这种跨模态的不一致或欺骗性内容,是当前一个非常重要且活跃的研究领域。

6. 参与度与多文化性 🌍

最后,我们来看看如何让多模态系统更具吸引力和包容性。

  • 情感与参与度:通过识别和生成富有情感的内容(如带有情感的对话、故事生成),可以使多模态系统与用户的互动更加自然和吸引人。
  • 多语言与多文化性:目前大多数多模态研究集中在英语等少数语言上。一个重要趋势是开发支持多种语言和文化背景的多模态系统,确保技术成果能够惠及全球更广泛的用户群体,并理解不同文化语境下的表达差异。

总结:本节课我们一起学*了多模态机器学*领域的八个新兴研究方向:

  1. 抽象与逻辑推理:结合神经表示与符号化知识进行可解释的推理。
  2. 因果推断:使用因果图分析并改善模型,避免学*虚假关联。
  3. 模型理解:诊断多模态训练中的过拟合问题,并动态调整优化策略。
  4. 常识推理:让模型掌握关于世界的基本知识,以进行更深层次的理解。
  5. 社会影响(公平性):检测和缓解模型中的社会偏见。
  6. 社会影响(虚假信息):识别跨模态的误导性内容。
  7. 情感与参与度:构建更具情感交互能力的系统。
  8. 多语言与多文化性:开发包容性的、支持多种语言文化的模型。

这些方向展示了多模态机器学*正朝着更鲁棒、更可解释、更负责任且更通用的方向发展。希望本课能为你探索该领域的前沿工作提供一个起点。

📚 课程 P2:L1.2 - 多模态学*数据集概览

在本节课中,我们将深入探讨多模态学*中的主要研究任务及其相关数据集。我们将回顾多模态研究的发展历程,并重点介绍几个核心应用领域及其代表性数据集。

🕰️ 多模态研究的发展历程

上一节我们介绍了多模态学*的基本概念,本节中我们来看看其研究脉络是如何演进的。多模态研究始于20世纪70年代,当时心理学和哲学领域的研究者致力于构建行为模型来理解人类在社交环境中的沟通与互动。其中一个标志性项目是认知心理学家提出的“麦格克效应”,它揭示了音频和视觉信息在语音识别中的重要性。

进入20世纪80年代,随着计算工具的普及,研究进入了计算时代。目标转变为构建计算模型来验证行为时代发展出的心理学和哲学理论。这一时期的项目包括构建从数据中学*的统计模型。

到了21世纪初,研究焦点转向交互时代,人们不仅关注理解单一个体,也研究人与人、人与计算机之间的互动,这推动了多模态人机交互研究的繁荣。最终,在2010年代深度学*的浪潮下,研究者们开始在多模态学*中追求卓越的性能。

🎯 核心研究任务与数据集

随着研究范式的演进,一系列具体的多模态研究任务应运而生,并催生了相应的数据集。以下是几个关键领域的介绍。

🧠 情感计算

情感计算的宏伟目标是构建能够识别人类情感和情感状态的计算机。这个领域不仅研究基本情绪,还扩展到认知状态、人格特质、病理学和社会过程等多个方面。

以下是情感计算中常见的标注类型:

  • 情感状态:识别愤怒、厌恶、恐惧等基本情绪,以及羞耻、内疚、沮丧等复杂情绪。
  • 认知状态:判断个体是否投入、具备相关知识,这对教育应用至关重要。
  • 人格特质:通过长期推理判断个体内在的人格,如内向、外向、艺术性、责任感等。
  • 病理学:预测个体是否有抑郁、焦虑等心理健康障碍的风险。
  • 社会过程:理解群体互动中的社交信号,如群体是否融洽。

该领域的一个经典数据集是音频视觉情感挑战赛数据集。它包含离散情感和连续情感的标注。连续情感通常在“效价”(积极到消极)和“唤醒度”(活跃到被动)两个维度上进行回归预测。

另一个重要数据集是RECOLA,它提供了帧级别的细粒度连续情感标注,并包含了心电图、皮电活动等生理信号,为多模态融合带来了新的挑战。

我们课题组在多模态情感分析方面做了大量工作,扩展了基于语言的情感分析,收集了包含大量说话者和话题的YouTube视频数据集,并标注了细粒度的情感和情绪。

情感识别面临的核心挑战主要体现在以下几个方面,可以用以下公式化的目标来描述模型需要解决的问题:

  1. 融合:如何最佳地利用多个数据源进行预测。y = f(文本, 音频, 视觉)
  2. 表示学*:提取高质量的多模态表示。h = Encoder(原始特征)
  3. 对齐:对齐不同模态间在时间上的对应关系。Align(文本序列, 视频帧序列)
  4. 协同学*:利用多模态信息增强单模态表示。

🖼️ 媒体描述

在深度学*的推动下,媒体描述(如图像/视频描述生成)成为多模态研究的热点。这类任务旨在为图像或视频生成准确的文字描述。

最著名的数据集之一是MS COCO,它包含了超过12万张图像,每张图像都通过众包平台标注了5条不同的描述。由于生成任务的评估非常困难,该数据集也配套了评估服务器,使用人工和自动指标(如CIDEr、METEOR、ROUGE、BLEU)来衡量生成结果的质量。

随后,研究扩展到了视频描述生成,以处理时间依赖性问题。例如Charades数据集,它要求标注者根据剧本表演并生成描述,从而能更精细地控制数据内容和真实标注。

为了规避生成任务评估难的问题,研究者提出了指代表达式理解任务。给定一张图像和一段描述,目标是定位描述所指代的图像区域。这本质上是** grounding **任务,即将语言元素与图像中的指代对象联系起来。

Visual Genome是一个大规模、细粒度的数据集,它标注了图像中的实体(名词)、属性及其关系,形成了一个密集连接的图结构,对于推理和预训练都非常有用。

媒体描述任务的核心挑战包括:

  1. 翻译:将一种模态的数据映射到另一种模态的语义空间。文本 = Generator(图像)
  2. 表示与对齐:学*跨模态的、对齐的良好表示。相似度 = Sim(图像编码, 文本编码)

❓ 多模态问答

多模态问答的动机是为了弥补图像/视频描述生成任务在评估上的困难,将其转化为分类任务。

最流行的数据集是视觉问答数据集。给定一张图像和一个问题,模型需要定位问题所指的图像区域并找出正确答案。该数据集规模庞大,包含20多万张图像和数百万个问答对。

然而,研究发现VQA模型存在偏差问题。例如,仅根据问题“香蕉是什么颜色?”,模型可能倾向于回答“黄色”,因为训练集中大多数香蕉是黄色的,而忽略了图像中可能出现的绿色香蕉。为了应对这一问题,新的数据集被设计出来,它们为同一个问题提供不同答案的图像,迫使模型必须理解图像内容。

研究也扩展到了视频问答,例如TVQA数据集,它要求根据电视剧片段回答时序相关问题。VCR数据集则要求模型不仅给出答案,还要提供解释,这需要常识推理能力。

我们课题组提出了Social-IQ数据集,它侧重于社交场景中的QA,问题更多涉及社交行为和互动,而非具体物体。

多模态问答的核心挑战除了翻译、对齐和表示外,还包括:

  1. 问题理解与定位:理解问题并定位其对应的图像或视频区域。答案 = Reason(图像特征, 问题特征)
  2. 融合:有效融合视觉和语言信息以进行推理。

🧭 多模态导航

随着强化学*和机器人学的发展,多模态导航旨在构建能与真实世界交互的AI智能体,例如遵循自然语言指令进行导航。

这项任务的核心是感知-行动循环:智能体需要感知多模态环境(语言指令和视觉观察),并采取行动影响环境,从而进入下一个状态。

一个典型任务是指令跟随。例如,在Room-to-Room数据集中,智能体需要在真实建筑中根据如“上楼,经过钢琴,在走廊尽头左转……”这样的多步指令进行导航。这需要持续地 grounding 指令中的实体(如“钢琴”、“走廊”)并执行动作(如“上楼”、“左转”)。

更复杂的任务要求智能体在环境中既说话又行动,例如在文本冒险游戏中进行社交互动。这结合了对话和行动,对构建社会性智能体提出了更高要求。

多模态导航的核心挑战集中在:

  1. 表示学*:学*对强化学*有用的表示,以应对稀疏奖励和长期交互。策略 π = Policy(状态表示)
  2. 融合:联合推理语言指令和环境状态。
  3. 翻译:在需要生成对话时,产生合理的自然语言语句。

💡 课程项目建议与总结

本节课我们一起回顾了多模态学*的主要研究任务和相关数据集。为了帮助大家更好地进行课程项目研究,以下是一些建议:

进行多模态研究时,请多思考根本性的研究问题,而不仅仅是数据集本身。设计能够解决这些通用问题的模型,其泛化能力会更强。

除了追求性能指标,也请关注以下方面:

  • 鲁棒性:模型对缺失或噪声模态的鲁棒性,以及对抗攻击下的稳健性。
  • 公平性:确保模型表示不会携带与敏感属性相关的不良偏差。
  • 可解释性:构建易于理解的模型,或分析现有模型。
  • 效率:设计更快的训练和推理模型。
  • 理论探索:结合实验验证,进行多模态学*的理论性研究。

最后,请注意处理图像和视频数据可能需要较大的存储和计算资源,请提前规划并与课程团队沟通可用的云资源支持。

希望本课程能帮助你找到感兴趣的研究方向,并成功完成你的项目。

课程 P3:L2.1 - 基本概念 🧠

在本节课中,我们将学*多模态人工智能中的单模态表示基础,并初步了解神经网络的核心概念。我们将从图像、文本和音频这三种主要模态的基本表示方法开始,然后简要回顾机器学*的基础知识,最后引入神经网络的基本构成。

单模态表示基础

上一节我们介绍了课程概述,本节中我们来看看如何将不同类型的原始数据(模态)转换为机器可以处理的数学表示。

图像表示

图像最基本的表示形式是一个矩阵。对于灰度图像,它是一个二维矩阵;对于彩色图像,它通常是一个三维矩阵,其中第三个维度代表颜色通道(例如红、绿、蓝)。这三个二维矩阵堆叠在一起构成了彩色图像。

为了将图像输入到典型的分类器(如前馈神经网络或多层感知机)中,我们需要将这个矩阵转换成一个一维向量。最简单的方法是将所有像素值拼接起来。

以下是图像表示的公式化描述:

  • 灰度图像:X ∈ R^(H×W)
  • 彩色图像:X ∈ R^(H×W×C),其中 C=3(RGB)
  • 向量化:x = flatten(X) ∈ R^(H*W*C)

分类任务可以分为几种类型:

  • 二分类:输出是或否(例如,是否是狗)。
  • 多分类:输出是多个互斥类别中的一个(例如,图像是猫、狗或鸭子)。
  • 多标签分类:输出可以同时属于多个类别(例如,图像中同时包含猫和狗)。
  • 回归:输出是连续值(例如,年龄、距离)。

文本表示

对于语言(无论是书面语还是语音转写的文本),最基本的表示方法是独热编码

构建一个包含训练集中所有可能单词的词典。每个单词对应一个很长的向量,该向量中只有对应单词的位置为1,其余位置为0。

以下是文本表示的代码描述:

# 假设词典为 [“猫”, “狗”, “喜欢”]
# 单词“狗”的独热编码为:
vector_dog = [0, 1, 0]

对于文档或段落级别的表示,可以使用词袋模型。它使用同样的长向量,但每个位置记录的是对应单词在文档中出现的次数(或是否出现)。

基于这种表示,可以执行词级分类任务,如情感分析(正面/负面)、命名实体识别(识别人名、地名)或词性标注(名词、动词等)。

音频表示

音频最基本的“原始”表示是一个一维的、非常长的向量,它记录了振幅随时间的变化。采样率决定了每秒有多少个数据点(例如,8kHz 表示每秒8000个点)。

然而,人类听觉系统更倾向于在频域中处理声音。因此,更常见的做法是将音频信号转换为频谱图

处理步骤如下:

  1. 将音频流分割成短的时间窗口(例如,20毫秒)。
  2. 对每个窗口应用快速傅里叶变换,得到该时间段内不同频率的强度。
  3. 将每个窗口的频率强度按时间顺序排列,形成频谱图。

频谱图是一个二维矩阵,其中一维是时间,另一维是频率,值代表能量强度。这种表示常用于语音识别、情感识别等任务。

其他模态表示

除了上述三种主要模态,世界上还存在许多其他类型的数据。

以下是其他一些模态及其表示方式的例子:

  • 触觉传感器数据:例如,手套上的压力传感器阵列可以表示为二维网格数据,类似于图像,可以利用卷积神经网络处理其空间冗余性。
  • 机器人传感器数据:机器人关节的马达角度、速度等随时间变化的数据,可以视为时间序列信号。
  • 表格数据:表格中的文本不仅包含内容,其行列位置也蕴含了结构信息,需要特殊处理来利用这种邻*性。
  • 图数据:如社交网络、知识图谱,由节点和边组成。节点和边都可以附带信息。如何用神经网络处理这种非欧几里得结构是一个有趣的挑战。
  • 集合数据:例如,同一人的多张人脸图像、自动驾驶激光雷达产生的点云。这类数据是一组样本的集合,需要能够处理可变数量输入并利用集合内关系的模型。

理解原始数据如何转换为适合机器学*模型处理的表示形式,是构建任何AI系统的第一步。

机器学*基础回顾

在深入神经网络之前,我们先快速回顾一些机器学*的基本概念和命名规范,以确保我们在后续讨论中有一致的理解。

数据集与泛化

一个带标签的数据集包含许多样本,每个样本有一个特征向量 x_i 和一个标签 y_i。数据集通常被划分为:

  • 训练集:用于训练模型。
  • 测试集:用于最终评估模型性能。关键原则:在训练和开发过程中绝不能使用测试集进行任何决策。

机器学*的核心是泛化,即从训练数据中学*到的模式能够适用于未见过的测试数据。

最*邻分类器

最简单的一种分类器是最*邻分类器,它是一种非参数模型。

在预测时,它为新的测试样本在训练集中寻找最相似的样本(“最*邻”),并将该训练样本的标签作为预测结果。这种方法让数据自己“说话”。

最*邻分类器的核心在于距离度量。最常用的距离包括曼哈顿距离(L1)和欧几里得距离(L2)。选择哪种距离度量本身就是一个需要决定的超参数

另一个相关超参数是 K,即考虑最*邻的数量(K-最*邻),并通过多数投票决定最终类别。

超参数与验证集

超参数是模型外部、不能从数据中直接学*的配置选项(如距离度量类型、K值、神经网络层数等)。

为了选择超参数,我们需要从训练集中再划分出一部分作为验证集

以下是模型选择的基本流程:

  1. 使用不同的超参数组合在训练集上训练多个模型。
  2. 在验证集上评估这些模型的性能。
  3. 选择在验证集上性能最好的超参数组合。
  4. 用选定的超参数在完整的训练集上重新训练模型。
  5. 最后,在从未使用过的测试集上进行一次性评估。

如果数据量很小,可能会采用交叉验证等更复杂的方法。

神经网络核心:从线性分类器到神经元

现在,我们进入本节课的核心部分,探讨神经网络的基础构建模块。理解这一点至关重要,因为现代深度学*模型都由此演变而来。

线性分类器

许多分类模型,包括神经网络的基础单元,都可以追溯到线性分类器

构建一个学*系统主要涉及三个任务:

  1. 评分函数:定义一个函数 f(x, W, b),它接收输入 x 和参数 Wb,为每个可能的类别输出一个分数。
  2. 损失函数:定义一个函数,量化预测分数与真实标签之间的差异,给出一个代表“不满意程度”的单一数值。
  3. 优化:寻找能使损失函数最小化的最佳参数 Wb

对于一个多类图像分类问题(例如,10个类别,图像展平为3072维向量),评分函数可以定义为:
f(x, W, b) = Wx + b
其中 W ∈ R^(10×3072)b ∈ R^(10)。这相当于为每个类别设置了一个独立的线性分类器(神经元)。

损失函数

损失函数将评分函数的输出映射为一个衡量模型错误的标量。常见的损失函数有:

  • 交叉熵损失(配合Softmax):首先使用 Softmax 函数将每个类别的分数转换为概率分布(所有概率之和为1)。Softmax 公式为:
    P(class=i) = e^(s_i) / ∑_j e^(s_j)
    然后,使用交叉熵损失来衡量预测概率分布与真实“独热”分布之间的差异。最小化交叉熵等价于最大化正确类别的对数似然。

  • 合页损失:常用于支持向量机。其思想是不仅要求正确类别的分数高,还要求它比错误类别的分数高出至少一个边界值 Δ。公式鼓励正确类别分数与最高错误类别分数之间的差距大于 Δ

损失函数通常还包含正则化项(如L2正则化:λ||W||^2),用于惩罚模型复杂度,防止过拟合,提升泛化能力。这里的 λ 也是一个超参数。

神经元:带有非线性的线性分类器

一个神经元本质上就是一个线性分类器,后面加上一个激活函数

其计算为:output = activation(Wx + b)
激活函数引入了非线性,使得神经网络能够学*复杂的模式。早期的激活函数包括:

  • Sigmoid:将输入压缩到 (0, 1) 区间。
  • Tanh:将输入压缩到 (-1, 1) 区间。

神经网络(多层感知机)

神经网络(如前馈神经网络或多层感知机)就是将许多这样的神经元分层连接起来。

  • 前一层的输出作为后一层的输入。
  • 每一层都有自己的权重矩阵 W 和偏置 b
  • 通过这种层级堆叠,网络可以学*从原始输入到最终输出的复杂映射。

在神经网络中,我们区分两个过程:

  • 前向传播:输入 x 通过网络各层,得到输出预测(分数)。这个过程用于推理
  • 反向传播:根据损失函数计算梯度,从输出层向输入层传播,用于更新网络权重 Wb。这是优化过程的核心。

总结

本节课中我们一起学*了多模态AI的基石。我们首先探讨了图像、文本和音频等单模态数据的基本表示方法,将原始数据转换为数学向量或矩阵。接着,我们回顾了机器学*的基础,包括数据集划分、泛化概念、简单的最*邻分类器以及超参数选择的重要性。最后,我们深入探讨了神经网络的核心,揭示了神经元本质上是带有非线性激活的线性分类器,并通过堆叠这些神经元形成了能够学*复杂模式的多层网络。理解这些基本概念是后续学*更高级模型(如CNN、RNN、Transformer)的关键第一步。

课程 P4:L2.2 - 神经网络基本概念:优化 🧠

在本节课中,我们将学*神经网络优化的核心概念。我们将探讨如何通过计算梯度来调整模型参数,以最小化损失函数,并分享一些在实践中优化深度模型的有效技巧。

概述

优化是训练神经网络的核心过程。我们的目标是找到一组模型参数,使得模型在给定数据上的损失函数值最小。这就像在一个复杂的地形中寻找最低点。

上一节我们介绍了神经网络的基本架构,本节中我们来看看如何通过优化算法来训练这些网络。

梯度计算

梯度是一个向量,它指向函数值增长最快的方向。在优化中,我们关注损失函数相对于模型参数的梯度。对于神经网络,我们通常使用解析梯度,因为它可以高效地计算。

梯度公式可以表示为:
[
\nabla_{\theta} L(\theta) = \left[ \frac{\partial L}{\partial \theta_1}, \frac{\partial L}{\partial \theta_2}, ..., \frac{\partial L}{\partial \theta_n} \right]
]
其中 (L) 是损失函数,(\theta) 代表所有模型参数。

反向传播

反向传播是计算神经网络梯度的有效算法。它利用链式法则,从输出层向输入层反向计算各层的梯度。

以下是反向传播的核心步骤:

  1. 前向传播:输入数据通过网络,计算各层输出及最终损失。
  2. 初始化梯度:从损失函数开始,梯度初始为1。
  3. 反向计算:利用链式法则,逐层计算局部梯度(雅可比矩阵),并将梯度从后向前传递。
# 伪代码示例:梯度下降更新参数
def gradient_descent(parameters, gradients, learning_rate):
    for param, grad in zip(parameters, gradients):
        param -= learning_rate * grad
    return parameters

通过这种方式,我们可以高效地获得所有模型参数的梯度,用于后续的更新。

梯度下降法

掌握了梯度计算后,我们就可以使用梯度下降法来优化参数。其核心思想是沿着梯度的反方向(即函数下降最快的方向)更新参数。

参数更新公式为:
[
\theta_{t+1} = \theta_t - \eta \cdot \nabla_{\theta} L(\theta_t)
]
其中 (\eta) 是学*率,控制每次更新的步长。

在实践中,根据使用数据量的不同,梯度下降有三种主要变体:

  • 批量梯度下降:使用整个训练集计算梯度,更新稳定但计算成本高。
  • 随机梯度下降:每次随机使用一个样本计算梯度,更新快但噪声大。
  • 小批量梯度下降:折中方案,每次使用一个小批量数据计算梯度,兼顾效率和稳定性。

优化挑战与技巧

优化非凸的深度神经网络时会面临许多挑战,例如局部极小值、鞍点和梯度消失/爆炸等。以下是应对这些挑战的一些实用技巧。

学*率调整

学*率是至关重要的超参数。学*率太大会导致震荡或不收敛,太小则收敛缓慢。自适应学*率算法(如Adam、RMSProp)能根据梯度历史动态调整每个参数的学*率,通常效果更好。

正则化

为了防止模型在训练数据上过拟合,我们需要使用正则化。常见的正则化方法包括:

  • L1/L2正则化:在损失函数中增加参数范数惩罚项,促使模型更简单。
  • Dropout:在训练时随机“丢弃”一部分神经元,防止神经元间复杂的协同适应,起到模型平均的效果。

参数初始化与预训练

良好的参数初始化有助于模型更快、更稳定地收敛。对于多模态任务,一个有效的策略是对不同模态的模块(如图像CNN、文本RNN)进行预训练,即先在相关任务上单独训练,再将训练好的参数作为初始化,进行联合微调。

总结

本节课中我们一起学*了神经网络优化的核心内容。我们从梯度的概念出发,介绍了利用反向传播高效计算梯度的方法,并深入探讨了梯度下降法及其变体。最后,我们了解了优化过程中面临的挑战,以及学*率调整、正则化和预训练等关键技巧。掌握这些基础知识是成功训练深度模型的重要一步。

课程P5:L3.1 - CNN与视觉表示 👁️📊

在本节课中,我们将学*卷积神经网络(CNN)及其在视觉表示中的应用。我们将从图像表示的基本概念入手,了解CNN的核心原理、架构及其优势,并探讨其在多模态学*中的重要性。


图像表示概述 🖼️

图像表示的目标是将图像转换为可用于计算的数值形式。一张图像包含大量信息,直接使用所有像素会非常复杂。目前,许多方法采用基于对象的表示方式,即识别图像中的所有对象,并为每个对象关联一个标签或外观描述符。

外观描述符通常是一个长向量(例如2000个数值),用于*似描述对象的外观。这种方式在多模态学*中非常成功,特别是在图像描述任务中。


传统图像表示方法 📐

在深入了解CNN之前,我们先回顾一些传统的图像表示方法,这有助于理解CNN中卷积核的直觉。

以下是几种传统的图像表示方法:

  • 图像梯度:检测图像中颜色或灰度值的剧烈变化,例如从白到黑的边缘。它能突出显示对比度强烈的区域。
  • 梯度直方图:将图像划分为网格,计算每个区域内梯度的方向直方图。它同时捕捉了颜色变化和空间信息。
  • 光流:主要用于视频,用于估计像素在连续帧之间的运动。

这些概念与CNN中的卷积核有密切联系。


从模板到卷积核 🔍

哈小波和Gabor滤波器是早期重要的特征检测方法。它们本质上是一组预定义的模板(或滤波器),在图像上进行滑动匹配,并生成响应图

  • 哈小波:例如,一个水平边缘模板在图像上滑动,当匹配到水平边缘时会产生高响应。
  • Gabor滤波器:受人类视觉皮层早期感知的启发,能检测特定方向和频率的边缘。

这些预定义模板的方法与CNN的核心思想一脉相承。关键区别在于,CNN中的卷积核不是预先设定的,而是通过数据动态学*得到的。


卷积神经网络(CNN)的核心 🧠

CNN的主要目标是构建更抽象、更高层次的视觉表示。其关键优势包括:

  1. 受视觉皮层启发:底层卷积核检测边缘等特征,与视觉皮层初期激活类似。
  2. 视觉抽象:随着网络层数加深,表示变得更加抽象。
  3. 平移不变性:同一个对象出现在图像不同位置时,网络仍能识别,无需为每个位置学*单独模型。
  4. 参数共享:同一卷积核在整个图像上滑动使用,大幅减少了需要学*的参数数量。
  5. 参数效率:得益于参数共享和局部连接,CNN比全连接网络参数少得多,训练更高效。

与之前预定义模板的方法不同,CNN的卷积核权重(W)在训练开始时随机初始化,并通过优化过程自动学*对分类任务有用的模式(如颜色、条纹)。


卷积的数学原理 ➗

卷积是一种基本的数学运算。在CNN的离散语境下:

  • 输入:一个尺寸为 N x M 的图像(2D信号)。
  • 卷积核:一个尺寸较小的矩阵(如 3x3)。
  • 操作:卷积核在输入图像上滑动,在每个位置进行元素乘法和求和,生成响应图
  • 输出尺寸:通常为 (N - K + 1) x (M - K + 1),其中K是卷积核尺寸。可以通过填充(Padding)来控制输出尺寸。

卷积核可以看作是学*到的模板,响应图显示了该模板在图像中各位置的匹配程度。


卷积层与全连接层的对比 ⚖️

为了理解CNN的高效性,我们将其与全连接层进行对比。

假设我们想将输入图像映射到一个响应图:

  • 全连接层:需要将输入图像的每一个像素连接到输出响应图的每一个单元。这会导致巨大的参数量,且不具备平移不变性(图像轻微移动会被视为完全不同的输入)。
  • 卷积层:通过两项关键修改实现高效性:
    1. 局部连接:输出单元只与输入的一小片局部区域(感受野)连接,而非整个图像。这使得权重矩阵 W 非常稀疏。
    2. 权值共享:在整个图像上使用相同的卷积核(权重)。这意味着学*一个 3x3 的卷积核,只需要学*9个参数,无论图像多大。

这种设计使CNN能够以极少的参数有效地学*局部特征模板,并天然具有平移不变性。


CNN的典型架构 🏗️

一个典型的CNN由多种层堆叠而成:

  1. 卷积层:使用多个学*到的卷积核(如64个)处理输入,每个生成一个特征图(响应图)。所有特征图堆叠形成3D输出体积。
  2. 激活函数:如ReLU,引入非线性。
  3. 池化层:在特征图上进行下采样(如最大池化或平均池化),逐步减少空间尺寸,实现抽象和汇总,同时增强对微小平移的鲁棒性。
  4. 重复堆叠:多次重复“卷积-激活-池化”的模块,构建层次化特征。
  5. 全连接层:在网络的最后,将高级特征图展平,接入一个或多个全连接层,用于最终的分类或回归任务。

这种架构(例如经典的VGGNet)使得网络早期层捕捉边缘等低级特征,后期层组合这些特征形成更复杂的概念(如物体部件)。


CNN的扩展与应用 🚀

基础CNN架构有许多重要的扩展和应用:

  • 区域CNN:如R-CNN系列、Fast R-CNN、Faster R-CNN、YOLO、SSD。它们不是在整个图像上密集滑动窗口,而是先提出可能包含物体的区域建议,然后只在建议区域上运行CNN。这大大提高了检测效率,是当前目标检测的主流方法。
  • 3D CNN:将卷积核扩展到3维(宽、高、时间),用于处理视频序列,可以同时学*外观和时序上的运动模式。
  • 时序卷积网络:在已经提取的每帧特征序列(例如来自2D CNN)上应用1D卷积,来捕捉时间维度上的模式,适用于动作识别或情感分析等任务。

需要注意的是,许多预训练的CNN模型(如在ImageNet上训练的)是针对特定任务(如物体分类或人脸识别)优化的。将其用于新任务(如细粒度车型分类或情绪识别)时,可能需要进行微调,因为高层特征可能不直接适用。


总结 📝

本节课我们一起学*了卷积神经网络(CNN)及其视觉表示。

  • 我们首先了解了图像表示的挑战和传统方法(如梯度、模板匹配)。
  • 然后深入探讨了CNN的核心思想:通过学*卷积核(而非预定义模板)来提取特征,并借助局部连接权值共享实现高效性与平移不变性。
  • 我们剖析了CNN的典型架构,包括卷积层、池化层和全连接层的组合。
  • 最后,我们介绍了CNN的重要扩展,如用于目标检测的区域CNN和处理视频的3D CNN。

理解CNN的工作原理对于在多模态学*中有效地利用视觉信息至关重要,它使我们能更明智地进行特征融合与联合建模。

课程 P6:L3.2 - 语言表示与RNN 🧠📚

在本节课中,我们将学*语言表示的核心概念,特别是词表示和句子级表示。我们还将深入探讨循环神经网络(RNN)及其变体,并了解如何利用句法结构来增强语言模型。课程内容旨在让初学者能够轻松理解这些复杂的概念。

语言表示概述 🌐

今天的课程是关于语言的表示,特别是词表示、句子级表示,以及语言的其他有趣方面,如句法和语言结构。上周我们探讨了视觉表示及其强大之处与局限性,本节课我们将对语言进行类似的分析。

词表示 🔤

语言学家和计算语言学家长期以来都有一个目标,即找到一种方法来表示句子中词的含义。计算表示的目标是使用向量或数值来*似词的意义。*年来,神经表示在这一领域取得了巨大进展。

分布假说 📊

理解词含义的一个关键思想是分布假说:一个词的含义可以通过其周围的上下文词来*似。即使你不认识某个词,通过观察它在不同语境中的使用,也能推断出其大致含义。

例如,通过分析“bardawik”在不同句子中的上下文,我们可以推断它可能是一种类似葡萄酒的红色酒精饮料。这表明,上下文信息对于*似词义非常关键。

从共现到表示 🧮

根据分布假说,出现在相似上下文中的词,其含义也相*。一种早期的计算方法是构建一个共现矩阵,记录每个词与其他词共同出现的频率。

假设我们有一个包含“knife”、“cat”、“dog”等词的词汇表。我们可以观察每个词周围出现的动词(如“use”、“get”),并统计频率。这些频率可以构成一个矩阵,作为词的表示。

公式表示: 若词汇表大小为 (V),上下文窗口大小为 (C),则可以构建一个 (V \times V) 的共现矩阵 (M),其中 (M_{ij}) 表示词 (i) 和词 (j) 在特定窗口内共同出现的次数。

然而,直接使用欧几里得距离比较这些向量可能不够信息丰富。更有效的方法是关注向量之间的角度或比率,这更能反映词义的相似性。通常,我们会将向量归一化,然后使用余弦相似度进行比较。

代码示例(概念性)

# 假设我们有词向量
vector_dog = [120, 18]  # 在“use”和“get”上下文中的频率
vector_cat = [95, 22]
# 计算余弦相似度
similarity = np.dot(vector_dog, vector_cat) / (np.linalg.norm(vector_dog) * np.linalg.norm(vector_cat))

神经词表示:Word2Vec 🧠

Word2Vec是一种基于神经网络的词表示方法,其核心思想与分布假说一致:通过一个词的上下文来预测它,从而学*到有意义的词向量。

模型接收一个词的独热编码作为输入,通过一个浅层神经网络,学*到一个低维的向量表示(如300维),这个表示能很好地预测该词的上下文词。训练完成后,我们只保留输入层到隐藏层的权重矩阵,即为每个词的词向量。

公式表示: 对于给定的中心词 (w_t),其上下文词为 (w_{t-c}, ..., w_{t+c})(排除 (w_t))。Word2Vec的目标是最大化平均对数概率:
[
\frac{1}{T} \sum_{t=1}^{T} \sum_{-c \leq j \leq c, j \neq 0} \log p(w_{t+j} | w_t)
]
其中 (p(w_{t+j} | w_t)) 通常由softmax函数定义。

Word2Vec的一个有趣特性是能够捕捉词之间的类比关系,例如:
[
\vec{king} - \vec{man} + \vec{woman} \approx \vec{queen}
]

然而,Word2Vec也存在一些局限性:

  1. 同形异义词问题: 像“plant”(植物/工厂)这样的词只有一个向量,无法区分不同含义。
  2. 反义词相似: 像“hot”和“cold”这样的反义词可能因为出现在相似语境中而具有相似的向量。

后续的FastText等模型尝试通过引入子词(subword)信息来解决部分问题。

句子表示与语言模型 📝

上一节我们介绍了词表示,本节我们来看看如何表示整个句子,以及什么是语言模型。

句子级表示

句子可以看作一系列词符(token)的序列。句子级表示主要有两种思路:

  1. 为句子中的每个词生成一个上下文相关的表示(如ELMo)。
  2. 为整个句子生成一个单一的向量表示。

一个简单而有效的方法是对句子中所有词的Word2Vec向量取平均。尽管有更复杂的方法(如RNN、Transformer),但在许多任务中,平均词向量配合一个简单的注意力机制就能取得很好的效果。

什么是语言模型? 🤔

在自然语言处理领域,语言模型特指一个能够预测序列中下一个词的概率的模型。换句话说,给定前面的词,语言模型计算下一个词出现的概率。它也可以用来评估一个句子在正常语料中出现的可能性。

语言模型广泛应用于:

  • 文本生成: 给定起始词,递归预测下一个词,生成完整的句子或段落。
  • 机器翻译: 作为解码器的一部分,生成流畅的目标语言句子。
  • 语音识别: 作为先验知识,结合声学模型来解码最可能的词序列。

公式表示: 一个语言模型计算序列 (w_1, w_2, ..., w_T) 的概率:
[
P(w_1, w_2, ..., w_T) = \prod_{t=1}^{T} P(w_t | w_1, ..., w_{t-1})
]

循环神经网络(RNN) 🔄

处理变长序列(如句子)是自然语言处理中的核心挑战。循环神经网络(RNN)是一种专门设计用来处理序列数据的神经网络。

RNN的基本结构

RNN的关键思想是引入“记忆”机制。在每一个时间步 (t),RNN单元不仅接收当前输入 (x_t),还接收来自上一个时间步的隐藏状态 (h_{t-1}),并输出当前隐藏状态 (h_t)。

公式表示
[
h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t + b_h)
]
[
y_t = W_{hy} h_t + b_y
]
其中 (W_{hh}, W_{xh}, W_{hy}) 是权重矩阵,(b_h, b_y) 是偏置项。

RNN的“循环”体现在权重共享上:所有时间步都使用相同的权重矩阵。这使得模型参数数量固定,能够处理任意长度的序列。

通过时间反向传播(BPTT)

训练RNN使用一种称为通过时间反向传播的算法。损失函数通常是在所有时间步的预测损失之和(如序列标注任务),或者仅在最后一个时间步的损失(如句子分类任务)。

梯度从序列末端开始计算,并沿着时间步反向传播。由于权重共享,梯度会流经每个时间步的相同参数。

RNN的应用模式

  1. 序列到序列(Seq2Seq): 常用于机器翻译。一个RNN作为编码器将源语言句子编码为一个上下文向量,另一个RNN作为解码器基于该向量生成目标语言句子。这可以分模块训练,也可以进行端到端训练。
  2. 编码器-解码器结构: 编码器将输入序列压缩为向量,解码器将该向量展开为输出序列。损失函数仅在解码器的输出(如目标语言)上定义。

RNN的挑战:梯度消失/爆炸 💥

标准RNN的一个著名问题是梯度消失或爆炸。由于在长序列上反复乘以相同的权重矩阵 (W_{hh}),梯度会指数级地衰减或增长,导致难以训练长程依赖关系。

长短期记忆网络(LSTM) 🧠💾

为了解决梯度消失问题,研究者提出了LSTM。LSTM通过引入“门”机制和“细胞状态”来有选择地保留或遗忘信息。

LSTM的核心组件

LSTM单元包含三个关键的门:

  1. 遗忘门: 决定从细胞状态中丢弃哪些信息。
  2. 输入门: 决定将哪些新信息存入细胞状态。
  3. 输出门: 基于细胞状态,决定输出什么。

细胞状态 (C_t) 像一个传送带,贯穿整个序列,允许信息相对无损地流动。

公式表示
[
\begin{aligned}
f_t &= \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) \
i_t &= \sigma(W_i \cdot [h_{t-1}, x_t] + b_i) \
\tilde{C}t &= \tanh(W_C \cdot [h, x_t] + b_C) \
C_t &= f_t \odot C_{t-1} + i_t \odot \tilde{C}t \
o_t &= \sigma(W_o \cdot [h
, x_t] + b_o) \
h_t &= o_t \odot \tanh(C_t)
\end{aligned}
]
其中 (\sigma) 是sigmoid函数,(\odot) 表示逐元素相乘。

门控循环单元(GRU)是LSTM的一个流行变体,它合并了遗忘门和输入门,结构更为简洁。

双向RNN与上下文相关表示

标准RNN是单向的,只考虑过去的信息。双向RNN(Bi-RNN)同时运行两个RNN,一个从前向后,一个从后向前,然后将两个方向的最终隐藏状态拼接起来,从而获得每个词更丰富的上下文信息。

ELMo这样的模型就使用了深层双向LSTM来生成词表示。对于像“plant”这样的多义词,ELMo能够根据其上下文(如“green plant” vs. “industrial plant”)生成不同的向量表示。

句法结构与递归神经网络 🌳

语言不仅有意义,还有结构(句法)。利用句法信息可以提升模型性能。

句法分析

句法分析旨在揭示句子的结构。常见任务包括:

  • 词性标注: 标记每个词的词性(名词、动词等)。
  • 组块分析: 识别名词短语、动词短语等基本组块。
  • 成分句法分析: 构建完整的句法树,显示短语如何组合成句子。
  • 依存句法分析: 识别词与词之间的二元依存关系(如主谓、动宾)。

句法结构有助于理解语言,例如,在注意力机制中,关注“yellow squash”这个名词短语比单独关注“squash”更有意义。

递归神经网络(Recursive Neural Network)

为了将树状结构融入神经网络,我们可以使用递归神经网络。与RNN在序列上循环不同,递归神经网络在句法树上递归应用相同的神经网络单元。

工作原理

  1. 首先使用句法分析器得到句子的句法树。
  2. 从叶子节点(词)开始,每个节点将其子节点的向量表示作为输入,通过一个神经网络单元(权重在所有节点共享)进行计算,得到该节点的向量表示。
  3. 这个过程递归进行,直到根节点,根节点的向量可以作为整个句子的表示。

这种结构特别适合需要捕捉短语级语义的任务,如细粒度情感分析。我们可以在每个短语节点(如“very good”、“not good”)都标注情感极性,并利用树结构进行训练和预测。

代码示例(概念性)

# 假设有一个神经网络单元,用于合并两个子节点的表示
def merge_unit(vector_left, vector_right):
    combined = torch.cat((vector_left, vector_right), dim=-1)
    # 经过一个线性层和激活函数
    parent_vector = torch.tanh(self.linear_layer(combined))
    return parent_vector
# 递归地自底向上构建树表示

更高级的模型如Stack LSTM,将句法分析器的堆栈操作与LSTM相结合,能够同时进行句法分析和表示学*。

总结 🎯

在本节课中,我们一起学*了:

  1. 词表示: 从分布假说到Word2Vec,理解了如何用向量捕捉词义及其局限性。
  2. 句子表示与语言模型: 学*了句子级表示的思路,以及语言模型的核心任务——预测下一个词。
  3. 循环神经网络: 掌握了RNN处理序列数据的基本原理、训练方法(BPTT)及其在Seq2Seq模型中的应用,也认识了标准RNN的梯度消失问题。
  4. 长短期记忆网络: 了解了LSTM通过门控机制解决长程依赖问题的设计思想。
  5. 句法与递归神经网络: 探索了如何利用句法树结构,通过递归神经网络来获得更丰富的语言表示。

这些概念是理解现代自然语言处理模型(如Transformer、BERT)的重要基础。在接下来的课程中,我们将深入探讨自注意力机制等更前沿的技术。

课程 P7:L4.1 - 多模态表示 🧠

在本节课中,我们将要学*多模态表示的核心概念。我们将首先简要讨论基于图的表示方法,然后深入探讨如何将来自不同模态(如文本、图像、音频)的信息融合到一个统一的表示空间中。理解这些表示方法是构建强大跨模态AI系统的基石。

基于图的表示 📊

上一节我们介绍了递归神经网络在处理树状结构(如句法分析树)时的优势。本节中,我们来看看如何将这种思想扩展到更通用、更灵活的结构——图。

图由节点(或顶点)和连接节点的组成。它可以用一个邻接矩阵 A 来表示,其中 A[i][j] = 1 表示节点 i 和节点 j 相连。图神经网络的目标是为图中的每个节点学*一个有效的嵌入表示。

以下是图神经网络的一些关键应用场景:

  • 节点分类:例如,在社交网络中识别用户是真人还是机器人。
  • 链接预测:预测图中两个节点之间是否存在连接。
  • 图聚类:基于节点嵌入的相似性对节点进行分组。

图神经网络的核心直觉是局部性多层聚合。对于一个目标节点,其表示主要受其直接邻居的影响。通过堆叠多层网络,信息可以传播到更远的节点。

一个基础的图神经网络层可以形式化地表示为:
H^(l+1) = σ( A * H^(l) * W^(l) )
其中,H^(l) 是第 l 层的节点特征矩阵,W^(l) 是可学*的权重矩阵,σ 是非线性激活函数。

然而,简单的平均池化可能无法有效处理不同数量的邻居节点。图卷积网络 通过使用归一化的邻接矩阵和共享权重来解决这个问题,提高了计算效率。为了应对深层网络中的梯度消失问题,研究人员引入了类似 GRU 的门控机制在层之间,使得模型能够构建更深的网络。

多模态表示的目标 🎯

现在,让我们将焦点转向多模态表示。多模态表示学*的目标是创建一个能够融合和理解来自不同感官或数据源(模态)信息的统一框架。

多模态表示学*主要有以下几个目标:

  • 相似性建模:使不同模态中描述相同概念或实体的表示在嵌入空间中彼此接*。
  • 支持下游任务:学*到的表示应该对检索、映射、融合等预测任务有用。
  • 处理模态缺失:理想情况下,即使某些模态数据缺失,也能使用该表示进行推理或补全。
  • 跨模态翻译:能够从一个模态的表示生成或推断另一个模态的内容。

学*多模态表示主要面临两大核心挑战,对应两种主要范式:

  1. 联合表示:将所有模态的信息映射到同一个共享的表示空间中。
  2. 协调表示:为每个模态学*独立的表示空间,但通过约束使它们在语义上对齐或“协调”。我们将在后续课程中详细讨论后者。

无监督表示学* 🔍

在深入多模态之前,我们先回顾一下无监督表示学*。它的目标是让模型更好地刻画输入数据本身的结构,而非仅仅为分类任务提取特征。这有助于数据压缩、趋势分析,并且通常能利用大量无标签数据学*到更具泛化能力的表示,以供后续监督任务使用。

早期有两种重要的多模态无监督学*方法:

  • 受限玻尔兹曼机:一种生成模型,可以学*模态间的联合概率分布。其能量函数通常定义为 E(v, h) = -b^T v - c^T h - v^T W h,通过训练使模型能够重构输入数据。
  • 自编码器:一种更易于优化的方法。其基本思想是让网络学*重构其自身输入。一个典型的自编码器包含一个将输入压缩为低维编码的编码器,和一个从编码解码重构输入的解码器。损失函数是重构误差,例如均方误差:L = ||x - decoder(encoder(x))||^2

去噪自编码器 是自编码器的一个变体,它通过向输入添加噪声(x_noisy),然后训练网络从带噪输入重构原始干净输入,从而使学*到的表示对噪声更鲁棒。

多模态自编码器 🤖

如何将自编码器扩展到多模态场景?关键在于学*一个联合表示

以音视频语音识别为例,我们同时有唇部运动轨迹(视觉模态)和音频频谱(听觉模态)。多模态自编码器的架构如下:

  1. 每个模态有独立的编码器网络。
  2. 编码器的输出被送入一个共享的联合表示层
  3. 从联合表示层出发,每个模态有独立的解码器网络,试图重构各自的原始输入。

训练这种模型需要配对的多模态数据。通常,我们会先使用单模态数据预训练每个模态的编码器和解码器,然后再用配对数据对整个网络进行联合微调。

这种方法的强大之处在于,一旦模型训练完成,我们可以:

  • 丢弃解码器,仅使用联合表示作为特征,用于新的监督任务(如语音识别)。
  • 在测试时,即使某个模态(如音频)缺失,我们仍然可以利用另一个模态(如视频)的编码器和联合表示进行推理,实现跨模态补全

生成式多模态模型 🎨

与自编码器不同,生成式模型(如多模态RBM)不仅学*表示,还显式地建模数据的生成过程。这使得它们能够从表示中采样生成新的多模态数据。

例如,在图像-文本任务中,一个深度生成模型可以:

  1. 从图像或文本输入开始。
  2. 通过多层非线性变换,逐步抽象出高层特征。
  3. 在最高层形成一个紧凑的联合表示。
  4. 从这个联合表示出发,模型可以生成(采样)相关的文本描述或图像。

研究表明,这种联合表示具有不对称性:文本表示从图像信息中获益更多,反之则不然。在预训练后,这种生成式模型学到的表示同样可以提升纯视觉或纯文本下游任务的性能。

监督式多模态融合 🧩

在许多实际应用中,我们最终需要一个监督信号(如情感标签)来驱动多模态表示的学*。这里的关键是设计有效的融合机制,以捕捉模态间复杂的相互作用。

简单的融合方法包括拼接元素级乘积。但多模态交互可能非常复杂:

  • 单模态信息:仅凭文本“这部电影很酷”难以判断情感。
  • 双模态交互:“这部电影很酷” + “微笑” => 很可能为正面。
  • 三模态交互:“这部电影很酷” + “微笑” + “大声” => 强烈正面。

为了显式地建模这些交互,研究者提出了双线性池化。对于两个模态的特征向量 h_xh_y,双线性池化计算它们的外积,得到一个矩阵 Z = h_x * h_y^T。这个矩阵 Z 的每个元素都编码了 h_xh_y 特定维度之间的交互信息。

更进一步的扩展是多模态张量融合,它通过引入一个额外的维度,同时建模单模态、双模态和三模态的交互。虽然这会引入大量参数,但通过张量分解(如CP分解)等技术可以有效地降低计算复杂度。

时序多模态建模 ⏳

许多多模态数据(如视频、对话)具有时序特性。一个简单的做法是在每个时间步独立进行融合,但更好的方法是让融合过程本身具备时序建模能力。

多视图LSTM 是处理时序多模态数据的一个范例。与标准LSTM只有一个记忆单元不同,多视图LSTM为每个模态维护一个独立的记忆单元。其关键创新在于输入门的计算:在决定更新哪个模态的记忆时,不仅考虑该模态自身当前和过去的信息,还可以有选择地参考其他模态的信息。

这引出了不同的融合拓扑:

  • 独立:每个模态的LSTM完全独立运行。
  • 耦合:每个模态的记忆更新完全依赖于其他模态,忽略自身历史。
  • 融合:每个模态的记忆更新是自身信息和其他模态信息的加权组合。

权重(如α, β)可以是固定的超参数,也可以设计成动态学*的门控机制,让模型自己决定在何时信任哪个模态。

协调表示预览 🤝

我们将在下节课深入探讨协调表示。与联合表示将所有信息压入同一空间不同,协调表示旨在为每个模态学*独立的表示空间,但同时施加约束使它们在语义上对齐。

常见的协调目标包括:

  • 余弦相似度最大化:迫使正样本对(如图像及其描述)的表示在各自空间中的余弦相似度尽可能高。
  • 对比损失:不仅拉*正样本对,还推开负样本对。其形式常为:L = max(0, margin - sim(pos) + sim(neg))
  • 结构保持约束:确保在原始模态空间中有相似关系(如邻居关系)的样本,在嵌入空间中依然保持这种关系。

本节课中我们一起学*了多模态表示的基础。我们从基于图的表示方法入手,理解了局部聚合的思想。然后,我们深入探讨了多模态表示的目标与挑战,并学*了无监督(自编码器、生成模型)和监督式(各种融合技术)的学*方法。最后,我们预览了时序建模和协调表示的概念,为后续课程打下基础。掌握这些表示方法是构建能够理解和推理多模态世界的人工智能系统的关键一步。

课程P8:L4.2 - 协调表示 👥

在本节课中,我们将学*多模态协调表示。我们将快速回顾多模态联合表示,然后深入探讨协调表示的核心概念。课程将涵盖多元统计分析基础、典型相关分析及其扩展,以及多视图聚类等主题。


多模态表示快速回顾 🔄

上一节我们介绍了多模态联合表示,本节中我们来看看协调表示。

在周二的课程中,我们讨论了生成模型。生成模型的有趣之处在于,一旦你能够训练一个生成模型,你几乎可以在任何方向上进行转换。例如,你可以根据文本生成图像,或者根据图像生成文本。这是因为我们建模了X和Y之间的完整联合分布,这使得我们可以执行许多有趣的条件概率或翻译任务。

我们可以使用从这些生成模型(如玻尔兹曼机)中学到的表示,或者使用其他无监督方法。一旦你有了这些表示,你就可以在其之上学*一两个层来执行其他任务,例如监督学*任务。在相关论文中,这个任务是基于表示进行图像检索。

我们还研究了另一种以无监督方式训练这些联合表示的方法,其中之一是堆叠自编码器。你可以端到端地学*。在这种情况下,损失函数是一个两部分的问题:一部分是你生成文本的好坏,另一部分是你生成图像的好坏。你可以同时使用图像和文本作为输入来训练它,或者你也可以决定只使用图像作为输入进行训练,但你的损失仍然同时包含文本和图像。

此外,还有使用前馈神经网络学*这些中间表示的想法,此时你正在执行翻译任务。在这里,你并不是在学*联合分布,更多的是在学*条件概率。例如,在图像描述任务中,你编码图像以生成文本。此时,中间表示预期是文本和图像之间的中间表示。在实践中,这个表示可能更接*文本或更接*图像,虽然没有强制要求它必须是真正的联合表示,但它肯定处于图像和文本之间的某个位置。

我们还讨论了这样一个事实:有些表示没有明确地建模所有不同的交互方式。因此,我们研究了双线性模型。其中一个例子是张量融合网络,它允许我们同时处理单模态和双模态特征。虽然这增加了参数数量,但它使得每个特征更具代表性,可能有助于网络后期阶段更容易找出哪些单模态或双模态特征对任务最有用。


如何学*更好的表示? 🧠

上一节我们回顾了联合表示,本节中我们来看看如何学*更好(或至少不同类型)的表示——协调表示。

协调表示的核心思想是,我们不为每种模态只学*一个表示,而是找到一种方法来协调它们。在周二的课程末尾,我们讨论了非常强的协调方式,例如要求两个表示几乎相同,并使用余弦距离作为损失函数。虽然这有时被称为无监督学*,但这种说法有点误导性,因为它仍然需要一些监督——图像和文本之间的配对关系仍然是学*这两个独立表示所必需的。

在强协调下,如果使用像余弦相似度这样强的度量,这两个表示几乎会是等价的。我们展示了一个例子,现在我们可以更好地理解发生了什么。实际上,你拥有成对的图像和文本数据。对于每一对,你有一张图像和一段文本描述。从图像中,你可能通过CNN编码得到特征;从文本中,你可能得到整个句子的词向量平均。目标是学*新的表示,使它们的夹角尽可能接*。这就是2014年那篇论文的妙处:他们在配对数据上训练,然后在测试时,取一张图像,将其前向传播得到其表示;取单词“蓝色”得到其表示;取单词“红色”得到其表示;然后进行一些算术运算,就可以采样出最接*的图像。

现在你可以更好地理解这篇视觉语义嵌入论文了。你可以在“白天”和“黑夜”上做类似操作。然而,这不会完美地工作,这是这种方法的一个问题。虽然它们被训练得彼此接*,但并非对所有可能的单词都有效。你不能简单地做“白天”减去“颜色”这样的运算,因为那样你可能会进入一个不同的表示区域,所以这种算术并不完美。但看到其中一些能工作是很好的。

当你训练这些表示时,你也可以在学*这些结构时保持顺序。你可以有两个嵌入,然后你说你希望它们以某种方式协调。你可以说,你希望图像和描述之间的余弦相似度尽可能高,这就是我们刚刚描述的方式。或者你也可以说使用顺序嵌入,这是一种更结构化的协调方式。你可能希望,如果两个实体在非常高的层次上是关于“人”的,那么它们应该彼此接*。例如,描述中谈到一个“农民”,而图像中是一个“滑雪者”。在某种意义上,他们并不完全相同,但在非常高的层次上,他们都是人。因此,这两个例子仍然应该是相关的,但可能不如描述和图像都是关于“滑雪者”时那么紧密。这就是这种更结构化方法的直觉。

另一种协调方式是,通过某种编码机制(如哈希表)将它们连接起来。这既能保证效率,也能强制执行它们之间的一些相似性。这些都是协调表示的其他例子。接下来,我们还将讨论典型相关分析和其他方法。


多元统计分析基础 📊

为了深入理解协调表示,特别是典型相关分析,我们需要回顾一些多元统计分析的基础知识。这些是理解后续内容的重要工具。

多元统计分析旨在理解高维数据中的关系。“多元”可以看作是多个变量或多个维度的数据。常见的例子包括方差分析和其多元版本MANOVA、主成分分析和因子分析,以及线性判别分析。我们稍后将讨论典型相关分析。

这一切的核心是随机变量。随机变量是随机现象数值结果的变量。有两种类型的随机变量:离散随机变量和连续随机变量。离散随机变量的可能取值是离散的,例如0, 1, 2, 3, 4,或者颜色、年龄等属性或数值。连续随机变量则有无限个连续值,例如某人的身高、体重。年龄通常可以表示为连续变量,但身高和体重通常被离散化。

有趣的是,这些变量之间可能是相关的。例如,年龄可能与身高和体重相关(至少在早期),身高和体重本身也可能相关。因此,相关性是研究随机变量时一个非常有趣的方面。

以下是几个关键术语的定义:

  • 期望值:这是值的概率加权平均。在离散情况下,它是所有可能值乘以该值发生概率的总和。在许多情况下,如果所有观测值的概率相等,期望值就等于算术平均值。如果某些值比其他值更可能出现,期望值会考虑到这一点。
  • 方差:衡量观测值的离散程度。它是数据值减去均值后的平方的期望值。方差等于标准差的平方。
  • 协方差:衡量两个随机变量如何一起变化。如果你已经对数据进行了中心化处理(减去均值),那么协方差就是两个变量值的乘积。协方差很重要,因为它引出了相关性。
  • 相关性:协方差的归一化版本。它衡量两个变量之间线性关系的程度。通过归一化,相关性值介于-1和1之间,这提供了一个很好的度量尺度。

相关性测试:如果X是横轴,Y是纵轴,每个点是一个样本(散点图)。如果散点图呈明显的从左下到右上的直线趋势,则X和Y正相关。如果点非常分散,没有明显趋势,则相关性很弱。如果呈从左上到右下的直线趋势,则为负相关。如果其中一个变量完全没有变化(方差为零),则相关性未定义(除以零)。

多元分析是上述概念的扩展。在单变量分析中,我们可能看年龄和体重。在多元分析中,对于一种视图(如语言),我们可能有多个随机变量(特征),例如X1是情感,X2是时态(过去/现在),这些都可以从词典中提取。对于图像,我们可能看特征,例如是否有人、人是否在微笑、他们在看哪里。这些都是一组特征随机变量。

在多元意义上,之前描述的一切仍然存在。

  • 协方差矩阵:在一个模态内部(例如模态X),衡量不同特征随机变量之间如何相关。这个矩阵的对角线是每个特征与自身的协方差(即方差)。如果所有特征彼此完全不相关,那么所有非对角线元素将为零。
  • 交叉协方差矩阵:这更有趣,因为它不是比较X与自身,而是比较X和Y。它查看例如语言情感非常积极时,如何与图像中的人是男性还是女性、是否微笑等特征共同变化。这个矩阵将显示所有特征如何彼此共同变化。这个矩阵的对角线将是X1和Y1如何共同变化等。特征的顺序在确定后应保持一致,但最初是任意的。更有趣的是观察这些特征如何与另一个模态的特征相关。

相关性矩阵可以看作是交叉协方差矩阵除以X和Y各自方差矩阵的乘积。

定义为矩阵对角线元素之和。对于相关性矩阵,对角线总是1,所以迹就是维度数。

主成分分析 是多元世界中广为人知的方法。PCA的思想是,你有一组可能相关的观测值,PCA将它们转换为一组线性不相关的变量,称为主成分。对于二维点云,PCA寻找方差最大的方向(第一特征向量),第二个特征向量总是与第一个垂直,并且方差较小。通常前几个特征向量解释了大部分信息,而特征值较小的特征向量可能只是噪声,可以被移除。

奇异值分解 是解决特征值问题的一种方法。对于矩阵A,SVD将其分解为U、Σ和VT,其中U的列是AAT的特征向量,V的行是A^TA的特征向量。我们将在讨论CCA时重用这个概念。


典型相关分析 🔗

上一节我们介绍了多元统计分析的基础,本节中我们来看看协调表示中的一个核心方法——典型相关分析。

在许多多视图学*问题中,例如你有 demographic 数据和 survey 响应,你试图匹配 demographic 如何与 survey 的不同方面对齐。在我们的案例中,你有音频和视频,你想看看它们如何相互关联。这就是典型相关分析发挥作用的地方。

“典型”意味着简化到最简单或最清晰的模式。典型相关分析分三步进行:

  1. 线性投影以最大化相关性:我有文本和图像。目前可以称之为无监督,但它实际上是配对数据,因此具有某种监督性。直觉是,我希望图像和文本的嵌入表示尽可能相关。但这不是精确的说法,我将澄清一下。在高层次上,你可以说我希望这些嵌入尽可能“相关”。相关意味着一个增加,另一个也增加(正相关)或减少(负相关)。CCA的思想是学*两个线性投影。我已经有了X(文本)和Y(图像)的特征,我想对它们进行投影。对于线性CCA,我假设已经有了词向量和CNN特征,只想学*一个线性投影。但我想学*这些投影,使得这两个投影(即表示或嵌入)尽可能相关。如果我只做这一步,它不会被称为典型相关分析,而只是相关分析,因为这仅仅是使两者最相关。
  2. 寻找多个正交的相关方向:CCA的美妙之处在于,它认识到数据可能不止一种相关方式。因此,我们希望找到数据的多个投影。这些投影彼此正交。我们将学*多个投影,使得第一个投影对之间的相关性最大,第二个次之,第三个再次之,依此类推。这意味着h_x和h_y之间可能存在不止一种相关方式。我们需要一种方法来强制这些投影是正交的或“典型”的。“典型”意味着最简单,而使其简单的方法就是使其正交。数学上,这意味着对于不同的投影对,它们的乘积应为零。
  3. 约束与求解:另一种方式是,我们希望整个矩阵的非对角线元素为零,只关注迹(对角线)。我们可以重新表述问题为:在约束投影向量的方差为单位矩阵的条件下,最大化迹。这强制了非对角线元素为零。我们如何解决这个优化问题?当我们看到“最大化...受限于某些约束”时,可以想到使用拉格朗日乘数法。通过构建拉格朗日函数并求梯度,可以找到驻点。有趣的是,这个问题实际上与奇异值分解非常相关。可以通过SVD分解来求解CCA,从而得到特征向量和特征值。

典型相关分析的优点在于它找到了事物相关的多种方式。在协调表示的谱系中,我没有强制表示彼此相等,也没有强制它们完全相关(那将类似于联合表示)。这里你说,嘿,它们可以有不止一种相关方式。在大框架下,它仍然相对接*联合表示,但允许更松散的协调。


CCA的非线性扩展 🚀

上一节我们介绍了线性典型相关分析,本节中我们来看看其非线性扩展,这更接*现代深度学*。

2013年有一篇受欢迎的论文,将CCA扩展到非线性版本。在这种情况下,不仅仅是线性投影,还会加入非线性层(可以有多层)。目标函数仍然是使损失函数中两个表示尽可能相关,因为对于配对数据,我们知道样本X应该与Y共现。为此,你需要计算h(x)和h(y)之间的梯度。只要能得到解析梯度(我们在上一节提到过这可以解析计算),那么这就是一种基于梯度的方法。深度神经表示都是关于解析梯度的,所以如果我能得到解析梯度,我就可以传播梯度,一切顺利。

这篇论文的妙处在于,你可以进行预训练。这个想法在现在语言模型中仍然非常流行:在大量数据上进行预训练。你可以先在文本基础上预训练,使用多个非线性投影层,也许还有一个线性投影层,最终得到一个中间表示,使得你可以重建文本。预训练之后,你可以进行微调,例如只微调线性投影层或微调所有层。

CCA的一个挑战是,相关性需要大量样本。如果我只给你一个图像样本和一个文本样本,你无法计算相关性(未定义)。因此,如果采用基于批处理的方法,使用大批次或全批次非常重要,然后使用像牛顿法这样的方法。

一个有趣的扩展是,不仅用自编码器预训练然后做CCA,还可以将它们结合在一起训练。这就是下面这个模型的妙处。

深度典型相关自编码器:观察这个模型,它的损失函数是什么?你有文本的自编码器、图像的自编码器,然后两者之间还有一些协调。所以,h(x)应该足够好,以便能重建图像(或图像特征);h(y)应该能重建文本特征。那么,这三个损失如何组合?总损失将包含三部分:如何生成文本、如何生成图像,以及它们如何相关。你可以从强调前两个损失开始,然后逐渐希望它们相关。这就像是之前分步方法的一个平滑版本:先做自编码,然后做CCA。而在这里,你几乎是将它们同时进行。但即使同时进行,你可能也不希望在优化的每次迭代中所有损失的权重都相同。这是另一个需要考虑的问题。

CCA也可以以我们之前讨论过的堆叠方式学*。我不详细介绍LDA和MANOVA等方法了,但在我们所有人都使用相同工具集的领域,我真心鼓励你们去看看其他方法。有时它们看起来像旧工作,但其中有很多证明和有趣的结果。如果你将可解释性作为一个目标,这些统计方法可以给你更好、通常更可解释的结果,它们也带有置信区间等界限,这些是非常有用的信息。


多视图聚类 👥

上一节我们讨论了基于相关性的协调方法,本节中我们来看看另一种协调思路——多视图聚类。

我们讨论了拥有配对数据的情况,并希望学*一个表示。但聚类本身还不是多视图聚类,它只是将数据样本进行划分,使得相似样本聚集在一起,不相似样本分开。在可解释模型的世界里,数据聚类的思想不仅是学*一个表示,还要在该表示中找出有哪些组或簇。

以下是几种基本的聚类方法:

  • K均值聚类:这是一种基于竞争学*的简单聚类,每个样本只能属于k个组中的一个。它是一个迭代过程:通常随机或预热设置每个组的中心,将每个样本分配到最*的组,然后重新计算簇中心,直到收敛。胜者通吃,所以是竞争性的。
  • 非负矩阵分解:思想是你有一个矩阵X,你想将其分解为非负矩阵F和G。你可以将G看作是不同簇的中心,F则是每个样本属于每个簇的程度。这使得F是非负的才有意义,因为它代表了“属于”的程度。典型的NMF要求F和G都是非负的。半非负矩阵分解可能只要求其中一个非负。也有深度半非负矩阵分解的论文,它可以是多层的。我喜欢的一个方向是从多个视图学*数据划分。

到目前为止,这只是关于聚类。但如果我们有多个视图,那就更有趣了。例如,我不只有文本数据并想对其进行聚类(经典的主题建模),我还有这些网页中的图像,可能还有相关的音频。我想基于所有这三种模态进行聚类。这就是多视图聚类的有趣之处。假设我有配对数据,我知道每个实例来自相同的音频、文本和图像。

多视图聚类的两个重要原则是:

  1. 共识原则:跨多个视图,你希望将信息分组在一起。在每个模态中,我可能有很多特征,但有一个特征子集具有共识,即它们是相似的。
  2. 互补性原则:多个视图需要获得更全面和准确的描述,因此视图之间也存在互补性。

多视图子空间聚类是一种方法,它假设所有视图共享一个共同的子空间表示。你学*这个子空间,以便能够预测那个统一的表示。那么,如何在我们的多模态数据中进行数据聚类呢?这非常有趣。我有多种模态,我想学*文本和图像的表示,使得数据中自然形成聚类,并且这个聚类在不同模态间是一致的。

有一篇早期的论文邀请你去看看,即深度矩阵分解。它将视觉特征和语言特征(以离散方式表示)结合在一起,最终以某种方式进行分解,使得数据有一个良好的分解。在测试时,这也有助于图像标注。我邀请你们看看其他方法,因为我没有时间讨论所有不同的方式。一种方式是我们将其视为子空间,然后在该子空间中以某种方式进行分组。但你也可以在其中使用图,每个视图的子嵌入实际上是一个图,你希望以某种方式对图进行聚类,这更接*我们上周二讨论的内容。这些方法非常棒,因为你可以以某种方式在它们之间进行引导。例如,你在一个模态上进行聚类,获得一些知识,然后利用这些知识用于另一个模态的聚类,再进行知识传递,这是一种协同训练的方式。


自编码器的自编码器 🌀

上一节我们探讨了多视图聚类,本节中我们来看协调表示谱系中的最后一个有趣扩展——自编码器的自编码器。

在协调表示的谱系中,我们讨论过非常强的协调(如余弦相似度)、相关性、典型相关性,以及聚类(我认为是较松散的协调,甚至是基于图的协调)。现在我们来讨论一种具有潜在空间直觉,但又有所扩展的方法。

快速回顾一下深度CCA:深度CCA的思想是,你有一个自编码器,有两个编码器,同时你还有一个损失项,使得它们在正交投影下也相关。

多视图潜在完整空间 的直觉是:存在一个真实的、完整的表示空间,然后每个模态或每个视图都是该空间的一个切片加上一些噪声。例如,我真心希望你们喜欢多模态机器学*并理解其意图,这存在于我的大脑中,你们观察不到。但存在这个完整的表示空间。当我讲话时,我试图分享这个不可见空间的一小部分视图。你们看到我的表情,听到我的声音,这些都是同一个完整空间的不同视图。所以,我有一个完整空间,我分享了一些东西,你们看到我的非语言行为、听到我的声音,这给了你们一个带有噪声的、关于我想说什么的版本。这是我想分享的第一个直觉:完整空间的思想。

另一个更酷的直觉是:这个完整空间对于每个实例都是不同的。如果你看这个讲座的前五分钟,我有一个想分享的信息,那是那前五分钟我的完整空间。但接下来的五分钟,

课程 P9:L5.1 - 多模态对齐 👥

在本节课中,我们将要学*多模态对齐。这是一个非常有趣且核心的主题,因为在多模态机器学*中,对齐是连接不同模态信息的关键桥梁。

概述 📋

多模态对齐旨在寻找两个或多个模态之间的对应关系。在单个模态内部,我们拥有许多元素(例如时间序列中的时间点)。对齐的任务就是在这些元素层面建立联系。有些元素可能是某个模态独有的,有些信息可能在多个模态中是冗余的,而有些信息则可能是互补的,即结合多个模态才能产生新的含义。

我们将学*两种主要的对齐技术:显式对齐隐式对齐。显式对齐将对齐本身作为优化目标,而隐式对齐则将对齐作为完成其他任务(如情感预测)的中间步骤。

显式对齐 🎯

上一节我们介绍了对齐的基本概念,本节中我们来看看显式对齐的具体方法。在显式对齐中,我们的损失函数直接优化对齐关系,目标就是找到模态间的对应。

动态时间规整

一个经典的显式对齐例子是音频与文本转录的词对齐,或者同步两个不同步的视频。动态时间规整是解决这类问题的关键技术。

假设我们有两个长度可能不同的时间序列 X 和 Y。我们的目标是找到一组索引映射,使得对齐后的序列差异最小。这可以形式化为一个优化问题,寻找索引向量 p_txp_ty 以最小化对齐损失,例如欧几里得损失:

min || X[p_tx] - Y[p_ty] ||^2

动态时间规整的核心思想是在一个成本矩阵中寻找最低成本的路径。它通常遵循单调性和连续性约束,确保序列在时间上不会“倒退”,并且每个元素都会被映射。求解过程通常使用动态规划算法。

从单模态到多模态

然而,基础的动态时间规整假设序列来自同一模态(单模态)。当 X 和 Y 来自不同模态(例如图像特征和文本特征)时,它们的特征空间和维度可能不同。这时,我们需要先将它们映射到一个可以比较的公共空间。

上周我们学*的典型相关分析 正是为此而生。CCA 可以学*一个投影空间,使得两个模态在该空间中的表示具有最大相关性。结合 DTW 和 CCA,就形成了典型时间规整 方法,它能在同一个损失函数中同时学*投影(表征学*)和对齐。

其优化过程通常采用坐标下降法:固定对齐参数,优化投影参数(使用特征分解或 SVD);然后固定投影参数,优化对齐参数。

扩展到深度模型与多序列

为了获得更强大的非线性表征能力,我们可以将 CTW 扩展为深度典型时间规整。这本质上是深度 CCA 与广义时间规整的结合。优化过程与深度模型类似,使用梯度下降法。

此外,CTW 和 DCTW 都可以进一步推广到对齐多个来自不同模态的序列,例如同时对齐视频、音频和动作捕捉数据。

隐式对齐 🔍

上一节我们探讨了以对齐为直接目标的显式方法,本节中我们来看看更为流行的隐式对齐。在隐式对齐中,对齐本身不是最终目标,而是完成图像描述、视觉问答等任务所必需的中间步骤。注意力模型是这类方法的杰出代表。

注意力机制的核心直觉是:人在处理信息(如看图像或听声音)时,会在任一时刻聚焦于信息的某个子集。神经网络中的注意力模型借鉴了这一思想,动态地决定在每一步应关注输入中的哪些部分。

以下是几种主要的注意力机制类型:

1. 软注意力(自注意力)

这是最常见的一种。它不进行硬性选择,而是为所有输入元素分配一个0到1之间的权重(通常通过softmax归一化),然后进行加权求和。这使得整个过程是可微的,便于通过反向传播优化。

一个著名的历史应用是机器翻译中的序列到序列注意力模型。在该模型中,解码器在生成每一个目标语言单词时,都会计算源语言句子中所有单词的注意力权重,从而动态地聚焦于最相关的源语言上下文。这解决了长序列信息压缩和词序差异的问题。

将这种思想扩展到多模态任务(如图像描述生成),就产生了“Show, Attend and Tell”等工作。模型在生成描述中的每个词时,会对CNN卷积层输出的特征图(保留了空间信息)计算注意力权重,从而“看向”图像中与该词最相关的区域。

2. 空间变换网络

这种方法提供了一种不同的“注意”视角。它不是对特征进行加权,而是预测一组参数(如仿射变换参数),对输入图像(或特征)进行空间变换(如裁剪、旋转、缩放),从而让网络聚焦于特定区域。这个预测变换参数的模块本身也是一个可微的网络,可以与主任务一起训练。

3. 硬注意力

硬注意力机制每次只选择输入中的一个离散子集(例如图像中的一个特定区域)进行处理,而不是进行软加权。这种选择过程本质上是不可微的,因此通常需要借助强化学*(如策略梯度方法)来进行训练。一个例子是循环注意力模型,它像“视觉扫视”一样,在多个时间步依次关注图像的不同区域,最终做出决策。

总结 🏁

本节课中我们一起学*了多模态对齐的两种主要范式:

  • 显式对齐:将对齐作为直接优化目标。我们深入探讨了动态时间规整及其在多模态场景下的扩展——典型时间规整深度典型时间规整。这些方法通过联合优化投影和对齐,能够显式地建立模态间元素的对应关系。
  • 隐式对齐:将对齐作为完成其他任务的中间步骤。我们重点介绍了以注意力模型为核心的各类方法,包括软注意力(自注意力)空间变换网络硬注意力。这些机制使模型能够动态地聚焦于输入中最相关的部分,极大地提升了如机器翻译、图像描述等任务的性能,并提供了某种程度的可解释性。

对齐是多模态机器学*中连接异构数据、实现信息融合的基础,理解其原理与方法对于构建有效的多模态系统至关重要。

posted @ 2026-02-03 19:58  绝不原创的飞龙  阅读(6)  评论(0)    收藏  举报