【多模态】Flamingo模型技术学习

devtools/2024/11/26 22:13:32/

Flamingo模型技术学习

  • 前言
  • Flamingo——支持上下文学习的多模态模型>多模态模型
    • 模型架构
      • 模型架构——Resampler
      • 模型架构——插入到LLM的cross-attention层
  • 代码查看——masked cross-attention
    • note

前言

  最近多模态模型>多模态模型特别火,从头开始学习!在前面写的几篇里面学习了MiniCPM-V、ViT、CLIP和BLIP/BLIP-2之后,今天学习一下Flamingo模型,记录学习过程,欢迎批评指正,一起学习~~

Flamingo_3">Flamingo——支持上下文学习的多模态模型>多模态模型

  • Flamingo出自Deepmind在NeurIPS 2022的论文Flamingo: a Visual Language Model for Few-Shot Learning
  • 相比于之前的方案,之前的方案通常只支持VQA,Flamingo支持图片和文本内容混合输入,支持提供图-文示例进行In-context learning,支持提供多图多轮对话
    在这里插入图片描述

模型架构

  • Flamingo模型和大部分VLM模型类似,由视觉编码器+图文对齐模块+LLM构成,Flamingo并不更新视觉编码器和LLM的参数
  • 预训练过程中,参数会更新的部分是resampler模块和插入到LLM的cross-attention层
    在这里插入图片描述

模型架构——Resampler

  • 这个Resampler是一个Q-Former模块,训练过程中会更新query和transformer层,前面的BLIP-2的核心就是这个模块
  • 如果输入很长,例如是一个视频,Q-Former可以实现对信息的压缩【输出大小只和query大小有关】
    在这里插入图片描述

模型架构——插入到LLM的cross-attention层

  • 预训练过程中,参数会更新的部分是resampler模块和插入到LLM的cross-attention层,这些层的权重参数初始化为0,在Flamingo的训练过程中更新
    在这里插入图片描述
    *值得注意的是,这些交叉注意力层前面的权重系数,层数越深,权重系数的绝对值越大
    在这里插入图片描述

代码查看——masked cross-attention

  • 为了让模型能够除了对图片进行描述之外,还能处理图片和文本交替混合输入,Flamingo的做法是在cross-attention层使用掩码
  • 在当前文本token下,只看这个文本token前一个图片的视觉token
    在这里插入图片描述
  • media_locations = input_ids == self.media_token_id这里面media_token_id是<image>
  • 推理时有图片的时候,use_cache这个为false
media_locations = input_ids == self.media_token_id# if there are media already cached and we're generating and there are no media tokens in the input,
# we'll assume that ALL input tokens should attend to the last previous media that is cached.
# this is especially important for HF generate() compatibility, since generate() calls forward()
# repeatedly one token at a time (with no media tokens).
# without this check, the model would not attend to any images when generating (after the first token)
use_cached_media_locations = (self._use_cached_vision_xand self.is_conditioned()and not media_locations.any()
)for layer in self._get_decoder_layers():if not use_cached_media_locations:layer.condition_media_locations(media_locations)layer.condition_use_cached_media(use_cached_media_locations)

这个掩码机制实现如下,注意输入了图片的时候use_cached=False

media = rearrange(media, "b t n d -> b (t n) d")
sim = einsum("... i d, ... j d -> ... i j", q, k)if exists(media_locations):media_time = torch.arange(T_img, device=x.device) + 1  # T_img是存图片数量的维度if not use_cached_media:# at each boolean of True, increment the time counter (relative to media time)text_time = media_locations.cumsum(dim=-1)  # 前缀和,如果第1张是图,得到[0,1,1,1]# text time must equal media time if only attending to most immediate image# otherwise, as long as text time is greater than media time (if attending to all previous images / media)mask_op = torch.eq if self.only_attend_immediate_media else torch.getext_to_media_mask = mask_op(rearrange(text_time, "b i -> b 1 i 1"),repeat(media_time, "j -> 1 1 1 (j n)", n=n),)sim = sim.masked_fill(~text_to_media_mask, -torch.finfo(sim.dtype).max)sim = sim - sim.amax(dim=-1, keepdim=True).detach()
attn = sim.softmax(dim=-1)

  直接看代码比较抽象,看一个例子会比较清晰:假设B = 2,文本长度T_txt = 4,图片数T_img = 3,Resampler的query向量长度n = 2,那么

media_locations = torch.tensor([
[False, True, False, False],
[False, False, True, False]])
text_time = torch.tensor([[0, 1, 1, 1],[0, 0, 1, 1]])
media_time = torch.tensor([1, 2, 3])

广播机制实现的结果如下:
在这里插入图片描述
最后实现的效果是:得到的mask,每一行对应一个文本token,每n列代表一张图像
在这里插入图片描述

note

  到这里,MiniCPM-V的前面需要了解的一些内容应该都看完了,过段时间再仔细看一下MiniCPM-V的源代码,偏好对齐那部分也很强,有效降低了幻觉,学习一下DPO是如何实现的


http://www.ppmy.cn/devtools/137233.html

相关文章

PPT分享 | IBM集团业务流程架构顶层规划-订单到交付-销售到回款方案

PPT下载链接见文末~ IBM业务流程规划方法是一套结构化、体系化的流程设计理论&#xff0c;其企业流程框架&#xff08;EPF&#xff09;是一种用于企业业务流程架构设计梳理的方法论。 一、IBM业务流程规划方法的核心 IBM的BPM&#xff08;业务流程管理&#xff09;流程管理体…

如何使用Jest测试你的React组件

在本文中&#xff0c;我们将了解如何使用Jest&#xff08;Facebook 维护的一个测试框架&#xff09;来测试我们的React组件。我们将首先了解如何在纯 JavaScript 函数上使用 Jest&#xff0c;然后再了解它提供的一些开箱即用的功能&#xff0c;这些功能专门用于使测试 React 应…

【unity小技巧】Unity 四叉树算法实现空间分割、物体存储并进行查询和碰撞检测

文章目录 前言四叉树的工作原理四叉树的优点四叉树的应用场景案例四叉树实现空间分割和物体存储并进行查询四叉树节点类使用示例 解释 四叉树实现碰撞检测四叉树的构建四叉树的实现步骤1. 创建四叉树的基本类2. 在 Unity 中使用四叉树进行碰撞检测 3. 解释4. 优势5. 注意事项 完…

实时质检系统—静音检测功能设置流程

设置流程 1. 设置静音检测时间 在实时质检系统中&#xff0c;有一静音检测功能&#xff1a;可以对主叫或被叫在接通后的规定时间内开启静音检测。例&#xff1a;被叫静音检测配置设置了10&#xff0c;那么质检电话在接通后的10秒内&#xff0c;开启静音检测&#xff0c;如果被…

Jira关键git

在使用 Git 和 Jira 管理项目时&#xff0c;可以通过在 Git 提交信息中关联 Jira 工单&#xff0c;同时实现关闭相关任务的功能。以下是操作步骤&#xff1a; 1. 确保 Git 和 Jira 集成 确认 Jira 已与您的代码库&#xff08;如 GitHub、GitLab 或 Bitbucket&#xff09;正确…

记录一个奇怪的前端布局现象

背景 我再根尚硅谷的教程学着写页面时&#xff0c;用padding和margin使li里的文本水平垂直居中我看到下一级的时候发现li添加了一个div后&#xff0c;结果和老师的代码有所出入我就写了个demo 加padding/margin的demo <!DOCTYPE html> <html lang"en">…

Linux中的权限管理

Linux 权限管理主要是指对 Linux 系统中的文件和目录进行权限设置和管理&#xff0c;以确保系统的安全性和稳定性。以下是对 Linux 中权限管理的详细介绍&#xff1a; 一、权限的基本概念 在 Linux 系统中&#xff0c;权限是指某个特定的用户具有特定的系统资源使用权利。Lin…

大数据新视界 -- Hive 数据仓库:构建高效数据存储的基石(下)(2/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…