ViT的若干細節

之前只看了ViT的大概結構,具體的模型細節和代碼實現知之甚少。隨著ViT逐漸成為CV領域的backbone,有必要重新審視下。

ViT

patch -> token

為了將圖片處理成序列格式,很自然地想到將圖片分割成一個個patch,再把patch處理成token。

patch

假設圖片大小為 224 × 224 × 3 224 \times 224 \times 3 224×224×3 (即 H × W × C H \times W \times C H×W×C ),每個patch大小為 16 × 16 × 3 16 \times 16 \times 3 16×16×3,那么序列長度就是 196 196 196,序列的形狀是 196 × 768 196 \times 768 196×768

如何將大小為 16 × 16 × 3 16 \times 16 \times 3 16×16×3 的patch,映射為 768 768 768 維的token?源碼是直接將其reshape

在reshape之后,還需要過一層 768 × 768 768 \times 768 768×768的embedding層。因為reshape后的 768 768 768維向量是參數無關的,不參與梯度更新,過完embedding層,即擁有了token embedding的語義信息。

處理成patch的好處
  • 減少計算量:如果按照pixel維度計算self-attention,那復雜度大大增加。patch size越大,復雜度越低。stable diffusion也是這個思路,在latent space進行擴散,而不是pixel
  • 減少圖像冗余信息:圖像是有大量冗余信息的,處理成patch不影響圖片語義信息

position embedding

論文采用的是可學習式位置編碼,跟bert類似,初始化一個可學習的1-d參數向量

其它的位置編碼方案結果對比:
pos

個人感覺2-d位置編碼更make sense,它保留了patch之間的空間位置關系,跟CNN類似。直接粗暴地拉平成一維序列,則丟棄了這種空間信息。

實驗結果

exp

在相同的數據集JFT-300M上預訓練后,ViT在所有的下游任務上,都超過了BiT。值得注意的是,準確率上提升不大,但訓練時間大為縮短。

可能是基于Transformer架構的VIT,和卷積神經網絡相比,更適合做切分均勻的矩陣計算,這樣我們就能把參數均勻切到不同卡上做分布式訓練,更好利用GPU算力,提升訓練效率。

但transformer架構有個獨門絕技,那就是大力出奇跡。數據量越大,模型參數越多,任務效果就越好。下圖就是證明:

exp

ViT學習到空間局部性了嗎?

local

可以看到,每個patch除了跟自己最相似外,其與周圍的patch相關性高于距離較遠的patch。這就說明ViT通過位置編碼,已經學到了一定的空間局部性。

總結

  • ViT證明了Transformer架構在CV領域的可行性,以后Transformer將大一統各領域。NLP的成功經驗非常有潛力遷移到CV領域,比如scaling law,大數據+大模型的范式將開拓出CV的新一片天地。
    • 大數據+大模型真的是既無腦又有效,通過這種方式讓Transformer自己去學習到特定領域的歸納偏置。可以說Transformer下限比CNN低,但上限又是CNN無法企及的。

參考

  • 再讀VIT,還有多少細節是你不知道的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717051.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717051.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717051.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mysql整理-主從復制

MySQL的主從復制是一種常見的數據復制和分布式數據共享方法。在這種架構中,一個MySQL服務器充當主(master)服務器,而一個或多個其他MySQL服務器充當從(slave)服務器。數據從主服務器復制到從服務器,實現數據的分布和備份。這種設置主要用于數據備份、讀取擴展、災難恢復…

Python系列(20)—— 循環語句

Python中的循環控制語句 一、引言 在Python編程中,循環是重復執行一段代碼直到滿足特定條件的基本結構。Python提供了多種循環控制語句,如For 和While ,以及用于控制循環流程的輔助語句,如Break、Continue和Pass。這些語句的組合…

SpringBoot緩存

目錄 緩存支持 緩存集成 redis緩存集成 緩存支持 Spring 框架只提供抽象,不提供具體的緩存存儲,底層需要依賴第三方存儲組件,如果當前應用沒有注冊CacheManager 或者 CacheResolver 實例,Spring Boot 會按以下緩存組件的順序來…

[藍橋杯 2020 省 B1] 整數拼接

一、題目描述 P8712 [藍橋杯 2020 省 B1] 整數拼接 二、題目簡析 我們選兩個數 a a a 和 b b b,用 f ( a , b ) f(a, b) f(a,b) 表示 a a a 在前、 b b b 在后的拼接,即 f ( a , b ) a ? 1 0 b . s i z e b f(a, b) a * 10^{b.size} b f(a,…

Linux學習:初始Linux

目錄 1. 引子:1.1 簡述:操作系統1.2 學習工具 2. Linux操作系統中的一些基礎概念與指令2.1 簡單指令2.2 ls指令與文件2.3 cd指令與目錄2.4 文件目錄的新建與刪除指令2.5 補充指令1:2.6 文件編輯與拷貝剪切2.7 文件的查看2.8 時間相關指令2.9 …

洛谷P1256 顯示圖像

廣搜練手題 題目鏈接 思路 打印每個數與其最近的 1 1 1的曼哈頓距離&#xff0c;顯然廣搜&#xff0c;存儲每一個 1 1 1&#xff0c;針對每一個 1 1 1開始廣搜&#xff0c;逐層更新&#xff0c;每輪后更新的為兩輪之中的最小曼哈頓距離 ACcode #include<bits/stdc.h>…

波動數列(藍橋杯)

問題描述&#xff1a; 觀察如下數列&#xff1a; 1 3 0 2 -1 1 -2 … 這個數列中后一項總是比前一項增加 2 或者減少 3。 棟棟對這種數列很好奇&#xff0c;他想知道長度為 n nn 和為 s ss 而且后一項總是比前一項增加 a aa 或者減少 b bb 的整數數列可能有多少種呢&#xff1f…

非專業程序員常用vscode插件

牙叔教程 簡單易懂 我常用的腳本語言是js, python. AutoHotkey v2 Language Support vscode-autohotkey-debug 由于工作有寫重復, 要用到autohotkey, 所以裝這個插件 Black Formatter 格式化python代碼 Bookmarks 書簽 change-case 命名方式: 小駝峰, 下劃線, 等命名風格轉…

【網站項目】202物流管理系統

&#x1f64a;作者簡介&#xff1a;擁有多年開發工作經驗&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。&#x1f339;贈送計算機畢業設計600個選題excel文件&#xff0c;幫助大學選題。贈送開題報告模板&#xff…

不會代碼的時候,如何使用Jmeter完成接口測試

1.接口測試簡介 接口測試是測試系統組件間接口的一種測試。接口測試主要用于檢測外部系統與系統之間以及內部各個子系統之間的交互點。測試的重點是要檢查數據的交換&#xff0c;傳遞和控制管理過程&#xff0c;以及系統間的相互邏輯依賴關系等。 2.接口測試流程 接口測試的…

【貪玩巴斯】VisualStudio+Github聯合工作指令

實現在本地VisualStudio進行代碼改寫&#xff0c;同時上傳Github和項目組成員實時更新代碼。 格式指令&#xff1a; alt z ctrl shift p后 輸入 wordwrap —— 進行格式排盤&#xff08;在一頁中能夠完全顯示&#xff0c;代碼會自動換行&#xff09; git pull origin mast…

2024.3.1 小項目

1、機械臂 #include <myhead.h> #define SER_IP "192.168.125.32" //服務器端IP #define SER_PORT 8888 //服務器端端口號#define CLI_IP "192.168.68.148" //客戶端IP #define CLI_PORT 9999 /…

串的BF算法(樸素查找算法)

串的模式匹配&#xff1a;在主串str的pos位置查找子串sub&#xff0c;找到返回下標&#xff0c;沒有找到返回-1。 1.BF算法思想 相等則繼續比較&#xff0c;不相等則回退&#xff1b;回退是i退到剛才位置的下一個&#xff08;i-j1&#xff09;;j退到0&#xff1b;利用子串是否…

Python matplotlib

目錄 1、安裝 matplotlib 2、繪制折線圖 修改標簽文字和線條粗細 校正圖形 3、繪制散點圖 繪制單點 繪制一系列點 自動計算數據 刪除數據點的輪廓 自定義顏色 使用顏色映射 自動保存圖表 4、隨機漫步 創建 RandomWalk() 類 選擇方向 繪制隨機漫步圖 給點著色 …

最簡單的ubuntu遠程桌面方法

最簡單的ubuntu遠程桌面方法 部署環境&#xff1a;Ubuntu 20.04 LTS 現在最常用的遠程控制Linux系統的方法是通過XRDP、VNC等&#xff0c;但是安裝配置過程繁瑣復雜&#xff0c;經常出現各種問題導致連接失敗&#xff0c;另外一方面延遲較高&#xff0c;操作卡頓。 經過我堅…

【Java項目介紹和界面搭建】拼圖小游戲——鍵盤、鼠標事件

&#x1f36c; 博主介紹&#x1f468;?&#x1f393; 博主介紹&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高興認識大家~ ?主攻領域&#xff1a;【滲透領域】【應急響應】 【Java】 【VulnHub靶場復現】【面試分析】 &#x1f389;點贊?評論?收藏 …

DDS數據分發服務——提升汽車領域數據傳輸效率

1.引言 隨著智能化技術的快速發展&#xff0c;汽車行業正經歷著一場革命性的變革。如今的分布式系統變得越來越復雜且龐大&#xff0c;對網絡通信基數要求在功能和性能層面越來越高。數據分發服務&#xff08;DDS&#xff09;作為一項先進的數據傳輸解決方案&#xff0c;在汽車…

2369. 檢查數組是否存在有效劃分(動態規劃)

2024-3-1 文章目錄 [2369. 檢查數組是否存在有效劃分](https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/)思路&#xff1a;代碼&#xff1a; 2369. 檢查數組是否存在有效劃分 思路&#xff1a; 1.狀態定義:f[i]代表考慮將[0,i]是否能被有效劃…

電腦要用多少V的電源?電腦電源輸入電壓是市電

臺式電源的輸出電壓是多少&#xff1f; 電腦電源輸出一般有三種不同的電壓&#xff0c;分別是&#xff1a; 12V、5V、3.3V。 電腦電源負責給電腦配件供電&#xff0c;如CPU、主板、內存條、硬盤、顯卡等&#xff0c;是電腦的重要組成部分。 工作電流根據不同的硬件及其使用狀…

LeetCode15:三數之和

題目描述 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請 你返回所有和為 0 且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的三元組…