4つのニューラルネットワークシーケンスデコードモデルとサンプルコードの説明

4つのニューラルネットワークシーケンスデコードモデルとサンプルコードの説明

[[189448]]

以下は、ニューラル ネットワーク モデルにおける 4 つのシーケンス デコード モデルについて、一般的な言葉を使って、主に全体的な概念やアイデアから一般的な説明を提供して理解を助けるための、カジュアルなトーク、つまりランダムなチャットです。注意:時間と労力を節約するために、以下の数式は掲載しない場合があります。また、一部の詳細は省略されています。ご興味があれば、原文[1][2][3]を直接お読みください。

[1] ニューラルネットワークによるシーケンスツーシーケンス学習

[2] 統計的機械翻訳のためのRNNエンコーダー・デコーダーを用いたフレーズ表現の学習

[3] アラインメントと翻訳を共同学習するニューラル機械翻訳

ニューラル ネットワークを使用したシーケンス エンコーディングの主なモデルは RNN です。現在、セル ユニットのみが異なる LSTM と GRU などのバリアント モデルが人気です。以下はすべて RNN で表されます。

エンコードモデルは比較的単純です。下図に示すように、入力テキスト{X1-X6}は反復的にエンコードされ、各瞬間の隠れ層の状態を取得します。最後に、シーケンスが完了した後、特徴融合を実行して文の表現を取得します。一般的なアプローチは、最後の瞬間のエンコーディング モデルの隠れた状態をシーケンス全体のエンコーディング表現として使用することですが、この効果は実際のアプリケーションではあまり良くありません。したがって、この図では、シーケンス全体の隠れたエンコーディングの合計と平均を直接使用して、シーケンスのエンコーディング ベクトルを取得します。

初期のタスクは主にトピック分類や感情検出などの分類タスクでした。この場合、エンコーディング ベクトルにソフトマックスを追加することで問題を解決できます。ただし、機械翻訳や音声認識などの問題では、シリアル化デコードが必要になります。

エンコード時には、RNN には前の瞬間の隠れ状態のエンコードだけでなく、各瞬間の現在の瞬間の入力文字も含まれることに注意してください。一方、デコード時にはそのような入力はありません。そして、より直接的な方法は、エンコード側で得られたエンコードベクトルを、各瞬間のデコードモデルの入力特徴として使用することです。次の図に示すように:

シンプルで直感的であり、デコードモデルとエンコードモデルに違いはありません。ただし、学者たちはこのモデルがエレガントではないと感じているので、より洗練されたモデルをいくつか紹介しましょう。

このモデルを説明するために、試験での不正行為を一般的な例として使用します。

まず、入力テキストは学習中の教科書であり、エンコード先は教科書の理解に基づいてまとめられた授業ノートであると仮定します。デコード側の隠れ層ニューラルネットワークが私たちの脳であり、各瞬間の出力が試験中にテスト用紙に記入される答えとなります。上記の最も単純なデコード モデルでは、試験中に授業のノートを見ながら解答を書くようなものと考えることができます。これが普通のカンニングをする学生のやり方なら、成績優秀な学生は教科書をめくる必要はありません。彼らは授業のノートを記憶できる強力な脳神経ネットワークを持っています。デコードするときは、以前に書いた内容を復習し、解答用紙に答えを一つずつ丁寧に書いていくだけです。これは次のモデルです[1]。

また、弱い生徒の中には、カンニングをするだけでなく、ノートを見返す際に前回解答用紙に書いた答えを復習しなければならない生徒も多くいます(弱い生徒は前回解答用紙に書いた単語すら思い出せないほど弱いです)。これは次のような解答パターンです[2]。

しかし、成績の悪い生徒もいます。彼らはカンニングをするだけでなく、解答用紙に書いた答えを最後の瞬間に見直すだけでなく、教師が教科書の重要なポイントを強調して、自分でノートを整理できるようにする必要があります(これは一種の注意メカニズムです。ノートを取るときは、テストの問題に応じて重要なポイントを強調する必要があります!)。教師は成績の悪い生徒を本当によく世話します。彼らの解答モードは次のとおりです[3]。

成績優秀な学生を除いて、他の学生は質問に答えながら授業ノートに目を通すというカンニングをしていたことがわかります(多くの文献では、これをデコードモデル構造の覗き見と呼んでいますが、カンニングのように見えませんか?)。また、成績の悪い学生も、先生に要点を強調するように求めました。要点がわかったら、本に目を通す必要はなく、ちらっと見るだけで済みます。文献では、これを「ちらっと見る」と呼んでいますが、カンニングのように見えませんか?

生徒の脳ネットワークを同じ構造に設定すると(IQ を一定に保つように強制すると)、不正行為をする生徒が間違いなく最高得点を獲得します。トップ生徒モードは不利です。簡単なモデルテストをしてみましょう。

テストデータ:

入力シーケンステキスト = ['1 2 3 4 5'

、'6 7 8 9 10′

、'11 12 13 14 15′

、'16 17 18 19 20′

, '21 22 23 24 25']

ターゲットシーケンステキスト = ['1 2 3 4 5'

、「6、7、8、9、10」

、「11、12、13、14、15」

、「16、17、18、19、120」

, '21 22 23 24 25']

いくつかのパラメータを次のように設定します。

(「語彙数:」、51、「固有語」)

('入力最大長:', 5, '単語')

('ターゲット最大長:', 5, '単語')

(「隠れたベクトルの次元」、20)

(「トレーニングストーリーの数:」、5)

(「テストストーリーの数:」、5)

トレーニング プロセスを観察します。

そのうち、第 1 デコード モデルは一般的な不正行為、第 2 デコード モデルは学術マスター モード、第 3 デコード モデルは学術的弱者不正行為、第 4 デコード モデルは学術的弱者不正行為です。

IQ値(デコードモデルのニューラルネットワーク構造)が同じ場合、成績の悪い生徒のカンニングモードの方が質問に速く答える(トレーニング収束速度)のに対し、成績上位の生徒のモードは質問に最も遅く答えることがわかります。

論文[1]で述べたように、Xuebaモデルで良好なパフォーマンスを達成するには、モデルの隠れ層に4,000個のノードが必要です(XuebaのIQは確かに高く、強力な脳ネットワークを持っています)。

考えてみてください。教科書の内容が多ければ、成績優秀な生徒でも疲れてしまいます。成績の悪い生徒は、授業中に理解できると確信していますか?成績の悪い生徒は笑ってしまうので、先生は彼らのために要点を強調します!!!

このブログ記事でテストされたサンプルコードは、[Github アドレス] にあります。

  1. # -*- エンコーディング:utf-8 -*-
  2. 「」
  3. テストエンコーダー-デコーダー 2016/03/22
  4. 「」
  5. keras.modelsからSequentialをインポートする
  6. keras.layers.recurrentからLSTM をインポートします
  7. keras.layers.embeddingsからEmbedding をインポートします
  8. keras.layers.coreからRepeatVector、TimeDistributedDense、Activation をインポートします。
  9. seq2seq.layers.decodersからLSTMDecoder、LSTMDecoder2、AttentionDecoder をインポートします
  10. インポート時間   
  11. numpyをnpとしてインポートする
  12. 輸入再
  13.   
  14. __author__ = 'http://jacoxu.com'
  15.   
  16.   
  17. def pad_sequences(シーケンス, maxlen=None, dtype='int32′,
  18. パディング='pre'、切り捨て='pre'、値=0。):
  19. ”'各シーケンスをパディング 同じ長さ:
  20. 最長シーケンス長さ
  21.   
  22. maxlenが指定されている場合  シーケンスが長くなる
  23. maxlen より長い場合は maxlen切り捨てられます
  24. 切り捨て先頭(デフォルトまたは   
  25. 終わり シーケンス
  26.   
  27. ポストパディングプレパディングをサポートします (デフォルト)。
  28.   
  29. # 引数
  30. シーケンス:各要素シーケンスあるリストリスト   
  31. maxlen: int 、最大長
  32. dtype: 入力する 結果のシーケンスをキャストします
  33. パディング: 'pre'または'post'、前または後にパディング シーケンスの後に
  34. 切り捨て: 'pre'または'post'、を削除 より大きいシーケンスから
  35. 最初maxlenまたは 最後 シーケンス   
  36. value: floatシーケンスを目的の値パディングする
  37.   
  38. #返品   
  39. x:次元 (number_of_sequences, maxlen)を持つnumpy 配列
  40. ”'
  41. 長さ = [シーケンス内のslen(s)]
  42.   
  43. nb_samples = len(シーケンス)
  44. maxlenNoneの場合:
  45. maxlen = np.max (長さ)
  46.   
  47. #最初空でないシーケンスからサンプルシェイプを取得します    
  48. #以下のメインループ一貫性チェックします。
  49. sample_shape = タプル()
  50. シーケンス内のs場合:
  51. len(s) > 0の場合:
  52. sample_shape = np.asarray(s).shape[1:]
  53. 壊す
  54.   
  55. x = (np.ones((nb_samples, maxlen) sample_shape) * 値).astype(dtype)
  56. enumerate(シーケンス)idx、sの場合:
  57. len(s) == 0の場合:
  58. 続行# 空のリストが見つかりました
  59. 切り捨て == 'pre' の場合:
  60. 切り捨て = s[-maxlen:]
  61. elif 切り捨て == 'post':
  62. 切り捨て = s[:maxlen]
  63. それ以外
  64. ValueError が発生します ('切り捨て型 "%s" が認識されません' % 切り捨て)
  65.   
  66. # `trunc` が期待通りの形状であるかどうかをチェックする
  67. trunc = np.asarray(trunc, dtype=dtype)
  68. trunc.shape[1:] != sample_shapeの場合:
  69. ValueErrorが発生します('サンプル%s形状 順序 位置 %s、予想される形状 %s' %異なります
  70. (trunc.shape[1:], idx, sample_shape))
  71.   
  72. パディング == 'post' の場合:
  73. x[idx, :len(trunc)] = 切り捨て
  74. elif パディング == 'pre':
  75. x[idx, -len(trunc):] = trunc
  76. それ以外
  77. ValueError が発生します ('パディング タイプ "%s" が認識されません' % padding)
  78. xを返す
  79.   
  80.   
  81. def vectorize_stories(input_list、tar_list、word_idx、input_maxlen、tar_maxlen、vocab_size):
  82. x_set = []
  83. Y = np.zeros((len(tar_list), tar_maxlen, vocab_size), dtype=np.bool)
  84. input_list_sent場合:
  85. x = [word_idx[w] _sent内のwの場合]
  86. x_set.append(x)
  87. enumerate(tar_list)s_index、tar_tmpの場合:
  88. t_indexの場合enumerate(tar_tmp)トークン:
  89. Y[s_index, t_index, word_idx[トークン]] = 1
  90.   
  91. pad_sequences(x_set, maxlen=input_maxlen)、Yを返す
  92.   
  93.   
  94. def tokenize(送信):
  95. 句読点を含む文トークンを返します
  96.   
  97. >>> tokenize('ボブはリンゴを落としました。  リンゴは何ですか
  98. [ 「ボブ」 「落とした」 「その」 「リンゴ」 「.」 「どこ」 その」 リンゴ」 「?」 ]
  99. ”'
  100. [x.strip()re.split( '(\W )?' 、 sent)内のxに対して返す(x.strip() の場合)]
  101.   
  102.   
  103. main() を定義します:
  104. 入力テキスト = [ '1 2 3 4 5'     
  105. '6 7 8 9 10'     
  106. '11 12 13 14 15'     
  107. '16 17 18 19 20'     
  108. , '21 22 23 24 25' ]
  109. tar_text = [ '1、2、3、4、5'     
  110. 「6、7、8、9、10」     
  111. 「11、12、13、14、15」     
  112. 「16、17、18、19、120」     
  113. , '21 22 23 24 25' ]
  114.   
  115. 入力リスト = []
  116. tar_list = []
  117.   
  118. input_texttmp_inputの場合:
  119. input_list.append(トークン化(tmp_input))
  120. tar_text内のtmp_tarの場合:
  121. tar_list.append(トークン化(tmp_tar))
  122.   
  123. vocab = sorted(reduce(lambda x, y: x | y, ( set (tmp_list) for tmp_list in input_list tar_list)))
  124. # pad_sequencesによるマスク用に0を予約する
  125. vocab_size = len(vocab) 1 # kerasは埋め込みを実行するときにlen(vocab) 1を実行する必要があります
  126. input_maxlen = max (map(len, ( input_list内のxに対するx )))
  127. tar_maxlen = max (map(len, ( tar_list内のxについてx )))
  128. 出力次元 = 語彙サイズ
  129. 隠し次元 = 20
  130.   
  131. 印刷('-')
  132. print('語彙サイズ:', vocab_size, 'ユニーク単語')
  133. print('入力最大長:', input_maxlen, 'words')
  134. print('ターゲット最大長:', tar_maxlen, 'words')
  135. print('隠しベクトル次元:', hidden_​​dim)
  136. print('トレーニングストーリー数:', len(input_list))
  137. print('テストストーリー:', len(input_list))
  138. 印刷('-')
  139. print('単語シーケンスをベクトル化しています…')
  140. word_to_idx = dict((c, i 1) for i, c in enumerate(vocab)) # エンコードには文字をデジタルインデックスにマッピングする必要がある    
  141. idx_to_word = dict((i 1, c) for i, c in enumerate(vocab)) # デコード時に、数値インデックスを文字にマッピングする必要があります
  142. inputs_train、tars_train = vectorize_stories(input_list、tar_list、word_to_idx、input_maxlen、tar_maxlen、vocab_size)
  143.   
  144. デコーダーモード = 1 # 0 最もシンプルなモード、1 [1] 後方モード、2 [2] ピークモード、3 [3] 注意モード
  145. デコーダーモード == 3 の場合:
  146. エンコーダートップレイヤー = LSTM(hidden_​​dim, return_sequences= True )
  147. それ以外
  148. エンコーダートップレイヤー = LSTM(hidden_​​dim)
  149.   
  150. デコーダーモード == 0 の場合:
  151. デコーダートップレイヤー = LSTM(hidden_​​dim, return_sequences= True )
  152. デコーダートップレイヤー.get_weights()
  153. elif デコーダーモード == 1:
  154. デコーダートップレイヤー = LSTMDecoder(hidden_​​dim=hidden_​​dim、output_dim=hidden_​​dim
  155. 、output_length=tar_maxlen、state_input= False 、return_sequences= True )
  156. elif デコーダーモード == 2:
  157. デコーダートップレイヤー = LSTMDecoder2(hidden_​​dim=hidden_​​dim、output_dim=hidden_​​dim
  158. 、output_length=tar_maxlen、state_input= False 、return_sequences= True )
  159. elif デコーダーモード == 3:
  160. デコーダートップレイヤー = AttentionDecoder(hidden_​​dim=hidden_​​dim、output_dim=hidden_​​dim
  161. 、output_length=tar_maxlen、state_input= False 、return_sequences= True )
  162.   
  163. en_de_model = シーケンシャル()
  164. en_de_model.add (埋め込み(input_dim=vocab_size,
  165. output_dim=hidden_​​dim、
  166. input_length=入力最大長))
  167. en_de_model.add (encoder_top_layer)を追加します
  168. デコーダーモード == 0 の場合:
  169. en_de_model. add (RepeatVector(tar_maxlen))
  170. en_de_model.add (decoder_top_layer) (デコーダートップレイヤー
  171.   
  172. en_de_model.add (TimeDistributedDense(output_dim))
  173. en_de_model.add(アクティベーション('softmax'))
  174. print('コンパイル中…')
  175. time_start =時間.時間()
  176. en_de_model.compile(損失='categorical_crossentropy'、オプティマイザー='rmsprop')
  177. time_end =時間.時間()
  178. print('コンパイルされました。所要時間:%f秒!' % (time_end - time_start))
  179. iter_num範囲(5000)場合:
  180. en_de_model.fit(inputs_train、tars_train、batch_size=3、nb_epoch=1、show_accuracy= True )
  181. out_predicts = en_de_model.predict(inputs_train)
  182. i_idx 、out_predict をenumerate(out_predicts)指定します:
  183. 予測シーケンス = []
  184. out_predictpredict_vectorの場合:
  185. next_index = np.argmax(予測ベクトル)
  186. 次のトークン = idx_to_word[次のインデックス]
  187. 予測シーケンス.append(次のトークン)
  188. print('ターゲット出力:', tar_text[i_idx])
  189. print('予測出力:', predict_sequence)
  190.   
  191. print('現在のiter_num:%d' % iter_num)
  192.   
  193. __name__ == '__main__' の場合:
  194. 主要()

<<:  物体検出のための深層畳み込みニューラルネットワークの進歩

>>:  人工知能は人類の未来にどのような影響を与えるのでしょうか?

ブログ    

推薦する

人工知能の主な研究段階と将来の発展方向は何ですか?

人工知能は常にコンピュータ技術の最前線にあり、人工知能研究の理論と発見はコンピュータ技術の発展の方向...

百度研究所が2020年のAI技術トレンド予測トップ10を発表

一歩前進、そしてまた一歩前進し、2019年が終わりました。 12月24日、百度研究所は2020年のト...

遺伝的アルゴリズムの基本概念と実装(Java 実装例付き)

上図(左)に示すように、個体が複数の染色体で構成され、各染色体が複数の遺伝子で構成されている場合に遺...

アリの採餌とインターネットアルゴリズム

[[93484]]人間とアリの違いは何でしょうか? Ant にはインターネットがありません。創造的な...

OpenAIがChatGPT Enterprise Editionをリリース、より高いセキュリティとプライバシー保護を実現

8月29日、OpenAIは、企業ユーザーのニーズを満たし、より高いセキュリティとプライバシー保護を提...

...

...

...

百度言語知識技術サミットが開催され、王海鋒氏がNLP技術の進化の道筋を明らかにした

AIはより深いレベルへと進化しており、言語や知識技術の重要性がますます高まっています。 8月25日、...

ディープニューラルネットワークを使用して三体問題を1億倍速く解く

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

IT サービス管理における 3 つの主要な NLP 使用例

[[421132]] [51CTO.com クイック翻訳]自然言語処理 (NLP) は、機械学習の専...

人工知能が人の感情を認識できるなんてすごいですね。信じられません。

感情認識技術は、実際には人工知能を使用して顔の表情から感情を検出する新興技術であり、数十億ドル規模の...

...

...