講得很基礎、
第二章以後大部分是Weaviate向量資料庫的操作API教學
RAG的部分講的不深、適合想學Weaviate操作的新手
如果對多模態基礎不了解的第一章可以看一下
Multimodal Embedding Models
Training Multimodal Models
Unify the Models Using Contrastive Learning
Understanding Contrastive Learning for Text。瞭解對比學習的概念,以文字為例
學習之前:
- 錨點(藍色)與正樣本(綠色)和負樣本(紅色)的位置
- 初始狀態下,錨點與正樣本和負樣本之間的距離可能不反映其實際的語義相似度
學習過程:
- 目標:調整嵌入,使錨點更靠近正樣本,遠離負樣本
- 機制:通常通過對比損失函數實現,該函數鼓勵減少錨點與正樣本之間的距離,同時增加錨點與負樣本之間的距離
學習之後:
- 錨點(藍色)現在更接近正樣本(綠色),且遠離負樣本(紅色)
- 模型已學會區分語義上相似和不相似的對,使其能更好地辨別相關和不相關的例子
Contrastive Loss Function。對比學習損失函素
Encoder (
):
- 功能:編碼器處理每張圖片 (
, , 和 ) 生成相應的嵌入 ( , , 和 )。 - 輸出:
Distance Function (
):
- 目的:測量兩個嵌入之間的相似性或不相似性。
- 計算的距離類型:
:錨點與正樣本之間的距離。 :錨點與負樣本之間的距離。 學習目標:
- 最小化
:
- 目標:減少錨點與正樣本嵌入之間的距離,使它們更相似。
- 最大化
:
- 目標:增加錨點與負樣本嵌入之間的距離,使它們更不相似。
Understanding Contrastive Learning for Multimodal Data
類似的概念拓展到多模態資料
圖-文配對。將圖-文配對相近的嵌入空間拉近、反之,則推遠
Text Encoder(文本編碼器):
- 輸入:一系列的文本輸入(如 "Pepper the aussie pup")
- 輸出:編碼後的文本表示
。 - 目的:將文本輸入轉換為數值向量表示,捕捉文本的語義。
Image Encoder(圖像編碼器):
- 輸入:一系列的圖像輸入(如狗的圖片)
- 輸出:編碼後的圖像表示
- 目的:將圖像輸入轉換為數值向量表示,捕捉圖像的視覺特徵
矩陣結構:
- 矩陣顯示每個編碼圖像
和每個編碼文本 之間的互動 - 矩陣中的每個單元格
代表圖像 和文本 之間的相似度或互動度量 目標是通過比較嵌入找到圖像和文本描述之間的最佳匹配。
在訓練過程中,模型被優化以最大化正確圖像-文本對的相似度得分,並最小化錯誤對的得分
Understanding the Contrastive Loss Function
嵌入生成:
表示通過函數 (例如圖像編碼器)對圖片進行編碼,生成查詢向量 。 表示通過函數 對圖片進行編碼,生成鍵值向量 。 損失函數
分子
: 表示查詢向量 與正樣本鍵值向量 的相似度,經過溫度參數 縮放 分母
: 包含了查詢向量 與所有鍵值向量(包括正樣本 和負樣本 )的相似度和
- 分母特別排除了正樣本自己
,更強調負樣本的對比 - 通過將正樣本的距離放在分母中,損失函數實際上是在計算錨點和正樣本之間相似度的相對機率。錨點和正樣本的相似度在所有樣本(包括正樣本和負樣本)中的比例
包含正樣本在分母中有助於在同一範圍內進行比較,使得優化過程更穩定,損失函數範圍在 (0,1) 之間,有助於梯度穩定。這樣的設計強調了相對相似度,而不是絕對相似度
: 溫度參數,控制相似度分佈的集中程度 目標是最小化損失函數
,即最大化查詢向量與正樣本鍵值向量之間的相似度,同時最小化與負樣本鍵值向量之間的相似度
核心程式碼
# The ideal distance metric for a positive sample is set to 1, for a negative sample it is set to 0
class ContrastiveLoss(nn.Module):
def __init__(self):
super(ContrastiveLoss, self).__init__()
self.similarity = nn.CosineSimilarity(dim=-1, eps=1e-7)
def forward(self, anchor, contrastive, distance):
# use cosine similarity from torch to get score
score = self.similarity(anchor, contrastive)
# after cosine apply MSE between distance and score
return nn.MSELoss()(score, distance) #Ensures that the calculated score is close to the ideal distance (1 or 0)
def train_model(epoch_count=10):#
net = Network()
lrs = []
losses = []
for epoch in range(epoch_count):
epoch_loss = 0
batches=0
print('epoch -', epoch)
lrs.append(optimizer.param_groups[0]['lr'])
print('learning rate', lrs[-1])
for anchor, contrastive, distance, label in tqdm(trainLoader):
batches += 1
optimizer.zero_grad()
anchor_out = net(anchor.to(device))
contrastive_out = net(contrastive.to(device))
distance = distance.to(torch.float32).to(device)
loss = loss_function(anchor_out, contrastive_out, distance)
epoch_loss += loss
loss.backward()
optimizer.step()
losses.append(epoch_loss.cpu().detach().numpy() / batches)
scheduler.step()
print('epoch_loss', losses[-1])
# Save a checkpoint of the model
checkpoint_path = os.path.join(checkpoint_dir, f'model_epoch_{epoch}.pt')
torch.save(net.state_dict(), checkpoint_path)
return {
"net": net,
"losses": losses
}
encoded_data = []
labels = []
with torch.no_grad():
for anchor, _, _, label in tqdm(trainLoader):
output = model(anchor.to(device))
encoded_data.extend(output.cpu().numpy())
labels.extend(label.cpu().numpy())
encoded_data = np.array(encoded_data)
labels = np.array(labels)
Reduce Dimensionality of Data: 64d -> 3d
pca = PCA(n_components=3)
encoded_data_3d = pca.fit_transform(encoded_data)
Interactive Scatter Plot in 3d – with PCA
scatter = go.Scatter3d(
x=encoded_data_3d[:, 0],
y=encoded_data_3d[:, 1],
z=encoded_data_3d[:, 2],
mode='markers',
marker=dict(size=4, color=labels, colorscale='Viridis', opacity=0.8),
text=labels,
hoverinfo='text',
)
# Create layout
layout = go.Layout(
title="MNIST Dataset - Encoded and PCA Reduced 3D Scatter Plot",
scene=dict(
xaxis=dict(title="PC1"),
yaxis=dict(title="PC2"),
zaxis=dict(title="PC3"),
),
width=1000,
height=750,
)
mapper = umap.UMAP(random_state=42, metric='cosine').fit(encoded_data)
umap.plot.points(mapper, labels=labels);
…
後面章節大部分是Weaviate向量資料庫的操作API教學,揀選一些概念性的投影片放上
…
vector search
Multivector Recommender Systems
Specialized Embedding Models
對比學習設計
公式
分子(正樣本間的相似度):
分母(負樣本間的相似度):
對數和負號:
直觀理解