在本章中,我们了解了结合不同模态信息的几种方式。有时,通过视觉方式展现这些方法能帮助它们变得清晰。本次实践练习旨在通过绘制和解读图表,帮助你建立关于结合和表示策略如何运作的心智模型。不必担心绘画技巧;目标是清晰明了。第一部分:通过图表理解结合层级请记住,多模态结合可以在不同阶段发生:早期结合: 结合原始数据或非常低级别的特征。中间结合: 在对每种模态进行一些初步处理后合并特征。后期结合: 结合在单个模态上训练的模型输出或决策。我们尝试图示这些。轮到你:动手绘制!在查看我们的示例之前,拿张纸或打开绘图工具。尝试为以下每种结合类型绘制一个简单的框图:早期、中间和后期。思考以下问题:每种模态(例如,图像、文本)的数据从何处进入系统?(如果在结合之前)特征是在何处提取的?不同数据流在何时汇集?它们结合后会发生什么?此练习有助于巩固你的理解。尝试过后,请将你的草图与下方图表比较。示例图表:早期结合早期结合,也称为输入级别或数据级别结合,涉及在处理过程的最开始结合来自不同模态的信息。这通常意味着拼接原始数据或从每种模态提取的基本特征。digraph EarlyFusion { rankdir=TB; bgcolor="transparent"; node [shape=box, style="filled", fontname="sans-serif"]; edge [fontname="sans-serif"]; Modality_A [label="模态 A\n(例如,图像像素)", fillcolor="#a5d8ff"]; Modality_B [label="模态 B\n(例如,文本词元)", fillcolor="#b2f2bb"]; Fusion [label="早期结合\n(例如,拼接)", fillcolor="#ffec99", shape=ellipse]; Combined_Features [label="结合特征", fillcolor="#ffd8a8"]; Multimodal_Model [label="多模态模型", fillcolor="#d0bfff"]; Output [label="输出 / 预测", fillcolor="#ced4da"]; Modality_A -> Fusion; Modality_B -> Fusion; Fusion -> Combined_Features; Combined_Features -> Multimodal_Model; Multimodal_Model -> Output; }显示早期结合的图表。来自模态 A 和模态 B 的数据在结合阶段直接结合,生成结合特征,然后输入多模态模型。在此图表中:模态 A(例如,原始图像像素)和 模态 B(例如,原始文本词元)是输入。它们立即被输入到 早期结合 阶段。这可以像将它们的特征向量并排堆叠一样简单,例如在方程 $v_{\text{结合}} = \text{拼接}(v_A, v_B)$ 中。结合特征 然后由单个 多模态模型 处理以生成 输出。 主要特点是结合发生在对每种模态进行任何显著独立处理之前。示例图表:中间结合中间结合,或特征级别结合,发生在每种模态经过一些初步处理和特征提取之后。这些提取的特征随后被结合。digraph IntermediateFusion { rankdir=TB; bgcolor="transparent"; node [shape=box, style="filled", fontname="sans-serif"]; edge [fontname="sans-serif"]; Modality_A_Input [label="模态 A\n(例如,图像)", fillcolor="#a5d8ff"]; Feature_Extractor_A [label="特征提取器 A\n(例如,CNN)", fillcolor="#74c0fc"]; Features_A [label="特征 A", fillcolor="#4dabf7"]; Modality_B_Input [label="模态 B\n(例如,文本)", fillcolor="#b2f2bb"]; Feature_Extractor_B [label="特征提取器 B\n(例如,词嵌入)", fillcolor="#8ce99a"]; Features_B [label="特征 B", fillcolor="#69db7c"]; Fusion [label="中间结合\n(例如,拼接,注意力机制)", fillcolor="#ffec99", shape=ellipse]; Combined_Features [label="结合特征", fillcolor="#ffd8a8"]; Multimodal_Model [label="多模态模型", fillcolor="#d0bfff"]; Output [label="输出 / 预测", fillcolor="#ced4da"]; Modality_A_Input -> Feature_Extractor_A; Feature_Extractor_A -> Features_A; Modality_B_Input -> Feature_Extractor_B; Feature_Extractor_B -> Features_B; Features_A -> Fusion; Features_B -> Fusion; Fusion -> Combined_Features; Combined_Features -> Multimodal_Model; Multimodal_Model -> Output; }演示中间结合的图表。模态 A 和模态 B 首先由独立的特征提取器处理。产生的特征(特征 A 和特征 B)随后在结合阶段进行结合。这种结合表示随后由一个多模态模型使用。以下是所发生的情况:模态 A 和 模态 B 首先由各自的 特征提取器 处理(例如,用于图像的卷积神经网络,用于文本的词嵌入层)。这会产生 特征 A 和 特征 B,它们是比原始数据更抽象的表示。这些特征随后在 中间结合 阶段进行结合。产生的 结合特征 输入到 多模态模型。 结合发生于一些单模态处理之后,但模型最终决策部分之前。示例图表:后期结合后期结合,也称为决策级别结合,涉及通过独立的模型独立处理每种模态。这些模型的输出或决策随后被结合以产生最终结果。digraph LateFusion { rankdir=TB; bgcolor="transparent"; node [shape=box, style="filled", fontname="sans-serif"]; edge [fontname="sans-serif"]; Modality_A_Input [label="模态 A\n(例如,图像)", fillcolor="#a5d8ff"]; Model_A [label="模型 A", fillcolor="#74c0fc"]; Prediction_A [label="预测 A", fillcolor="#4dabf7"]; Modality_B_Input [label="模态 B\n(例如,文本)", fillcolor="#b2f2bb"]; Model_B [label="模型 B", fillcolor="#8ce99a"]; Prediction_B [label="预测 B", fillcolor="#69db7c"]; Fusion [label="后期结合\n(例如,平均,投票)", fillcolor="#ffec99", shape=ellipse]; Final_Prediction [label="最终预测", fillcolor="#ced4da"]; Modality_A_Input -> Model_A; Model_A -> Prediction_A; Modality_B_Input -> Model_B; Model_B -> Prediction_B; Prediction_A -> Fusion; Prediction_B -> Fusion; Fusion -> Final_Prediction; }后期结合图表。模态 A 由模型 A 处理以生成预测 A。独立地,模态 B 由模型 B 处理以生成预测 B。这些独立的预测随后在结合阶段进行结合,以产生最终预测。在后期结合中:模态 A 输入到 模型 A,产生 预测 A。独立地,模态 B 输入到 模型 B,产生 预测 B。这些独立的预测(或分数,或类别概率)随后在 后期结合 阶段进行结合(例如,通过平均、投票或一个简单的学习层)。这产生 最终预测。 主要思路是每种模态都由各自的模型完全处理,只有高级结果被合并。思考一下: 回顾你自己的草图和这些示例。这三个图表在视觉上的主要区别是什么?信息流的“汇合”点如何变化?你能想到一个简单的场景,其中一种方法可能比其他方法更受青睐吗?例如,如果一种模态比另一种模态可靠得多,这会如何影响你选择结合策略?第二部分:表示策略的图示两种主要思路是共享表示和协调表示。共享表示空间共享表示(或联合嵌入)旨在将来自不同模态的数据映射到单一的公共向量空间中。在这个共享空间中,来自不同模态的表示可以被直接比较。例如,一张猫的图像和“猫”这个词可能会被投影到这个空间中彼此靠近的点。digraph SharedRepresentation { rankdir=TB; bgcolor="transparent"; node [shape=box, style="filled", fontname="sans-serif"]; edge [fontname="sans-serif"]; Modality_A [label="模态 A\n(例如,图像)", fillcolor="#a5d8ff"]; Encoder_A [label="编码器 A", fillcolor="#74c0fc"]; Rep_A [label="图像表示\n(在 S 中)", fillcolor="#4dabf7", shape=ellipse]; Modality_B [label="模态 B\n(例如,文本)", fillcolor="#b2f2bb"]; Encoder_B [label="编码器 B", fillcolor="#8ce99a"]; Rep_B [label="文本表示\n(在 S 中)", fillcolor="#69db7c", shape=ellipse]; Shared_Space_Label [label="共享空间 (S)", shape=plaintext, fontcolor="#495057"]; Modality_A -> Encoder_A -> Rep_A; Modality_B -> Encoder_B -> Rep_B; {rank=same; Rep_A; Rep_B; Shared_Space_Label} }演示共享表示空间的图表。模态 A 被转换成“图像表示”,模态 B 被转换成“文本表示”。两种表示都存在于同一“共享空间 (S)”中,允许直接比较或交互。在此图表中:模态 A(例如,一张图像)通过 编码器 A。模态 B(例如,文本)通过 编码器 B。两个编码器都将其输出(表示 A 和 表示 B)投影到同一个 共享空间 (S)。 目标是相似的项目,无论其原始模态如何,最终都能在这个共享空间中彼此靠近。这对跨模态检索(基于文本查询查找图像)等任务很有用。协调表示空间另一方面,协调表示不一定强制将所有事物放入一个相同的空间。相反,它们侧重于学习每种模态独立表示空间之间的映射或关联。这些空间被“协调”,以便你可以将信息从一个空间转换或关联到另一个空间,即使它们的结构不同。digraph CoordinatedRepresentation { rankdir=TB; bgcolor="transparent"; node [shape=box, style="filled", fontname="sans-serif"]; edge [fontname="sans-serif", color="#495057"]; Modality_A [label="模态 A\n(图像)", fillcolor="#a5d8ff"]; Encoder_A [label="编码器 A", fillcolor="#74c0fc"]; Rep_A [label="表示 A\n(图像特征)", fillcolor="#4dabf7", shape=ellipse]; Modality_B [label="模态 B\n(文本)", fillcolor="#b2f2bb"]; Encoder_B [label="编码器 B", fillcolor="#8ce99a"]; Rep_B [label="表示 B\n(文本特征)", fillcolor="#69db7c", shape=ellipse]; Mapping_Node [label="协调\n(学习到的映射)", fillcolor="#ffc078", shape=diamond, style="filled,dashed", fontcolor="#495057"]; Space_A_Label [label="空间 A", shape=plaintext, fontcolor="#495057"]; Space_B_Label [label="空间 B", shape=plaintext, fontcolor="#495057"]; Modality_A -> Encoder_A -> Rep_A; Modality_B -> Encoder_B -> Rep_B; Rep_A -> Space_A_Label [style=dotted, arrowhead=none, color="#adb5bd"]; Rep_B -> Space_B_Label [style=dotted, arrowhead=none, color="#adb5bd"]; Rep_A -> Mapping_Node [style=dashed, dir=both, color="#f76707"]; Rep_B -> Mapping_Node [style=dashed, dir=both, color="#f76707"]; {rank=same; Rep_A; Mapping_Node; Rep_B;} {rank=same; Space_A_Label; Space_B_Label;} }协调表示空间的图表。模态 A 被编码成“表示 A”,并与其自身的“空间 A”关联,而模态 B 被编码成“表示 B”,并与其“空间 B”关联。“协调(学习到的映射)”机制允许这些不同的表示相互关联或转换。在这种设置中:模态 A 被编码成 表示 A,并与 空间 A 相关联。模态 B 被编码成 表示 B,并与 空间 B 相关联。重要的部分是 协调(学习到的映射)。这个映射使得系统能够理解 表示 A 和 表示 B 之间的关系,即使它们处于不同的数学空间中。例如,模型可能会学习将 空间 A 中的图像表示转换为 空间 B 中的文本描述表示。快速检查: 共享空间与协调空间中,来自不同模态的表示处理方式主要区别是什么?一种将它们汇集到公共区域;另一种在独立区域之间建立联系。哪个是哪个?第三部分:整合所有内容:一个场景我们尝试应用这些思路。 假设你被要求构建一个简单系统,帮助识别鸟类物种。你有两种输入类型:鸟的图像。鸟鸣的音频记录。你的目标是预测鸟类物种。活动:选择结合策略: 哪种结合策略(早期、中间或后期)对于这个问题来说是一个合理的起点?为你选择的策略绘制一个框图,将鸟的图像和鸟鸣标记为输入。考虑表示:如果你目标是共享表示,那对图像特征和音频特征意味着什么?有什么优点?如果你选择了协调表示,它将如何工作?在什么场景下这会更具灵活性?这里没有唯一的“正确”答案。目标是使用我们练习过的视觉语言来思考设计选择。例如,如果你选择了中间结合:你将有一个图像特征提取器(可能是一个预训练的CNN)和一个音频特征提取器(例如,一个产生MFCC或频谱图特征的)。这些提取器的输出随后会结合(例如,拼接,或输入到一个注意力机制),然后进入一个分类器来预测鸟类物种。digraph BirdScenario { rankdir=TB; bgcolor="transparent"; node [shape=box, style="filled", fontname="sans-serif"]; edge [fontname="sans-serif"]; Image_Input [label="鸟类图像", fillcolor="#a5d8ff"]; Image_Encoder [label="图像特征\n提取器 (CNN)", fillcolor="#74c0fc"]; Image_Features [label="图像特征", fillcolor="#4dabf7"]; Audio_Input [label="鸟鸣(音频)", fillcolor="#b2f2bb"]; Audio_Encoder [label="音频特征\n提取器 (MFCC)", fillcolor="#8ce99a"]; Audio_Features [label="音频特征", fillcolor="#69db7c"]; Fusion [label="中间结合", fillcolor="#ffec99", shape=ellipse]; Combined_Rep [label="结合的鸟类\n表示", fillcolor="#ffd8a8"]; Classifier [label="物种分类器", fillcolor="#d0bfff"]; Species_Output [label="预测鸟类物种", fillcolor="#ced4da"]; Image_Input -> Image_Encoder -> Image_Features -> Fusion; Audio_Input -> Audio_Encoder -> Audio_Features -> Fusion; Fusion -> Combined_Rep -> Classifier -> Species_Output; }一个使用中间结合的鸟类识别场景示例图。图像和音频输入由各自的特征提取器处理。产生的特征被结合,然后输入分类器以预测鸟类物种。此图表显示了一种处理鸟类识别任务的方式。你也可以绘制早期或后期结合方法进行比较。回顾希望通过绘制和查看这些图表,能让结合多模态数据的不同方式变得更清晰。当然,这些是简化视图。多模态系统可能复杂得多,常常混合这些策略。然而,理解这些结合和表示的基本模式是一个很好的第一步。当你遇到更高级的多模态架构时,试着看看能否发现这些基本组成部分的作用。