首頁 >科技週邊 >人工智慧 >了解連續的單詞袋(CBOW)

了解連續的單詞袋(CBOW)

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原創
2025-03-17 09:46:09868瀏覽

語義很重要,因為在NLP中,這是正在研究的單詞之間的關係。最簡單但最有效的過程之一是連續的單詞袋(CBOW),將單詞映射到稱為單詞向量的高度有意義的向量。 CBow在Word2Vec框架中使用,並根據與之相鄰的單詞預測一個單詞,該單詞捕獲了語言的語義和語法含義。在本文中,讀者將了解CBOW模型的操作以及其使用方法。

學習目標

  • 了解CBOW模型背後的理論。
  • 了解CBow和Skip-gram之間的差異。
  • 使用示例數據集實現Python中的CBOW模型。
  • 分析CBOW的優勢和局限性。
  • 探索CBOW生成的單詞嵌入的用例。

目錄

  • 什麼是連續的單詞模型?
  • 連續的單詞如何工作
  • CBow架構詳細解釋
  • 從頭開始編碼CBOW(帶有Python的示例)
  • 連續袋的優點
  • 連續的單詞袋的局限
  • 常見問題

什麼是連續的單詞模型?

連續的單詞袋(CBOW)也是一種模型,它在使用神經網絡確定嵌入單詞時使用,並且是Tomas Mikolov的Word2Vec模型的一部分。 CBow試圖根據給定句子觀察的上下文單詞預測目標詞。這樣,它就能捕獲語義關係,因此在高維空間中密切表示近距離表示。

例如,在“貓坐在墊子上”的句子中,如果上下文窗口大小為2,則“ sat”的上下文單詞是[“”,“”,“ cat”,“ on”,“ the”] 並且該模型的任務是預測“ sat”一詞。

CBOW通過匯總上下文單詞(例如,平均嵌入)並使用此匯總表示來預測目標單詞來運行。該模型的體系結構涉及上下文單詞的輸入層,用於嵌入生成的隱藏層以及使用概率分佈預測目標單詞的輸出層。

這是一個適合處理頻繁單詞的快速高效模型,非常適合需要語義理解的任務,例如文本分類,推薦系統和情感分析。

連續的單詞如何工作

CBow是根據上下文的最簡單,有效的技術之一,用於單詞嵌入,其中整個單詞的詞彙映射到向量。本節還將CBOW系統的操作描述為在其最基本的層面上理解該方法的一種手段,討論了基於CBOW方法的主要思想,並為CBOW命中計算系統的架構佈局提供了綜合指南。

了解上下文和目標詞

CBow依靠兩個關鍵概念:上下文單詞和目標詞。

  • 上下文詞:這些是定義的窗口大小中的目標詞圍繞目標單詞的單詞。例如,在句子中:
    “快速的棕色狐狸跳過懶狗”
    如果目標詞是“ fox” ,而上下文窗口大小為2,則上下文單詞為[“快速”,“棕色”,“跳”,“ Over”]
  • 目標詞:這是CBOW旨在預測上下文單詞的單詞。在上面的示例中,目標詞是“狐狸”

通過分析上下文與大型語料庫中的目標單詞之間的關係,CBOW生成嵌入,以捕獲單詞之間的語義關係。

CBOW的逐步過程

這是CBOW工作原理的細分,分步:

步驟1:數據準備

  • 選擇文本語料庫(例如,句子或段落)。
  • 將文本歸為單詞並構建詞彙。
  • 定義上下文窗口大小nnn(例如,每側2個單詞)。

步驟2:生成上下文目標對

  • 對於語料庫中的每個單詞,請根據窗口大小提取其周圍的上下文單詞。
  • 示例:對於“我愛機器學習”和n = 2n = 2n = 2的句子,對是:目標詞上下文單詞愛[i”,“ machine”]機器[“愛”,“學習”]

步驟3:單速編碼

基於詞彙大小,將上下文單詞和目標單詞轉換為單熱矢量。對於大小5的詞彙,“愛”一詞的單次表示可能看起來像[0、1、0、0、0、0]

步驟4:嵌入層

通過嵌入層傳遞單熱編碼的上下文單詞。該層將每個單詞映射到密集的向量表示,通常比詞彙大小較低。

步驟5:上下文聚合

匯總所有上下文單詞的嵌入(例如,平均或求和它們)形成單個上下文向量。

步驟6:預測

  • 將聚合的上下文向量饋入具有軟磁輸出層的完全連接的神經網絡。
  • 該模型根據詞彙上的概率分佈預測最可能的單詞作為目標。

步驟7:損失計算和優化

  • 使用跨透鏡損失函數計算預測和實際目標詞之間的誤差。
  • 反向傳播誤差以調整嵌入和預測層中的權重。

步驟8:對所有對重複

重複語料庫中所有上下文目標對的過程,直到模型收斂為止。

CBow架構詳細解釋

連續的單詞(CBOW)模型架構旨在根據其周圍上下文單詞進行預測目標單詞。它是一個具有直接但有效結構的淺神經網絡。 CBOW架構由以下組件組成:

輸入層

  • 輸入表示
    該模型的輸入是上下文單詞表示為單熱編碼向量
    • 如果詞彙大小為v,則每個單詞表示為大小為V的單式向量,在索引處單個1表示與單詞相對應的索引,而在其他地方為0。
    • 例如,如果詞彙為[“貓”,“狗”,“狐狸”,“樹”,“鳥”]和“狐狸”一詞是第三個單詞,則其一hot矢量為[0,0,1,0,0] [0,0,0,0,1,1,0,0,0] [0,0,1,1,0,0]。
  • 上下文窗口
    上下文窗口大小n確定了使用的上下文單詞的數量。如果n = 2,則使用目標單詞的每一側兩個單詞。
    • 對於句子: “快速的棕色狐狸跳過懶狗”和目標單詞“狐狸” ,n = 2的上下文單詞是[“快速”,“棕色”,“跳躍”,“ Over”]

嵌入層

  • 目的
    該層將在高尺寸中存在的單熱量向量轉換為最大密度和低尺寸向量。與以下事實相反:在單詞嵌入單詞中被表示為具有零值的向量,在嵌入式層中,每個單詞都由所需維度的連續向量編碼,這些維度反映了單詞含義的特定特徵。
  • 單詞嵌入矩陣
    嵌入層保持一個單詞嵌入尺寸v×d的矩陣W,其中v是詞彙大小,d是嵌入尺寸。
    • W的每一行代表單詞的嵌入。
    • 對於單熱向量XXX,將嵌入計算為W^TX X。
  • 上下文詞嵌入
    使用嵌入矩陣將每個上下文單詞轉換為相應的緻密矢量。如果窗口大小n = 2,並且我們有4個上下文單詞,則提取了這些單詞的嵌入。

隱藏層:上下文聚合

  • 目的
    將上下文單詞的嵌入組合在一起以形成單個上下文向量。
  • 聚合方法
    • 平均值:所有上下文單詞的嵌入平均以計算上下文向量。

了解連續的單詞袋(CBOW)

  • 求和:嵌入而不是平均,而是求和。

了解連續的單詞袋(CBOW)

  • 結果上下文向量:結果是單個密集的向量HHH,代表周圍單詞的匯總上下文。

輸出層

  • 目的:輸出層使用上下文向量HHH預測目標單詞。
  • 完全連接的層:上下文向量HHH通過一個完全連接的層,該層輸出了詞彙中每個單詞的原始分數。這些分數稱為邏輯。
  • Softmax Function : The logits are passed through a softmax function to compute a probability distribution over the vocabulary:

了解連續的單詞袋(CBOW)

  • 預測的目標詞:第一個原因是,在SoftMax輸出時,該算法將目標詞定義為具有最高概率的單詞。

損失功能

  • 跨透鏡損失用於將預測的概率分佈與實際目標詞(地面真相)進行比較。
  • 使用隨機梯度下降(SGD)或其變體等優化技術將損失最小化。

CBOW的示例

輸入
句子: “我愛機器學習” ,目標詞: “機器” ,上下文詞: [“我”,“愛”,“學習”]

單速編碼
詞彙: [“我”,“愛”,“機器”,“學習”,“ AI”]

  • 一旋向量:
    • “ i”:[1,0,0,0,0] [1,0,0,0,0] [1,0,0,0,0]
    • “愛”:[0,1,0,0,0] [0、1、0、0、0] [0,1,0,0,0]
    • “學習”:[0,0,0,1,0] [0,0,0,1,0] [0,0,0,1,0]

嵌入層

  • 嵌入尺寸:d = 3。
  • 嵌入矩陣W:

了解連續的單詞袋(CBOW)

嵌入:

  • “我”:[0.1,0.2,0.3]
  • “愛”:[0.4,0.5,0.6]
  • “學習”:[0.2,0.3,0.4]

聚合

  • 平均嵌入:

了解連續的單詞袋(CBOW)

輸出層

  • 計算logits,應用SoftMax並預測目標詞。

CBOW建築圖

輸入層:[“ i”,“ love”,“學習”]
     - >一式編碼
     - >嵌入層
         - >密集的嵌入
         - >匯總上下文向量
         - >完全連接的層Softmax
輸出:預測單詞“機器”

從頭開始編碼CBOW(帶有Python的示例)

現在,我們將瀏覽Python中從頭開始實施CBOW模型。

準備CBOW數據

第一個尖峰是將文本轉換為代幣,將文字與上下文對鍵對面生成的單詞與上下文作為包含目標單詞的單詞。

 copus =“快速棕狐跳過懶狗”
colpus = colpus.lower()。split()#tokenization和lowercase轉換

#定義上下文窗口大小
C = 2
context_target_pairs = []

#生成上下文目標對
對於我的範圍(c,len(corpus) -  c):
    context = copus [i -c:i] copus [i 1:i c 1]
    target = copus [i]
    context_target_pairs.append(((上下文,目標)))

print(“上下文 - 目標對:”,context_target_pairs)

輸出:

上下文目標對:[([['the','quick','fox',跳躍'],'brown'),(['quick'','','brown','''','off''],'fox'),(['brown'','fox'over'over'over'off'' “超過”,“懶惰”,“狗”],“'')]]

創建字典一詞

我們構建了一個詞彙(獨特的單詞集),然後將每個單詞映射到唯一的索引,反之亦然,以期在訓練過程中進行有效的查找。

 #創建詞彙並將每個單詞映射到索引
vocab = set(語料庫)
word_to_index = {word:idx for IDX,枚舉(vocab)中的字}}
index_to_word = {idx:Word Word,word_to_index.items()}中的idx

打印(“ word to Index字典:”,Word_to_index)

輸出:

單詞到索引字典:{'brown':0,'dog':1,'quick':2,'跳躍':3,'fox':4,'over':5,'the':6,'lazy':7}

一式編碼示例

單速編碼作品是通過將單詞形成系統中的每個單詞轉換為向量的,其中該單詞的指標為“ 1”,而其餘的地方則為“ 0”,出於很快的原因。

 def One_hot_encode(word,word_to_index):
    ONE_HOT = NP.Zeros(len(word_to_index))
    ONE_HOT [word_to_index [word]] = 1
    返回One_hot

#一個單詞“快速”的示例用法
context_one_hot = [one_hot_encode(word,word_to_index)for ['the'the','quick']]中的字
print(“'quick''的單速編碼:”,context_one_hot [1])

輸出:

單速編碼為“快速”:[0。 0。1。0。0。0。0。0。0。]

從頭開始構建CBOW模型

在此步驟中,我們創建了一個具有兩個層的基本神經網絡:一個用於單詞嵌入,另一個用於基於上下文單詞計算輸出,平均上下文並將其傳遞到網絡中。

 cbow級:
    def __init __(self,vocab_size,embedding_dim):
        #隨機初始化嵌入和輸出層的權重
        self.w1 = np.random.randn(vocab_size,embedding_dim)
        self.w2 = np.random.randn(embedding_dim,vocab_size)
        
    def向前(self,context_words):
        #計算隱藏層(上下文單詞的平均值)
        h = np.mean(context_words,axis = 0)
        #計算輸出層(SoftMax概率)
        輸出= np.dot(h,self.w2)
        返回輸出
    
    向後def(self,context_words,target_word,Learning_rate = 0.01):
        #正向通行證
        h = np.mean(context_words,axis = 0)
        輸出= np.dot(h,self.w2)
        
        #計算錯誤和梯度
        錯誤= target_word-輸出
        self.w2 = Learning_rate * np.outer(h,錯誤)
        self.w1 = Learning_rate * np.outer(context_words,錯誤)

#創建CBOW對象的示例
vocab_size = len(word_to_index)
embedding_dim = 5#讓我們假設5維嵌入

cbow_model = cbow(vocab_size,embedding_dim)

#使用隨機上下文單詞和目標(例如)
context_words = [one_hot_encode(word,word_to_index)for ['the'the','quick','fox','躍跳']中的字
context_words = np.array(context_words)
context_words = np.mean(context_words,axis = 0)#普通上下文單詞
target_word = one_hot_encode('brown',word_to_index)

#向前通過CBOW模型
輸出= cbow_model.forward(context_words)
打印(“ CBOW向前通行證的輸出:”,輸出)

輸出:

 CBOW向前通行證的輸出:[[-0.20435729 -0.23851241 -0.08105261 -0.14251447 0.20442154 0.14336586
  -0.06523201 0.0255063]
 [-0.0192184 -0.12958821 0.1019369 0.11101922 -0.177773069 -0.02340574
  -0.22222151 -0.23863179]
 [0.21221977 -0.15263454 -0.015248 0.27618767 0.02959409 0.21777961
   0.16619577 -0.20560026]
 [0.05354038 0.06903295 0.0592706 -0.13509918 -0.00439649 0.18007843
   0.1611929 0.2449023]
 [0.01092826 0.19643582 -0.07430934 -0.16443165 -0.01094085 -0.27452367
  -0.13747784 0.31185284]]]

使用TensorFlow實現CBOW

TensorFlow通過定義使用嵌入層來學習單詞表示和輸出密集層的神經網絡來簡化過程,並使用上下文單詞預測目標單詞。

導入TensorFlow作為TF

#使用TensorFlow定義簡單的CBOW模型
cbowmodel類(tf.keras.model):
    def __init __(self,vocab_size,embedding_dim):
        super(cbowmodel,self).__ init __()
        self.embeddings = tf.keras.layers.embedding(input_dim = vocab_size,output_dim = embedding_dim)
        self.output_layer = tf.keras.layers.dense(vocab_size,activation ='softmax')
    
    def呼叫(self,context_words):
        embedded_context = self.embeddings(context_words)
        context_avg = tf.reduce_mean(embedded_context,axis = 1)
        輸出= self.output_layer(context_avg)
        返回輸出

#示例用法
model = cbowmodel(vocab_size = 8,embedding_dim = 5)
context_input = np.random.randint(0,8,size =(1,4))#隨機上下文輸入
context_input = tf.convert_to_tensor(context_input,dtype = tf.int32)

#正向通行證
輸出=模型(context_input)
打印(“ Tensorflow Cbow型號的輸出:”,output.numpy())

輸出:

 TensorFlow CBOW模型的輸出:[[0.12362909 0.12616573 0.12758036 0.12601459 0.12477358 0.1237749
  0.1231998 0.12486169]]]

使用Gensim進行CBOW

Gensim在Word2Vec()函數中提供了現成的CBOW實現,其中無需在培訓上勞動,因為Gensim訓練文本語料庫的單詞嵌入。

導入Gensim
來自Gensim.models導入Word2vec

#準備數據(單詞列表列表)
copus = [[“”,“ Quick”,“ Brown”,“ Fox”],[“跳”,“ Over”,“ The”,“ lazy”,“ dog”]]

#使用CBOW訓練Word2Vec型號
model = word2vec(colpus,vector_size = 5,window = 2,min_count = 1,sg = 0)

#獲取單詞的向量表示
vector = model.wv ['fox']
打印(“'fox'的向量表示:”,向量)

輸出:

 “福克斯”的矢量表示:[-0.06810732 -0.01892803 0.11537147 -0.15043275 -0.07872207]

連續袋的優點

現在,我們將探索連續袋的優勢:

  • 有效學習單詞表示:CBOW通過使用上下文單詞有效地學習單詞的密集矢量表示。與傳統的單熱編碼相比,這會導致較低的矢量,這在計算上可能很昂貴。
  • 捕獲語義關係:CBOW基於單詞在大型語料庫中的上下文中捕獲語義關係。這使模型可以學習單詞相似性,同義詞和其他上下文細微差別,這些差異在信息檢索和情感分析之類的任務中很有用。
  • 可伸縮性:CBOW模型可擴展,並且可以有效地處理大型數據集,從而非常適合具有大量文本數據的應用程序,例如搜索引擎和社交媒體平台。
  • 上下文靈活性:CBOW可以處理不同數量的上下文(即所考慮的周圍單詞的數量),在學習單詞表示單詞所需的上下文中提供靈活性。
  • NLP任務中的性能提高了:CBOW的單詞嵌入式通過提供高質量的功能表示,增強了下游NLP任務的性能,例如文本分類,命名實體識別和機器翻譯。

連續的單詞袋的局限

現在讓我們討論CBOW的局限性:

  • 對上下文窗口大小的敏感性:CBOW的性能高度取決於上下文窗口大小。一個小窗口可能只會捕獲本地關係,而大窗口可能會模糊單詞的獨特性。找到最佳上下文大小可能具有挑戰性且依賴於任務。
  • 缺乏單詞順序敏感性:CBOW無視上下文中單詞的順序,這意味著它不會捕獲語言的順序性質。對於需要對單詞順序深入了解的任務,例如句法解析語言建模,此限制可能是有問題的。
  • 稀有詞的困難:CBOW難以生成有意義的嵌入,以實現稀有或訪問量的單詞(OOV)。該模型依賴於上下文,但是單詞不經常的數據稀疏會導致矢量表示不良。
  • 僅限於淺色上下文理解:儘管CBOW捕獲基於周圍單詞的單詞含義,但它在理解更複雜的語言現象(例如長期依賴性,諷刺或諷刺)方面具有有限的功能,這可能需要更複雜的模型(例如變形金剛)。
  • 無法很好地處理多義:具有多種含義的單詞(polysemy)對於CBOW可能是有問題的。由於該模型會為每個單詞生成一個嵌入,因此與Bert或Elmo(例如BertElmo )不同,它可能無法捕獲單詞在不同上下文中所具有的不同含義。

結論

事實證明,連續的單詞(CBOW)模型是通過利用周圍環境來生成單詞嵌入的一種有效而直觀的方法。通過其簡單而有效的架構,Cbow彌合了原始文本和有意義的向量表示之間的差距,從而實現了廣泛的NLP應用程序。通過了解CBOW的工作機制,其優勢和局限性,我們可以更深入地了解NLP技術的發展。 Cbow憑藉其在嵌入生成中的基本作用,繼續成為探索先進語言模型的墊腳石。

關鍵要點

  • CBow使用其周圍環境預測目標詞,從而使其有效而簡單。
  • 它可以很好地提供頻繁的單詞,並提供計算效率。
  • CBOW學到的嵌入既捕獲語義和句法關係。
  • CBOW是理解現代單詞嵌入技術的基礎。
  • 實際應用包括情感分析,語義搜索和文本建議。

常見問題

Q1:CBOW和SKIP-GRAM有什麼區別?

答:CBOW使用上下文單詞預測目標單詞,而Skip-gram則使用目標單詞預測上下文單詞。

Q2:為什麼CBOW計算速度比Skip-gram快?

答:CBOW同時處理多個上下文單詞,而跳過gram獨立評估每個上下文單詞。

Q3:CBOW可以有效處理稀有單詞嗎?

答:不,Skip-gram通常更好地傾向於學習稀有詞的學習表示。

Q4:CBOW中嵌入層的作用是什麼?

答:嵌入層將稀疏的單熱矢量轉化為密集的表示形式,從而捕獲單詞語義。

Q5:CBOW今天仍然有意義嗎?

答:是的,儘管存在像伯特這樣的新模型,但CBOW仍然是單詞嵌入中的基礎概念。

以上是了解連續的單詞袋(CBOW)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn