上期我們一起學習了RNN的GRU模塊,
深度學習算法(第23期)----RNN中的GRU模塊
今天我們一起簡單學習下自然語言處理中的Word Embedding.
我們知道,在前面的RNN或者CNN中,我們在訓練網絡的時候,不管輸入還是輸出,都是數值型的數據參與數學矩陣就算,然而面對自然語言中的單詞,是沒辦法進行矩陣運算的,那麼單詞該怎麼輸入到網絡中呢?
怎麼解決?其實Word Embedding就是解決上面的問題的,也就是對單詞的轉換表述。我們在之前的分類中常用的標籤標示方法為one-hot向量,那麼這裡能不能也用one-hot向量呢?假如我們的詞彙有5000個詞,那麼一個詞用one-hot的方法標示的話,將會是一個5000維度的向量,這種稀疏的標示方法效率是及其低下的。
理想情況下,我們希望相似的詞有相似的標示方法,這樣模型就比較容易從一個詞推斷出和它相似的詞有相同的用法。比如說,如果我們告訴模型「I drink milk」是一個有效的句子,並且如果模型知道「milk」和「water」比較接近,跟「shoes」相差比較遠的話,那麼模型將知道句子「I drink milk」比「I drink shoes」靠譜的多。
標示詞彙中的一個詞最常用的方法就是用一個相對小的,稠密(非稀疏)的向量(比如150維),稱為一個embedding。那麼接下來的任務就是讓神經網絡對每一個詞訓練出一個比較好的embedding。在訓練的初期,embeddings基本上是隨機選擇的,但是經過網絡的前後傳輸之後,最終相似的詞將會聚類到一起,甚至會以某種更有意義的方式聚集到一起,比如性別,單複數,動名詞等等。
在tensorflow中,我們應該首先為詞彙中的每一個詞創建一個embedding(隨機初始化),如下:
vocabulary_size = 50000
embedding_size = 150
embeddings = tf.Variable(
tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))現在,假如我們想將「I drink milk」輸入到網絡中,那麼我們首先需要對句子做預處理,比如將句子拆分成已知的詞,移除不必要的字符,替換未知字符。例如用[unk]代替未知的詞,用[num]代替數字,用[url]代替網址等等。一旦我們有了已知單詞的列表,那麼我們就可以從詞彙表中查找到相應單詞的整數索引(0~4999),比如說「I drink milk」轉換之後為[72, 3335, 288]。
train_inputs = tf.placeholder(tf.int32, shape=[None])
embed = tf.nn.embedding_lookup(embeddings, train_inputs)如上,這個時候,我們就可以用一個placeholder來將這個句子輸入到網絡中了,並且用函數embedding_lookup()來獲取相應的embedding。
一旦我們的模型學到了比較好的embeddings,那麼這些embeddings也可以用在其他NLP的應用中,畢竟,「milk」基本上在任何應用中都和「water」相近,而和「shoes」相遠。事實上,一般情況下,我們都會去down一個別人訓練好的embeddings,而不是自己去重新訓練一個。就和之前學的復用訓練好的層一樣,復用別人訓練好的embeddings。好了,至此,今天我們簡單學習了自然語言處理的word embedding的簡單知識,希望有些收穫,下期我們將一起學習下機器翻譯中的編碼解碼器,歡迎留言或進社區共同交流,喜歡的話,就點個「在看」吧,您也可以置頂公眾號,第一時間接收最新內容。
智能算法,與您攜手,沉澱自己,引領AI!