| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【ViT 微调时关于position embedding如何插值(interpolate)的详解】 -> 正文阅读 |
|
[人工智能]【ViT 微调时关于position embedding如何插值(interpolate)的详解】 |
1. 问题描述
最近在读ViT相关的论文(ViT、DeiT、Swin Transformer),感觉看得比较细致,但ViT中有个细节我一直不太理解:就是在用高分辨率(high resolution)图像做微调时,作者在论文里说:保持patch size不变,直接把position embedding向量进行插值处理(interpolate),原文如下: 作者的意思是:当使用高分辨率(high resolution)图像对预训练好的ViT进行微调(fine-tuning)时,保持patch size( N ? N N*N N?N)不变(即每个patch中的像素数量不变),但由于image size( H ′ ? W ′ H'*W' H′?W′,且 H ′ = W ′ H'=W' H′=W′)变大了,则sequence length s n = H ′ / N s_n=H'/N sn?=H′/N 也相应变大了。而预训练好的position embedding是对原先低分辨率(low resolution)图像的位置编码(即原来的sequence length s o = H / N s_o=H/N so?=H/N),自然无法适应现在的新的sequence length s n s_n sn?。作者对此提出的解决方案是对原先的postion embedding进行2D的插值处理。 这我就很困惑了:position embedding是个1-D的向量,怎么做2D的插值呢?查了好久也没找到满意的解释,最后还是去看了torchvision中ViT的实现才明白怎么回事儿,其实很简单。 2. positional embedding如何interpolate我们用图来表示想做的事情: 如何把 s o s_o so?变成 s n s_n sn?呢?具体做法如下: 假设position_embedding_img的shape为 ( b , h , s o ) (b, h, s_o) (b,h,so?),其中 b b b为batch size,设置 b = 1 b=1 b=1。 h h h和 s o s_o so?的含义见上面的表格。
经过上述步骤,我们就将position_embedding_img的 ( b , h , s o ) (b, h, s_o) (b,h,so?)变成了position_embedding_img_new的 ( b , h , s n ) (b, h, s_n) (b,h,sn?)。示意图如下(这里设 b = 1 , h = 1 b=1,h=1 b=1,h=1): 3. 输入的sequence length改变了ViT还能正常前向推断?其实到了第二步就已经结束了,但可能有些人(包括我之前)还会有个疑问:之前我们预训练时输入给Transformer Encoder(即上图中红色圈出的部分)的tensor的shape为: ( b , s o , h ) (b, s_o, h) (b,so?,h),而如果使用高分辨率的img进行微调,那输入到Transformer Encoder的shape变成了: ( b , s n , h ) (b, s_n, h) (b,sn?,h),还可以前向推断吗?Transformer Encoder不需要改内部结构吗? 答案是不需要。原因在于微调时hidden dimension h h h的值没有变,为什么这么说呢?我们考虑下Transformer Encoder的内部结构,主要是多头自注意力(multi-head self-attention)和MLP。multi-head self-attention其实就是把输入切分成n个头,分别进行self-attention,然后再把结果concat起来,所以我们以单头自注意力、batch size=1为例,self-attention的大致流程为:
同理,Transformer Encoder中的MLP的input layer的神经元个数也是 h h h,和 s n s_n sn?无关。 即Transformer Encoder中参数只和hidden embedding的长度 h h h有关,和sequence length s o 、 s n s_o、s_n so?、sn?无关。 因此,即使我们输入Transformer Encoder的维度由 ( b , s o , h ) (b, s_o, h) (b,so?,h)变为 ( b , s n , h ) (b, s_n, h) (b,sn?,h),也不会影响ViT的前向推断过程。 如果想看Torchvision官方中关于interpolate代码的细节实现,我放在下面:
参考:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:33:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |