對比學習(Contrastive Learning)方法詳解

對比學習(Contrastive Learning)方法詳解

對比學習(Contrastive Learning)是一種強大的自監督或弱監督表示學習方法,其核心思想是學習一個嵌入空間,在這個空間中,相似的樣本(“正樣本對”)彼此靠近,而不相似的樣本(“負樣本對”)彼此遠離。

核心概念

  • 目標: 學習數據的通用、魯棒、可遷移的表示(通常是向量/嵌入),而不需要大量的人工標注標簽。

  • 核心思想: “通過對比來學習”。模型通過比較數據點之間的異同來理解數據的內在結構。

  • 關鍵元素:

    • 錨點樣本(Anchor): 一個查詢樣本。

    • 正樣本(Positive Sample): 與錨點樣本在語義上相似或相關的樣本(例如,同一張圖片的不同增強視圖、同一個句子的不同表述、同一段音頻的不同片段)。

    • 負樣本(Negative Sample): 與錨點樣本在語義上不相似的樣本(例如,來自不同圖片、不同句子、不同音頻的樣本)。

    • 編碼器(Encoder): 一個神經網絡(如ResNet, Transformer),將輸入數據(圖像、文本、音頻等)映射到低維嵌入空間 f ( x ) → z f(x) \to z f(x)z

    • 相似度度量(Similarity Metric): 通常是余弦相似度 s i m ( z i , z j ) = ( z i ? z j ) / ( ∣ ∣ z i ∣ ∣ ? ∣ ∣ z j ∣ ∣ ) sim(z_i, z_j) = (z_i · z_j) / (||z_i|| \cdot ||z_j||) sim(zi?,zj?)=(zi??zj?)/(∣∣zi?∣∣?∣∣zj?∣∣) 或點積 s i m ( z i , z j ) = z i ? z j sim(z_i, z_j) = z_i \cdot z_j sim(zi?,zj?)=zi??zj?,用于衡量兩個嵌入向量在嵌入空間中的接近程度。

  • 基本流程:

    1. 對輸入數據應用數據增強,生成不同的視圖(對于圖像:裁剪、旋轉、顏色抖動、模糊等;對于文本:同義詞替換、隨機掩碼、回譯等;對于音頻:時間拉伸、音高偏移、加噪等)。

    2. 使用同一個編碼器 f ( ? ) f(\cdot) f(?) 處理錨點樣本 x x x及其正樣本 x + x^+ x+(通常是 x x x的一個增強視圖),得到嵌入向量 z z z z + z^+ z+

    3. 從數據集中采樣或使用內存庫/當前批次中獲取一組負樣本 x 1 ? , x 2 ? , . . . , x K ? {x^-_1, x^-_2, ..., x^-_K} x1??,x2??,...,xK??,并通過 f ( ? ) f(\cdot) f(?)得到對應的負嵌入向量 z 1 ? , z 2 ? , . . . , z K ? {z^-_1, z^-_2, ..., z^-_K} z1??,z2??,...,zK??

    4. 計算錨點 z z z與正樣本 z + z^+ z+的相似度(應高),以及與每個負樣本 z k ? z^-_k zk??的相似度(應低)。

    5. 定義一個對比損失函數(如InfoNCE)來最大化 z z z z + z^+ z+ 之間的相似度,同時最小化 z z z和所有 z k ? z^-_k zk?? 之間的相似度。

    6. 通過優化這個損失函數來更新編碼器 f ( ? ) f(\cdot) f(?)的參數,使得相似的樣本在嵌入空間中聚集,不相似的樣本分離。

核心原理

對比學習的有效性建立在幾個關鍵原理之上:

  • 不變性學習: 通過對同一數據點的不同增強視圖(正樣本對)施加高相似度約束,編碼器被迫學習對這些增強變換保持不變的特征(即數據的內在語義內容)。例如,一只貓的圖像無論怎么裁剪、旋轉、變色,編碼器都應將其映射到相似的嵌入位置。

  • 判別性學習: 通過將錨點與眾多不同的負樣本區分開來,編碼器被迫學習能夠區分不同語義概念的特征。這有助于模型捕捉細微的差異,避免學習到平凡解(例如,將所有樣本映射到同一個點)。

  • 最大化互信息: InfoNCE 損失函數(見下文)被證明是在最大化錨點樣本 x x x與其正樣本 x + x^+ x+的嵌入 z z z z + z^+ z+之間的互信息的下界。這意味著模型在學習捕捉 x x x x + x^+ x+之間共享的信息(即數據的本質內容)。

  • 避免坍縮(Collapse): 對比學習面臨的一個主要挑戰是模型可能找到一個“捷徑解”,將所有樣本映射到同一個嵌入向量(坍縮到一個點)。負樣本的存在、特定的損失函數設計(如 InfoNCE的分母項)、架構技巧(如預測頭、非對稱網絡、動量編碼器)都旨在防止這種坍縮。

關鍵損失函數

對比學習有多種損失函數形式,它們共享相同的目標,但在數學表述和側重點上有所不同。

Contrastive Loss (成對損失/邊界損失)

  • 目標: Contrastive Loss 是對比學習中最基礎的損失函數,處理成對樣本(正樣本對 / 負樣本對),通過距離度量(歐氏距離或余弦相似度)約束特征空間的結構。

  • 公式:
    L c o n t r a s t i v e = y i j ? d ( f ( x i ) , f ( x j ) ) 2 + ( 1 ? y i j ) ? m a x ( 0 , m a r g i n ? d ( f ( x i ) , f ( x j ) ) ) 2 \mathcal{L}_{contrastive}=y_{ij}\cdot d(f(x_i), f(x_j))^2+(1-y_{ij})\cdot max(0, margin-d(f(x_i), f(x_j)))^2 Lcontrastive?=yij??d(f(xi?),f(xj?))2+(1?yij?)?max(0,margin?d(f(xi?),f(xj?)))2

    • d ( ? , ? ) d(\cdot, \cdot) d(?,?) 是距離度量(如歐氏距離)。
    • margin 是一個超參數,強制執行正負樣本對之間的最小差異。它定義了正負樣本對在嵌入空間中應保持的最小“安全距離”。
  • 特點:

    • 非常直觀,直接體現了對比學習的基本思想(拉近正對,推遠負對)。
    • 正樣本對( y i j = 1 y_{ij}=1 yij?=1):鼓勵特征距離盡可能小(趨近于 0)。
    • 負樣本對( y i j = 0 y_{ij}=0 yij?=0):若當前距離小于margin,則施加懲罰,迫使距離超過margin;若已大于margin,則不懲罰。
    • 缺點:僅考慮成對關系,當負樣本對距離遠大于m時,梯度消失,學習效率低。

Triplet Loss (三元組損失)

  • 目標: 明確要求錨點到正樣本的距離比到負樣本的距離小至少一個邊界 margin。

  • 公式 (使用距離):
    L t r i p l e t = m a x ( 0 , d ( z , z + ) ? d ( z , z ? ) + m a r g i n ) \mathcal{L}_{triplet} = max(0, d(z, z^+) - d(z, z^-) + margin) Ltriplet?=max(0,d(z,z+)?d(z,z?)+margin)

  • 特點:

  • 每次顯式地處理一個三元組(錨點、正樣本、負樣本)。

  • 對負樣本采樣敏感,特別是對“半困難”負樣本(那些距離錨點比正樣本遠,但又在 margin 邊界附近的負樣本)能提供最有價值的梯度。

  • 在大規模數據集上,如何高效挖掘有意義的(半)困難三元組是一個挑戰。

InfoNCE (Noise-Contrastive Estimation) Loss (噪聲對比估計損失,NT-Xent Loss)

  • 目標: 源于噪聲對比估計(NCE),將對比學習轉化為多分類問題:給定一個錨點 x x x,從包含一個正樣本 x + x^+ x+ 和 K 個負樣本 x 1 ? , . . . , x K ? {x^-_1, ..., x^-_K} x1??,...,xK?? 的集合 x + , x 1 ? , . . . , x K ? {x^+, x^-_1, ..., x^-_K} x+,x1??,...,xK?? 中,識別出哪個是正樣本 x + x^+ x+。目標是最大化錨點 x x x 與其正樣本 x + x^+ x+的互信息的下界。

  • 公式:
    L I n f o N C E = ? log ? e x p ( s i m ( z , z + ) / τ ) e x p ( s i m ( z , z + ) / τ ) + ∑ k = 1 K e x p ( s i m ( z , z k ? ) / τ ) \mathcal{L}_{InfoNCE} = -\log \frac{exp(sim(z, z^+) / \tau)}{exp(sim(z, z^+) / \tau) + \sum_{k=1}^K exp(sim(z, z^-_k) / \tau)} LInfoNCE?=?logexp(sim(z,z+)/τ)+k=1K?exp(sim(z,zk??)/τ)exp(sim(z,z+)/τ)?

    等價于交叉熵損失,其中正樣本為正類,負樣本為負類,分類標簽為 one-hot 向量。
    NT-Xent (Normalized Temperature-scaled Cross Entropy) Loss是 InfoNCE 的一種具體實現形式,使用 L2 歸一化 的嵌入向量(即 ||z|| = 1)。

顯式地引入溫度系數 τ。

  • s i m ( z i , z j ) sim(z_i, z_j) sim(zi?,zj?):錨點嵌入 z z z與另一個樣本嵌入 z j z_j zj?的相似度(通常用余弦相似度)。

  • τ \tau τ:一個溫度系數(Temperature),非常重要的超參數。它調節了分布的形狀:

    • τ \tau τ 小:損失函數更關注最困難的負樣本(相似度高的負樣本),使決策邊界更尖銳。
    • τ \tau τ 大:所有負樣本的權重更均勻,分布更平滑。
    • K:負樣本的數量。
  • 特點:

    • 當前對比學習的主流損失函數。 像 SimCLR, MoCo, CLIP 等里程碑式的工作都采用它。

    • 形式上是一個 (K+1) 類的 softmax 交叉熵損失,其中正樣本是目標類。

    • 理論根基強: 被證明是在最大化 z z z z + z^+ z+之間互信息 I ( z ; z + ) I(z; z^+) I(z;z+)的下界。

    • 利用大量負樣本: 損失函數的分母項 ∑ e x p ( s i m ( z , z k ? ) / τ ) \sum exp(sim(z, z^-_k) / \tau) exp(sim(z,zk??)/τ) 要求模型同時區分錨點與多個負樣本,這比只區分一個負樣本(如 Triplet Loss)提供了更強的學習信號和更穩定的梯度。更多的負樣本通常能帶來更好的表示。

    • 溫度系數 τ \tau τ至關重要: 需要仔細調整。合適的 τ \tau τ能有效挖掘困難負樣本的信息。

    • 計算成本隨負樣本數量K線性增加。MoCo 等模型通過維護一個大的負樣本隊列(動量編碼器)來解決這個問題,使得 K 可以非常大(如 65536)而不顯著增加每批次的計算量。

    • 隱式地學習了一個歸一化的嵌入空間(如果使用余弦相似度)。

總結對比

特征Pair-wise/Triplet LossInfoNCELoss
核心思想直接約束距離/相似度差異 (邊界)多類分類 (識別正樣本) / 最大化互信息下界
樣本關系顯式處理錨點-正樣本-負樣本三元組錨點 vs. 1正樣本 + K負樣本
負樣本數量1 (per triplet)K (通常很大, 幾十到幾萬)
關鍵超參數margin溫度系數 τ \tau τ
梯度來源主要來自困難負樣本來自所有負樣本 (權重由相似度和 τ \tau τ決定)
計算復雜度相對較低 (每樣本)隨K線性增加 (但MoCo等可高效處理大K)
理論根基直觀但理論較弱強 (基于互信息最大化)
主流性早期/特定應用 (如人臉)當前主流 (SimCLR, MoCo, CLIP等)
防止坍縮機制依賴負樣本和margin依賴大量負樣本和分母項
表示空間不一定歸一化通常L2歸一化 (超球面)

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

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

相關文章

1.6 http模塊nodejs 對比 go

我們以go語言 原生實現 和瀏覽器交互.到現在學習 nodejs http模塊. nodejs 對于請求分發,也需要我們自己處理. 我們應該也對 http 服務是建立在 tcp協議基礎上.有更深入的體會了吧. 對于我們之后 學習 java web容器. 能有更深入的認知. 請求分發 請求分發是指 Web 框架或服務器…

護照閱讀器在景區的應用

護照閱讀器在景區的應用可以顯著提升游客管理效率、增強安全性并優化游客體驗。以下是其主要應用場景、優勢及實施建議: 一、核心應用場景 快速入園核驗 自動身份識別:通過掃描護照芯片(MRZ碼或NFC讀取),1-3秒完成身份…

Prompt Tuning、P-Tuning、Prefix Tuning的區別

一、Prompt Tuning、P-Tuning、Prefix Tuning的區別 1. Prompt Tuning(提示調優) 核心思想:固定預訓練模型參數,僅學習額外的連續提示向量(通常是嵌入層的一部分)。實現方式:在輸入文本前添加可訓練的連續向量(軟提示),模型只更新這些提示參數。優勢:參數量少(僅提…

什么是遙測數據?

遙測數據定義 遙測數據提供了關于系統性能的重要洞察,對主動解決問題和做出明智決策至關重要。要實現這一點,不能只依賴原始數據 —— 你需要實時的洞察,而這正是遙測數據提供的。 遙測是從遠程來源(如服務器、應用程序和監控設…

【JavaAPI搜索引擎】項目測試報告

JavaAPI搜索引擎測試報告 項目背景與項目介紹項目功能自動化測試單元測試測試ansj分詞器測試能否獲取到正確的URL測試能否正確解析文件中的正文 測試計劃界面測試測試1 頁面布局是否合理美觀,元素是否正確顯示測試2 測試是否可以正常顯示出搜索結果測試3 點擊搜索結…

如何選擇合適的IP輪換周期

選擇合適的IP輪換周期需綜合業務目標、目標平臺風控規則、IP類型與質量等多維度因素,以下是系統化決策框架及實操建議: 🔄 一、核心決策要素 業務場景類型 高頻操作型(如數據采集、廣告點擊): 輪換周期短&a…

GO Goroutine 與并發模型面試題及參考答案

目錄 什么是 Goroutine,它與線程有何區別? 如何創建一個 Goroutine?有哪些方式? Goroutine 執行函數時傳遞參數應注意什么問題? 使用 Goroutine 時如何確保主線程不會提前退出? 多個 Goroutine 寫共享變量時會出現什么問題?如何解決? 如何用 sync.WaitGroup 管理 …

Leetcode-11 2 的冪

Leetcode-11 2 的冪(簡單) 題目描述思路分析通過代碼(python) 題目描述 給你一個整數 n,請你判斷該整數是否是 2 的冪次方。如果是,返回 true ;否則,返回 false 。 如果存在一個整數…

【Java】【力扣】121.買賣股票的最佳時機

思路 所以后續的每次都是在&#xff1a;1-判斷是否更新最低點 2-如果不需要更新最低點 則計算差值 代碼 class Solution { public int maxProfit(int[] prices) { int minprices[0]; int max0; for (int i 1; i < prices.length; i) { //假設0就是最低點 // 判…

微服務架構下大型商城系統的事務一致性攻堅:Saga、TCC與本地消息表的實戰解析

當用戶在商城完成支付卻看到"訂單異常"提示時&#xff0c;背后往往是分布式事務一致性缺失導致的業務裂縫。在微服務拆分的商城系統中&#xff0c;如何保障跨服務的交易原子性&#xff0c;成為架構設計的生死線。 一、商城分布式事務的典型場景與痛點 在某家電品牌商…

深入理解 Vue.observable:輕量級響應式狀態管理利器

目錄 引言 一、什么是 Vue.observable&#xff1f; 二、為什么需要 Vue.observable&#xff1f;解決什么問題&#xff1f; 三、核心原理&#xff1a;響應式系統如何工作 四、如何使用 Vue.observable 功能說明 技術要點 五、關鍵注意事項與最佳實踐 六、實際應用案例 …

JS設計模式(5): 發布訂閱模式

解鎖JavaScript發布訂閱模式&#xff1a;讓代碼溝通更優雅 在JavaScript的世界里&#xff0c;我們常常會遇到這樣的場景&#xff1a;多個模塊之間需要相互通信&#xff0c;但是又不想讓它們產生過于緊密的耦合。這時候&#xff0c;發布訂閱模式就像一位優雅的信使&#xff0c;…

【電路物聯網】SDN架構與工作原理介紹

(??? )&#xff0c;Hello我是祐言QAQ我的博客主頁&#xff1a;C/C語言&#xff0c;數據結構&#xff0c;Linux基礎&#xff0c;ARM開發板&#xff0c;網絡編程等領域UP&#x1f30d;快上&#x1f698;&#xff0c;一起學習&#xff0c;讓我們成為一個強大的攻城獅&#xff0…

vscode 保存 js 時會自動格式化,取消設置也不好使

vscode 里的設置搜索 Editor: Format On Save 取消勾選 卸載 Prettier - Code formatter 這個插件后好使了&#xff0c;本來以為是插件的問題&#xff0c;后來發現是工作區設置的問題。 因為我是用 GitHub 下載的工程打開后&#xff0c; vscode 認為是工作區了, 因為 .vscode…

xcode中project.pbxproj點開為空白問題

由于需要修改signing里面的配置&#xff0c;點擊了project.pbxproj。但是發現一片空白&#xff0c;如圖 以為是配置文件損壞&#xff0c;郵件show in Finder看了一通后沒看出什么所以然。并且發現entitlement文件、list文件全都是點開為白&#xff0c;并且沒有任何保存 最后發…

JUC并發編程(四)常見模式

目錄 一 同步與協調模式 1 保護性暫停模式 2 順序控制模式 3 生產者消費者模式 4 Balking模式&#xff08;猶豫模式&#xff09; 二 線程管理/生命周期模式 1 兩階段終止模式 一 同步與協調模式 1 保護性暫停模式 一個線程需要等待另一個線程提供特定條件&#xff08;通常是…

Vue 數據代理機制對屬性名的要求

Vue 數據代理機制對屬性名的要求 在 Vue 的數據代理機制中,屬性名需遵循以下關鍵規則: 1. 禁止以 _ 或 $ 開頭 ?? Vue 會跳過代理以 _ 或 $ 開頭的屬性原因:這些前綴被 Vue 保留用于內部屬性(如 _data, _uid, $refs, $el 等)示例:data() {return {count: 1, // ?…

pdf.js在iOS移動端分頁加載優化方案(ios移動端反復刷新加載問題)

背景與問題 在iOS移動端加載大型PDF文件時&#xff0c;由于設備內存限制&#xff0c;經常遇到以下問題&#xff1a; 內存不足導致頁面崩潰大文件加載緩慢頁面反復重新加載 ##解決方案 采用PDF.js的分頁加載策略&#xff0c;實現按需加載當前可視頁面及相鄰頁面&#xff0c;…

【C++】來學習使用set和map吧

各位大佬好&#xff0c;我是落羽&#xff01;一個堅持不斷學習進步的大學生。 如果您覺得我的文章有所幫助&#xff0c;歡迎多多互三分享交流&#xff0c;一起學習進步&#xff01; 也歡迎關注我的blog主頁: 落羽的落羽 文章目錄 一、set和map是什么二、set系列1. set2. mult…

h5st逆向分析

h5st最新5.1版本逆向分析 申明定位h5st生成的位置動態插樁,事半功倍日志分析,十分鐘還原算法邏輯申明 本文僅用來記錄學習過程以免日后忘了,如有侵權請聯系刪除。 定位h5st生成的位置 通過關鍵字“sign”搜索,可以定位到window.PSign.sign(f)這個位置,f參數的值為{ &qu…