課題學習筆記3——SBERT

1 引言

在構建基于知識庫的問答系統時,"語義匹配" 是核心難題 —— 如何讓系統準確識別 "表述不同但含義相同" 的問題?比如用戶問 "對親人的期待是不是欲?",系統能匹配到知識庫中 "追名逐利是欲,那對孩子和親人的有所期待是不是欲?" 的答案。

2 系統原來的實現方式

原來的系統是用 BERT 生成句向量并實現匹配的。核心邏輯集中在_get_embedding(生成向量)和search(匹配答案)兩個方法中。

BERT 本身并不直接輸出 "句向量",需要手動從模型輸出中提取特征并處理,原來的核心思路是:

  • BERT 的每一層隱藏層都包含不同粒度的語義(淺層偏字面,深層偏抽象)
  • 融合最后 4 層的特征,并用手動設置的權重([0.15, 0.25, 0.35, 0.25])調整各層的重要性
  • 用 [CLS] 標記的向量代表整個句子的語義

生成向量后,需要計算用戶問題與知識庫中所有問題的相似度

BERT 預訓練時通過 NSP 學到的 “句子間語義關聯能力”,已經內化為模型參數。這種能力會間接體現在句向量中:

  • 例如,BERT 能理解 “親人” 和 “孩子” 在 “親近關系” 上的共性,“期待” 和 “期望” 的同義性 —— 這些都是 MLM 和 NSP 任務中學習到的語言知識;
  • 系統通過融合 BERT 隱藏層向量,間接利用了這些知識,讓生成的句向量具備基礎語義區分能力。

“加權融合隱藏層” 是為了彌補原始 BERT 句向量生成能力的不足而設計的關鍵步驟。它的核心作用是整合 BERT 不同層的語義特征,生成更全面的句向量

  • 淺層(如第 1-4 層):更關注字面信息(如詞匯本身、簡單搭配)。例如 “對親人的期待”,淺層可能更關注 “親人”“期待” 這些詞的字面含義;
  • 深層(如第 9-12 層):更關注抽象語義(如句子整體意圖、邏輯關系)。例如深層能捕捉到 “對親人的期待” 本質是 “一種情感訴求”。

3? BERT 的痛點

BERT 作為預訓練語言模型,在句子級任務中,它有兩個明顯局限:

3.1?計算效率低下

BERT 本身是為 “詞級” 理解設計的(如完形填空、命名實體識別)。

通常獲得句子向量的方法有兩種:
1.計算所有 Token 輸出向量的平均值
2.使用[cLs]位置輸出的向量

若要計算兩個句子的相似度,需將兩個句子拼接成?[CLS] 句子A [SEP] 句子B [SEP]?作為輸入,通過模型輸出的?[CLS]?向量判斷相似度。
計算量隨候選集規模線性增長

3.2??句子級語義捕捉不足

BERT 的?[CLS]?向量雖能代表句子語義,但本質是為 “句子對分類” 任務優化的(如判斷兩個句子是否同義),并非專門為 “單個句子的語義嵌入” 設計。在問答系統中,常出現 “語義相近但表述差異大” 的問題匹配不準的情況。

具體來說,當用 BERT 做 “判斷兩個句子是否同義” 時,輸入格式是固定的:[CLS] 句子A [SEP] 句子B [SEP]
BERT 輸出的?[CLS]?向量(常用來代表整體語義),是 “針對句子 A 和句子 B 的關系” 生成的 —— 它包含的是 “兩個句子如何關聯” 的信息,而非 “句子 A 單獨的語義” 或 “句子 B 單獨的語義”。

單獨輸入句子 A([CLS] 句子A [SEP]),BERT 的?[CLS]?向量缺乏句子 B,生成的向量無法穩定代表句子 A 的語義。

句子對分類任務:輸入兩個句子,判斷它們的關系(如 “是否同義”“是否存在因果關系”“是否矛盾”)。
例:輸入 “我喜歡蘋果” 和 “蘋果是我愛的水果”,模型判斷 “同義”(輸出分類結果)。

單個句子的語義嵌入:為單個句子生成一個向量(數字列表),這個向量需要 “完整代表句子的語義”—— 即 “語義越近的句子,向量越相似”。
例:“我喜歡蘋果” 和 “我喜愛蘋果” 的向量應該非常接近;和 “我討厭香蕉” 的向量應該差異很大。

舉例

  • BERT 就像一臺 “雙人對比秤”:它擅長測量 “兩個人的體重差”(句子對關系),但如果單獨測一個人的體重(單個句子向量),結果可能不準(因為它的刻度是為 “對比” 設計的)。

  • 而 “單個句子的語義嵌入” 需要的是 “單人精準秤”:能穩定測量單個人的體重,且兩個人的體重數值可以直接比較(比如 “60kg” 和 “61kg” 接近,“60kg” 和 “80kg” 差異大)。

4 Sentence-BERT(SBERT)

Sentence-BERT(SBERT)是專門為 "句子級語義任務" 設計的模型,它在 BERT 基礎上做了針對性優化,完美解決了上述問題。

Sentence-BERT(SBERT)的作者對預訓練的 BERT 進行修改:

微調+使用 Siamese and TripletNetwork(孿生網絡和三胞胎網絡)生成具有語義的句子 Embedding 向量。

語義相近的句子,其 Embedding 向量距離就比較近,從而可以使用余弦相似度、曼哈頓距離、歐氏距離等找出語義相似的句子。這樣 SBERT 可以完成某些新的特定任務,比如聚類、基于語義的信息檢索等

4.1 孿生網絡(Siamese

模型結構

核心思想是 “用兩個共享參數的子網絡,學習兩個輸入的相似度”。它不像普通分類網絡那樣直接輸出類別,而是專注于判斷 “兩個輸入是否相似”。

如下圖

  • 包含兩個結構完全相同、參數完全共享的子網絡(可以是 CNN、RNN、BERT 等任意網絡);
  • 兩個子網絡接收不同輸入(如兩個句子),分別提取特征;
  • 最后通過一個 “對比層” 計算兩個特征的相似度,輸出 “兩個輸入是否相似” 的判斷。

SBERT本質上是 “孿生網絡 + BERT + 對比學習” 的組合,專門解決句子語義相似度問題。

SBERT 的兩個子網絡就是 BERT,通過共享參數提取句子向量。傳入兩個句子,通過計算損失,反向傳播更新參數。對比層用余弦相似度計算向量距離,同時通過對比學習(訓練時讓相似句子向量更近)優化向量分布;

(注意傳入第一個句子時沒有辦法進行梯度回傳更新參數)

損失函數

輸入:兩個待比較的對象

  • 輸入 A:用戶問題 “對親人的期待是不是欲?”

  • 輸入 B:知識庫問題 “對孩子的期待屬于欲望嗎?”

特征提取:兩個子網絡生成特征向量

  • 輸入 A 進入子網絡 1,生成特征向量 V1(比如通過 BERT 提取的語義向量);

  • 輸入 B 進入子網絡 2(和子網絡 1 結構、參數完全相同),生成特征向量 V2;

  • 關鍵:因為參數共享,兩個子網絡對 “相似語義” 的理解標準完全一致(比如 “期待” 和 “期望” 會被映射到相近的向量)。

(這里還是通過計算所有 Token 輸出向量的平均值或者使用[cLs]位置輸出的向量來獲得句向量)

對比:計算向量相似度,輸出判斷結果

  • 通過 “對比層” 計算 V1 和 V2 的相似度(如余弦相似度、歐氏距離);

  • 若相似度高于閾值(如 0.8),判斷為 “相似”(匹配成功);否則為 “不相似”。

5 總結

對比原始 BERT 的實現,SBERT 的優勢明顯:

  • 無需手動提取隱藏層(省去hidden_states[-4:]相關邏輯)
  • 無需加權融合(模型內置最優融合策略)
  • 支持批量編碼(model.encode(questions)直接處理列表)

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

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

相關文章

在Word和WPS文字中把全角數字全部改為半角

大部分情況下我們在Word或WPS文字中使用的數字或標點符號都是半角,但是有時不小心按錯了快捷鍵或者點到了輸入法的全角半角切換圖標,就輸入了全角符號和數字。不用擔心,使用它們自帶的全角、半角轉換功能即可快速全部轉換回來。一、為什么會輸…

數據結構的基本知識

一、集合框架1、什么是集合框架Java集合框架(Java Collection Framework),又被稱為容器(container),是定義在java.util包下的一組接口(interfaces)和其實現類(classes).主要表現為把多個元素(element)放在一個單元中,用于對這些元素進行快速、便捷的存儲(store&…

WebStack-Hugo | 一個靜態響應式導航主題

WebStack-Hugo | 一個靜態響應式導航主題 #10 shenweiyan announced in 1.3-折騰 WebStack-Hugo | 一個靜態響應式導航主題#10 ?編輯shenweiyan on Oct 23, 2023 6 comments 7 replies Return to top shenweiyan on Oct 23, 2023 Maintainer Via:我給自己…

01 基于sklearn的機械學習-機械學習的分類、sklearn的安裝、sklearn數據集、數據集的劃分、特征工程中特征提取與無量綱化

文章目錄機械學習機械學習分類1. 監督學習2. 半監督學習3. 無監督學習4. 強化學習機械學習的項目開發步驟scikit-learn1 scikit-learn安裝2 sklearn數據集1. sklearn 玩具數據集鳶尾花數據集糖尿病數據集葡萄酒數據集2. sklearn現實世界數據集20 新聞組數據集3. 數據集的劃分特…

攜全雙工語音通話大模型亮相WAIC,Soul重塑人機互動新范式

近日,WAIC 2025在上海隆重開幕。作為全球人工智能領域的頂級盛會,本屆WAIC展覽聚焦底層能力的演進與具體垂類場景的融合落地。堅持“模應一體”方向、立足“AI社交”的具體場景,Soul App此次攜最新升級的自研端到端全雙工語音通話大模型亮相&…

第2章 cmd命令基礎:常用基礎命令(1)

Hi~ 我是李小咖,主要從事網絡安全技術開發和研究。 本文取自《李小咖網安技術庫》,歡迎一起交流學習🫡:https://imbyter.com 本節介紹的命令有目錄操作(cd)、清屏操作(cls)、設置顏色…

Java 10 新特性解析

Java 10 新特性解析 文章目錄Java 10 新特性解析1. 引言2. 本地變量類型推斷(JEP 286)2.1. 概述2.2. 使用場景2.3. 限制2.4. 與之前版本的對比2.5. 風格指南2.6. 示例代碼2.7. 優點與注意事項3. 應用程序類數據共享(JEP 310)3.1. …

【WRF工具】服務器中安裝編譯GrADS

目錄 安裝編譯 GrADS 所需的依賴庫 conda下載庫包 安裝編譯 GrADS 編譯前檢查依賴可用性 安裝編譯 GrADS 參考 安裝編譯 GrADS 所需的依賴庫 以統一方式在 $HOME/WRFDA_LIBS/grads_deps 下安裝所有依賴: # 選擇一個目錄用于安裝所有依賴庫 export DIR=$HOME/WRFDA_LIBS庫包1…

數據結構之隊列(C語言)

1.隊列的定義: 隊列(Queue)是一種基礎且重要的線性數據結構,遵循先進先出(FIFO)?? 原則,即最早入隊的元素最先出隊,與棧不同的是出隊列的順序是固定的。隊列具有以下特點&#xff…

C#開發基礎之深入理解“集合遍歷時不可修改”的異常背后的設計

前言 歡迎關注【dotnet研習社】&#xff0c;今天我們聊聊一個基礎問題“集合已修改&#xff1a;可能無法執行枚舉操作”背后的設計。 在日常 C# 開發中&#xff0c;我們常常會操作集合&#xff08;如 List<T>、Dictionary<K,V> 等&#xff09;。一個新手開發者極…

【工具】圖床完全指南:從選擇到搭建的全方位解決方案

前言 在數字化內容創作的時代&#xff0c;圖片已經成為博客、文檔、社交媒體等平臺不可或缺的元素。然而&#xff0c;如何高效、穩定地存儲和分發圖片資源&#xff0c;一直是內容創作者面臨的重要問題。圖床&#xff08;Image Hosting&#xff09;作為專門的圖片存儲和分發服務…

深度學習篇---PaddleDetection模型選擇

PaddleDetection 是百度飛槳推出的目標檢測開發套件&#xff0c;提供了豐富的模型庫和工具鏈&#xff0c;覆蓋從輕量級移動端到高性能服務器的全場景需求。以下是核心模型分類、適用場景及大小選擇建議&#xff08;通俗易懂版&#xff09;&#xff1a;一、主流模型分類及適用場…

cmseasy靶機密碼爆破通關教程

靶場安裝1.首先我們需要下載一個cms靶場CmsEasy_7.6.3.2_UTF-8_20200422,下載后解壓在phpstudy_pro的網站根目錄下。2.然后我們去訪問一下安裝好的網站&#xff0c;然后注冊和鏈接數據庫3.不知道自己數據庫密碼的可以去小皮面板里面查看4.安裝好后就可以了來到后臺就可以了。練…

【C語言】指針深度剖析(一)

文章目錄一、內存和地址1.1 內存的基本概念1.2 編址的原理二、指針變量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指針變量和解引用操作符&#xff08;*&#xff09;2.2.1 指針變量2.2.2 指針類型的解讀2.2.3 解引用操作符2.3 指針變量的大小三、指針變量類型的…

半導體企業選用的跨網文件交換系統到底應該具備什么功能?

在半導體行業的數字化轉型過程中&#xff0c;跨網文件交換已成為連接研發、生產、供應鏈的關鍵紐帶。半導體企業的跨網文件交換不僅涉及設計圖紙、工藝參數等核心知識產權&#xff0c;還需要滿足跨國協同、合規審計等復雜需求。那么&#xff0c;一款適合半導體行業的跨網文件交…

影刀RPA_初級課程_玩轉影刀自動化_網頁操作自動化

聲明&#xff1a;相關內容來自影刀學院&#xff0c;本文章為自用筆記&#xff0c;切勿商用&#xff01;&#xff08;若有侵權&#xff0c;請聯絡刪除&#xff09; 1. 基本概念與操作 1.1 正確處理下拉框元素&#xff08;先判斷頁面元素&#xff0c;后進行流程編制&#xff09;…

Spark初探:揭秘速度優勢與生態融合實踐

更多推薦閱讀 Spark與Flink深度對比&#xff1a;大數據流批一體框架的技術選型指南-CSDN博客 LightProxy使用操作手冊-CSDN博客 Sentry一看就會教程_sentry教程-CSDN博客 微前端架構解析&#xff1a;核心概念與主流方案特性對比_微前端方案對比-CSDN博客 目錄 Spark為何比Hadoo…

詳談OSI七層模型和TCP/IP四層模型以及tcp與udp為什么是4層,http與https為什么是7層

一、網絡模型&#xff1a;OSI七層 vs TCP/IP四層OSI七層模型 (理論參考模型):目的&#xff1a;提供一個標準化的理論框架&#xff0c;用于理解網絡通信過程和各層的功能劃分&#xff0c;促進不同廠商設備的互操作性。它是一個理想化的模型。分層 (從下到上):物理層&#xff1a;…

ClickHouse 高性能實時分析數據庫-索引與數據跳過(查詢的“瞬移”能力)

告別等待&#xff0c;秒級響應&#xff01;這不只是教程&#xff0c;這是你駕馭PB級數據的超能力&#xff01;我的ClickHouse視頻課&#xff0c;凝練十年實戰精華&#xff0c;從入門到精通&#xff0c;從單機到集群。點開它&#xff0c;讓數據處理速度快到飛起&#xff0c;讓你…

Jetpack - Room(Room 引入、Room 優化)

一、Room 引入 1、基本介紹 Room 在 SQLite 上提供了一個抽象層&#xff0c;以便在充分利用 SQLite 的強大功能的同時&#xff0c;能夠流暢地訪問數據庫&#xff0c;官方強烈建議使用 Room 而不是 SQLite 2、演示 &#xff08;1&#xff09;Setting 模塊級 build.gradle depend…