C語言中文網 目錄
TensorFlow
1 TensorFlow是什么
2 TensorFlow安裝和下載
3 第一個TensorFlow程序
4 TensorFlow程序結構
5 TensorFlow常量、變量和占位符
6 TensorFlow矩陣基本操作
7 TensorFlow TensorBoard數據流圖可視化
8 TensorFlow代碼自動升級為1.0版本
9 TensorFlow XLA
10 TensorFlow指定CPU和GPU設備
11 TensorFlow與深度學習
12 TensorFlow常用Python擴展包
13 回歸算法有哪些
14 TensorFlow損失函數
15 TensorFlow優化器
16 TensorFlow csv文件讀取數據
17 TensorFlow實現簡單線性回歸
18 TensorFlow實現多元線性回歸
19 TensorFlow邏輯回歸處理MNIST數據集
20 感知機與神經網絡
21 TensorFlow常用激活函數(6種)
22 TensorFlow實現單層感知機
23 TensorFlow實現反向傳播算法
24 TensorFlow多層感知機實現MINIST分類
25 TensorFlow多層感知機函數逼近
26 TensorFlow超參數
27 TensorFlow Keras
28 CNN卷積神經網絡
29 三維卷積神經網絡預測MNIST數字
30 卷積神經網絡分類圖片
31 遷移學習
32 DeepDream網絡
33 TensorFlow實現文本情感分析
34 VGG網絡濾波器
35 VGGNet、ResNet、Inception和Xception
36 預建深度學習提取特征及實現
37 TensorFlow實現InceptionV3
38 TensorFlow WaveNet聲音合成
39 TensorFlow視頻分類(6種方法)
40 RNN循環神經網絡
41 神經機器翻譯(seq2seq RNN)
42 注意力機制(基于seq2seq RNN)
43 RNN訓練模型并生成文本
44 RNN循環神經網絡實現預測比特幣價格
45 主成分分析法(PCA)
46 k均值聚類算法
47 SOM自組織映射法
48 受限玻爾茲曼機訓練
49 推薦系統的實現(基于RBM)
50 基于DBN實現情緒檢測
51 自編碼器
52 標準自編碼器
53 稀疏自編碼器
54 去燥自編碼器
55 卷積自編碼器
56 堆疊自編碼器
57 強化學習
58 OpenAI Gym安裝和使用
59 全連接神經網絡實現玩Pac-Man游戲
60 Q learning實現Cart-Pole平衡游戲
61 DQN算法(深度Q網絡)
62 David Silver策略梯度算法
63 深度學習在移動端的應用
64 Android移動端部署TensorFlow mobile
65 iPhone移動端部署TensorFlow mobile
66 移動端優化TensorFlow代碼
67 GAN生成式對抗網絡
68 GAN生成式對抗網絡虛構MNIST圖像
69 DCGAN虛構MNIST圖像
70 DCGAN虛構名人面孔和其他數據集
71 VAE變分自編碼器
72 CapsNet膠囊網絡
73 TensorFlow分布式
74 TensorFlow GPU的安裝和使用
75 TensorFlow分布式
76 TensorFlow分布式訓練MNIST分類器
77 TensorFlow Serving運行Docker容器
78 TensorFlow分布式在谷歌云平臺運行
79 TensorFlow分布式在谷歌CloudML運行
80 TensorFlow分布式在Microsoft Azure上運行
81 TensorFlow分布式在Amazon AWS上運行
首頁 > TensorFlow 閱讀:139

神經機器翻譯(seq2seq RNN)實現詳解

seq2seq 是一類特殊的 RNN,在機器翻譯、文本自動摘要和語音識別中有著成功的應用。本節中,我們將討論如何實現神經機器翻譯,得到類似于谷歌神經機器翻譯系統得到的結果(https://research.googleblog.com/2016/09/a-neural-network-for-machine.html)。

關鍵是輸入一個完整的文本序列,理解整個語義,然后輸出翻譯結果作為另一個序列。閱讀整個序列的想法與以前的架構截然不同,在該架構中,一組固定詞匯從一種源語言翻譯成目標語言。

本節受到 Minh-Thang Luong 于 2016 年所寫的博士論文“Neural Machine Translation”的啟發。第一個關鍵概念是編碼器–解碼器架構,其中編碼器將源語句轉換為表示語義的向量,然后這個向量通過解碼器產生翻譯結果。

編碼器和解碼器都是 RNN,它們可以捕捉語言中的長距離依賴關系,例如性別一致性和語法結構,而不必事先知道它們,也不需要跨語言進行 1:1 映射。它能夠流利地翻譯并且具有強大的功能。


圖 1 編碼器–解碼器示例

來看一個 RNN 例子:將 She loves cute cats 翻譯成 Elle aime les chats mignons。有兩個 RNN:一個充當編碼器,一個充當解碼器。源語句 She loves cute cats 后面跟著一個分隔符“-”和目標語句 Elle aime les chats mignon。這兩個關聯語句被輸入給編碼器用于訓練,并且解碼器將產生目標語句 Elle aime les chats mignon。當然,需要大量類似例子來獲得良好的訓練。


圖 2 NMT的序列模型示例

NUM序列模型,一個深度循環結構示例,用于將源語句“She loves cute cats” 翻譯成目標語句“Elle aimel les chats mignons”。解碼器側,前面時序中產生的單詞作為輸出下一個單詞的輸入,“_”代表語句的結束。

現在有一些可以使用的 RNN 變體,具體介紹其中的一些:
  • RNN 可以是單向的或雙向的,后者將捕捉雙向的長時間依賴關系。
  • RNN 可以有多個隱藏層,層數的選擇對于優化來說至關重要...更深的網絡可以學到更多知識,另一方面,訓練需要花費很長時間而且可能會過度擬合。
  • RNN 可以有多個隱藏層,層數的選擇對于優化來說至關重要...更深的網絡可以學到更多知識,另一方面,訓練需要花費很長時間而且可能會過度擬合。
  • RNN 可以具有嵌入層,其將單詞映射到嵌入空間中,在嵌入空間中相似單詞的映射恰好也非常接近。
  • RNN 可以使用簡單的重復性單元、LSTM、窺孔 LSTM 或者 GRU。

仍然考慮博士論文“Neural Machine Translation”,可以使用嵌入層將輸入的句子映射到一個嵌入空間。然后,存在兩個連接在一起的 RNN——源語言的編碼器和目標語言的解碼器。如下圖所示,有多個隱藏層和兩個流動方向:前饋垂直方向連接隱藏層,水平方向是將知識從上一步轉移到下一步的循環部分。


圖 3 神經機器翻譯示例

本節使用 NMT(Neural Machine Translation,神經機器翻譯),這是一個在 TensorFlow 上在線可得的翻譯演示包。

NMT 可通過https://github.com/tensorflow/nmt/ 獲取,具體代碼可通過 GitHub 獲取。

具體實現過程

  1. 從 GitHub 克隆 NMT:


     
  2. 下載一個訓練數據集。在這個例子中,使用訓練集將越南語翻譯成英語,其他數據集可以在https://nlp.stanford.edu/projects/nmt/上獲得,如德語和捷克語:


     
  3. 參考https://github.com/tensorflow/nmt/,這里將定義第一個嵌入層,嵌入層將輸入、詞匯量尺寸 V 和期望的輸出尺寸嵌入到空間中。詞匯量尺寸 V 中只有最頻繁的單詞才考慮被嵌入,所有其他單詞則被打上 unknown 標簽。在本例中,輸入是 time-major,這意味著 max time 是第一個輸入參數(https://www.tensorflow.org/api_docs/python/tf/nn/dynamic_rnn):


     
  4. 仍然參考 https://github.com/tensorflow/nmt/,這里定義一個簡單的編碼器,它使用 tf.nn.rnn_cell.BasicLSTMCell(num_units) 作為基本的 RNN 單元。雖然很簡單,但要注意給定基本 RNN 單元,我們利用 tf.nn.dynamic_rnn 構建了 RNN 的(見https://www.tensorflow.org/api_docs/python/tf/nn/dynamic_rnn):


     
  5. 定義解碼器。首先要有一個基本的 RNN 單元:tf.nn.rnn_cell.BasicLSTMCell,以此來創建一個基本的采樣解碼器 tf.contrib.seq2seq.BasicDecoder,將結果輸入到解碼器 tf.contrib.seq2seq.dynamic_decode 中進行動態解碼。


     
  6. 網絡的最后一個階段是 softmax dense 階段,將最高隱藏狀態轉換為 logit 向量:


     
  7. 定義在訓練階段使用的交叉熵函數和損失:


     
  8. 定義反向傳播所需的步驟,并使用適當的優化器(本例中使用 Adam)。請注意,梯度已被剪裁,Adam 使用預定義的學習率:


     
  9. 運行代碼并理解不同的執行步驟。首先,創建訓練圖,然后開始迭代訓練。評價指標是 BLEU(bilingual evaluation understudy),這個指標是評估將一種自然語言機器翻譯為另一種自然語言的文本質量的標準,質量被認為是算法的結果和人工操作結果的一致性。正如你所看到的,指標值隨著時間而增長:

解讀分析

所有上述代碼已經在 https://github.com/tensorflow/nmt/blob/master/nmt/model.py 上給出。關鍵是將兩個 RNN 打包在一起,第一個是嵌入空間的編碼器,將相似的單詞映射得很接近,編碼器理解訓練樣例的語義,并產生一個張量作為輸出。然后通過將編碼器的最后一個隱藏層連接到解碼器的初始層可以簡單地將該張量傳遞給解碼器。

請注意,學習能夠進行是因為損失函數基于交叉熵,且labels=decoder_outputs。

如下圖所示,代碼學習如何翻譯,并通過BLEU指標的迭代跟蹤進度:
下面我們將源語言翻譯成目標語言。這個想法非常簡單:一個源語句作為兩個組合的 RNN(編碼器+解碼器)的輸入。一旦句子結束,解碼器將發出 logit 值,采用貪婪策略輸出與最大值相關的單詞。

例如,單詞 moi 作為來自解碼器的第一個標記被輸出,因為這個單詞具有最大的 logit 值。此后,單詞 suis 輸出,等等:
圖 5 帶概率分布的NMT序列模型示例

解碼器的輸出有多種策略:
  1. 貪婪:輸出對應最大logit值的單詞。
  2. 采樣:通過對眾多logit值采樣輸出單詞。
  3. 集束搜索:有多個預測,因此創建一個可能結果的擴展樹。

翻譯實現過程

  1. 制定解碼器采樣的貪婪策略。這很簡單,因為可以使用 tf.contrib.seq2seq.GreedyEmbeddingHelper 中定義的庫,由于不知道目標句子的準確長度,因此這里使用啟發式方法將其限制為源語句長度的兩倍。


     
  2. 現在可以運行網絡,輸入一個從未見過的語句(inference_input_file=/tmp/my_infer_file),并讓網絡轉換結果(inference_output_file=/tmp/nmt_model/output_infer):


兩個 RNN 封裝在一起形成編碼器–解碼器 RNN 網絡。解碼器發出的 logits 被貪婪策略轉換成目標語言的單詞。作為一個例子,下面顯示了一個從越南語到英語的自動翻譯的例子:


精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo