DNN模型訓練詞向量原理

轉自:https://blog.csdn.net/fendouaini/article/details/79821852

1 詞向量

在NLP里,最細的粒度是詞語,由詞語再組成句子,段落,文章。所以處理NLP問題時,怎么合理的表示詞語就成了NLP領域中最先需要解決的問題。

因為語言模型的輸入詞語必須是數值化的,所以必須想到一種方式將字符串形式的輸入詞語轉變成數值型。由此,人們想到了用一個向量來表示詞組。在很久以前,人們常用one-hot對詞組進行編碼,這種編碼的特點是,對于用來表示每個詞組的向量長度是一定的,這個長度就是對應的整個詞匯表的大小,對應每個具體的詞匯表中的詞,將該詞的對應的位置置為1,向量其他位置置為0。舉個例子,假設我們現有5個詞組組成的詞匯表,詞’Queen’對應的序號是2,那么它的詞向量就是(0,1,0,0,0)。其他的詞也都是一個長度為5的向量,對應位置是1,其余位置為0。

?

?

One-hot code非常簡單,但是存在很大的問題,當詞匯表很大,比如數百萬個詞組成了詞匯表時,每個詞的向量都是數百萬維,會造成維度災難。并且,one-hot 編碼的向量會過于稀疏,這樣的稀疏向量表達一個詞效率并不高。

而dristributed representation(通常叫做詞向量)可以很好的解決one-hot code的問題,它是通過訓練,將每個詞都映射到一個較短的詞向量上(這樣就解決了每個詞向量的維度過大問題),所有的詞向量構成了詞匯表的每個詞。并且更重要的是,dristributed representation表示的較短詞向量還具有衡量不同詞的相似性的作用。比如‘忐’,‘忑’兩個字如果作為兩個詞,那么在dristributed representation表示下,這兩個詞的向量應該會非常相似。不僅如此,dristributed representation表示的詞向量還能表示不同詞組間組合的關系,比如假設現在由訓練好的詞向量,現在拿出King,Queen,Man,Woman四個詞的詞向量,則:

?

?

?

?

2.DNN訓練詞向量

詞向量怎么得到呢,這里得先說語言模型:

f(x)=y

在NLP中,我們把x看作是一個句子里的一個詞,y是這個詞的上下文。這里的f就是語言模型,通過它判斷(x,y)這個樣本,是否符合自然語言的邏輯法則。直白的說,語言模型判斷樣本(x,y)是不是人話。

而詞向量正是從這個訓練好的語言模型中的副產物模型參數(也就是神經網絡的權重)得來的。這些參數是作為輸入x的某種向量化表示,這個向量就叫做詞向量。

注意我們訓練詞向量的邏輯,我們是為了得到一個語言模型的副產物-詞向量,去訓練這個模型。所以我們的目的不是關注在怎么優化該模型,而是為了獲取該模型的參數構造詞向量。

在Word2vec出現之前,已經有用神經網絡DNN來訓練出詞向量了。一般采用三層神經網絡結構,分為輸入層,隱藏層,和輸出層(softmax層)。

?

?

該模型中V代表詞匯表的大小,N代表隱藏層神經元個數(即想要的詞向量維度)。輸入是某個詞,一般用one-hot表示該詞(長度為詞匯表長度),隱藏層有N個神經元,代表我們想要的詞向量的維度,輸入層與隱藏層全連接。輸出層的神經元個數和輸入相同,隱藏層再到輸出層時最后需要計算每個位置的概率,使用softmax計算,每個位置代表不同的單詞。該模型中我們想要的就是經過訓練以后,輸入層到隱藏層的權重作為詞向量。

假設詞匯表有10000個,詞向量維度設定為300。

輸入層:

為詞匯表中某一個詞,采用one-hot編碼 長度為1X10000

隱藏層:

從輸入層到隱藏層的權重矩陣W_v*n就是10000行300列的矩陣,其中每一行就代表一個詞向量。這樣詞匯表中所有的詞都會從10000維的one-hot code轉變成為300維的詞向量。

?

?

輸出層:

經過神經網絡隱層的計算,這個輸入的詞就會變為1X300的向量,再被輸入到輸出層。輸出層就是一個sotfmax回歸分類器。它的每個結點將會輸出一個0-1的概率,所有結點的值之和為1,我們就會取最大概率位置檢測是否為輸入樣本x對應的y。

?

在此補充一下,有沒有考慮過一個問題,采用one-hot編碼時,輸入維度是10000,如果我們將1X10000 向量與10000X300的矩陣相乘,它會消耗大量的計算資源。

?

?

我們發現,one-hot編碼時,由于只有一個位置是1,將該向量與隱藏層權重矩陣相乘會發現,one-hot編碼向量中對應1的index,詞向量中這個下標對應的一行詞向量正式輸出結果。所以,在真正的從輸入到隱藏層的計算中,并不會真正的進行矩陣相乘計算,而是通過one-hot向量1的index取直接查找隱藏層的權重矩陣對應的行,這樣極大的簡化了計算。

?

3.CBOW與Skip-gram模型:

該模型更一般情況是使用CBOW(Continuous Bag-of-Words)或Skip-gram兩種模型來定義數據的輸入和輸出。CBOW的訓練輸入的是某一個特征詞的上下文相關的詞對應的詞向量,輸出是這個特定詞的詞向量。而Skip-gram剛好相反,輸入一個特征詞,輸出是這個特征詞。上下文相關的詞。

?

?

這里我們以CBOW模型為例

假設我們有一句話,people make progress every day。輸入的是4個詞向量,’people’ , ‘make‘ , ‘every’ , ‘day’, 輸出是詞匯表中所有詞的softmax概率,我們的目標是期望progress詞對應的softmax概率最大。

?

?

開始時輸入層到隱藏層的權重矩陣和隱藏層到輸出層的權重矩陣隨機初始化,然后one-hot編碼四個輸入的詞向量’people’ ‘make’ ‘every’ ‘day’,并通過各自向量1的位置查詢輸入到隱藏層的權重矩陣行數,找尋其對應的詞向量。將4個詞向量與隱藏層到輸出層的權重相乘通過激活函數激活后再求平均,最后進行softmax計算輸出的每個位置的概率。再通過DNN反向傳播算法,我們就可以更新DNN的隱藏層的權重參數,也就得到了更新后詞向量。通過不斷的訓練,我們得到的模型參數就會越來越準確,詞向量也會變得越來越好。

?

通過這樣的訓練,為什么詞向量會具有衡量不同詞語義相似性的功能呢?

以CBOW模型為例,這里我們可以看到,通過one-hot編碼的輸入樣本,每次只會在隱藏層中輸出與它對應的權重矩陣的行。也就是說在本次訓練中,隱藏層只會調用與輸入樣本相關的某一行的權重參數,然后反向傳播后每次都是局部更新隱藏層的權重矩陣。

?

?

根據語言學,同義詞的上下文很相似,這樣在訓練模型中,相似輸入值都是對應相似的輸出值,每次就會更偏向于局部更新對應這些詞的詞向量的參數,那么久而久之意思有關聯且相近的詞就會在詞向量上很接近。模型的輸出只是每個位置一一對應了詞向量,本身沒有太大的意義。我的理解訓練詞向量的模型就像在做聚類一樣,每次把上下文的詞與中心詞對應的詞向量通過訓練關聯在一起并彼此影響,這樣意思相近的詞對應的詞向量也會越來越像近。

轉載于:https://www.cnblogs.com/coshaho/p/9571000.html

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

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

相關文章

天平稱重【遞歸解法】

用天平稱重時,我們希望用盡可能少的砝碼組合稱出盡可能多的重量。如果只有5個砝碼,重量分別是1,3,9,27,81則它們可以組合稱出1到121之間任意整數重量(砝碼允許放在左右兩個盤中)。 本…

算法 --- reduce的使用.

描述: 難點: 將[[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]]輸出為[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”]. 關鍵代碼描述: 1.假設我們已經根據輸入的數字得到了 rawArr [[‘a’,‘b’,‘c’],[‘d’,‘e’,‘f’]] 2. 下一步將rawArr[0…

SpringBoot、mysql配置PageHelper插件

一:https://blog.csdn.net/h985161183/article/details/79800737 主要異常:org.springframework.beans.factory.BeanCreationException: Error creating bean with name com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration: pageHelper.…

字符串的拆分以及分隔符所在不同位置的刪除

try { //根據imComuserGroupMng獲取這個數據庫的所有ImComuserGroup數據 List<ImComuserGroup> list imComuserGroupMng.findAllComuserGroup(); //便利實體數據list為數據的集合 …

算法 --- 遞歸生成括號

問題描述 思路: 1.首先生成n個括號 2.左括號數量(記為l)不超過n 3.右括號數量(記為r)不超過n,且優先生成左括號(即 l < r) 4.需要設計一個遞歸式h(str,l,r) // 一開始,str , l 0, r 0 // 第一步進去,添加左括號, str(, l 1, r 0 // 然后因為 l < n . r < l 所以…

使用 TypeScript 改造構建工具及測試用例

最近的一段時間一直在搞TypeScript&#xff0c;一個巨硬出品、賦予JavaScript語言靜態類型和編譯的語言。 第一個完全使用TypeScript重構的純Node.js項目已經上線并穩定運行了。 第二個前后端的項目目前也在重構中&#xff0c;關于前端基于webpack的TypeScript套路之前也有提到…

JavaScript 驗證表單不為空和獲取select下拉列表的值和文本

1.驗證表單不為空 var hasform { "Name": "名字", "Id_card": "身份證", "PaySalary": "月工資", "CardCode": "賬號", "Fk_Subjectf_Code": &quo…

javascript --- 變量污染全局作用域問題解決方案

日常寫法 // 假設你寫了幾個關于某個某塊的函數 function foo1 () {...} function foo2 () {...} function foo3 () {...}出現問題:假設你的團隊中也有一個人定義了foo1函數,那么你寫的將會覆蓋以前的函數,或者會被覆蓋掉.若前面使用let聲明了foo1變量.將會報錯. 解決污染 你…

solr7.4 安裝與使用

1.solr7環境要求 solr7需要java8環境&#xff0c;且需要在環境變量中添加 JAVA_HOME變量。 2.solr 安裝 下載地址 https://lucene.apache.org/solr/mirrors-solr-latest-redir.html 我下載為7.4版本 在solr5以前solr的啟動都有tomcat作為容器&#xff0c;但是從solr5以后solr內…

初入HTML5

在最開始接觸HTML5的時候&#xff0c;你會遇到的大多是一些常見常用的屬性以及屬性值。它們分類廣、品種雜且使用率高。到css各種樣式的時候&#xff0c;你會接觸到更多的東西&#xff0c;各種屬性、選擇器、盒子模型都是重點。那么&#xff0c;現在我們就看一下它們到底是什么…

javascript --- 讓函數的實例可以鏈式調用

關鍵: 在每個函數的末尾加上 return thisthis:在javascript中表示當前的對象 栗如: 有以下函數 var fooObj {foo1: function() {console.log(1);},foo2: function() {console.log(2);},foo3: function() {console.log(3);} }// 你想通過 fooObj.foo1().foo2().foo3() // …

ReactiveCocoa基礎

本文轉載自最快讓你上手ReactiveCocoa之基礎篇&#xff0c;在此基礎上稍作修改&#xff0c;歡迎交流。 有關對 ReactiveCocoa 的看法可以看一下唐巧的這篇ReactiveCocoa 討論會 ReactiveCocoa思維導圖ReactiveCocoa簡介 ReactiveCocoa&#xff08;簡稱為RAC&#xff09;,是由Gi…

javascript --- 創建一個二維數組

想創建一個 n*n 的矩陣,并全部賦予初始值false 你可能會想到下面 let arr []; for(let i 0 ;i< n;i) {arr[i] [];for( let j 0; j< n; j){arr[i][j] false;} }稍微封裝一下: function Cmatrix(n, c) {let arr [];for (let i 0; i < n; i) {arr[i] [];for (le…

配置OpenCV產生flann\logger.h(66): error C4996: ‘fopen': This function or variable may be unsafe問題

轉載自&#xff1a;http://guoming.me/%E9%85%8D%E7%BD%AEopencv%E4%BA%A7%E7%94%9Fflannlogger-h66-error-c4996-fopen-this-function-or-variable-may-be-unsafe%E9%97%AE%E9%A2%98 今天使用vs2012配置OpenCV編譯出現問題: 1>—— 已啟動生成: 項目: Win32ForOpenCV245, 配…

android listview和simpleadapter 給itme 中的控件添加事件

simpleAdapter.setViewBinder(new SimpleAdapter.ViewBinder() { Override public boolean setViewValue(View view, Object data, String textRepresentation) {   Log.d("進入setview","進入setview");if(view instanceof Button &&am…

0 uC/OS 系統精講索引

uC/OS-II與uC/OS-III放在一起講&#xff0c;每個例程同時提供兩個版本的源代碼。 本系列教程主要涉及如下內容&#xff1a; 【原理部分】 1-操作系統簡介&#xff1a;基本概念 2-目錄結構與測試環境搭建&#xff1a;uC/OS-III emWin VS2015 2.1 官方文件目錄結構 【*】uC/Lib …

OPENCV-1 學習筆記

灰度圖&#xff1a;2維矩陣 彩色圖&#xff1a;3維矩陣 ps&#xff1a;目前大部分設備都是用無符號 8 位整數&#xff08;類型為 CV_8U&#xff09;表示像素亮度 Mat類定義&#xff1a; class CV_EXPORTS Mat { public://一系列函數.../* flag 參數中包含許多關于矩陣的信息…

javascript --- repeat的用處

描述 思路: 最多重復s.length次使用String.prototype.repeat(n)方法可以將字符串重復n次 核心: while( i < len/2){if( s s.slice(0,i).repeat(len /i) ) {return ture;} }總體代碼: var repeatedSubstringPattern function(s) {let i 1;let len s.length;while (i …

redis 零散知識

1、單線程 2、默認 16 個庫。0~15 3、select &#xff1a;切換數據庫 4、DBsize &#xff1a;查看當前數據庫的數量 5、keys * &#xff1a;查看當前庫的所有 key 6、keys k? &#xff1a;問號是占位符 7、FlushDB &#xff1a;清除當前庫 8、FlushAll &#xff1a;清除所有庫…

模型評估——定量分析預測的質量

https://blog.csdn.net/hustqb/article/details/77922031 評分參數定義模型評價規則 公共案例預定義值根據度量函數定義你的評分策略應用你自己的評分對象使用多種度量指標分類度量 從二分類到多分類多標簽精確度Cohens kappa混亂矩陣分類報告漢明損失Jaccard 相似性相關系數準…