网易首页 > 网易号 > 正文 申请入驻

使用Pytorch构建视觉语言模型(VLM)

0
分享至

视觉语言模型(Vision Language Model,VLM)正在改变计算机对视觉和文本信息的理解与交互方式。本文将深入解析 VLM 的核心组件和实现细节,可以让你全面掌握这项前沿技术。我们的目标是理解并实现能够通过指令微调来执行有用任务的视觉语言模型。

总体架构



VLM 的总体架构包括:

  1. 图像编码器(Image Encoder):用于从图像中提取视觉特征。本文将从 CLIP 中使用的原始视觉 Transformer。
  2. 视觉-语言投影器(Vision-Language Projector):由于图像嵌入的形状与解码器使用的文本嵌入不同,所以需要对图像编码器提取的图像特征进行投影,匹配文本嵌入空间,使图像特征成为解码器的视觉标记(visual tokens)。这可以通过单层或多层感知机(MLP)实现,本文将使用 MLP。
  3. 分词器和嵌入层(Tokenizer + Embedding Layer):分词器将输入文本转换为一系列标记 ID,这些标记经过嵌入层,每个标记 ID 被映射为一个密集向量。
  4. 位置编码(Positional Encoding):帮助模型理解标记之间的序列关系,对于理解上下文至关重要。
  5. 共享嵌入空间(Shared Embedding Space):文本嵌入与来自位置编码的嵌入进行拼接(concatenate),然后传递给解码器。
  6. 解码器(Decoder-only Language Model):负责最终的文本生成。



上图是来自CLIP 论文的方法示意图,主要介绍文本和图片进行投影

综上,我们使用图像编码器从图像中提取特征,获得图像嵌入,通过视觉-语言投影器将图像嵌入投影到文本嵌入空间,与文本嵌入拼接后,传递给自回归解码器生成文本。

VLM 的关键在于视觉和文本信息的融合,具体步骤如下:

  1. 通过编码器提取图像特征(图像嵌入)。
  2. 将这些嵌入投影以匹配文本的维度。
  3. 将投影后的特征与文本嵌入拼接。
  4. 将组合的表示输入解码器生成文本。

深度解析:图像编码器的实现

图像编码器:视觉 Transformer

为将图像转换为密集表示(图像嵌入),我们将图像分割为小块(patches),因为 Transformer 架构最初是为处理词序列设计的。





为从零开始实现视觉 Transformer,我们需要创建一个PatchEmbeddings类,接受图像并创建一系列小块。该过程对于使 Transformer 架构能够有效地处理视觉数据至关重要,特别是在后续的注意力机制中。实现如下:

class PatchEmbeddings(nn.Module):
def __init__(self, img_size=96, patch_size=16, hidden_dim=512):
super().__init__()
self.img_size = img_size
self.patch_size = patch_size
self.num_patches = (img_size // patch_size) ** 2
# 无重叠卷积用于提取小块
self.conv = nn.Conv2d(
in_channels=3,
out_channels=hidden_dim,
kernel_size=patch_size,
stride=patch_size
)
# 使用 Xavier/Glorot 初始化权重
nn.init.xavier_uniform_(self.conv.weight)
if self.conv.bias is not None:
nn.init.zeros_(self.conv.bias)
def forward(self, X):
"""
参数:
X: 输入张量,形状为 [B, 3, H, W]
返回:
小块嵌入,形状为 [B, num_patches, hidden_dim]
"""
if X.size(2) != self.img_size or X.size(3) != self.img_size:
raise ValueError(f"输入图像尺寸必须为 {self.img_size}x{self.img_size}")
X = self.conv(X) # [B, hidden_dim, H/patch_size, W/patch_size]
X = X.flatten(2) # [B, hidden_dim, num_patches]
X = X.transpose(1, 2) # [B, num_patches, hidden_dim]
return X

在上述代码中,输入图像通过卷积层被分解为(img_size // patch_size)2** 个小块,并投影为具有通道维度为 512 的向量(在 PyTorch 实现中,三维张量的形状通常为 [B, T, C])。



注意力机制

视觉编码器和语言解码器的核心都是注意力机制。关键区别在于解码器使用因果(掩码)注意力,而编码器使用双向注意力。以下是对单个注意力头的实现:

class Head(nn.Module):
def __init__(self, n_embd, head_size, dropout=0.1, is_decoder=False):
super().__init__()
self.key = nn.Linear(n_embd, head_size, bias=False)
self.query = nn.Linear(n_embd, head_size, bias=False)
self.value = nn.Linear(n_embd, head_size, bias=False)
self.dropout = nn.Dropout(dropout)
self.is_decoder = is_decoder
def forward(self, x):
B, T, C = x.shape
k = self.key(x)
q = self.query(x)
v = self.value(x)
wei = q @ k.transpose(-2, -1) * (C ** -0.5)
if self.is_decoder:
tril = torch.tril(torch.ones(T, T, dtype=torch.bool, device=x.device))
wei = wei.masked_fill(tril == 0, float('-inf'))
wei = F.softmax(wei, dim=-1)
wei = self.dropout(wei)
out = wei @ v
return out

视觉-语言投影器

投影器模块在对齐视觉和文本表示中起关键作用。我们将其实现为一个多层感知机(MLP):

class MultiModalProjector(nn.Module):
def __init__(self, n_embd, image_embed_dim, dropout=0.1):
super().__init__()
self.net = nn.Sequential(
nn.Linear(image_embed_dim, 4 * image_embed_dim),
nn.GELU(),
nn.Linear(4 * image_embed_dim, n_embd),
nn.Dropout(dropout)
)
def forward(self, x):
return self.net(x)

综合实现

最终的 VLM 类将所有组件整合在一起:

class VisionLanguageModel(nn.Module):
def __init__(self, n_embd, image_embed_dim, vocab_size, n_layer,
img_size, patch_size, num_heads, num_blks,
emb_dropout, blk_dropout):
super().__init__()
num_hiddens = image_embed_dim
assert num_hiddens % num_heads == 0
self.vision_encoder = ViT(
img_size, patch_size, num_hiddens, num_heads,
num_blks, emb_dropout, blk_dropout
)
self.decoder = DecoderLanguageModel(
n_embd, image_embed_dim, vocab_size, num_heads,
n_layer, use_images=True
)
def forward(self, img_array, idx, targets=None):
image_embeds = self.vision_encoder(img_array)
if image_embeds.nelement() == 0 or image_embeds.shape[1] == 0:
raise ValueError("ViT 模型输出为空张量")
if targets is not None:
logits, loss = self.decoder(idx, image_embeds, targets)
return logits, loss
else:
logits = self.decoder(idx, image_embeds)
return logits

训练及注意事项

在训练 VLM 时,需要考虑以下重要因素:

预训练策略:现代 VLM 通常使用预训练的组件:

  • 视觉编码器:来自 CLIP 或 SigLIP
  • 语言解码器:来自 Llama 或 GPT 等模型
  • 投影器模块:初始阶段仅训练此模块

训练阶段:

  • 阶段 1:在冻结的编码器和解码器下预训练,仅更新投影器
  • 阶段 2:微调投影器和解码器以适应特定任务
  • 可选阶段 3:通过指令微调提升任务性能

数据需求:

  • 大规模的图像-文本对用于预训练
  • 任务特定的数据用于微调
  • 高质量的指令数据用于指令微调

总结

通过从零开始实现视觉语言模型(VLM),我们深入探讨了视觉和语言处理在现代人工智能系统中的融合方式。本文详细解析了 VLM 的核心组件,包括图像编码器、视觉-语言投影器、分词器、位置编码和解码器等模块。我们强调了多模态融合的关键步骤,以及在实现过程中需要注意的训练策略和数据需求。



构建 VLM 不仅加深了我们对视觉和语言模型内部机制的理解,还为进一步的研究和应用奠定了基础。随着该领域的迅速发展,新的架构设计、预训练策略和微调技术不断涌现。我们鼓励读者基于本文的实现,探索更先进的模型和方法,如采用替代的视觉编码器、更复杂的投影机制和高效的训练技术,以推动视觉语言模型的创新和实际应用。

https://avoid.overfit.cn/post/fa8eb707ce954dffa25ce801da251a51

Achraf Abbaoui

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
重挫,民航巨大损失!

重挫,民航巨大损失!

民航之翼
2024-12-01 19:30:03
大马士革街头枪声大作!巴沙尔的弟弟发动政变?

大马士革街头枪声大作!巴沙尔的弟弟发动政变?

大风文字
2024-12-01 19:01:37
朱芝松、章更生、陆克华等68人被查,唐仁健、王昊、楼文龙、刘星泰等75人被处分!11月反腐月报公布

朱芝松、章更生、陆克华等68人被查,唐仁健、王昊、楼文龙、刘星泰等75人被处分!11月反腐月报公布

鲁中晨报
2024-12-01 22:24:08
管晨辰是最让人讨厌的那种人

管晨辰是最让人讨厌的那种人

葱哥说
2024-12-01 20:41:35
大兴机场被北漂睡成“洗浴中心”,撕开当下社会最体面的一幕

大兴机场被北漂睡成“洗浴中心”,撕开当下社会最体面的一幕

这班我上够了
2024-11-30 13:50:03
炸裂!美国男星布莱尔家中去世,遗体被爱犬啃食,现场惨不忍睹

炸裂!美国男星布莱尔家中去世,遗体被爱犬啃食,现场惨不忍睹

南城无双
2024-12-01 15:19:21
叫顾客“爸爸”遭原配大闹的LV柜姐,开始带货:5天发8条卖货视频

叫顾客“爸爸”遭原配大闹的LV柜姐,开始带货:5天发8条卖货视频

派大星纪录片
2024-12-01 09:18:17
黑熊闯进村民家中,丈夫杀熊救妻!官方:两人无生命危险,黑熊尸体将用于高校科研科普

黑熊闯进村民家中,丈夫杀熊救妻!官方:两人无生命危险,黑熊尸体将用于高校科研科普

红星新闻
2024-12-01 12:53:10
大家还是理智的!优衣库拒用新疆棉后客流不降反增,生意火爆

大家还是理智的!优衣库拒用新疆棉后客流不降反增,生意火爆

映射生活的身影
2024-12-01 11:22:51
太反常!优衣库拒用新疆棉:账号反而涨粉销量大涨,问题出哪儿了

太反常!优衣库拒用新疆棉:账号反而涨粉销量大涨,问题出哪儿了

影像温度
2024-12-01 18:06:07
姆巴佩自我救赎!轰远射世界波,皇马生涯第10球,效率远逊C罗

姆巴佩自我救赎!轰远射世界波,皇马生涯第10球,效率远逊C罗

奥拜尔
2024-12-02 00:02:51
人民币大幅贬值!今日凌晨的三大消息全面发酵(12.2)!

人民币大幅贬值!今日凌晨的三大消息全面发酵(12.2)!

风口招财猪
2024-12-02 01:05:03
冯德莱恩:没想到欧盟98%的稀土、93%的镁、97%的锂竟然来自中国

冯德莱恩:没想到欧盟98%的稀土、93%的镁、97%的锂竟然来自中国

魏家东
2024-12-01 07:51:05
立陶宛对华示好,想获得原谅,中方已读不回:触碰底线要付出代价

立陶宛对华示好,想获得原谅,中方已读不回:触碰底线要付出代价

兵说
2024-11-30 23:18:01
太有魅力了!马龙参观台北101,美女董事长亲自接待!

太有魅力了!马龙参观台北101,美女董事长亲自接待!

青青子衿
2024-12-01 05:29:01
反政府军距离首都150公里,巴沙尔的弟弟发动政变?

反政府军距离首都150公里,巴沙尔的弟弟发动政变?

西楼饮月
2024-12-01 12:49:41
阿娇都胖成这样了,虎背熊腰五大三粗,还开演唱会圈钱,谁买单?

阿娇都胖成这样了,虎背熊腰五大三粗,还开演唱会圈钱,谁买单?

南城无双
2024-12-01 00:29:35
以前禁止卫星锅,大家都偷偷装,为何现在没人管了反而没人使用了

以前禁止卫星锅,大家都偷偷装,为何现在没人管了反而没人使用了

慎独赢
2024-11-30 22:20:03
特朗普表态将对华征税不到4天,中方宣布对美豁免关税,哪些深意

特朗普表态将对华征税不到4天,中方宣布对美豁免关税,哪些深意

魏家东
2024-12-01 07:42:06
一败涂地!广东球迷怒了,请求朱芳雨立即停止五个行为

一败涂地!广东球迷怒了,请求朱芳雨立即停止五个行为

南海浪花
2024-12-01 17:40:13
2024-12-02 02:47:00
deephub
deephub
CV NLP和数据挖掘知识
1507文章数 1417关注度
往期回顾 全部

科技要闻

我国首个商业航天发射场首发成功

头条要闻

湖南省委原常委落马后 其妻追讨5000万巨额债务引关注

头条要闻

湖南省委原常委落马后 其妻追讨5000万巨额债务引关注

体育要闻

勇士四连败,到底是谁的错?

娱乐要闻

黄晓明姥姥去世,祖孙俩手牵手好温馨

财经要闻

女首富,死刑!交出800亿,免死!

汽车要闻

科技是中国豪车梦的支点 腾势Z9走心试驾体验

态度原创

家居
本地
房产
教育
军事航空

家居要闻

现代设计感 温馨两居室

本地新闻

云游中国|来伦布夏果感受充满Passion的人生

房产要闻

一燃再燃!又卖2亿!白鹅潭顶流,引爆全城!

教育要闻

2024第40届数学竞赛决赛国集获奖名单公布!江苏 2人入选

军事要闻

泽连斯基开出停火条件 俄方回应

无障碍浏览 进入关怀版