Flamingo – 直观且全面解释

原文:towardsdatascience.com/flamingo-intuitively-and-exhaustively-explained-bf745611238b

多模态建模 | 计算机视觉 | 自然语言处理

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/712884c3dbd5127cdae02736711755f7.png

“Flamingo” By Daniel Warfield using MidJoruney. 所有图像由作者提供,除非另有说明。

在这篇文章中,我们将讨论鹤,这是一篇关于“多模态建模”的里程碑论文。

首先,我们将“多模态模型”定义为一种机器学习模型,能够理解多种类型的数据。然后,我们将简要探讨图像分类和文本生成的里程碑论文,然后描述鹤如何结合这些技术,在包含图像和文本的使用案例中实现最先进的性能。

到文章结束时,你将彻底理解鹤如何实现最先进的性能,为今天的先进人工智能系统如 GPT-4 和 Google Gemini 打开道路。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7fde4281000c0233f6aa1ea95980fe1f.png

鹤在讨论文本和图像。粉色方块是由鹤模型生成的。来自鹤论文。Flamingo 论文

这对谁有用? 对自然语言处理、计算机视觉或多模态建模感兴趣的任何人。

这篇帖子有多先进? 这是一篇中级帖子,假设读者对机器学习有一些基本了解。

先决条件: 无,但如果你对某个特定主题感到困惑,我在文章中包含了一些相关的参考资料。

文章末尾有一个精选的资源列表,供相关阅读。

鹤之前的多模态建模

“视觉-语言建模”是人们想到“多模态建模”时首先想到的。在我们深入探讨这些概念之前,让我们定义这两个想法:

  • 多模态建模是一个总称,用于任何处理多个“模态”的机器学习模型。你可以将模态视为一种数据类型;像文本、图像、表格和音频这样的东西都被数据科学家视为不同的“模态”。多模态模型是可以以某种方式处理多个模态的模型。

  • 视觉-语言建模可能是最受欢迎的多模态形式。机器学习模型可以在某种程度上执行需要同时理解图像和文本的任务。

在现实中,视觉-语言建模是一个广泛的术语,用于一类问题:

  • 视觉问答: 给定一张图像和关于该图像的文本问题,生成一个响应

  • 标题:给定一张图片,用文字描述图片的内容

  • 视觉对话:进行包含图像和文本的连贯且自然的对话

  • 图像分类:给定一张图片,将该图片分类到一组预定义的文本类别之一。

在 Flamingo 之前,高度专业的模型在高度专业的多模态任务上处于最先进状态:

  • KAT在 OKVQA 数据集上达到了当时最先进的状态,这是一个视觉问答数据集

  • 一个好的嵌入就足够了吗?在 VQAv2 数据集上达到了当时最先进的状态,这是一个不同的视觉问答数据集

  • SimVLM在 COCO 图像标题数据集上达到了当时最先进的状态

  • VIOLET在 MSVDQA 数据集上达到了当时最先进的状态,这是一个专注于视频的视觉问答数据集

CLIP 论文(我们将在下一节中介绍的一个里程碑式论文)中的一个重大主张是,这种高度专业化的性能并不能很好地扩展到现实世界的情况。如果你有一个在某个数据集上表现良好的模型,但在类似的数据集中无法执行类似的任务,那么它真的是一个好的模型吗?

CLIP 在 flamingo 之前就解决了这个问题,但 CLIP 风格的模型只能在图像分类中工作。Flamingo 背后的想法是弥合 CLIP 风格模型(这些模型对图像内容有稳健的理解)和语言模型的文本理解和生成能力之间的差距,创建一个可以用来稳健且灵活地讨论文本和图像的系统。

Flamingo 的前身

在我们谈论 Flamingo 本身之前,理解它继承的两个关键建模策略至关重要;CLIP 和 Decoder Transformers:

CLIP

CLIP 的整个想法是创建一个通用的图像分类器,可以在各种情况下使用,而无需进一步训练。为了实现这一点,CLIP 论文的作者使用了一种称为“对比学习”的策略。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/016bb6da8819ee41cb2075410885b8f3.png

CLIP 在它从未直接训练的分类任务中预测了高度具体的标签。来源

对比学习是对图像分类问题的一种微妙的重构。不是学习“这个标签与这张图片相关,那个标签与那张图片相关”,而是对比学习提出“这个标签与这张图片在相似度上更接近,那个标签与那张图片在相似度上更接近”。这种思维上的微妙变化开启了一种全新的图像表示方法,这种方法自那时以来一直被广泛使用。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e8a38e65220d856234979bf45ea974f8.png

CLIP 的目标是使相似的事物更靠近,不同的事物更远离。请参阅我的 CLIP 文章

CLIP 使用两个组件来构建“接近”这一概念,即图像编码器和文本编码器。这两个组件在训练过程中一起学习,以在多维空间中对图像和文本的配对进行联合对齐。通过将相似的图像和文本放置在相似的位置,以及将不同的图像和文本放置在不同的位置,CLIP 风格的模型学会做出关于哪些文本与哪些图像相匹配的决定。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ff931c936891718f71933a7a5a9f8001.png

CLIP 训练后的一个示例,用于说明目的,具有二维嵌入。图像编码器将图像总结为向量,文本编码器将文本总结为向量。注意,一旦编码器被训练,正对就会靠近在一起。请参阅我的 CLIP 文章

对我们来说,重要的是图像编码器。为了让 CLIP 成功,它必须训练图像编码器来理解图像中的事物,如狗、衣服和滑板,以便这些图像可以与正确的文本一起放置在正确的位置。换句话说,CLIP 图像编码器非常擅长将图像提炼成其一般意义,这是 Flamingo 用来实现视觉语言建模的特性。

这只是一个非常快速的概述,您可以自由地参考我关于 CLIP 的文章以获取更多信息:

CLIP,直观且详尽地解释

仅解码器 Transformer

所以这就是 CLIP,Flamingo 用来理解图像的技术。仅解码器 Transformer 是 Flamingo 用来理解文本的。

从一个非常高的角度来看,您可以将语言模型想象成一个由许多块组成的大堆栈。每个块的目的都是逐块细化输入文本的表示,然后使用该表示来预测应该跟随输入的文本。

https://medium.com/towards-data-science/gpt-intuitively-and-exhaustively-explained-c70c38e87491。在这篇文章中,我们不必担心为什么这些被称为解码器块,但您可以在我的 GPT 文章中了解所有关于它的信息。图片来源](…/Images/ee34e1c2f7c6ce5b863029cb2fb8c0ff.png)

整个 GPT-1 模型。12 个解码块堆叠在一起。从我的关于 GPT 的文章(https://medium.com/towards-data-science/gpt-intuitively-and-exhaustively-explained-c70c38e87491)。在这篇文章中,我们不必担心为什么这些被称为解码块,但你可以在我的 GPT 文章中了解所有关于它的事情。图片来源

使 Transformer 中的每个块变得特殊的是它们使用“注意力”。注意力是一种建模形式,其中将输入中多个单词的表示组合在一起,以创建一个抽象且高度上下文化的表示。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d3f0593162c4276c600347b5b8679752.png

注意力概念的概述。机制从数学上组合不同单词的向量,创建一个编码整个输入更深层次意义的矩阵。来自我的关于 Transformer 的文章.

这是通过向注意力机制提供三个输入来完成的:“查询”、“键”和“值”。不要纠结于名称,我们稍后会构建对这个概念更直观的理解,我现在只想与你分享注意力机制的高级工作原理。

查询和键,它们是从注意力机制的输入中派生出来的,被相乘以创建我称之为“注意力矩阵”的东西

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/88e9577e4ac73bc6056a48b871149d03.png

两个输入,称为“键”和“查询”,相乘以创建注意力矩阵。键通常被转置(旋转)以使矩阵乘法正确。来自我的关于 Transformer 的文章

然后,将注意力矩阵用作过滤器来将值矩阵转换成最终输出。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/66e874fb8ad3d89fd2e2b347ab783228.png

注意力矩阵就像一个过滤器,它将一个称为“值”的输入转换成最终结果。来自我的关于 Transformer 的文章

因此,本质上,注意力机制使用一些输入来过滤其他输入。我们将在本文的后续部分更详细地介绍注意力,现在,只需从高层次理解其感觉就足够了。如果你想要深入了解,可以查看我的关于 Transformer 的文章,或者我的关于 GPT 的文章,GPT 是一个流行的仅解码器 Transformer:

Transformer – 直观且全面解释

GPT – 直观且全面解释

仅解码器 Transformer 的最终目标是使用模型中的注意力机制来理解输入,并确定下一个输出应该是什么。通过能够很好地猜测下一个输出,语言模型可以通过逐词猜测来构建输出。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c6849f9b0a3bc09f23d7a8020735d246.png

一个逐词生成输出的仅解码器语言模型。来自 我的关于 GPT 的文章

Flamingo 的概述

现在我们已经理解了 CLIP 风格图像编码(将图像转换为传达图像一般含义的向量)和 Transformer 风格语言模型(使用注意力机制迭代输出单词)的本质,我们可以开始深入了解 Flamingo。

在最高层次上,flamingo 由四个关键组件组成:

  • 视觉编码器,它将图像重新表示为其一般含义

  • 感知重采样器,一个将来自可变数量图像的信息组合成固定数量特征(允许模型理解视频或一系列图像等)的系统

  • 语言模型,一个类似于 GPT3 或 llama 的预训练解码器风格 Transformer。 flamingo 论文使用了 chinchilla。

  • 门控交叉注意力,允许 flamingo 在训练过程中逐渐学会将图像信息注入语言模型。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f9d7e48a29605b059d7ebdbabe4e7680.png

Flamingo 架构。我们将在未来的章节中逐个组件地探索这个图,来源

Flamingo 使用这些系统来理解任意输入序列的图像和文本,以生成文本输出。让我们逐一分解这些组件,以建立一个完整的 Flamingo 工作原理的理解。

视觉编码器

Flamingo 使用 CLIP 风格的图像编码器(我们之前讨论过的)来编码图像。这是在许多涉及图像的多模态架构中常用的策略。

这个想法是,火烈鸟不需要从头开始学习图像,它可以利用预训练的 CLIP 图像编码器的高质量总结。因此,火烈鸟卸载了理解图像的大部分工作,而只需对图像蒸馏进行推理。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f930b92b8c7cbea55b8851a673544371.png

CLIP 如何总结图像(其中包含大量难以解释的信息)并将其蒸馏成易于语言模型解释的抽象、信息密集的表示的概念图。图片由我的忠实写作伙伴提供。

火烈鸟实际上并不使用 CLIP,而是使用NFNet F6 模型。就我们的目的而言,唯一的概念性区别是 NFNet 生成的是关于图像子区域的总结,而不是整个图像。这使得火烈鸟更容易理解图像中的细微差别。NFNet 还做了很多其他酷炫的事情,我可能在未来的文章中介绍,但就我们的目的而言,这更像是一个项目清单。从概念上讲,NFNet 是 CLIP 的一个高级版本。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/46129da73abeec1357a7faa4c5077b0c.png

NFNet 在行动中的概念图,它总结图像区域以允许进行更细致的信息提取。

感知器重采样器

为了创建一个灵活且健壮的多模态模型,火烈鸟的作者创建了一个擅长处理图像和视频的系统。视频数据是机器学习上难以处理的数据类型;即使是小的视频文件也包含大量信息,高效地提取正确信息可能计算成本高昂且困难。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1c8be70716fa1cadd488a91df4e23909.png

火烈鸟从一系列图像中推断信息的示例。当处理视频时,火烈鸟将视频简单地视为每秒一帧的一系列图像。视频片段来源

火烈鸟使用“感知器重采样器”解决了视频的问题。感知器重采样器可以被视为一个将任意长视频压缩成一组固定描述标记的总结系统。在概念上并不困难,但有很多组成部分。让我们从高层次开始,然后是更具体的低层次。

感知器重采样器 – 高层次

从概念上讲,你可以将感知器重采样器视为一个过滤器;它接受固定长度的预定义标记,并使用从视频中提取的输入图像来过滤这些标记。无论输入中的图像数量如何,输出的标记数量是固定的。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b896ea3caa17e4e8820f1c530c1fdab8.png

感知器重采样器在实际操作中的概念图。感知器重采样器使用图像来过滤固定数量的标记。图像来源

从高层次来看,感知器重采样器以以下方式融入更大的 Flamingo 架构中:

  1. 图像是从提示中提取的。在它们的位置,文本中放置了一个<image>标记,以便模型知道图像的来源。

  2. 感知器重采样器的输出被用于逐步过滤 LLM 的内部状态,跨越各个层,最终使 LLM 能够就图像进行对话。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ccee11f0aa574e4aaa3b42f3663ecba0.png

Flamingo 如何将感知器重采样器的内容交织到语言模型中的概念图。LLM 块来自预训练的现有 LLM。Flamingo 注入“交叉注意力”块,通过 LLM 的连续层引入关于图像内容的信息。视频片段来源

我们将在后面的章节中介绍如何将交叉注意力交织到 LLM 中的图像表示。现在,让我们聚焦于感知器重采样器,看看它是如何工作的。

感知器重采样器——细节解析

要更详细地了解感知器重采样器,让我们逐步分析其组件。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d666e251fc991c704b38b8119fab7d26.png

感知器重采样器。来源

首先,输入图像或图像序列被传递到一个视觉编码器。这种方式总结了图像内容,便于 ML 系统解释。这是我们之前章节中讨论的 NFNet 图像编码器。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/14ba4aecaac3e6897e6cc6467d34994d.png

感知器重采样器使用我们的图像编码器总结图像。来源

注意力机制(最终将图像编码输入其中),倾向于打乱输入,从而失去跟踪特定信息在输入序列中的位置。因此,通常需要添加一个时间编码,它将输入的时间嵌入到输入本身的值中。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1f03b209a866b675f796a97118ce2a9a.png

在感知器重采样器中视觉编码器的使用。来源

Flamingo 为输入的每一帧使用一个学习得到的时间向量。在训练过程中,Flamingo 总共有 8 个输入帧的位置。这些位置被添加到从视觉编码器提取的特征中。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d4ad6219e60fb0afc168393a134dd65f.png

向图像编码添加时间编码的概念图。每个时间槽都有一个向量;t=0,t=1,等等。所有来自图像编码的向量都添加了一个相应的时间向量(因此,在 t=0 时,所有编码向量都添加了 t=0 的时间向量);因此,输出向量包含关于图像的信息,以及图像在序列中的时间。这张图像只包含三个图像的序列,但 Flamingo 支持八个。

我对此有点惊讶。我以为 Flamingo 的整个目的就是要具有通用性;限制视频输入为八个帧似乎是一种愚蠢的设计选择。然而,显然,该模型对在时间嵌入之间进行插值以适应更多帧是鲁棒的。所以,如果你想添加更多帧,只需通过在八个训练好的时间标记之间进行插值来创建新的时间标记。

虽然我们的模型是用 8 个固定帧数进行训练的,但在推理时,我们以 3 FPS 的速度输入了 30 帧。这是通过在推理时线性插值感知器重采样器的学习时间位置嵌入来实现的。Flamingo 论文

另一个快速提示,你可能想“嘿,如果我们需要添加关于时间的信息,那么为什么不是位置呢?如果注意力机制打乱了我们的输入,那么说‘这条信息来自图像的右上角’之类的信息不是很有用吗?”答案是绝对有用,但我们不需要添加位置信息,因为我们的视觉编码器已经做到了:

注意,我们只使用时间编码,而没有使用显式的空间网格位置编码;我们没有观察到后者带来的改进。这背后的理由可能是,CNN,如我们的 NFNet 编码器,众所周知,隐式地包含空间信息 - 火烈鸟论文

现在我们已经从每张图像中提取了特征,并且添加了所有必要的时间信息,我们可以使用注意力机制通过学习到的标记从图像中过滤出正确的信息。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e9376728d7e1b289445d9ec82aa564bc.png

注意力机制,它使用学习到的标记(学习到的潜在查询)从编码的图像中提取正确的信息。来源

让我们跟随一些数据通过注意力机制,以全面了解其工作原理。

步骤 1) 平滑化

从图像中提取的特征的形状为 [T, S, d],其中 T 是图像的数量,S 是空间网格的数量,d 是特征向量的长度。在大多数机器学习场景中,“标记”是某些长度的向量。d 有时被称为“内部维度”,因为它是在模型内标记向量的大小(注意:在这篇文章中 d 被描绘为长度 6,但现实中现代模型的内部维度非常大,数量级为数百或数千。因此,通常这些向量比描绘的要长得多)。

在通过注意力之前,这些标记在空间和时间维度上被平滑化;因此 TS 变成一个长度为 T * S 的维度,结果是一个形状为 [T * S, d] 的二维矩阵。

<…/Images/6db3c051f772f90b2dab8de4b7881efd.png>

平滑化过程。实际上,我们的图像数据是一个形状为 [时间,空间,d] 的 3D 张量。这些数据在时间和空间上被平滑化。

请记住,虽然这看起来像我们在图像数据周围进行洗牌:

  1. 这个操作在连续的运行中是一致的,所以虽然平滑化会打乱空间和时间的顺序,但它对任何给定输入都以相同的方式进行。

  2. 我们并不真的需要保留顺序。回想一下,空间信息是由图像编码器自动编码的,时间信息被添加到每个标记中以编码时间信息。只要操作保持一致,输入的顺序并不真的重要。

步骤 2) 创建键和值

现在我们已经正确处理了图像信息,是时候将它们传递到注意力机制中。回想一下,从高层次来看,感知重采样器整个想法是使用图像来过滤固定数量的标记。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b896ea3caa17e4e8820f1c530c1fdab8.png

一个感知器重采样器作用的概念图。感知器重采样器使用图像来过滤固定数量的标记,从而将任意序列的图像编码为固定大小。图像来源

这种“过滤”思想在注意力机制内部通过矩阵乘法来实现,这本质上只是矩阵乘法。

<…/Images/6b84f5c5eb87df604f0095b3633b1479.png>

回想一下,一个[I,m]形状的矩阵可以与一个[m,n]形状的矩阵相乘,结果得到一个[I,n]形状的矩阵。这是因为,在矩阵乘法中,第一个矩阵的行与第二个矩阵的列相乘。通过控制"A"和"B"矩阵的形状,可以控制"C"矩阵的形状。来源

这种注意力机制的整体思想是从可变序列的图像中提取固定数量的标记,因此需要一些巧妙的矩阵操作来确保一切正常工作。这就是为什么在感知器重采样器中的注意力机制之前有一堆箭头的原因。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e9376728d7e1b289445d9ec82aa564bc.png

在注意力机制之前,数据被移动以使正确的值放入正确的位置。这是出于多种原因,但主要是为了让矩阵乘法工作得更好。来源

对于 Flamingo 来说,来自图像的展平特征,标记为Xf,与一组学习到的标记X(形状为[R,d])连接,以构建“键”和“值”输入。在这种情况下,R代表任意固定的标记数量。而“查询”仅仅是学习到的标记X

回想一下,d是模型的内部维度。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1a9949c191d21b036db088b7bbeaa400.png

在注意力机制构建查询、键和值之前,会发生一些数据重新排列。

你可能想知道的一个问题是“为什么学习的标记被附加到图像信息上?”,我认为这是为了让感知器重采样器更紧密地控制从注意力机制中输出的信息。在下一节中,请记住这一点。

步骤 3)通过注意力机制

现在我们已经定义了查询(Query)、键(Key)和值(Value),我们可以将它们通过注意力机制。注意力机制只是两次矩阵乘法操作。首先,查询和键相乘以构造注意力矩阵

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f01ad36a90c767136984dba120c1e92d.png

然后将注意力矩阵与值相乘以构造最终输出。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/57f6078377a62434db162a88179b68a7.png

et voilà,感知器重采样器中的注意力机制现在已经从所有图像中提取了固定数量的输出标记,其大小为 [R, D],其中 r 是任意数量的固定学习标记,d 是任意内部模型维度。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b896ea3caa17e4e8820f1c530c1fdab8.png

感知器重采样器在作用中的概念图。感知器重采样器使用图像来过滤固定数量的标记,从而将任意序列的图像编码为固定大小。图像来源

步骤 4)构建最终输出

在注意力机制之后,应用了一个“跳跃”连接。基本上,注意力机制非常擅长提取细微特征,但它会把周围的一切都混合得乱七八糟。允许一些在注意力机制之前的老旧、简单的结构存在是有用的。因此,在注意力机制之前学习的标记被添加到注意力机制的输出中,允许一些老旧和简单的信息存在。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b19da58840d729c94778cd4164fa3c67.png

在注意力机制之后,应用了一个跳跃连接。那就是注意力机制后面的那个 “+”。来源

跳跃连接的输出通过一个前馈网络传递,这是你的经典原型神经网络。同样地,为了同样的原因,又应用了一个跳跃连接。

通常情况下,对于机器学习系统来说,通过几次遍历做同样的事情是有帮助的,这样就可以在众多层上增量地进行复杂操作。在感知器重采样器中,这种使用注意力、跳跃和前馈的信息提取进行了几次。一次迭代输出的标记直接反馈到另一个输入中;因此,上图中的 X num_layers

好的,那么这就是感知重采样器。使用一组学习到的标记(这些标记只是可以在训练过程中变化的数字向量),多个注意力堆叠允许感知重采样器从一系列输入图像中提取信息。在下一节中,我们将讨论这些信息是如何被输入到语言模型中,以便语言模型能够就图像进行对话。

使用门控交叉注意力结合视觉和文本信息

感谢大家的耐心,希望你们发现这和我一样有趣。自从你们开始阅读这篇文章以来,大约已经过去了六个月;回想一下,整个目的就是让预训练的语言模型能够理解和就图像进行对话。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f9d7e48a29605b059d7ebdbabe4e7680.png

高级 flamingo 架构,允许语言模型就交织的图像和文本进行对话。注意门控交叉注意力是如何在预训练语言建模(LM)块之间交织的。来源

现在我们已经使用感知重采样器从我们的图像(或图像序列)中提取了一定量的信息,我们需要将这一信息输入到语言模型中。为了做到这一点,我们将使用门控交叉注意力。

门控交叉注意力的想法是逐步将视觉信息注入到我们预训练的语言模型中。在每一个层级(或每隔几个层级),门控交叉注意力试图引入正确的视觉信息,以便模型能够发挥最佳性能。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3e94a9bbc7f36440b98b0b15c133f9ee.png

深入探讨单个 flamingo 层中的门控交叉注意力机制。来源

感知重采样器的视觉数据用于构建“键”和“值”,而语言模型内部的标记用于生成“查询”。通过将图像和语言数据同时输入到交叉注意力中,两种模态的信息都被用来创建两种模态的抽象表示(我们将在下一节中深入探讨交叉注意力的具体细节)。

如果语言模型是一个人,它现在可能会感到非常困扰。语言模型已经学会了在一系列高度抽象和细微的表示中仔细地表示语言。现在我们在这个精心设计的方程中加入了一个大大的障碍。

为了减轻这个问题,Flamingo 采用了“tanh 门控”。在 Flamingo 注入交叉注意力时,它使用一个具有可学习值alphatanh门控。这个alpha值,作为tanh函数的输入,最初被设置为0tanh(alpha=0)的结果是0

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/180d447418aafaea4f21a19ad813ecec.png

tanh 函数,对于大输入接近 1,对于小输入为-1。来源.

门控函数的结果乘以交叉注意力输出,实际上就像一个旋钮,调节引入模型中的视觉信息量。模型通过训练学习到改变alpha会改变tanh函数的值,因此它学会逐渐调节从交叉注意力机制中引入的视觉信息量。

tanh门控之后,有一个标记为"+"的跳过连接。回想一下,跳过连接只是从某些操作之前取数据,并将其添加到操作的结果中。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3e94a9bbc7f36440b98b0b15c133f9ee.png

注意在交叉注意力(以及就这个新可学习的前馈网络而言)之后使用的跳过连接和 tanh 门控。来源.

因此,在 tanh 门控和跳过连接之间,引入视觉信息的交叉注意力机制看起来大致如下:

result = (tanh(alpha) * cross_attention(vis_info, lang_info)) + lang_info

因为alpha在训练开始时初始化为0,所以tanh门控的值也是0。因此,交叉注意力机制在训练初期没有信息,最终输出与如果我们完全不使用 Flamingo 而只使用语言模型是一样的。

result = (0 * cross_attention(vis_info, lang_info)) + lang_info = just lang_info

如果我们不这样做,我们将在训练初期直接注入图像信息,这将会严重混淆语言模型,因为全新的感知器重采样器根本不知道如何以最佳方式表示图像数据,使其最适合语言模型。因此,tanh门控允许 Flamingo 温和地将图像信息引入模型。

在门控交叉注意力之后有一个门控前馈层,原因也是一样的。你可以将其视为一个神经网络,它将结合的语言和图像数据转换为与语言模型的未来层兼容。

所以,从信息流的角度来看,就是这样!你现在理解了 Flamingo 模型是如何通过以下方式进行图像对话的:

  1. 从输入提示中提取图像

  2. 使用感知器重采样器将图像或图像序列重新格式化为固定数量的标记

  3. 使用交叉注意力将图像信息注入语言模型,以便语言模型可以就输入文本和图像进行对话。

Flamingo 还采用了一些其他细节来确保信息流真正起作用。现在我们已经从高层次上对 Flamingo 有了完整的了解,我们可以深入探讨一些具体细节。

面向掩码的简介

Flamingo 独特之处之一在于它处理掩码的方式。对于那些对一般主题不熟悉的人来说,掩码是注意力的重要组件,它允许研究人员在机器学习模型的某些部分隐藏某些信息。

你可能会想知道隐藏信息对模型有何用处。难道机器学习模型如果能够访问所有信息,通常不是会更好吗?通常情况下是这样的,但掩码是这一普遍规则的常见例外。

例如,语言模型使用“因果掩码”。语言模型的想法是预测输入序列中的下一个单词,但在训练时,像 GPT 这样的语言模型实际上预测序列中的每个下一个单词。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e2d4c91789e9e2992ea0f108770c1061.png

在训练过程中,语言模型预测输出序列中每个下一个单词的演示。当它出错时,参数会更新以训练模型。请参阅我关于投机抽样的文章,该文章对此主题进行了更深入的探讨。

如果语言模型只需查看序列中的下一个单词应该是什么,这种训练形式将是微不足道的;模型只需在给定输出处复制下一个单词。然而,通过使用因果掩码,模型在预测给定单词时无法看到未来的单词。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/10811681d150a5449cbf4d82453a0bc3.png

语言模型在训练语言模型时因果掩码对模型的作用概念图。它隐藏了模型未来的单词,意味着模型实际上必须预测序列中的下一个单词。请参阅我关于投机抽样的文章,该文章对此主题进行了更深入的探讨。

因果掩码本身存在于语言模型的自我注意力机制中。回想一下,现代语言模型本质上是一大堆自我注意力块的堆叠。因果掩码通过实际注意力矩阵应用于注意力机制。回想一下,“查询”和“键”输入相乘以构建“注意力矩阵”,然后“注意力矩阵”乘以“值”以创建最终输出。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e641402883ac31a3722ff2c4b4ddf5b0.png

查询和键相乘以创建注意力矩阵的概念图。注意注意力矩阵中存在特定值,其中输入序列中的一个词对应于另一个输入序列中的一个词。

这个注意力矩阵,作为一个矩阵乘法,是“查询”中的每个输入与“键”中的每个输入的复杂组合。因果掩码的想法是,当“查询”与对应于未来单词的“键”交互时,因果掩码将该位置上的注意力矩阵的值设置为零;因此,从给定单词中隐藏了关于未来单词的任何信息。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c0228d8d8271150576c58dca61f1446c.png

我们的因果掩码应用于注意力的概念图。注意注意力矩阵中某些块是黑色的;这些表示通过因果掩码设置为零的值。这种对角矩阵的一般形状,其中右上区域被掩码,是典型的“因果自我注意力掩码”。

请记住,这是为了使预测每个下一个单词的训练目标变得非平凡。如果一个语言模型中的每个注意力块都使用因果掩码,未来单词的信息永远不会渗入先前单词的信息。

因果掩码与 Flamingo 相关,因为 Flamingo 使用的语言模型是使用因果掩码训练的。然而,Flamingo 本身在掩码媒体时采用了一种略微不同的掩码策略。

通过掩码实现媒体的任意交叉注意力

火烈鸟的想法是你可以随意与模型就图像和文本进行对话。你可能有很多图像,也可能很少,不同的与模型的对话可能包含图像在对话中可能存在的各种位置。机器学习模型喜欢学习模式,当它们遇到不尊重它们已学习的模式时,它们会感到困惑。我们如何让火烈鸟擅长理解它可能就图像进行的各种对话的多样性?

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b792f32c4c612808b0d145caf14fde1b.png

一些关于如何在与火烈鸟的对话中交错文本和图像的例子。来源.

火烈鸟论文通过使用不同的掩码系统来解决此问题。回顾前文,我们知道火烈鸟通过交叉注意力将感知器重采样器中的图像数据注入到语言模型中。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/29c730002adb26202989608cfc2649ac.png

回顾火烈鸟使用交叉注意力将图像数据注入到语言模型中。来源.

在交叉注意力机制中,只允许立即前一个图像(或图像序列)关注输入序列中的特定单词。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f6dd8c97d564154c2092550399a15335.png

通过掩码允许某些图像关注某些文本片段的示意图。深蓝色表示特定图像可以关注特定文本的位置。来源.

图 7:交错视觉数据和文本支持。给定交错图像/视频和文本,例如来自网页,我们首先通过在文本中视觉数据的位置插入标签以及特殊标记(表示“序列开始”或“块结束”)来处理文本。图像由视觉编码器和感知器重采样器独立处理以提取视觉标记。在给定的文本标记处,模型只交叉关注与最后一个前一个图像/视频对应的视觉标记。𝜑表示文本标记可以关注哪个图像/视频,当没有图像/视频前导时为 0。在实践中,这种选择性的交叉注意力通过掩码实现——在此用深蓝色条目(未掩码/可见)和浅蓝色条目(掩码)表示。

这究竟是如何做到的,留作一个谜团;Flamingo 论文继承了 ML 研究中的一个不幸趋势;从公开学术界过渡到私人企业激励。

代码和数据是专有的。– Flamingo 论文

Flamingo 是由 DeepMind 的一群博士谷歌员工编写的;猜测他们做了什么并不难。开个玩笑,我们对 Flamingo 如何处理注意力了解很多,所以我们可能实际上可以近似出幕后所做的工作。

回想一下,在语言模型中没有因果自注意力掩码的情况下,我们以这种方式进行掩码,只暴露给自身和前面的单词:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c0228d8d8271150576c58dca61f1446c.png

我们可以应用相同的一般逻辑来想象我们的媒体掩码在 Flamingo 中可能的样子。基于他们如何定义查询和键,实际的注意力计算可能看起来像这样:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d224c3e2a247ac9f1596699d4887c15a.png

Flamingo 中交叉注意力计算的示意图。两点重要说明。1) 回想一下,预接收重采样器定义了来自特定图像或图像序列的固定数量的标记。在这里,我随意将其定义为 3,但这是一个超参数。2) 每个图像可以是一个单独的图像,或者一系列图像。

然后,假设 Flamingo 使用的掩码将简单地屏蔽掉任何不遵守“紧接其前的图像”规则的任何关系。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d5ec0e99709fa1ba8ac4e3b365210f32.png

一个在交叉注意力上定义了 Flamingo 媒体掩码的概念图。

Flamingo 论文大量讨论了“Φ”(phi)。在 Flamingo 中,phi 只是一个函数,它以编程方式跟踪哪些文本应该与哪些图像相关联,以便为给定的输入正确定义这个掩码。自然地,随着不同的输入序列,Flamingo 的交叉注意力掩码会改变。

Flamingo 这样做整个原因是为了提高 Flamingo 一般理解交错文本和图像的能力。这背后有几个理论想法:

  1. 通过限制文本只关注紧接其前的图像,模型确保文本分析直接与最近的视觉上下文相关。这有助于保持图像中看到的内容和文本中描述或询问的内容之间的紧密耦合。

  2. 允许文本关注所有之前的图像将显著增加模型的计算复杂性和内存需求。

  3. 专注于即时图像-文本对有助于模型更好地学习视觉内容和文本信息之间的关系。这可以提高模型从已见示例到未见示例泛化的能力。

  4. 通过缩小注意力的范围,模型简化了学习任务,这有助于降低过度拟合到无关细节或模式的风险。这种关注可以导致一个在理解和回应图像-文本交互的具体细微差别方面更好的模型。

结论

就这样。很抱歉没有包括更多内容,我知道这是一篇简短的。

在这篇文章中,我们定义了多模态建模,并专注于视觉问答。我们定义了之前的最先进状态,其中许多不同的模型擅长许多不同的任务。然后我们讨论了 flamingo 如何结合两种现有技术;CLIP 模型和 transformer 解码器模型,结合两种高度性能和泛化的建模策略。

我们介绍了 Flamingo 的本质,它是一套旨在连接 CLIP 和解码器模型的工具。首先,我们介绍了感知器重采样器如何对图像序列的 CLIP 嵌入进行压缩,将其压缩成固定大小的表示。然后,我们讨论了 Flamingo 如何使用 tanh 门控交叉注意力将信息注入到语言模型中。最后,我们讨论了一些具体细节,如 Flamingo 的掩码策略,以了解 Flamingo 用来保持尖端性能的一些重要细微差别。

关注更多!

我描述了机器学习空间中的论文和概念,强调实用和直观的解释。

每当 Daniel Warfield 发布时获取电子邮件

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/259cae7470d1bc1152b1d5eca397593e.png

没有预料到,总是感激。通过捐赠,您让我能够将更多的时间和资源投入到更频繁和更高品质的文章中。链接

**归属权:**您可以出于非商业目的使用本帖中的任何资源,只要您引用本文,danielwarfield.dev 或两者,均可。在请求的情况下,可能会授予明确的商业许可。


进一步阅读

根据与本文内容的关联性和重要性排序。

CLIP,直观且全面解释

在这篇帖子中,你将了解“对比语言-图像预训练”(CLIP),这是一种创建视觉和语言表示的策略,如此之好,以至于可以在没有任何训练数据的情况下用于制作高度特定和性能优异的分类器。我们将介绍理论,CLIP 与更传统方法的区别,然后我们将逐步介绍其架构。

Transformer – 直观且详尽地解释

在这篇帖子中,你将了解 Transformer 架构,这是几乎所有前沿大型语言模型架构的核心。我们将从一些相关自然语言处理概念的简要历史开始,然后逐步介绍 Transformer,揭示其工作原理。

使用冻结的大型语言模型进行视觉问答

在本文中,我们将使用 Q-Former,这是一种连接计算机视觉和自然语言模型的技术,来创建一个视觉问答系统。我们将介绍必要的理论,遵循BLIP-2 论文,然后实现一个可以用来与大型语言模型讨论图像的系统。

GPT – 直观且详尽地解释

在本文中,我们将探讨 OpenAI 的 GPT 模型的演变。我们将简要介绍 Transformer,描述导致第一个 GPT 模型的 Transformer 变体,然后我们将介绍 GPT1、GPT2、GPT3 和 GPT4,以构建对当前技术状态的完整概念理解。

推测采样 - 直观且详尽地解释

在本文中,我们将讨论“推测采样”,这是一种使文本生成更快、更经济,同时不牺牲性能的策略。在这样做的同时,我们将深入探讨语言模型的一些更微妙方面。

卷积网络 – 直观且详尽地解释

卷积神经网络是计算机视觉、信号处理以及大量其他机器学习任务中的主要组成部分。它们相当直接,因此,许多人认为它们理所当然,而没有真正理解它们。在本文中,我们将直观且详尽地介绍卷积网络的理论,并探讨它们在几个用例中的应用。

演示了为无线无人机电池充电设计的感应电力传输(IPT)系统 Dynamic Wireless Charging for (UAV) using Inductive Coupling 模拟了为无人机(UAV)量身定制的无线电力传输(WPT)系统。该模型演示了直流电到高频交流电的转换,通过磁共振在气隙中无线传输能量,以及整流回直流电用于电池充电。 系统拓扑包括: 输入级:使用IGBT/二极管开关连接到全桥逆变器的直流电压源(12V)。 开关控制:脉冲发生器以85 kHz(周期:1/85000秒)的开关频率运行,这是SAE J2954无线充电标准的标准频率。 耦合级:使用互感和线性变压器块来模拟具有特定耦合系数的发射(Tx)和接收(Rx)线圈。 补偿:包括串联RLC分支,用于模拟谐振补偿网络(将线圈调谐到谐振频率)。 输出级:桥式整流器(基于二极管),用于将高频交流电转换回直流电,以供负载使用。 仪器:使用示波器块进行全面的电压和电流测量,用于分析输入/输出波形和效率。 模拟详细信息: 求解器:离散Tustin/向后Euler(通过powergui)。 采样时间:50e-6秒。 4.主要特点 高频逆变:模拟85 kHz下IGBT的开关瞬态。 磁耦合:模拟无人机着陆垫和机载接收器之间的松耦合行为。 Power GUI集成:用于专用电力系统离散仿真的设置。 波形分析:预配置的范围,用于查看逆变器输出电压、初级/次级电流和整流直流电压。 5.安装与使用 确保您已安装MATLAB和Simulink。 所需工具箱:必须安装Simscape Electrical(以前称为SimPowerSystems)工具箱才能运行sps_lib块。 打开文件并运行模拟。
<think>好的,我需要处理用户关于Flamingo IT相关的查询。首先,用户提到了几个不同的引用来源,我需要先理解这些引用内容分别涉及哪些方面。 引用[1]提到Flamingo是一个开源项目,用于漏洞扫描,并提供了Python代码示例。这说明有一个安全工具类的Flamingo项目。 引用[2]是关于Android Studio Flamingo,这是谷歌的IDE版本,属于移动开发工具。用户可能想知道这个版本的特点或升级问题。 引用[3]指向一个名为flamingo的项目,功能是捕获网络中的凭证喷洒,由IT和安全产品产生。这可能属于网络安全监控工具。 引用[4]讨论的是Flamingo底层框架的启动流程,涉及事件处理和网络IO优化,可能属于系统级框架或库。 用户的问题比较笼统,询问Flamingo IT相关的内容,我需要根据这四个引用,整理出不同领域的Flamingo项目,并分别解释它们的用途和特点,同时生成相关问题。需要确保每个部分引用正确的来源,并在回答中自然添加引用标识。还要注意使用中文,结构清晰,分点说明。最后生成的相关问题需要覆盖各个引用内容的应用场景、技术细节或比较分析,帮助用户进一步探索。</think>### Flamingo IT相关解析 Flamingo 在IT领域涉及多个不同方向的项目和工具,以下是主要分类及说明: --- #### 1. **安全扫描工具(Flamingo 开源项目)** - **用途**:用于网络漏洞扫描和安全检测,支持自动化识别目标系统的潜在风险。 - **示例代码**: ```python from flamingo import Flamingo flamingo = Flamingo() flamingo.set_target("http://example.com") flamingo.run_scan() results = flamingo.get_results() ``` - **特点**:提供API接口,可集成到DevOps流程中实现持续安全监控[^1]。 --- #### 2. **Android开发工具(Android Studio Flamingo)** - **版本信息**:Android Studio Flamingo(2022.2.1)是谷歌推出的稳定版本,代号“火烈鸟”。 - **功能改进**: - 增强了对Kotlin多平台开发的支持。 - 优化了Compose UI调试工具。 - 改进了构建性能分析器[^2]。 - **典型问题**:升级时需注意Gradle插件兼容性和Jetpack库版本冲突。 --- #### 3. **网络凭证监控工具(flami/flamingo)** - **用途**:捕获IT系统中因配置不当或安全产品漏洞导致的凭证泄露行为。 - **技术原理**:通过监听网络流量,识别并记录敏感信息(如密码、API密钥)的明文传输[^3]。 - **项目地址**:https://gitcode.com/gh_mirrors/flami/flamingo --- #### 4. **底层框架(事件驱动模型优化)** - **核心机制**:通过`eventfd`轮询器实现高效的任务调度,避免工作线程在无任务时空转CPU。 - **优化策略**: - 动态调整`epoll_wait`超时时间,平衡实时性和资源消耗。 - 分离网络IO事件与其他异步任务处理逻辑[^4]。 - **应用场景**:适用于高并发服务器或实时数据处理系统。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值