AI時代系列(2) 機器學習三部曲: 🔹 第二部:《深度學習 —— 神經網路的革命》
80/100 第八週:📌 自監督學習與預訓練技術 🔁
80.小結與測驗:SimCLR 處理 CIFAR-10 🧪 只靠資料自己學會分類!
🧠 單元重點小結(71~79 課)
71 🔧 自監督學習 ➜ 不需標註,讓模型從原始資料中學出結構與規律
72 🔍 對比學習 ➜ 透過「相似 vs 不相似」資料對學習語意區分能力
73 📸 SimCLR / MoCo ➜ SimCLR:大批次對比損失;MoCo:小批次+記憶庫策略
74 👯♀️ BYOL / DINO ➜ 不用負樣本,靠模仿與自我蒸餾學到語意特徵
75 🤓 NLP 中自監督應用 ➜ 遮蔽、打亂、排序等任務,訓練語言結構感知能力
76 🧠 多模態預訓練 ➜ CLIP 用對比學圖文對應,Flamingo 理解+生成皆可
77 📈 資料擴充與對比組合 ➜ 擴充樣本多樣性、用挑戰性樣本增強模型辨別力
78 🔎 SSL + Few-shot ➜ 通用語意預訓練 + 少量標註資料完成任務適應
79 🏥💰 醫療與金融應用 ➜ 用無標註影像或時間序列學出關鍵特徵與異常事件
________________________________________
✅ 單選題(含解析)
1️⃣ 自監督學習(SSL)最主要的特點是什麼?
A. 只能用圖像資料進行訓練
B. 需人工標註大量資料
✅ C. 可從未標註資料中自動產生學習任務
D. 僅適用於分類問題
📘 解析:
自監督學習的核心特點在於「不依賴人工標註」,模型能從資料中產生預測任務(如遮蔽、排序、對比等)進行學習,廣泛應用於 NLP、CV 等多種任務。
________________________________________
2️⃣ 下列哪一種技術主要透過「拉近正樣本、拉遠負樣本」進行訓練?
A. Masked Language Modeling
B. Encoder-Decoder Attention
✅ C. 對比學習(Contrastive Learning)
D. 生成對抗網路(GAN)
📘 解析:
對比學習(如 SimCLR、MoCo、CLIP)是一種透過設計正負樣本對(如圖像增強或語句配對)來讓模型學會語意邊界的方法。
________________________________________
3️⃣ CLIP 模型的主要應用能力是哪一項?
A. 圖像超解析重建
B. 語音辨識
✅ C. 圖文語意對齊與零樣本分類
D. 多語翻譯與摘要
📘 解析:
CLIP 使用圖像與文字的對比學習,學出共享語意空間,因此可以直接用文字提示進行「零樣本圖像分類」與「語意搜尋」。
________________________________________
4️⃣ DINO 模型有何獨特特性?
A. 使用遮蔽預測處理時間序列
B. 僅可處理單一模態資料
✅ C. 能學出物體邊界而不需標註資料
D. 為生成式對話模型架構
📘 解析:
DINO 是一種自蒸餾的自監督學習方法,特別適用於 Vision Transformer,在未提供任何標籤的情況下也能自動學出語意邊界,常用於無監督圖像分割與檢索。
________________________________________
5️⃣ 哪個組合最適合應用在資料稀少但需高準確率的場景(如醫療或金融)?
A. GAN + 強化學習
B. 預訓練 + 多任務學習
✅ C. 自監督預訓練 + 少樣本學習
D. 隨機森林 + PCA 壓縮
📘 解析:
在資料稀缺、高準度需求的場景中,先透過自監督方法從大量無標註資料中學到語意特徵,再以少量標註資料進行微調,是目前主流且實用的解法。
________________________________________
🧠 問答題(含建議解答)
❓ 問題 1:請說明為什麼自監督學習可以提升少樣本學習的效果?
✅ 建議答案:
自監督學習能在大量未標註資料中學出強大的語意表示,這些表示提供了良好的初始化特徵空間。當面對標註樣本稀少的任務時,模型能快速遷移並適應,避免過度依賴訓練集,達成少樣本學習的目標。
________________________________________
❓ 問題 2:CLIP 是如何同時理解文字與圖像的?這在應用上有什麼好處?
✅ 建議答案:
CLIP 使用一對圖像與文字說明,經由圖像編碼器與文字編碼器輸出嵌入向量,再透過對比學習(拉近配對、推遠不匹配)建立跨模態語意空間。
應用上可做零樣本圖像分類、圖片語意檢索、文字找圖等任務,突破標註限制。
________________________________________
❓ 問題 3:資料擴充與對比樣本如何強化模型的泛化與魯棒性?
✅ 建議答案:
資料擴充可模擬現實中的輸入變異,讓模型學會處理不完整或雜訊資料;對比樣本則引導模型精細學出語意邊界,透過 hard negatives 進一步強化辨識力。兩者結合可顯著提升模型在未知情境下的穩定表現。
________________________________________
🧪 實作示範:SimCLR 處理 CIFAR-10(簡化版)
📦 安裝依賴
pip install torchvision torch numpy matplotlib
________________________________________
🧱 資料處理 + 增強
import torchvision.transforms as T
from torchvision.datasets import CIFAR10
from torch.utils.data import DataLoader
# 對比學習的增強(SimCLR方式)
simclr_transform = T.Compose([
T.RandomResizedCrop(32),
T.RandomHorizontalFlip(),
T.ColorJitter(0.4, 0.4, 0.4, 0.1),
T.RandomGrayscale(p=0.2),
T.ToTensor()
])
# 載入 CIFAR10 並自動產生正樣本對
class SimCLRDataset:
def __init__(self, dataset):
self.dataset = dataset
def __getitem__(self, idx):
x, _ = self.dataset[idx]
return simclr_transform(x), simclr_transform(x) # 兩個增強版本
def __len__(self):
return len(self.dataset)
train_set = CIFAR10(root="./data", train=True, download=True)
train_loader = DataLoader(SimCLRDataset(train_set), batch_size=128, shuffle=True)
________________________________________
🧠 模型架構(簡單版)
import torch.nn as nn
import torchvision.models as models
class SimCLRNet(nn.Module):
def __init__(self, projection_dim=128):
super().__init__()
self.backbone = models.resnet18(pretrained=False)
self.backbone.fc = nn.Identity()
self.projector = nn.Sequential(
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, projection_dim)
)
def forward(self, x):
h = self.backbone(x)
z = self.projector(h)
return z
________________________________________
🎯 NT-Xent 對比損失(簡化)
python
import torch
import torch.nn.functional as F
def nt_xent_loss(z1, z2, temperature=0.5):
z1 = F.normalize(z1, dim=1)
z2 = F.normalize(z2, dim=1)
representations = torch.cat([z1, z2], dim=0)
similarity_matrix = torch.matmul(representations, representations.T)
# 正樣本在對角的 offset 位置
batch_size = z1.shape[0]
labels = torch.cat([torch.arange(batch_size) + batch_size, torch.arange(batch_size)], dim=0).to(z1.device)
logits = similarity_matrix / temperature
mask = ~torch.eye(2 * batch_size, dtype=bool).to(z1.device)
logits = logits.masked_select(mask).view(2 * batch_size, -1)
return F.cross_entropy(logits, labels)
________________________________________
✅ 訓練流程(示意)
python
model = SimCLRNet().cuda()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
for epoch in range(10):
for x1, x2 in train_loader:
x1, x2 = x1.cuda(), x2.cuda()
z1, z2 = model(x1), model(x2)
loss = nt_xent_loss(z1, z2)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"Epoch {epoch}: Loss = {loss.item():.4f}")
這段簡化版的程式碼示範了如何使用 PyTorch 實作 SimCLR 自監督對比學習流程,以 CIFAR-10 為訓練資料,從未標註圖像中學習通用表徵:
首先透過 torchvision.transforms 建立 SimCLR 常用的資料增強方式(隨機裁切、顏色抖動、灰階等),並對每張圖像產生兩個不同視角作為正樣本對;接著定義 SimCLRDataset 類別以供 DataLoader 載入。
模型部分使用 ResNet-18 作為主幹(backbone),並移除原本的分類層,接上三層投影網路(projector)將特徵壓縮至 128 維的表示空間。
NT-Xent 損失函數的實作中,將兩組特徵 z1、z2 正規化後合併計算餘弦相似度,建構出一個 similarity matrix,然後透過交叉熵損失函數訓練模型學會拉近正樣本、推遠負樣本。
最後進入訓練流程:每一個 epoch 中,模型會對增強後的圖像對做前向傳播並計算損失,再進行梯度更新。整體過程可在無標註資料的情況下學出具有語意結構的影像表示,為分類、檢索、聚類等下游任務奠定基礎。
________________________________________
📚 小結:
• SimCLR 透過資料增強 + 對比損失學出語意表示
• 無需任何標籤,即可訓練出分類能力優良的 backbone
• 結合 Linear probing 或 kNN 分類,即可用於 CIFAR-10 分類任務