---
slideOptions:
transition: slide
---
# SigLIP論文解析
<!-- Put the link to this slide here so people can follow -->
Sigmoid Loss for Language Image Pre-Training
---
## 為何提出?
1. CLIP中的Softmax loss的計算量大、多GPU下浪費記憶體空間
2. CLIP訓練所需Batch size大,需要更多GPU
---
以下是[CLIP](https://arxiv.org/pdf/2103.00020)的pseudo code
<font size=3>與SigLIP原文中方法3.1公式一致</font>
``` python
#1.將Batch中的圖片-文字對進行編碼
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder (T) #[n, d_t]
#2.L2正規化統一範圍
#joint multimodal embedding [n, d_e]
I_e = 12_normalize(np.dot(I_f, W_i), axis=1)
T_e = 12_normalize(np.dot(T_f, W_t), axis=1)
#3.比對[n, n]矩陣內所有元素的餘弦相似度,計算出相似度矩陣
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
#4.對每一行(圖像)每一列(文本)為錨點做Cross Entropy loss
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2
```
----
其中第三步[n, n],這個矩陣包含了所有可能的圖像-文本配對的相似度得分,這就導致計算Cross Entropy時其中的softmax必須歷遍整個矩陣,複雜度$O(n^2)$

---
## Siglip loss
---
以下是Siglip在計算loss部分的pseudo code
```python
# img_emb :Image model embedding [n, dim]
# txt_embA :text model embedding [n, dim]
# t_prime, b : learnable temperature and bias
# n :mini-batch size
t = exp(t_prime)
zimg = l2_normalize(img_emb)
ztxt = l2_normalize(txt_emb)
logits = dot(zimg, ztxt.T) * t + b #計算相似度
labels = 2 * eye(n)- ones(n) #創建一個1,-1的對角矩陣
l =-sum(log_sigmoid(labels * logits)) / n # 計算sigmoid取log
```
----
對角矩陣正的部分,對應到的圖文在資料集內一定是互相匹配的,即正樣本一定是1,負樣本都是-1,對於模型而言,變成只需要獨立判斷每個圖文對是正是負的二分類問題,不需要去理會其他樣本的概率

----
$L = - \frac{1}{|B|} \sum_{i=1}^{|B|} \sum_{j=1}^{|B|} \log \left( \frac{1}{1 + e^{z_{ij}(-t x_i \cdot y_j + b)}} \right)$
* $-t x_i \cdot y_j + b:$計算正負相似度,b設計用於緩解初期負樣本過多的情況,t用於調整決策邊界的清晰度
* $z_{ij}$ 是標籤,如果第 $i$ 個圖像和第 $j$ 個文本是匹配的(即 $i=j$),則 $z_{ij} = 1$,否則 $z_{ij} = -1$
* $\log \left( \frac{1}{1 + e^{z_{ij}(-t x_i \cdot y_j + b)}} \right)$ 計算log Sigmoid
---
## 為什麼SigLip能提升分散式運算效能?
傳統對比式學習方法多採用data parallelism,將批次內的圖文分散到不同GPU,GPU上有相同的模型計算embeddings

----
* 計算Loss並更新時,因為需要計算整個批次內所有的圖文相似度,會採用All-Gather蒐集每個GPU上的embeddings
* [All gather](https://blog.csdn.net/cy413026/article/details/138618053):所有的數據要讓所有裝置知道
* 每個GPU記憶體需要$(batch大小)^2$
* 傳輸成本高,記憶體效率低下

----
將一個Batch根據裝置數量分成多個小塊,優先計算含有正樣本的塊的loss

----
接著交換資料,直到所有圖文對皆計算完畢

---
## 實驗結果
1. Batch size對 SigLit(Siglip+Vit)影響
2. Siglip vs CLIP
3. mSigLIP:多語言預訓練
4. 使用四個 TPU-v4 晶片訓練SigLiT
5. 使用少量 TPU-v4 晶片預訓練SigLIP
6. 提升參數量
7. 穩定大規模批次訓練
8. Sigmoid loss 中的負樣本比例
9. Bias消融實驗
10. 標籤雜訊寬容度
---
### 1.Batch size對 SigLit影響
Vit在18B資料集上訓練,batch size 16K前Sigmoid準確度高於softmax,於32K飽和

---
### Siglip vs CLIP
WebLI資料集上預訓練SigLIP模型,與CLIP比較
SigLIP在32k時表現最佳,而Softmaxloss需要 98k才能收斂

---
### mSigLIP:多語言預訓練
* WebLI資料集上100種語言30B資料量,超過32k會導致性能下降

----
* 使用「瓶頸」式 embedding,在[詞彙表的大小,嵌入維度]矩陣中引入一個K,K<嵌入維度,表示投影回 W 維的空間
* 將高維度的詞彙表壓縮到一個低維度的「瓶頸」中,然後擴展回原始的維度
* 減少儲存參數量
* 將瓶頸維度 K 設置為 96,相較於使用完整的 250k 詞彙表,在 ImageNet zero-shot 遷移上的效能下降約僅為 0.5%
---
### 使用四個 TPU-v4 晶片訓練SigLiT
<font size=4>.
| 設定項目 | 第一次實驗 | 第二次實驗 |
| -------------- | ----------------------------------------- | ----------------------------------------- |
| **視覺塔模型** | **公開可用的 ViT-AugReg-B/8** (**凍結**) | **ViT-g/14** (**凍結**) |
| **預計算圖像 Embedding** | **使用與 LiT 相同的方法** | **使用與 LiT 相同的方法** |
| **文本塔模型** | **Large Transformer (12 層)** | **Large Transformer (24 層)** |
| **優化器** | **LION** | **LION** |
| **權重衰減** | **1 × 10⁻⁷ (解耦)** | **1 × 10⁻⁷ (解耦)** |
| **學習率排程** | **線性 warm-up (6.5k 步)** 至 **1 × 10⁻⁴**,接續 **餘弦衰減** 至 0 | **線性 warm-up (未明確說明)** 至 **峰值學習率 (未明確說明)**,接續 **餘弦衰減** 至 0 |
| **總訓練步數** | **65,000 步** | **107,000 步** |
| **批次大小** | **32k** | **20k** |
| **訓練天數** | **約一天** | **不到兩天** |
| **ImageNet 0-shot 準確率** | **79.7%** | **84.5%** |
</font>
---
### 使用少量 TPU-v4 晶片預訓練SigLIP
* ViT-AugReg-B/16,在2B大小的 WebLI 英文資料上進行微調,比較直接微調與禁用預訓練權重
----
結果:直接微調預訓練模型的效果不佳,但訓練中禁用預訓練權重的 weight decay提升了 SigLIP 的效能

----
* 改進後,SigLIP 在 16 個 TPU-v4 晶片上以 16k 的批次大小訓練三天,71% 的 ImageNet zero-shot 準確率
* 32 個 TPUv4 晶片上僅用兩天完全訓練就達到了 72.1% 的 ImageNet zero-shot 準確率

---
### Sigmoid Loss 中的負樣本比例
* 使用 Sigmoid Loss,容易產生負樣本比例過多的問題,例如,在一個大小為 16k 的批次中,每個正樣本對會對應到 2.68 億個負樣本對
* 通過遮蔽(忽略)足夠的負樣本來模擬不同的「正樣本:負樣本」比例所獲得的分數
----
* 隨機(Random)
* 保留困難負樣本 (Hard):只保留最容易判斷錯誤的負樣本對
* 保留簡單負樣本 (Easy):只保留最容易判斷正確的負樣本對
* 保留困難負樣本並匹配總樣本數 (Hard + matching total pairs seen):確保訓練過程中模型見過的總樣本對數量與不遮蔽的情況相近,增加等比例的訓練的步數
----
* 隨機:性能下降,減少負樣本的數量不可行
* 保留簡單負樣本:幾乎完全無效
* 保留困難負樣本:幾乎相同,真正有易的資料是負樣本,,比例的不平衡似乎並不是一個主要的性能瓶頸
* 保留困難負樣本並匹配總樣本數:有所提升,效挖掘困難負樣本加強訓練是一個方向

---
* 穩定大規模批次訓練:較大批次大小訓練不穩定, 調整Adam 和 AdaFactor 的 β2即可改善
* 擴展 SigLIP 和 mSigLIP:透過「過度訓練」模型來擴展的效能, 提高image patches 與64 text tokens數量以提升模型效能
* Bias消融實驗:啟用偏差項並將其初始化為 -10 可以持續改善準確率
* 標籤雜訊寬容度:引入不同類型的雜訊,結果使用Sigmoid loss 訓練的模型抗雜訊能力更強