深度學習利器:TensorFlow與NLP模型

AI前線發表於2017-12-04
作者 | 武維
AI前線出品| ID:ai-front

前言

自然語言處理(簡稱NLP),是研究計算機處理人類語言的一門技術,NLP技術讓計算機可以基於一組技術和理論,分析、理解人類的溝通內容。傳統的自然語言處理方法涉及到了很多語言學本身的知識,而深度學習,是表徵學習(representation learning)的一種方法,在機器翻譯、自動問答、文字分類、情感分析、資訊抽取、序列標註、語法解析等領域都有廣泛的應用。

2013年末谷歌釋出的word2vec工具,將一個詞表示為詞向量,將文字數字化,有效地應用於文字分析。2016年穀歌開源自動生成文字摘要模型及相關TensorFlow程式碼。2016/2017年,谷歌釋出/升級語言處理框架SyntaxNet,識別率提高25%,為40種語言帶來文字分割和詞態分析功能。2017年穀歌官方開源tf-seq2seq,一種通用編碼器/解碼器框架,實現自動翻譯。本文主要結合TensorFlow平臺,講解TensorFlow詞向量生成模型(Vector Representations of Words);使用RNN、LSTM模型進行語言預測;以及TensorFlow自動翻譯模型。

Word2Vec數學原理簡介

我們將自然語言交給機器學習來處理,但機器無法直接理解人類語言。那麼首先要做的事情就是要將語言數學化,Hinton於1986年提出Distributed Representation方法,通過訓練將語言中的每一個詞對映成一個固定長度的向量。所有這些向量構成詞向量空間,每個向量可視為空間中的一個點,這樣就可以根據詞之間的距離來判斷它們之間的相似性,並且可以把其應用擴充套件到句子、文件及中文分詞。

Word2Vec中用到兩個模型,CBOW模型(Continuous Bag-of-Words model)和Skip-gram模型(Continuous Skip-gram Model)。模型示例如下,是三層結構的神經網路模型,包括輸入層,投影層和輸出層。

深度學習利器:TensorFlow與NLP模型
深度學習利器:TensorFlow與NLP模型
深度學習利器:TensorFlow與NLP模型


其中score(wt, h),表示在的上下文環境下,預測結果是的概率得分。上述目標函式,可以轉換為極大化似然函式,如下所示:

深度學習利器:TensorFlow與NLP模型


求解上述概率模型的計算成本是非常高昂的,需要在神經網路的每一次訓練過程中,計算每個詞在他的上下文環境中出現的概率得分,如下所示:

深度學習利器:TensorFlow與NLP模型


然而在使用word2vec方法進行特性學習的時候,並不需要計算全概率模型。在CBOW模型和skip-gram模型中,使用了邏輯迴歸(logistic regression)二分類方法進行的預測。如下圖CBOW模型所示,為了提高模型的訓練速度和改善詞向量的質量,通常採用隨機負取樣(Negative Sampling)的方法,噪音樣本w1,w2,w3,wk…為選中的負取樣。

深度學習利器:TensorFlow與NLP模型


TensorFlow近義詞模型

本章講解使用TensorFlow word2vec模型尋找近義詞,輸入資料是一大段英文文章,輸出是相應詞的近義詞。比如,通過學習文章可以得到和five意思相近的詞有: four, three, seven, eight, six, two, zero, nine。通過對大段英文文章的訓練,當神經網路訓練到10萬次迭代,網路Loss值減小到4.6左右的時候,學習得到的相關近似詞,如下圖所示:

深度學習利器:TensorFlow與NLP模型


下面為TensorFlow word2vec API 使用說明:

構建詞向量變數,vocabulary_size為字典大小,embedding_size為詞向量大小

embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))

定義負取樣中邏輯迴歸的權重和偏置

nce_weights = tf.Variable(tf.truncated_normal
([vocabulary_size, embedding_size], stddev=1.0 / math.sqrt(embedding_size)))
nce_biases = tf.Variable(tf.zeros([vocabulary_size]))

定義訓練資料的接入

train_inputs = tf.placeholder(tf.int32, shape=[batch_size])
train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1])

定義根據訓練資料輸入,並尋找對應的詞向量

embed = tf.nn.embedding_lookup(embeddings, train_inputs)

基於負取樣方法計算Loss值

loss = tf.reduce_mean( tf.nn.nce_loss
(weights=nce_weights, biases=nce_biases, labels=train_labels,
inputs=embed, num_sampled=num_sampled, num_classes=vocabulary_size))

定義使用隨機梯度下降法執行優化操作,最小化loss值

optimizer = tf.train.GradientDescentOptimizer(learning_rate=1.0).minimize(loss)

通過TensorFlow Session Run的方法執行模型訓練

for inputs, labels in generate_batch(...):
feed_dict = {train_inputs: inputs, train_labels: labels}
_, cur_loss = session.run([optimizer, loss], feed_dict=feed_dict)

TensorFlow語言預測模型

本章主要回顧RNN、LSTM技術原理,並基於RNN/LSTM技術訓練語言模型。也就是給定一個單詞序列,預測最有可能出現的下一個單詞。例如,給定[had, a, general] 3個單詞的LSTM輸入序列,預測下一個單詞是什麼?如下圖所示:

深度學習利器:TensorFlow與NLP模型


RNN技術原理

迴圈神經網路(Recurrent Neural Network, RNN)是一類用於處理序列資料的神經網路。和卷積神經網路的區別在於,卷積網路是適用於處理網格化資料(如影象資料)的神經網路,而迴圈神經網路是適用於處理序列化資料的神經網路。例如,你要預測句子的下一個單詞是什麼,一般需要用到前面的單詞,因為一個句子中前後單詞並不是獨立的。RNN之所以稱為迴圈神經網路,即一個序列當前的輸出與前面的輸出也有關。具體的表現形式為網路會對前面的資訊進行記憶並應用於當前輸出的計算中,即隱藏層之間的節點不再無連線而是有連線的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。如下圖所示:

深度學習利器:TensorFlow與NLP模型
深度學習利器:TensorFlow與NLP模型


LSTM技術原理

RNN有一問題,反向傳播時,梯度也會呈指數倍數的衰減,導致經過許多階段傳播後的梯度傾向於消失,不能處理長期依賴的問題。雖然RNN理論上可以處理任意長度的序列,但實習應用中,RNN很難處理長度超過10的序列。為了解決RNN梯度消失的問題,提出了Long Short-Term Memory模組,通過門的開關實現序列上的記憶功能,當誤差從輸出層反向傳播回來時,可以使用模組的記憶元記下來。所以 LSTM 可以記住比較長時間內的資訊。常見的LSTM模組如下圖所示:

深度學習利器:TensorFlow與NLP模型
深度學習利器:TensorFlow與NLP模型


深度學習利器:TensorFlow與NLP模型


output gate類似於input gate同樣會產生一個0-1向量來控制Memory Cell到輸出層的輸出,如下公式所示:

深度學習利器:TensorFlow與NLP模型


三個門協作使得 LSTM 儲存塊可以存取長期資訊,比如說只要輸入門保持關閉,記憶單元的資訊就不會被後面時刻的輸入所覆蓋。

使用TensorFlow構建單詞預測模型

首先下載PTB的模型資料,該資料集大概包含10000個不同的單詞,並對不常用的單詞進行了標註。

首先需要對樣本資料集進行預處理,把每個單詞用整數標註,即構建詞典索引,如下所示:

讀取訓練資料

深度學習利器:TensorFlow與NLP模型

接著讀取訓練資料文字,把單詞序列轉換為單詞索引序列,生成訓練資料,如下所示:

讀取訓練資料單詞,並轉換為單詞索引序列

data = _read_words(filename) data = [word_to_id[word] for word in data if word in word_to_id]

生成訓練資料的data和label,其中epoch_size為該epoch的訓練迭代次數,num_steps為LSTM的序列長度

深度學習利器:TensorFlow與NLP模型

構建LSTM Cell,其中size為隱藏神經元的數量

深度學習利器:TensorFlow與NLP模型

如果為訓練模式,為保證訓練魯棒性,定義dropout操作

深度學習利器:TensorFlow與NLP模型

根據層數配置,定義多層RNN神經網路

深度學習利器:TensorFlow與NLP模型

根據詞典大小,定義詞向量

深度學習利器:TensorFlow與NLP模型

根據單詞索引,查詢詞向量,如下圖所示。從單詞索引找到對應的One-hot encoding,然後紅色的weight就直接對應了輸出節點的值,也就是對應的embedding向量。

深度學習利器:TensorFlow與NLP模型
深度學習利器:TensorFlow與NLP模型

定義RNN網路,其中state為LSTM Cell的狀態,cell_output為LSTM Cell的輸出

深度學習利器:TensorFlow與NLP模型

定義訓練的loss值就,如下公式所示。

深度學習利器:TensorFlow與NLP模型
深度學習利器:TensorFlow與NLP模型

Loss值

深度學習利器:TensorFlow與NLP模型

定義梯度及優化操作

深度學習利器:TensorFlow與NLP模型

單詞困惑度eloss

深度學習利器:TensorFlow與NLP模型

TensorFlow語言翻譯模型

本節主要講解使用TensorFlow實現RNN、LSTM的語言翻譯模型。基礎的sequence-to-sequence模型主要包含兩個RNN網路,一個RNN網路用於編碼Sequence的輸入,另一個RNN網路用於產生Sequence的輸出。基礎架構如下圖所示

深度學習利器:TensorFlow與NLP模型

上圖中的每個方框表示RNN中的一個Cell。在上圖的模型中,每個輸入會被編碼成固定長度的狀態向量,然後傳遞給解碼器。2014年,Bahdanau在論文“Neural Machine Translation by Jointly Learning to Align and Translate”中引入了Attention機制。Attention機制允許解碼器在每一步輸出時參與到原文的不同部分,讓模型根據輸入的句子以及已經產生的內容來影響翻譯結果。一個加入attention機制的多層LSTM sequence-to-sequence網路結構如下圖所示:

深度學習利器:TensorFlow與NLP模型


針對上述sequence-to-sequence模型,TensorFlow封裝成了可以直接呼叫的函式API,只需要幾百行的程式碼就能實現一個初級的翻譯模型。tf.nn.seq2seq檔案共實現了5個seq2seq函式:

  • basic_rnn_seq2seq:輸入和輸出都是embedding的形式;encoder和decoder用相同的RNN cell,但不共享權值引數;
  • tied_rnn_seq2seq:同basic_rnn_seq2seq,但encoder和decoder共享權值引數;
  • embedding_rnn_seq2seq:同basic_rnn_seq2seq,但輸入和輸出改為id的形式,函式會在內部建立分別用於encoder和decoder的embedding矩陣;
  • embedding_tied_rnn_seq2seq:同tied_rnn_seq2seq,但輸入和輸出改為id形式,函式會在內部建立分別用於encoder和decoder的embedding矩陣;
  • embedding_attention_seq2seq:同embedding_rnn_seq2seq,但多了attention機制;

embedding_rnn_seq2seq函式介面使用說明如下:

  • encoder_inputs:encoder的輸入
  • decoder_inputs:decoder的輸入
  • cell:RNN_Cell的例項
  • num_encoder_symbols,num_decoder_symbols:分別是編碼和解碼的大小
  • embedding_size:詞向量的維度
  • output_projection:decoder的output向量投影到詞表空間時,用到的投影矩陣和偏置項
  • feed_previous:若為True, 只有第一個decoder的輸入符號有用,所有的decoder輸入都依賴於上一步的輸出;
深度學習利器:TensorFlow與NLP模型

TensorFlow官方提供了英語到法語的翻譯示例,採用的是statmt網站提供的語料資料,主要包含:giga-fren.release2.fixed.en(英文語料,3.6G)和giga-fren.release2.fixed.fr(法文語料,4.3G)。該示例的程式碼結構如下所示:

  • seq2seq_model.py:seq2seq的TensorFlow模型採用了embedding_attention_seq2seq用於建立seq2seq模型。
  • data_utils.py:對語料資料進行資料預處理,根據語料資料生成詞典庫;並基於詞典庫把要翻譯的語句轉換成用用詞ID表示的訓練序列。如下圖所示:
深度學習利器:TensorFlow與NLP模型

translate.py:主函式入口,執行翻譯模型的訓練

執行模型訓練

深度學習利器:TensorFlow與NLP模型

總結

隨著TensorFlow新版本的不斷髮布以及新模型的不斷增加,TensorFlow已成為主流的深度學習平臺。本文主要介紹了TensorFlow在自然語言處理領域的相關模型和應用。首先介紹了Word2Vec數學原理,以及如何使用TensorFlow學習詞向量;接著回顧了RNN、LSTM的技術原理,講解了TensorFlow的語言預測模型;最後例項分析了TensorFlow sequence-to-sequence的機器翻譯 API及官方示例。

參考文獻

  1. http://www.tensorflow.org
  2. 深度學習利器:分散式TensorFlow及例項分析
  3. 深度學習利器:TensorFlow使用實戰
  4. 深度學習利器:TensorFlow系統架構與高效能程式設計
  5. 深度學習利器:TensorFlow與深度卷積神經網路

作者簡介

武維:IBM Spectrum Computing 研發工程師,博士,系統架構師,主要從事大資料,深度學習,雲端計算等領域的研發工作。

-全文完-

人工智慧已不再停留在大家的想象之中,各路大牛也都紛紛抓住這波風口,投入AI創業大潮。那麼,2017年,到底都有哪些AI落地案例呢?機器學習、深度學習、NLP、影象識別等技術又該如何用來解決業務問題?

2018年1月11-14日,AICon全球人工智慧技術大會上,一些大牛將首次分享AI在金融、電商、教育、外賣、搜尋推薦、人臉識別、自動駕駛、語音互動等領域的最新落地案例,應該能學到不少東西。目前大會8折報名倒數計時,更多精彩可點選閱讀原文詳細瞭解。

t.cn/Rl2M2ZJ



相關文章