transformer为何如此强大?

transformer的结构,重点是self attention,通过qkv三个变量,建模事物内部,或者事物之间的相关性。

总体看,transformer的结构不算特别奇特,attention的用法也比较常见,也是借鉴了之前的技术。但它具有划时代的意义。

一般来说,任何事物,只要你能把它token化,你就可以用transformer进行建模,这是它强大的一个原因。k和v是同一种事物的抽象表示,q是同一种或不同种的抽象表示,通过qk的相关性计算(attention score),得到v中真正核心有用的内容。

你可以理解为,v是你的本体,k是影分身,q是敌方忍者。我们先用影分身k去试探q,得到经验(attention)后,为v在战斗中所用。

transformer理论上能建模无限长序列,不像lstm或rnn(不能建模长序列,容易遗忘性),而且能够并行计算(lstm是有时序依赖的,不能并行计算),这是它强大的第二个原因。

transformer的mask机制,能挑选控制attention的位置和方向,从而进行效果或性能的优化,这是它强大的第三个原因。

transformer本身具有encoder和decoder机制,其实它是天然的vae结构或gan风格,这是它强大的第四个原因。

但它不是没缺点的,随着sequence length越来越大,计算量和存储量剧增,这也是优化热点和难点(需要既保证效果,有提升速度)。另外,如何pretrain和finetune,使得transformer具有外推性(用短的样本去训练,无脑去处理长的样本),也是一个优化难点。

### Transformer在计算机视觉中的应用与模型 #### 背景与发展 近年来,Transformer架构不仅在自然语言处理领域取得了显著成就,在计算机视觉(CV)领域也开始崭露头角。传统上,计算机视觉的主要方法依赖于卷积神经网络(Convolutional Neural Networks, CNNs),这些模型通过局部感受野和权重共享机制来提取图像特征[^1]。 然而,随着自注意力机制的成功引入,Vision Transformers (ViTs) 开始成为一种新的范式。它们将输入图像划分为固定大小的补丁序列,并将其视为“词”,从而利用多头自注意力机制捕获全局上下文关系。这种设计使得 ViT 可以更好地捕捉长距离依赖性和复杂的空间模式[^2]。 #### 主要模型及其特点 以下是几种重要的基于 Transformer 的 CV 模型: 1. **Vision Transformer (ViT)** ViT 是最早尝试将纯 Transformer 应用于图像分类的任务之一。它直接采用标准的 Transformer 架构,无需任何特定修改即可实现高性能表现。不过,由于其对大规模数据集的需求较高以及缺乏位置编码优化等问题,在实际部署过程中可能存在一定局限性。 2. **Swin Transformer** Swin Transformer 提出了分层结构的设计理念,即通过滑动窗口的方式构建不同尺度上的局部表示学习能力。这种方法既保留了 Transformer 的优势特性——强大的建模能力和灵活性;同时也克服了一些固有缺陷比如计算成本高昂等缺点【CC】。因此,Swin Transformer 在多个下游任务如目标检测、语义分割等方面均展现出卓越性能。 3. **Deformable DETR** 基于端到端框架下的实例级识别问题解决方案之一便是 Deformable DETR 。该模型改进了原始DETR 中存在的收敛速度慢的问题 ,并通过可变形采样技术进一步提升了效率与精度平衡点 。 4. **Perceiver IO** Perceiver IO 扩展了常规感知器的能力边界至任意形态的数据类型转换操作之中去完成跨模态联合表征生成过程。这为未来探索更加统一化表达形式提供了新思路方向 。 #### 技术挑战与前景展望 尽管如此,当前仍面临诸多亟待解决的技术难题 :如何有效降低参数量的同时保持甚至超越现有水平?怎样才能让这类新型架构适应更多元化的应用场景需求呢? 可以预见的是,随着研究不断深入和技术持续进步,相信不久将来会有越来越多优秀成果涌现出来推动整个行业向前发展! ```python import torch from torchvision import transforms from timm.models.vision_transformer import vit_base_patch16_224 as create_model def load_vit(): model = create_model(pretrained=True) preprocess = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.5], std=[0.5]) ]) return model.eval(), preprocess model, transform = load_vit() dummy_input = torch.randn(1, 3, 224, 224) with torch.no_grad(): output = model(transform(dummy_input).unsqueeze(0)) print(output.shape) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

seasermy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值