word2vector細致分解(CBOW, SKIP_GRAM, 層次soft Max, 負采樣)

1 前世今生:NGRAM

NGRAM:將詞當成一個離散的單元(因此存在一定的局限性,沒有考慮到詞與詞之間的關系)
neural network language model:只能處理定長序列,訓練慢。使用RNN之后有所改善
NNLM

2 兩種訓練方式:CBOW,Skip-gram

CBOW(通過附近詞預測中心詞)、
Skip-gram(通過中心詞預測附近的詞)
兩種訓練方式

2.1 CBOW步驟

變量:詞表大小V, 維度N,窗口大小C;N一般取50~300
步驟:

  • 輸入層:上下文窗口內的C個詞的onehot表示
  • 隱藏層1: 權重矩陣𝑊 + 激活函數
    (V維表示降到N維表示)(所有的權重矩陣相同,即共享權重矩陣)
    𝑊𝑉×𝑁 ,將 𝑉×𝐶映射為 𝑁×𝐶
    word2vec中激活函數,用了簡單取平均;
  • 隱藏層2: 權重矩陣W‘ + 激活函數
    (N維升維到V維)
    𝑊′𝑁×𝑉 ,將 𝑁×1映射為 𝑉×1
  • 輸出層:softmax 激活函數,將值歸一化到0~1之間 y
  • 用BP+梯度下降優化cost function y和真實y之間的距離,迭代優化參數 𝑊、𝑊′
  • 收斂result:y是V維向量,每個元素取值0~1, 將最大元素值,還原為onehot編碼,就是最終結果了。

實際使用:得到第一個矩陣W之后,我們就能得到每個單詞的詞向量了。

訓練示例:I drink coffee everyday
1、第一個batch:I為中心詞,drink coffee為上下文,即使用單詞drink coffee來預測單詞I,即輸入為X_drink和X_coffee,輸出為X_I,然后訓練上述網絡;
2、第二個batch:drink為中心詞,I和 coffee everyday為上下文,即使用單詞I和coffee everyday,即輸入為X_I和X_coffee、X_everyday,輸出為X_drink,然后訓練上述網絡;
3、第三個batch:coffee為中心詞,I coffee 和 everyday為上下文,同理訓練網絡;
4、第四個batch:everyday為中心詞,drink coffee為上下文,同理訓練網絡。
然后重復上述過程(迭代)3-5次(epoehs)左右即得到最后的結果。
具體的第三個batch的過程可見word2vec是如何得到詞向量的?。得到的結果為[0.23,0.03,0.62,0.12],此時結果是以coffee為中心詞的詞向量,每個位置表示的是對應單詞的概率,例如該詞向量coffee的概率為0.62。
需要注意的是每個batch中使用的權重矩陣都是一模一樣的

2.2 skip-gram 步驟

思路同CBOW, 只是輸入是1個詞,輸出是C個詞;
一般用BP訓練得到參數,預測用一次前向傳播;

  • 輸入層:中心詞的embedding表示,
    looktable查表【Vd 表,每個詞作為中心詞的表示】得到中心詞的embedding 表示[1300]
    例如:你 真 漂亮。根據 真,預測其上下文的情況
  • 隱藏層: [W 大小為30010000], Vd 大小,是每個詞作為背景詞的表示
  • 輸出層:經過softmax,得到每個詞的概率。
    (0.3, 0.5, 0.7,), (0.1,0.9,0.1)
    你出現在真之前的概率是0.3,之后是0.1;
    真出現在真之前的概率是0.5,之后是0.9
    漂亮出現在真之前的概率是0.7,之后是0.1

用蒙特卡洛模擬的方法根據哪些概率值去采樣,就能得到一個具體的上下文。

然后就是優化了,使得輸入的詞之間“真漂亮”之間的概率足夠大。
寫出目標函數:

  • T是語料庫單詞的總個數,p(wt+j|wt)是已知當前詞wt,預測周圍詞的總概率對數值在這里插入圖片描述
    在這里插入圖片描述> - 訓練數據: ( input word, output word ) 單詞對input word和output word都是one-hot編碼的向量。最終模型的輸出是一個概率分布。

3 問題優化

word2vec結合了CBOW, skip-gram的方法 訓練得到參數𝑊,
針對CBOW和SKIP-gram,樣本大以及不均衡問題,在計算中做了很多優化;

可以看到,NNLM計算中,兩個問題導致計算量大
詞表維度大;
softmax計算量大
sofmax歸一化需要遍歷整個詞匯表,

解決方案
將常見的單詞組合(word pairs)或者詞組作為單個“words”來處理。
對高頻次單詞進行抽樣來減少訓練樣本的個數。

層次softmax 實質上生成一顆帶權路徑最小的哈夫曼樹,讓高頻詞搜索路徑變小;
負采樣更為直接,實質上對每一個樣本中每一個詞都進行負例采樣;這樣每個訓練樣本的訓練只會更新一小部分的模型權重,從而降低計算負擔。

事實證明,對常用詞抽樣并且對優化目標采用“negative sampling”不僅降低了訓練過程中的計算負擔,還提高了訓練的詞向量的質量。

3.1 層次softmax

問題:
計算量瓶頸:
詞表大
softmax計算大
每次更新更新參數多,百萬數量級的權重矩陣和億萬數量級的訓練樣本

1)用huffman編碼做詞表示
2)把N分類變成了log(N)個2分類。 如要預測的term(足球)的編碼長度為4,則可以把預測為’足球’,轉換為4次二分類問題,在每個二分類上用二元邏輯回歸的方法(sigmoid);
3)邏輯回歸的二分類中,sigmoid函數導數有很好的性質,𝜎′(𝑥)=𝜎(𝑥)(1?𝜎(𝑥))
4)采用隨機梯度上升求解二分類,每計算一個樣本更新一次誤差函數

從根節點到葉子節點的唯一路徑編碼了這個葉子節點所屬的類別
代價:增強了詞與詞之間的耦合性層次softmax
Word2Vec中從輸入到隱層的過程就是Embedding的過程。

在word2vec中,約定左子樹編碼為1,右子樹編碼為0,同時約定左子樹的權重不小于右子樹的權重。

在霍夫曼樹中,隱藏層到輸出層的softmax映射不是一下子完成的,而是沿著霍夫曼樹一步步完成的,因此這種softmax取名為"Hierarchical Softmax"。

二元邏輯回歸的方法,即規定沿著左子樹走,那么就是負類(霍夫曼樹編碼1),沿著右子樹走,那么就是正類(霍夫曼樹編碼0)。判別正類和負類的方法是使用sigmoid函數,即:

基于層次softmax的CBOW和SKIP_GRAM梯度推導以及訓練過程

3.1.1 Hierarchical Softmax的缺點與改進

如果我們的訓練樣本里的中心詞𝑤是一個很生僻的詞,那么就得在霍夫曼樹中辛苦的向下走很久.
負采樣就是結局這個問題的
Negative Sampling就是這么一種求解word2vec模型的方法,它摒棄了霍夫曼樹,采用了Negative Sampling(負采樣)的方法來求解,下面我們就來看看Negative Sampling的求解思路

3.2 負采樣

gensim的word2vec 默認已經不采用分層softmax了, 因為𝑙𝑜𝑔21000=10也挺大的;如果huffman的根是生僻字,則分類次數更多;
所以這時候負采樣就派上了用場

Negative Sampling由于沒有采用霍夫曼樹,每次只是通過采樣neg個不同的中心詞做負例,就可以訓練模型,因此整個過程要比Hierarchical Softmax簡單。

不過有兩個問題還需要弄明白:
1)如果通過一個正例和neg個負例進行二元邏輯回歸呢?
2) 如何進行負采樣呢?

基于負采樣的CBOW和SKIP_GRAM梯度推導以及訓練過程

3.2.1負采樣怎么做的

所有的參數都在訓練中調整的話,巨大計算量
負采樣每次讓一個訓練樣本僅僅更新一小部分的權重
現在只更新預測詞以及neg個負例詞的權重

隨機選擇一小部分的negative words(比如選5個negative words)來更新對應的權重。
我們也會對我們的“positive” word進行權重更新(在我們上面的例子中,這個單詞指的是”quick“)。

在論文中,作者指出指出對于小規模數據集,選擇5-20個negative words會比較好,對于大規模數據集可以僅選擇2-5個negative words。

3.2.2 如何選擇negative words

“一元模型分布(unigram distribution)”來選擇“negative words”。
出現頻次越高的單詞越容易被選作negative words。
在這里插入圖片描述

每個單詞被賦予一個權重,即f(wi), 它代表著單詞出現的頻次。
公式中開3/4的根號完全是基于經驗的,論文中提到這個公式的效果要比其它公式更加出色。
你可以在google的搜索欄中輸入“plot y = x^(3/4) and y = x”,然后看到這兩幅圖(如下圖),仔細觀察x在[0,1]區間內時y的取值,有一小段弧形,取值在y=x函數之上。
在這里插入圖片描述

負采樣的C語言實現非常的有趣。unigram table有一個包含了一億個元素的數組,這個數組是由詞匯表中每個單詞的索引號填充的,并且這個數組中有重復,也就是說有些單詞會出現多次。那么每個單詞的索引在這個數組中出現的次數該如何決定呢,有公式P(wi)V,也就是說計算出的負采樣概率1億=單詞在表中出現的次數。
有了這張表以后,每次去我們進行負采樣時,只需要在0-1億范圍內生成一個隨機數,然后選擇表中索引號為這個隨機數的那個單詞作為我們的negative word即可。一個單詞的負采樣概率越大,那么它在這個表中出現的次數就越多,它被選中的概率就越大。

3.2.3 為什么需要做采樣:

skip_gram 解決高頻詞訓練樣本太大的問題:
原始訓練樣本:

  • 1.對于高頻詞。會產生大量的訓練樣本。
    -2.(“fox”, “the”) 這樣的訓練樣本并不會給我們提供關于“fox”更多的語義信息,因為“the”在每個單詞的上下文中幾乎都會出現。
    常用詞出現概率很大,樣本數量遠遠超過了我們學習“the”這個詞向量所需的訓練樣本數。

Word2Vec通過“抽樣”模式來解決這種高頻詞問題。
它的基本思想如下:對于我們在訓練原始文本中遇到的每一個單詞,它們都有一定概率被我們從文本中刪掉,而這個被刪除的概率與單詞的頻率有關。
Z(wi)即單詞wi在語料中出現頻率在這里插入圖片描述
在這里插入圖片描述

當Z(wi)<=0.0026時,P(wi)=1.0。當單詞在語料中出現的頻率小于0.0026時,它是100%被保留的,這意味著只有那些在語料中出現頻率超過0.26%的單詞才會被采樣。
當Z(wi)<=0.00746時,P(wi)=0.5,意味著這一部分的單詞有50%的概率被保留。
當Z(wi)<=1.0時,P(wi)=0.033,意味著這部分單詞以3.3%的概率被保留。

4 問題

4.1 詞袋模型到word2vec改進了什么?

詞袋模型(Bag-of-words model)是將一段文本(比如一個句子或是一個文檔)用一個“裝著這些詞的袋子”來表示,這種表示方式不考慮文法以及詞的順序。而
在用詞袋模型時,文檔的向量表示直接將各詞的詞頻向量表示加和。通過上述描述,可以得出詞袋模型的兩個缺點:

詞向量化后,詞與詞之間是有權重大小關系的,不一定詞出現的越多,權重越大。 詞與詞之間是沒有順序關系的。
而word2vec是考慮詞語位置關系的一種模型。通過大量語料的訓練,將每一個詞語映射成一個低維稠密向量,通過求余弦的方式,可以判斷兩個詞語之間的關系,word2vec其底層主要采用基于CBOW和Skip-Gram算法的神經網絡模型。

因此,綜上所述,詞袋模型到word2vec的改進主要集中于以下兩點:

考慮了詞與詞之間的順序,引入了上下文的信息
得到了詞更加準確的表示,其表達的信息更為豐富

5 代碼

import jieba
import os
import re
import pandas as pd
from gensim.models.word2vec import Word2Vec
import gensimclass TrainWord2Vec(object):"""訓練得到一個Word2Vec模型"""def __init__(self, data, stopword, new_path, num_features=100, min_word_count=1, context=4, incremental=False):"""定義變量:param data: 用于訓練胡語料:param stopword: 停用詞表:param num_features:  返回的向量長度:param min_word_count:  最低詞頻:param context: 滑動窗口大小:param incremental: 是否進行增量訓練:param old_path: 若進行增量訓練,原始模型路徑"""self.data = dataself.stopword = stopwordself.num_features = num_featuresself.min_word_count = min_word_countself.context = contextself.incremental = incremental#self.old_path = old_pathself.new_path = new_pathdef clean_text(self):"""采用結巴分詞函數分詞:param corpus: 待分詞的Series序列:return: 分詞結果,list"""# 去除無用字符pattern = re.compile(r'[\sA-Za-z~()()【】%*#+-\.\\\/:=:__,,。、;;“”""''’‘??!!<《》>^&{}|=……]')corpus_ = self.data.apply(lambda s: re.sub(pattern, '', str(s)))# 分詞text = corpus_.apply(jieba.lcut)# 過濾通用詞text = text.apply(lambda cut_words: [word for word in cut_words if word not in self.stopword])return textdef get_model(self, text):"""從頭訓練word2vec模型:param text: 經過清洗之后的語料數據:return: word2vec模型"""model = Word2Vec(text, vector_size=self.num_features, min_count=self.min_word_count, window=self.context)return modeldef update_model(self, text):"""增量訓練word2vec模型:param text: 經過清洗之后的新的語料數據:return: word2vec模型"""model = Word2Vec.load(self.old_path)  # 加載舊模型model.build_vocab(text, update=True)  # 更新詞匯表model.train(text, total_examples=model.corpus_count, epochs=20)  # epoch=iter語料庫的迭代次數;(默認為5)  total_examples:句子數。return modeldef train(self):"""主函數,保存模型"""# 加入自定義分析詞庫#jieba.load_userdict("add_word.txt")text = self.clean_text()if self.incremental:model = self.update_model(text)else:model = self.get_model(text)model.train(text, total_examples=model.corpus_count, epochs=20)# 保存模型model.wv.save_word2vec_format(self.new_path, binary=True)if __name__ == '__main__':corpus = []infile = "/dataset/sentence_sim/V1_6/data/qiwei/single"stop_file = "qiwei_vocab_no_in.txt"w2v_file = 'w2v_qiwei.bin'for file_i in ["train.csv", "test.csv"]:corpus.append(pd.read_csv(os.path.join(infile, file_i))["text"])corpus = corpus[0].append(corpus[1])print(len(corpus))stopword = []with open(stop_file, "r") as f:for info in f.readlines():stopword.append(info.strip())new_model_path = w2v_filemodel = TrainWord2Vec(corpus, stopword, new_model_path)model.train()

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

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

相關文章

Elasticsearch向量庫

在Elasticsearch&#xff08;ES&#xff09;最新版本&#xff08;目前8.x系列&#xff09;中&#xff0c;無需額外的“embedding插件”&#xff0c;因為ES從7.14版本開始就原生支持向量數據類型&#xff08;dense_vector&#xff09; 和向量搜索能力&#xff0c;可直接作為向量…

嵌入式學習的第四十四天-ARM

一、ARM內核基礎知識1.ALU算術邏輯單元&#xff1b;完成運算的電路2.通用寄存器&#xff1a;R0~R15R13&#xff08;SP&#xff09;&#xff1a;棧指針寄存器&#xff1a;指向棧的指針&#xff08;指向正確的位置&#xff09;&#xff0c;為了保護現場 R14&#xff08;LR…

QML開發:QML中的基本元素

文章目錄一、概述二、常用基本元素2.1 基礎視覺元素&#xff08;常用于布局和顯示&#xff09;2.1.1 元素 Item 的介紹和使用2.1.2 元素 Rectangle 的介紹和使用2.1.3 元素 Image 的介紹和使用2.1.4 元素 Text 的介紹和使用2.2 交互元素&#xff08;用于接收用戶操作&#xff0…

Spring AI 項目實戰(二十二):Spring Boot + AI +DeepSeek實現智能合同數據問答助手?(附完整源碼)

系列文章 序號 文章名稱 1 Spring AI 項目實戰(一):Spring AI 核心模塊入門 2 Spring AI 項目實戰(二):Spring Boot + AI + DeepSeek 深度實戰(附完整源碼) 3 Spring AI 項目實戰(三):Spring Boot + AI + DeepSeek 打造智能客服系統(附完整源碼) 4

從 0 到 1 創建 InfluxDB 3 表:標簽、字段、命名規范一篇講透

前言 在使用 InfluxDB 3 存儲時序數據時,表的設計堪比蓋房子打地基,地基打歪,數據“塌方”指日可待。InfluxDB 雖然不是傳統意義上的關系型數據庫,但它有自己的一套“審美”:標簽(Tags)和字段(Fields)是它的雙核心,誰先誰后,關系重大,順序寫錯,查詢性能立馬打折。…

[sqlserver] 分析SQL Server中執行效率較低的SQL語句

查詢性能分析較低的SQL語句 -- 查詢性能分析 SELECT TOP 50qs.creation_time AS [編譯時間],qs.last_execution_time AS [最后執行時間],qs.execution_count AS [執行次數],qs.total_worker_time/1000 AS [CPU總時間(ms)],qs.total_elapsed_time/1000 AS [總耗時(ms)],(qs.tota…

SmartX 用戶建云實踐|寶信軟件:搭建“雙架構”私有云平臺,靈活滿足多種業務需求

上海寶信軟件股份有限公司&#xff08;以下簡稱寶信軟件&#xff09;系中國寶武實際控制、寶鋼股份控股的上市軟件企業&#xff0c;是中國領先的工業軟件行業應用解決方案和服務提供商&#xff0c;為寶武集團提供整體 IT 基礎架構解決方案與服務。為統一管理寶武集團旗下分散在…

應用科普 | 漫談6G通信的未來

【摘要前言】2019年推出的5G無線通信將移動設備的性能提升到了一個新的水平。首批應用利用5G提供移動寬帶&#xff0c;使消費者能夠以遠超以往的速度進行流媒體傳輸、游戲和連接。隨著技術的成熟&#xff0c;它已成為物聯網的關鍵組成部分&#xff0c;將機器匯集到一個全球網絡…

從零開始用 Eclipse 寫第一個 Java 程序:HelloWorld 全流程 + 避坑指南

對于 Java 初學者來說&#xff0c;第一次用 Eclipse 寫程序往往會手足無措 —— 找不到新建項目的入口、不知道包和類該怎么命名、運行時控制臺突然消失…… 別慌&#xff01;本文以最經典的 “HelloWorld” 為例&#xff0c;手把手帶你走完從 Eclipse 項目創建到程序運行的完整…

NVIDIA Isaac GR00T N1.5 源碼剖析與復現

? 0. 前言 2025.6.11 NVIDIA Isaac GR00T N1 進化&#xff0c;英偉達發布了NVIDIA Isaac GR00T N1.5模型&#xff0c;效果比原先提高了不少&#xff0c;故來復現一下&#xff0c;看看能否應用于我的項目中&#xff1a; 代碼頁 項目頁 模型頁 ? 以下是使用 GR00T N1.5 的一般…

手把手教你馴服Apache IoTDB時序數據庫,開啟時序數據管理新征程!

手把手教你馴服Apache IoTDB&#xff0c;開啟時序數據管理新征程&#xff01; 本文是一篇幽默風趣的 Apache IoTDB 時序數據庫安裝使用教程。從 “這東西能不能吃” 的靈魂拷問切入&#xff0c;先科普 IoTDB 的 “真實身份”—— 一款專為時序數據設計的數據庫利器&#xff0c;…

劇本殺小程序系統開發:開啟沉浸式推理社交新紀元

在數字化浪潮席卷的當下&#xff0c;傳統娛樂方式正經歷著前所未有的變革&#xff0c;劇本殺這一融合了推理、角色扮演與社交互動的熱門游戲&#xff0c;也搭上了科技的快車&#xff0c;劇本殺小程序系統開發應運而生&#xff0c;為玩家們開啟了一扇通往沉浸式推理社交新世界的…

Ubuntu系統VScode實現opencv(c++)視頻的處理與保存

通過OpenCV等計算機視覺工具&#xff0c;開發者可以像處理靜態圖像一樣對視頻流逐幀分析&#xff1a;從簡單的裁剪、旋轉、色彩校正&#xff0c;到復雜的穩像、目標跟蹤、超分辨率重建。而如何將處理后的高幀率、高動態范圍數據高效壓縮并封裝為通用格式&#xff08;如MP4、AVI…

三坐標測量技術解析:從基礎原理到斜孔測量難點突破

基礎原理 三坐標測量儀&#xff08;Coordinate Measuring Machine&#xff0c;CMM&#xff09;這種集機械、電子、計算機技術于一體的三維測量設備&#xff0c;其核心技術原理在于&#xff1a;當接觸式或非接觸式測頭接觸感應到工件表面時&#xff0c;測量系統會瞬間記錄三個坐…

【MySQL基礎篇】:MySQL常用內置函數以及實用示例

?感謝您閱讀本篇文章&#xff0c;文章內容是個人學習筆記的整理&#xff0c;如果哪里有誤的話還請您指正噢? ? 個人主頁&#xff1a;余輝zmh–CSDN博客 ? 文章所屬專欄&#xff1a;MySQL篇–CSDN博客 文章目錄內置函數一.日期函數二.字符串函數三.數學函數四.其他函數內置函…

Mirror學習筆記

Mirror官方案例操作 一、導入Mirror 在unity商城訂閱Mirror https://assetstore.unity.com/packages/tools/network/mirror-129321 使用unity創建工程 &#xff08;推薦版本&#xff1a;目前建議使用 Unity 2020 或 2021 LTS 版本&#xff1b;超出這些版本的可能可以運行…

R4周打卡——Pytorch實現 LSTM火災預測

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 一、準備工作 1.1導入數據 1.2數據集可視化 二、構建數據集 2.1數據集預處理 2.2設置X、Y 2.3檢查數據集中有沒有空值 2.4劃分數據集 三、構建模型 3.1定義訓…

【視覺識別】Ubuntu 22.04 上編譯安裝OPENCV 4.12.0 魯班貓V5

系列文章目錄 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 例如&#xff1a;第一章 Python 機器學習入門之pandas的使用 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目…

基于vue的財務管理系統/基于php的財務管理系統

基于vue的財務管理系統/基于php的財務管理系統

機器學習技術在訂單簿大單檢測中的應用研究

訂單簿數據的特點 訂單簿&#xff08;Order Book&#xff09;是記錄市場上所有未成交買賣訂單的數據結構&#xff0c;通常包括價格、數量、買賣方向等信息。訂單簿數據具有以下特點&#xff1a; 高頻率&#xff1a;訂單簿數據更新速度極快&#xff0c;通常以毫秒甚至微秒為單位…