Transformer系列-2丨Vision Transformer (ViT)模型解析

1 前言

前面一篇文章,笔者从网络结构和代码实现角度较为深入地和大家解析了Transformer模型,尤其是里面的自注意力模块位置编码输入掩码,其具体的链接如下:

【Transformer系列】基础Transformer模型和代码详解

除了基础的Transformer模型,笔者近期也对一些基于Transformer的模型(比如ViT,BERT等)进行了重温。

Transformer网络

本文稍微简洁一些,跟大家分享一下Transformer应用在视觉任务上的一个经典的工作,即ViT模型,希望对大家在学习Transformer时起到一些辅助作用。

2 ViT模型解析

2.1 简介

ViT,全称叫做Vision Transformer,虽然算不是第一个将Transformer应用到视觉任务上的工作,但应该是最有名的一个了。2020年提出至今,在谷歌学术上的引用已经超过了10000+,可见其对后续研究的影响程度。

该工作的论文名也很有意思,叫做《AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE》,翻译而来就是,一张图片值256(16 X 16)个词。这不禁勾起了大家的求知欲。这里,我给大家推荐一个关于ViT及其各种变体的代码库,具体为:

https://github.com/lucidrains/vit-pytorch

2.2 动机

本文提出的背景是,Transformer模型在各NLP任务上大杀四方。但是在同样热门的CV领域,好像并没有很大的进展。

有一些工作尝试去将Transformer应用到视觉任务上,但是由于使用了特定的注意力模态,并不适用于现有的硬件加速器。而且,这些方法的精度还是不如基于CNN的方法

为了解决上述问题,作者提出了视觉Transformer(ViT),其核心在于将应用在NLP任务上的Transformer直接应用到CV任务上,并且尽可能地少做改动。乍一看,相比现在一大堆为了体现工作量的魔改模型,这么做岂不是降低了文章的创新性吗。但是对于真正的大佬,其目的在于:

In model design we follow the original Transformer (Vaswani et al., 2017) as closely as possible. An advantage of this intentionally simple setup is that scalable NLP Transformer architectures – and their efficient implementations – can be used almost out of the box.

总结而言,作者这所以这么做,是希望实现NLP和CV任务在模型上的统一。这样一来,现在很多在NLP上大放异彩的Transformer模型可以被直接应用到视觉任务上了,也许这就是大佬的格局吧。

2.3 ViT网络结构

图1

如果大家熟悉Transformer,那么只要五分钟,我相信大家就能够大致掌握ViT的网络结构了。ViT的具体流程如上图1所示,包括:

  • 将图像等分成个图像块(image patch),这里的就是(为了简化,作者在上图用了);

  • 将图像块从左到右,从上到下依次输入到线性映射层(全连接层),输入之前对每个图像块进行铺平,全连接层将每个图像块映射成维向量(embeddings);

  • 设置一个类别记号(class token),其类型为可学习的张量,维度为维(图中的*);

  • 为“类别记号+每个图像块特征“赋予一个位置编码,位置编码是一个可学习的参数,维度为;

  • 将“类别记号+每个图像块特征“与其位置编码进行按位相加,作为Transformer编码器的输入;

  • Transformer编码器输出的第一个embedding(即类别记号对应的embedding),将其输入到多层感知器中(MLP),输出所属类别概率;

其大致流程如下动图2所示。

更具体地,上述流程中有一些需要解释的地方:

  • 如果输入图像的分辨率较高,那么仍保持每个图像块的尺度大小不变,这样的话,图像块的数量会增加,输入到ViT的序列长度也会增加;

  • 类别记号是借鉴BERT的。ViT是用于图像分类任务的,需要像CNN一样用全连接将提取的图像特征输出类别概率。这里最终的图像特征,可以用池化操作(pooling)对Transformer输出的所有序列进行均值池化获得的,也可以取输出序列的第一个embedding。这里作者选择了后者;

  • ViT仅采用基础Transformer中的编码器用于图像特征提取,因为是分类任务不是生成任务(类似翻译),所以无需解码器

  • ViT中的Transformer编码器由多层编码层构成,每个编码层主要由一个多头注意力多层感知器MLP(全连接层+激活)通过残差连接构成;

2.4 Python代码

上面简单讲完ViT的网络结构后,大家应该有了初步的印象。这里我们提供一些代码+相应的注释,让大家对ViT的实现流程更熟悉。

class ViT(nn.Module):
    def __init__(self, *, image_size, patch_size, num_classes, dim, depth, heads, mlp_dim, pool = 'cls', channels = 3, dim_head = 64, dropout = 0., emb_dropout = 0.):
        super().__init__()
        image_height, image_width = pair(image_size)
        patch_height, patch_width = pair(patch_size)

        assert image_height % patch_height == 0 and image_width % patch_width == 0, 'Image dimensions must be divisible by the patch size.'

        num_patches = (image_height // patch_height) * (image_width // patch_width)
        patch_dim = channels * patch_height * patch_width
        assert pool in {'cls', 'mean'}, 'pool type must be either cls (cls token) or mean (mean pooling)'

        self.to_patch_embedding = nn.Sequential(
            Rearrange('b c (h p1) (w p2) -> b (h w) (p1 p2 c)', p1 = patch_height, p2 = patch_width), # 将大图像拆分成图像块
            nn.LayerNorm(patch_dim),
            nn.Linear(patch_dim, dim),
            nn.LayerNorm(dim),
        )

        self.pos_embedding = nn.Parameter(torch.randn(1, num_patches + 1, dim)) # 可学习的参数,长度为图像块数量+1,这里的1是class token
        self.cls_token = nn.Parameter(torch.randn(1, 1, dim)) # 维度和每个图像块的embedding保持一致
        self.dropout = nn.Dropout(emb_dropout)

        self.transformer = Transformer(dim, depth, heads, dim_head, mlp_dim, dropout)

        self.pool = pool
        self.to_latent = nn.Identity()

        self.mlp_head = nn.Sequential(
            nn.LayerNorm(dim),
            nn.Linear(dim, num_classes)
        )

    def forward(self, img):
        x = self.to_patch_embedding(img) # 将图像分块,并用全连接层将每个图像块映射为embeddings(维度为D)
        b, n, _ = x.shape

        cls_tokens = repeat(self.cls_token, '1 1 d -> b 1 d', b = b) # 重复batch size次,为每张图像赋予一个类别记号(class tokens)
        x = torch.cat((cls_tokens, x), dim=1) # 把类别记号(class tokens)放在图像特征序列的前面
        x += self.pos_embedding[:, :(n + 1)] # 为“类别记号+每个图像块特征“赋予一个位置编码,位置编码是一个可学习的参数,维度为D;
        x = self.dropout(x)

        x = self.transformer(x) # 进行特征提取

        # 取Transformer编码器输出的第一个embedding(即类别记号对应的embedding),将其输入到多层感知器中(MLP),输出所属类别概率;
        # 或者,用池化操作(pooling)对Transformer输出的所有序列进行均值池化获得图像特征,再输入到多层感知器中输出所属类别概率
        x = x.mean(dim = 1) if self.pool == 'mean' else x[:, 0]

        x = self.to_latent(x)
        return self.mlp_head(x)

这里的Transformer定义如下:

class Transformer(nn.Module):
    def __init__(self, dim, depth, heads, dim_head, mlp_dim, dropout = 0.):
        super().__init__()
        self.layers = nn.ModuleList([])
        for _ in range(depth): # 编码层层数
            self.layers.append(nn.ModuleList([
                PreNorm(dim, Attention(dim, heads = heads, dim_head = dim_head, dropout = dropout)),
                PreNorm(dim, FeedForward(dim, mlp_dim, dropout = dropout))
            ]))
    def forward(self, x):
        # 每一层由一个多头注意力(attn)和多层感知器(全连接层+激活,ff)通过残差连接构成;
        for attn, ff in self.layers:
            x = attn(x) + x 
            x = ff(x) + x
        return x

3 总结

写到这里,关于ViT的基本流程和网络结构都讲解完毕了。如果大家熟悉Transformer的话,应该会觉得ViT这个工作非常容易理解(因为代码也就那么一丢丢长)。当然,如果大家觉得看起来比较吃力的话,这里非常建议大家可以自学/温习一下Transformer后再来看一遍!

在大模型时代,我们如何有效的去学习大模型?

现如今大模型岗位需求越来越大,但是相关岗位人才难求,薪资持续走高,AI运营薪资平均值约18457元,AI工程师薪资平均值约37336元,大模型算法薪资平均值约39607元。
在这里插入图片描述

掌握大模型技术你还能拥有更多可能性

• 成为一名全栈大模型工程师,包括Prompt,LangChain,LoRA等技术开发、运营、产品等方向全栈工程;

• 能够拥有模型二次训练和微调能力,带领大家完成智能对话、文生图等热门应用;

• 薪资上浮10%-20%,覆盖更多高薪岗位,这是一个高需求、高待遇的热门方向和领域;

• 更优质的项目可以为未来创新创业提供基石。

可能大家都想学习AI大模型技术,也_想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把都打包整理好,希望能够真正帮助到大家_。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,下面是我整理好的一套完整的学习路线,希望能够帮助到你们学习AI大模型。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述

三、AI大模型经典PDF书籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

四、AI大模型各大场景实战案例

在这里插入图片描述

结语

【一一AGI大模型学习 所有资源获取处(无偿领取)一一】
所有资料 ⚡️ ,朋友们如果有需要全套 《LLM大模型入门+进阶学习资源包》,扫码获取~

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值