從Embedding層到Keras解決文字分類

2021-08-21 15:03:48 字數 2192 閱讀 8714

最近,正在做ccf的乙個與文字分類相關的競賽。這也是我第一次接觸和nlp相關的分類問題,所以成績也並不是很理想,只是想分享下相關的經驗,因為我覺得nlp問題的預處理階段真的很勸退。。。

首先我們拿到的資料是tsv格式,也能當做txt格式來看​。tsv內部的格式為:

tsv中的一篇文章

因此我們可以吧一篇文章當做id \t title \t content \t label \n的格式

這裡我們在nlp問題中需要將詞\字轉化為向量進行處理,那麼就需要用分詞和gensim來完成轉換處理。不過這部分的word2vec處理不是我們這裡說的重點,可以參考

並且,450gb的資料在帶入深度網路中訓練之前io的開銷非常非常的大,整體的效能也極差,可以說我這個外行人鬧了個笑話。其實會有這個問題的最關鍵原因就是我並沒有理解所謂的embedding層的概念。這裡極力推薦蘇神分享的經驗如果看過後還不能充分理解的話可以來這裡結合具體實現的例子來看看。

在蘇神的分享中已經給出了embedding的定義,其本質就是乙個特殊的全連線,只是輸入都是0-1​​​​​

引用自「詞向量與embedding究竟是怎麼回事?」

再說得通俗一點,我們看上面的例子,假設最左邊第乙個矩陣為onehot矩陣x,中間的矩陣是embedding層中儲存的權重矩陣w,x的第一行(1,0,0,0,0,0)是1,第二行其實就是2。然後輸出的分別是w矩陣的第一行和第二行。這裡很多人可能會恍然大悟,窩草!這不就是個hashmap的key,value對映嗎?其實是可以這麼認為的。也就是x中的key=1對應w中value=第一行,key=2對應w矩陣value=第二行。看到這裡大家應該就能理解了,這不就可以用來轉換之前的word2vec嗎?是的。。。就是這麼搞的。

權重矩陣w的csv格式,第一行都是0

然後我們怎麼去處理原文章呢?還要不要可怕的900000x1500x100=450gb的儲存空間了呢?答案當然是no,我們可以僅僅通過詞向量所處w矩陣的行號(index化)來表示原文。這不僅極大縮減了儲存空間,還減少了訓練時候的io開銷。

假設一行是一篇文章,0是補0,10001是代表停用詞(為什麼是10001不是10002?如果是學計算機的就別問這個問題啦)

最終,w矩陣只需要儲存1.7gb,而文章index化儲存10gb,總共只需11.7gb就儲存了之前450gb的東西。

訓練的模型如下:​

簡單的nlp網路框架

這裡提供下embedding層keras的**,也是有一定的代表意義的:

keras的embedding層初始化函式

keras的embedding層

這裡的input_dim和output_dim分別是矩陣w的行數和列數(10002,100)。為什麼輸入會變成10002維呢?因為我們所輸入的index(0~10001)在embedding自動轉換為onehot編碼即10002維。所以這就是個10002—100的全連線,weights就是權重矩陣w,input_length是我們文章的長度上限,mask_zero是能夠自動補0,然而我們w中第一行已經是全0向量了這裡就不用了。不使用mask_zero的原因是他後面所有的layer都必須標記mask_zero,太麻煩了。。。至於trainable,由於我們的w是word2vec訓練出來的,算作預訓練模型,所以就無需訓練了。如果embedding層是trainable的,那麼由onehot的輸入可以認為每個樣本只能更新矩陣w的某一行。

這個分享主要是針對面向nlp的新人(包括我),所以是非常基礎的,請大家輕噴。​

深度學習中Embedding層

keras.layers.embeddings.embedding input dim,output dim,embeddings initializer uniform embeddings regularizer none,activity regularizer none,embeddings...

神經網路層的以及embedding層的對應筆記

神經網路實際上實現的是乙個w x b的操作,然後通過啟用函式進行輸出的過程,即f w乘x b y的過程,這裡面的f代表著乙個對應的啟用函式。所以影響神經網路的輸入以及輸出的過程有兩個關鍵點,乙個是對應的權重矩陣w,另外乙個是對應的啟用函式。偏移量一般都是公司或者企業提前給好的,所以偏移量一般都不在考...

從三層架構到MVC MVP

當然這種架構模式本身的一些問題也會在接下來的內容就加以介紹,另外就是如果大家有什麼不同觀點的話,歡迎拍磚 只要不打臉就行,呵呵 一.mvc是誰提出的 模型 檢視 控制器 mvc 是xerox parc在八十年代為程式語言smalltalk 80發明的一種軟體設計模式,至今已被廣泛使用。最近幾年被推薦...