CMU 10423 Generative AI:lec14(Vision Language Model:CLIP、VQ-VAE)

news2024/11/28 22:42:57

文章目录

  • 1 概述
  • 2 CLIP (Used in GPT-V)
  • 3 VQ-VAE (Used in Gemini)
      • **VQ-VAE 详细笔记**
        • **VQ-VAE 的模块组成与数据流**
      • **1. 输入数据**
      • **2. 编码器(Encoder)**
        • **2.1 编码器的作用**
        • **2.2 数据流与维度变化**
        • **2.3 编码器输出**
      • **3. 量化器(Quantizer)**
        • **3.1 代码本体(Codebook)是什么?**
        • **3.2 向量量化的过程**
        • **3.3 输出维度**
        • **3.4 q(z|x) 的作用**
      • **4. 解码器(Decoder)**
        • **4.1 解码器的作用**
        • **4.2 数据流与维度变化**
      • **5. 损失函数**
        • **5.1 重构损失(Reconstruction Loss)**
        • **5.2 代码本体损失(Codebook Loss)**
        • **5.3 承诺损失(Commitment Loss)**
        • **5.4 最终损失函数**
      • **6. 训练过程**
      • **总结**

1 概述

这份讲义主要讲解了Vision-Language Models (VLM) 的核心概念及其应用,涉及人工智能系统如何处理图像和文本输入并生成输出。以下是内容的主要概要:

  1. AGI 与 VLM:
  • 人工通用智能 (AGI) 应该能够处理多种形式的输入与输出,包括音频、视频、图像、文本等。
  • VLM 是专注于图像和文本混合输入,输出主要是文本,但也有可能生成图像。
  1. VLM 的基本原理:
  • 标准文本转换器通过将输入的文本转化为一系列的 tokens,然后使用 Transformer 模型处理这些 tokens。
  • VLM 的不同之处在于它不仅能处理文本,还可以处理图像。通过特定的图像编码器,图像也会被转化为可以输入 Transformer 的 tokens。
  1. VLM 编码器:
  • 两种主要的 VLM 编码器:
    • 基于 CLIP 的编码器:将图像映射为向量序列,适用于 OpenAI 的模型。
    • 基于 VQ-VAE 的编码器:将图像编码为离散的 token 序列,更适合生成图像的任务。
  1. VQ-VAE 详细解释:
  • VQ-VAE 是一种自编码器,负责将图像编码为 token 序列,并通过解码器恢复图像。
  • 训练目标是通过量化 VAE 的输出,使得离散的 token 序列能够保留原始图像的信息。
  1. CLIP 的训练目标:
  • CLIP 的目的是通过图像和对应文本的相似性最大化以及与不相关文本的区分来进行训练,从而保持图像的详细信息。
  1. VLM 的训练数据和基准测试:
  • VLM 使用的数据包括图像和文本配对的数据集(如 Google Images、Bing Images),以及合成的 ChartQA、Document layout 等数据。
  • 常见的基准测试包括文档理解(DocVQA)、数学推理(MathVista)等。
  1. VLM 的训练技巧:
  • 训练通常分为预训练和指令微调两个阶段,前者使用图文交织数据,后者采用类似问答的数据。
  • 细节如分辨率和图像的原生长宽比对模型效果有重要影响。

2 CLIP (Used in GPT-V)

见lec13笔记。

3 VQ-VAE (Used in Gemini)

2017.11。deepmind 3人

https://arxiv.org/pdf/1711.00937

在这里插入图片描述


VQ-VAE 详细笔记

VQ-VAE(Vector Quantized Variational AutoEncoder)是一种生成模型,结合了自编码器和向量量化技术,旨在学习图像、音频等数据的离散化表示,常用于生成任务和特征压缩。VQ-VAE 的主要创新点是将连续的潜在表示离散化,使模型能够在离散空间中学习数据特征。

VQ-VAE 的模块组成与数据流

VQ-VAE 主要由三个模块构成:编码器(Encoder)量化器(Quantizer)解码器(Decoder),每个模块在模型的训练和推理过程中都扮演了关键角色。


1. 输入数据

假设我们有一张 32 × 32 32 \times 32 32×32 的 RGB 图像,其输入维度是 32 × 32 × 3 32 \times 32 \times 3 32×32×3,表示图像的宽度、高度和三个颜色通道。


2. 编码器(Encoder)

2.1 编码器的作用

编码器的任务是将高维度的输入图像映射为低维度的潜在特征表示。它通过卷积神经网络(CNN)提取输入图像的特征,并将这些特征压缩到较低维度。

2.2 数据流与维度变化

32 × 32 × 3 32 \times 32 \times 3 32×32×3 的输入图像为例,经过几层卷积操作,编码器将其压缩成一个特征图(Feature Map)。假设经过 CNN 编码后,特征图的输出维度为 8 × 8 × 64 8 \times 8 \times 64 8×8×64,即:

  • 8 × 8 8 \times 8 8×8 的空间分辨率
  • 64 个特征通道,表示不同的特征。
2.3 编码器输出

编码器输出的这个 8 × 8 × 64 8 \times 8 \times 64 8×8×64 特征图是连续的,即每个像素位置的特征表示为 64 维的向量。这时的输出记作 z e ( x ) z_e(x) ze(x)


3. 量化器(Quantizer)

量化器是 VQ-VAE 的关键组件,它负责将编码器输出的连续表示离散化。这个过程称为向量量化(Vector Quantization),具体使用了一个 代码本体(Codebook)

3.1 代码本体(Codebook)是什么?

代码本体 是一个预定义的向量集合,存储了所有可能的离散表示。这些向量就像是一个词汇表,用来代替连续的特征向量。

  • 初始化:代码本体中的向量通常是随机初始化的,经过训练逐步调整。这些向量的个数(即词汇表大小)是超参数,假设代码本体的大小为 512 512 512,即有 512 个不同的向量。
  • 每个向量的维度与编码器输出的维度一致,例如每个向量的大小为 64 维。所以,代码本体的维度为 512 × 64 512 \times 64 512×64,表示有 512 个 64 维向量。
3.2 向量量化的过程

量化器的任务是将编码器输出的每个连续特征向量映射为代码本体中的一个离散向量。

  • 量化过程:对编码器输出的每个 8 × 8 8 \times 8 8×8 空间位置中的 64 维特征向量,量化器会从代码本体中找到最接近的向量,并将其替代。
  • 最近邻搜索:量化器计算编码器输出 z e ( x ) z_e(x) ze(x) 与代码本体中每个向量的距离,选择最相似的向量 e i e_i ei 替代原始的连续向量。这一过程记作 z q ( x ) z_q(x) zq(x),即量化后的表示。

公式表示

z q ( x ) = argmin e i ∈ E ∣ ∣ z e ( x ) − e i ∣ ∣ 2 z_q(x) = \text{argmin}_{e_i \in E} || z_e(x) - e_i ||_2 zq(x)=argmineiE∣∣ze(x)ei2

其中, E E E 是代码本体的所有向量集合, e i e_i ei 表示某个代码向量。

3.3 输出维度

量化后的输出维度保持不变,仍然是 8 × 8 × 64 8 \times 8 \times 64 8×8×64,但每个 64 维的向量现在是代码本体中某个离散的向量,而不再是连续的编码器输出。

3.4 q(z|x) 的作用

q ( z ∣ x ) q(z|x) q(zx) 是量化器的概率分布,它表示给定输入 x x x 时,选择哪个离散代码向量 z z z。在实际中,这个选择过程可以视为一个非参数化的过程,通过最近邻搜索选择最接近的代码本体向量。


4. 解码器(Decoder)

4.1 解码器的作用

解码器负责将量化后的离散向量表示 z q ( x ) z_q(x) zq(x) 转换回原始图像空间。解码器通常也是一个 CNN,它通过反卷积操作(up-sampling),将低维度的离散表示恢复为原始数据的高分辨率表示。

4.2 数据流与维度变化

解码器接收量化后的 8 × 8 × 64 8 \times 8 \times 64 8×8×64 的张量,通过多层反卷积操作,将其逐步恢复为原始分辨率的图像。最终,解码器输出的图像维度为 32 × 32 × 3 32 \times 32 \times 3 32×32×3,即重建的图像。


5. 损失函数

VQ-VAE 的训练过程中使用了三个主要的损失函数,分别负责不同的目标:

5.1 重构损失(Reconstruction Loss)

重构损失衡量解码器生成的图像与输入图像之间的差异。这个损失通常使用均方误差(MSE),用于优化解码器,使生成的图像与输入尽可能相似。

L rec = ∣ ∣ x − x ^ ∣ ∣ 2 2 L_{\text{rec}} = ||x - \hat{x}||_2^2 Lrec=∣∣xx^22

其中, x x x 是原始图像, x ^ \hat{x} x^ 是解码器生成的图像。

5.2 代码本体损失(Codebook Loss)

为了确保编码器的输出 z e ( x ) z_e(x) ze(x) 可以被量化为代码本体中的向量,模型需要一个损失项来鼓励编码器输出接近这些离散代码。这通过一个距离度量来实现。

L vq = ∣ ∣ sg [ z e ( x ) ] − e ∣ ∣ 2 2 L_{\text{vq}} = || \text{sg}[z_e(x)] - e ||_2^2 Lvq=∣∣sg[ze(x)]e22

其中, sg \text{sg} sg 表示“停止梯度”,即该项在反向传播时不会更新代码本体中的向量。

5.3 承诺损失(Commitment Loss)

承诺损失是为了约束编码器输出,使其尽量保持在代码本体的离散空间附近。该项损失防止编码器在连续空间中生成与代码本体相距过远的特征向量。

L com = ∣ ∣ z e ( x ) − sg [ e ] ∣ ∣ 2 2 L_{\text{com}} = ||z_e(x) - \text{sg}[e]||_2^2 Lcom=∣∣ze(x)sg[e]22

5.4 最终损失函数

最终的损失函数是上述三个损失的加权和,模型通过最小化该损失来优化编码器、量化器和解码器的参数。

L = L rec + L vq + β L com L = L_{\text{rec}} + L_{\text{vq}} + \beta L_{\text{com}} L=Lrec+Lvq+βLcom

其中, β \beta β 是控制承诺损失强度的超参数。


6. 训练过程

  • 代码本体的初始化:代码本体中的向量初始为随机向量,并且在训练过程中逐渐调整。
  • 梯度传播:由于量化器的选择是一个离散过程,无法直接对量化器的选择进行反向传播,因此使用了直通估计器(Straight-Through Estimator) 技术。这一技术跳过不可导的量化步骤,使得梯度能够从解码器通过量化器回传到编码器。

总结

VQ-VAE 是一种基于向量量化的自编码器,通过将连续潜在空间表示离散化,利用代码本体存储离散的表示向量。其训练过程通过优化重构损失、代码本体损失和承诺损失,最终生成高质量的重建图像。通过这种离散化的表示,VQ-VAE 在生成任务和特征压缩等方面具有独特的优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

北京湃生艾瑞金助力实用临床树脂微创修复实战合肥站圆满结束

随着微创理念的普及以及口腔医学生物修复材料的运用,人们对于牙齿治疗舒适度和美观性有了更高的要求。口腔软硬组织修复、龋洞树脂修复、缺牙种植修复等系列材料在临床上的应用越来越广。而这些医学材料的运用,亦能有效帮助口腔治疗实现精准和微创的目标…

零信任如何增强网络物理系统 (CPS) 安全性

远程访问对于管理关键基础设施至关重要,因为它允许企业优化和扩展运营并保持效率。然而,它也带来了许多安全漏洞,而且随着连接设备数量的增加,这些漏洞只会越来越多。 到 2025 年,企业和消费者环境中的物联网设备数量…

数据架构图:从数据源到数据消费的全面展示

在这篇文章中,我们将探讨如何通过架构图来展示数据的整个生命周期,从数据源到数据消费。下面是一个使用Mermaid格式的示例数据架构图,展示了数据从源到消费的流动、处理和存储过程。 数据架构图示例 说明 数据源:分为内部数据源&…

Bean,看到P188没看了与maven

通过IOC容器获得Bean对象

职业技术学校开设无人机培训技术详解

职业技术学校开设无人机培训技术,是一个涉及多个方面的综合性教学过程。以下是对该培训技术的详细解析: 一、培训目标 无人机培训技术的目标在于培养学员掌握无人机的基本原理、组装调试、飞行操作、安全规范及维修保养等技能,使其成为具备…

周期信号的傅里叶级数表示

一、特征函数: 一个信号,若系统对该信号的输出响应仅是一个常数乘以输入,则为特征函数,幅度因子称为系统的特征值。 复指数是线性时不变系统的特征函数 复指数序列是离散时间线性时不变系统的特征函数 二、连续时间周期信号的…

macOS终端配置自动补全功能

如何在macOS终端中配置自动补全功能 终端是一个非常强大的工具,它可以用来完成很多任务,比如创建、复制、移动、删除文件,执行脚本和运行程序。不过它的默认设置对用户不太友好,作为开发者,我们通常习惯代码编辑器的辅…

Kubernetes-环境篇-01-mac开发环境搭建

1、brew安装 参考知乎文章:https://zhuanlan.zhihu.com/p/111014448 苹果电脑 常规安装脚本(推荐 完全体 几分钟安装完成) /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"苹果电脑 极…

jenkins部署Maven和NodeJS项目

在 Java 项目开发中,项目的编译、测试、打包等是比较繁琐的,属于重复劳动的工作,浪费人力和时间成本。以往开发项目时,程序员往往需要花较多的精力在引用 jar 包搭建项目环境上,跨部门甚至跨人员之间的项目结构都有可能…

AutoSar通信服务—车载LIN总线详解

文章目录 诞生背景和应用场景LIN总线硬件接口LIN总线协议1. 架构2. 数据帧格式通信过程帧类型主节点的角色错误检测 LIN总线应用举例—获取四个车门状态1. 架构概述:2. 通信流程:3. 数据传输示例:4. 状态更新和处理:5. LIN通信调度…

MFC工控项目实例二十二主界面计数背景颜色改变

承接专栏《MFC工控项目实例二十一型号选择界面删除参数按钮禁用切换》 1、在SEAL_PRESSUREDlg.h文件中添加代码 class CSEAL_PRESSUREDlg : public CDialog { public: CBrush m_brush1;CBrush m_brush2;CBrush m_brush3;... } 2、在SEAL_PRESSUREDlg.cpp文件中添加代码 BO…

汇编语言知识(王爽第四版)

汇编语言,当然,我们学习是在c语言的基础上,那么,我们就先复习一下c语言的知识 C语言的基础,进制转换必不可少 数组,函数…… 接下来,我们学习了数据结构:顺序表,链表&…

【C++】——类和对象(上)

【C】——类和对象(上) 文章目录 【C】——类和对象(上)前言1. 类的定义1.1 类定义格式1.2 访问限定符1.3 类域 2. 实例化2.1 实例化概念2.2 对象的大小 3. this指针4. C和C语言实现Stack对比结语 前言 小伙伴们大家好呀,今天我们就开始学习C的重点及难点——类和对…

华为云+WordPress+Puock主题搭建个人博客

网站访问地址:qingxuly.cn 搭建网站 购买华为云服务器,购买域名,进行备案,配置域名解析等操作,请参考华为云文档。 安装Ubuntu系统 华为云控制台中给云服务器安装Ubuntu2204。 配置服务器安全组 华为云安全组中创建安…

用HTML CSS JS打造企业级官网-源码直接可用

页面效果&#xff1a;本前端网站应用多个JS特效 1.index.html&#xff1a; <!DOCTYPE html> <html lang"zxx"> <head><title>蓝网团队</title><meta name"viewport" content"widthdevice-width, initial-scale1&q…

C++之多线程

前言 多线程和多进程是并发编程的两个核心概念,它们在现代计算中都非常重要,尤其是在需要处理大量数据、提高程序性能和响应能力的场景中。 多线程的重要性: 资源利用率:多线程可以在单个进程中同时执行多个任务,这可以更有效地利用CPU资源,特别是在多核处理器上。 性…

量化交易backtrader实践(三)_指标与策略篇(2)_内置指标A开头

在第1节中&#xff0c;我们学习了移动平均线的原理&#xff0c;中位数以及正态分布的概念&#xff0c;并通过python手工做了一个双均线的策略回测。了解了怎么用pandas计算移动平均线&#xff08;rollingmean)&#xff0c;怎么得到某一列上1个的值&#xff08;shift)&#xff0…

DOM树(上) -- 第七课

文章目录 前言一、DOM是什么&#xff1f;二、基础用法1.DOM树2. 获取元素1. id2. 标签3. name4. HTMLS新增的获取的方法1. 根据类型获取2. 根据querySelector获取 3. 事件基础1. 概述2. 事件三要素3. 操作元素内容1. 操作内容2. 操作属性3. 案例 4. 操作元素样式5. 案例 -- 显示…

【JDK动态代理】JDK动态代理:为何只能代理接口和接口实现类

在Java开发中&#xff0c;JDK动态代理是一种非常有用的技术&#xff0c;它允许开发者在不修改目标类代码的情况下&#xff0c;为目标类添加额外的功能。然而&#xff0c;JDK动态代理的使用有一些限制&#xff0c;特别是它只能代理接口和接口实现类。本文将深入探讨这一限制的原…

​IAR全面支持国科环宇AS32X系列RISC-V车规MCU

全球领先的嵌入式系统开发软件解决方案供应商IAR与北京国科环宇科技股份有限公司&#xff08;以下简称”国科环宇”&#xff09;联合宣布&#xff0c;最新版本IAR Embedded Workbench for RISC-V将全面支持国科环宇AS32X系列RISC-V MCU&#xff0c;双方将共同助力中国汽车行业开…