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

文章目录

  • 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.mzph.cn/pingmian/55294.shtml

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

相关文章

Go基础学习09-多协程资源竞争、sync.Mutex、sync.Cond、chan在多协程对共享变量的资源竞争中的使用

文章目录 Go中协程基础小记协程基础为什么需要多协程多协程面临的问题 代码演示存在共享变量的资源竞争Mutex解决资源竞争Mutex基本介绍代码演示 MutexCond解决资源竞争和CPU空转Cond条件变量讲解代码演示代码片段关于wait和for循环的解释说明条件变量Signal方法和Broadcast方法…

C++七种异常处理

在C++中,使用异常机制可以提高程序的健壮性和可维护性。异常是在程序运行时发生的一个事件,它会打断正在执行的程序的正常流程。C++异常处理机制可以使程序在出现异常时,进行异常处理,而不是退出程序。 基本的异常处理 #include <iostream> using namespace std;int …

IP 数据包分包组包

为什么要分包 由于数据链路层MTU的限制,对于较⼤的IP数据包要进⾏分包. 什么是MTU MTU相当于发快递时对包裹尺⼨的限制.这个限制是不同的数据链路对应的物理层,产⽣的限制. • 以太⽹帧中的数据⻓度规定最⼩46字节,最⼤1500字节,ARP数据包的⻓度不够46字节,要在后⾯补填 充…

云栖实录 | 开源大数据全面升级:Native 核心引擎、Serverless 化、湖仓架构引领云上大数据发展

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 王 峰 | 阿里云智能集团研究员、开源大数据平台负责人 李 钰&#xff5c;阿里云智能集团资深技术专家 范 振&#xff5c;阿里云智能集团高级技术专家 李劲松&#xff5c;阿里云…

[论文笔记] LLaMA3.2

https://github.com/meta-llama/llama-stack [2407.21783] The Llama 3 Herd of Models Meta 部落格資訊:https://ai.meta.com/blog/llama-3-2-connect-2024-vision-edge-mobile-devices/HuggingFace:

【Kubernetes】常见面试题汇总(五十)

目录 112.考虑一个公司要向具有各种环境的客户提供所有必需的分发产品的方案。您如何看待他们如何动态地实现这一关键目标&#xff1f; 113.假设一家公司希望在从裸机到公共云的不同云基础架构上运行各种工作负载。在存在不同接口的情况下&#xff0c;公司将如何实现这一目标&…

MongoDB聚合操作及索引底层原理

目录 链接:https://note.youdao.com/ynoteshare/index.html?id=50fdb657a9b06950fa255a82555b44a6&type=note&_time=1727951783296 本节课的内容: 聚合操作: 聚合管道操作: ​编辑 $match 进行文档筛选 ​编辑 将筛选和投影结合使用: ​编辑 多条件匹配: …

Solidity智能合约中的事件和日志

1. Solidity 中的事件和日志概述 1.1 什么是事件&#xff1f; 在 Solidity 中&#xff0c;事件&#xff08;Event&#xff09;是一种允许智能合约与外部世界进行通信的机制。通过触发事件&#xff0c;可以记录合约执行中的关键操作&#xff0c;并将这些操作发送到链上。事件的…

魔改xjar支持springboot3,

jar包加密方案xjar, 不支持springboot3。这个发个魔改文章希望大家支持 最近公司需要将项目部署在第三方服务器&#xff0c;于是就有了jar包加密的需求&#xff0c;了解了下目前加密方案现况如下: 混淆方案&#xff0c;就是在代码中添加大量伪代码&#xff0c;以便隐藏业务代…

常见电脑品牌BIOS设置与进入启动项快捷键

常见电脑品牌BIOS与引导项快捷键速查表 | 电脑品牌 | BIOS快捷键 | 引导项快捷键 | 备注 ||------------|------------|--------------|------------------------------ || 联想 | F2/F1 | F12 | 笔记本通常为F2&#xff0c;台式机通常为F1 || IBM/ThinkPad | F1 | 未知 | ||…

【AI】AIOT简介

随着技术的快速发展&#xff0c;人工智能AI和物联网IoT已经成为当今最热门的技术领域。AIOT是人工智能和物联网的结合&#xff0c;使物联网设备更加智能化&#xff0c;能够进行自主决策和学习的技术。 通过物联网产生、收集来自不同维度的、海量的数据存储于云端、边缘端&#…

Ubuntu上安装Git:简单步骤指南

Git是目前世界上最流行的版本控制系统&#xff0c;广泛用于软件开发中。无论你是开发者还是版本控制的新手&#xff0c;Git都是你不可或缺的工具。本文将为你介绍如何在Ubuntu操作系统上安装Git。 什么是Git&#xff1f; Git是一个开源的分布式版本控制系统&#xff0c;由Lin…

数据治理006-数据标准的管理

元数据的分类和标准有哪些&#xff1f; 一、元数据的分类 元数据可以根据其描述的对象和属性不同&#xff0c;被分为不同的类型。以下是几种常见的元数据分类方法&#xff1a; 基于数据的类型&#xff1a;根据数据的类型&#xff0c;元数据可以被分为结构化元数据、非结构化元…

SQL连接Python

对于运营部门的Yoyo来说&#xff0c;她想要知道夜曲优选的订单都来自哪些省份&#xff0c;每个省份的总订单数以及总订单金额分别是多少。 这时小鹿就会通过SQL对连接的数据库进行查询&#xff0c;再将结果传递给Python处理&#xff0c;并帮助Yoyo生成可视化图表。 我们先来快…

拆解维修飞科剃须刀

原因 用了好几年的剃须刀&#xff0c;经过一次更换电池。后来上面的盖帽松动&#xff0c;无法合盖&#xff0c;经过把弹片矫正后修复。最近一次”大力出奇迹“的操作直接断送了这个老伤员最后的可能性。最终只能花了将近十块大洋买了一套盖着和中间座。简单更换了一下。 记录…

单元测试进阶-Mock使用和插桩

目录 一、基本概念 1、Mock 2、插桩&#xff08;Sutbbing&#xff09; 二、参考文章 一、基本概念 1、Mock Mock的作用就是不直接new对象&#xff0c;而是使用Mock方法或者注解Mock一个对象。 这个对象他不是new创建的对象&#xff0c;Mock对该对象的一些成员变量和方法…

【RabbitMQ 项目】服务端:消费者管理模块

文章目录 一.概念辨析1.什么是消费者&#xff1f;2.服务端为什么要管理消费者&#xff1f;3.怎么管理消费者&#xff1f;4.需要管理生产者吗&#xff1f; 二.编写思路1.定义消费者2.定义队列消费者管理管理类3.定义消费者管理类 三.代码实践 一.概念辨析 1.什么是消费者&#…

html嵌入百度地图

html嵌入百度地图 key地址 https://lbsyun.baidu.com/apiconsole/key#/home &#xff0c;点进去注册应用、然后复制key换掉即可显示地图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>百度地图搜索…

C++随心记 续一

C中的模板 在其它语言中如Java或者C#中可能叫做泛型&#xff0c;在C中为模板&#xff0c;泛型的限制通常比模板多。模板可以解决多次的代码重复问题&#xff0c;如以下场景 #include <iostream> #include <string>void print(int value) {std::cout << val…

MySQL存储和处理XML数据

文章目录 一、实战概述二、准备数据三、实战步骤1、创建数据库2、创建数据表3、插入XML数据4、查询XML数据5、修改XML数据6、删除XML数据7、注意事项四、实战小结一、实战概述 MySQL不直接支持XML数据类型,但可以通过TEXT或BLOB类型字段存储XML数据,利用ExtractValue和Update…