ディープラーニングツール: TensorFlow と NLP モデル

ディープラーニングツール: TensorFlow と NLP モデル

[[200204]]

序文

自然言語処理 (略して NLP) は、コンピューターが人間の言語を処理する方法を研究するテクノロジーです。NLP テクノロジーにより、コンピューターは一連のテクノロジーと理論に基づいて人間のコミュニケーション コンテンツを分析および理解できるようになります。従来の自然言語処理手法は言語学自体の知識を多く必要としますが、ディープラーニングは表現学習の手法です。機械翻訳、自動質問応答、テキスト分類、感情分析、情報抽出、シーケンスラベル付け、文法解析などで広く使用されています。

2013年末にGoogleがリリースしたword2vecツールは、単語を単語ベクトルとして表現し、テキストをデジタル化し、テキスト分析に効果的に適用されます。 2016 年に、Google は自動テキスト要約モデルと関連する TensorFlow コードをオープンソース化しました。 Google は 2016/2017 年に言語処理フレームワーク SyntaxNet をリリース/アップグレードし、認識率が 25% 向上し、テキスト分割と形態素解析機能が 40 の言語に対応しました。 2017 年、Google は自動翻訳用の汎用エンコーダ/デコーダ フレームワークである tf-seq2seq を正式にオープンソース化しました。この記事では、主に TensorFlow プラットフォームを組み合わせて、TensorFlow 単語ベクトル生成モデル (単語のベクトル表現)、言語予測のための RNN および LSTM モデルの使用、および TensorFlow 自動翻訳モデルについて説明します。

Word2Vec の数学的原理の簡単な紹介

自然言語は機械学習に引き渡されますが、機械は人間の言語を直接理解することはできません。そこで最初にすべきことは、言語を数学化することです。1986 年にヒントンは、言語内の各単語をトレーニングを通じて固定長のベクトルにマッピングする分散表現法を提案しました。これらのベクトルはすべて単語ベクトル空間を構成し、各ベクトルは空間内の点とみなすことができます。このように、単語間の類似性は単語間の距離に基づいて判断でき、その応用は文章、文書、中国語の単語分割にまで拡張できます。

Word2Vec では、CBOW モデル (Continuous Bag-of-Words モデル) と Skip-gram モデル (Continuous Skip-gram Model) の 2 つのモデルが使用されます。モデル例は次のとおりです。これは、入力層、投影層、出力層を含む 3 層のニューラル ネットワーク モデルです。

このうち、score(wt, h)は、コンテキストにおける予測結果の確率スコアを表します。上記の目的関数は、次のように最大尤度関数に変換できます。

上記の確率モデルを解くための計算コストは​​非常に高く、以下に示すように、ニューラル ネットワークの各トレーニング プロセス中に、コンテキスト内に出現する各単語の確率スコアを計算する必要があります。

ただし、特徴学習に word2vec メソッドを使用する場合、完全な確率モデルを計算する必要はありません。 CBOW モデルとスキップグラム モデルでは、ロジスティック回帰バイナリ分類法が予測に使用されます。以下の CBOW モデルに示すように、モデルのトレーニング速度を向上させ、単語ベクトルの品質を向上させるために、通常はランダムネガティブサンプリング法が使用され、ノイズサンプル w1、w2、w3、wk... が選択されたネガティブサンプルになります。

TensorFlow 同義語モデル

この章では、TensorFlow word2vec モデルを使用して同義語を検索する方法について説明します。入力データは長い英語の記事で、出力は対応する単語の同義語です。たとえば、冠詞を調べると、five と似た意味を持つ単語、four、three、seven、eight、six、two、zero、nineteen を見つけることができます。大規模な英語の記事のトレーニングを通じて、ニューラル ネットワークが 100,000 回の反復までトレーニングされ、ネットワーク損失値が約 4.6 に減少すると、学習された関連類似語は次の図のように表示されます。

以下は TensorFlow word2vec API の説明です。

単語ベクトル変数を構築します。vocabulary_sizeは辞書のサイズ、embedding_sizeは単語ベクトルのサイズです。

  1. 埋め込み = tf.Variable(tf.random_uniform([語彙サイズ, 埋め込みサイズ], -1.0, 1.0))

ネガティブサンプリングにおけるロジスティック回帰の重みとバイアスの定義

  1. nce_weights = tf.Variable(tf.truncated_normal
  2.  
  3. ([語彙サイズ、埋め込みサイズ]、標準偏差=1.0 / math.sqrt(埋め込みサイズ)))
  4.  
  5. nce_biases = tf.Variable(tf.zeros([vocabulary_size]))

トレーニングデータへのアクセスを定義する

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

トレーニングデータに基づいて入力を定義し、対応する単語ベクトルを見つける

  1. 埋め込み = tf.nn.embedding_lookup(埋め込み、train_inputs)

ネガティブサンプリング法に基づいて損失値を計算する

  1. 損失 = tf.reduce_mean( tf.nn.nce_loss
  2.  
  3. (重み=nce_weights、バイアス=nce_biases、ラベル=train_labels、
  4.  
  5. 入力=埋め込み、num_sampled=num_sampled、num_classes=語彙サイズ))

確率的勾配降下法を使用して最適化操作を実行し、損失値を最小化することを定義します。

  1. オプティマイザー = tf.train.GradientDescentOptimizer(learning_rate=1.0).minimize(損失)

TensorFlow Session Runメソッドを使用してモデルトレーニングを実行する

  1. generate_batch(...)入力、ラベルの場合:
  2.  
  3. feed_dict = {train_inputs: 入力、train_labels: ラベル}
  4.  
  5. _, cur_loss = session.run([オプティマイザ、損失]、feed_dict=feed_dict)

TensorFlow言語予測モデル

この章では、主に RNN と LSTM テクノロジの原理を確認し、RNN/LSTM テクノロジに基づいて言語モデルをトレーニングします。つまり、一連の単語が与えられた場合、最も可能性の高い次の単語を予測します。たとえば、3 つの単語 [had、a、general] の LSTM 入力シーケンスが与えられた場合、次に予測する単語は何でしょうか? 次の図に示すように:

RNNテクノロジーの原理

リカレント ニューラル ネットワーク (RNN) は、シーケンス データを処理するために使用されるニューラル ネットワークの一種です。畳み込みニューラル ネットワークと再帰型ニューラル ネットワークの違いは、畳み込みニューラル ネットワークはグリッド化されたデータ (画像データなど) の処理に適しているのに対し、再帰型ニューラル ネットワークはシリアル化されたデータの処理に適していることです。たとえば、文中の次の単語を予測したい場合、文中の前の単語と次の単語は独立していないため、通常は前の単語を使用する必要があります。 RNN がリカレント ニューラル ネットワークと呼ばれる理由は、シーケンスの現在の出力が以前の出力にも関連しているためです。具体的な現れは、ネットワークが以前の情報を記憶し、それを現在の出力の計算に適用することです。つまり、隠れ層間のノードは切断されなくなり、接続され、隠れ層の入力には入力層の出力だけでなく、前の瞬間の隠れ層の出力も含まれます。次の図に示すように:

LSTMテクノロジーの原理

RNN には、バックプロパゲーション中に勾配も指数関数的に減少し、多くの伝播段階の後に勾配が消えてしまうという問題があり、長期的な依存関係の問題を処理できません。 RNN は理論的には任意の長さのシーケンスを処理できますが、実際のアプリケーションでは、10 を超えるシーケンスを処理することは困難です。 RNN 勾配消失の問題を解決するために、Long Short-Term Memory モジュールが提案されています。これは、ゲートを切り替えることでシーケンス上のメモリ機能を実現します。出力層からエラーが逆伝播されると、モジュールのメモリ要素を使用して記録できます。そのため、LSTM は比較的長期間情報を記憶することができます。一般的な LSTM モジュールを下の図に示します。

出力ゲートは入力ゲートに似ており、次の式に示すように、出力層へのメモリセルの出力を制御する 0-1 ベクトルも生成します。

3 つのゲートの連携により、LSTM メモリ ブロックは長期的な情報にアクセスできるようになります。たとえば、入力ゲートが閉じている限り、メモリ ユニット内の情報は、後で入力によって上書きされることはありません。

TensorFlow を使用した単語予測モデルの構築

まず、PTB モデル データをダウンロードします。データセットには約 10,000 種類の単語が含まれており、一般的でない単語には注釈が付けられています。

まず、サンプル データ セットを前処理し、各単語に整数のラベルを付ける、つまり、次に示すように辞書インデックスを構築する必要があります。

トレーニングデータの読み取り

  1. データ = _read_words(ファイル名)
  2. # 単語の頻度で並べ替え
  3. カウンター = collections.Counter(データ)
  4. count_pairs = sorted(counter.items(), key =lambda x: (-x1, x[0]))
  5. #辞書と辞書インデックスを構築する
  6. 単語、_ = list(zip(*count_pairs))
  7. word_to_id = dict(zip(単語、範囲(len(単語))))

次に、トレーニング データ テキストを読み取り、単語シーケンスを単語インデックス シーケンスに変換して、以下に示すようにトレーニング データを生成します。

トレーニングデータの単語を読み取り、単語インデックスシーケンスに変換する

  1. data = _read_words(ファイル名) data = [word_to_id[word]データ内の単語に対してword_to_id内の単語の場合]

トレーニングデータのデータとラベルを生成します。epoch_size はこのエポックのトレーニング反復回数、num_steps は LSTM のシーケンス長です。

  1. i = tf.train.range_input_producer(epoch_size, shuffle= False ).dequeue()
  2. x = tf.strided_slice(データ、[0、i * num_steps]、[バッチサイズ、(i + 1) * num_steps])
  3. x.set_shape([バッチサイズ、ステップ数])
  4. y = tf.strided_slice(データ、[0、i * num_steps + 1]、[バッチサイズ、(i + 1) * num_steps + 1])
  5. y.set_shape([バッチサイズ、ステップ数])

LSTMセルを構築する。サイズは隠れニューロンの数である。

  1. lstm_cell = tf.contrib.rnn.BasicLSTMCell(サイズ,
  2.  
  3. バイアスを忘れる=0.0、状態がタプル= True )

トレーニングモードの場合、トレーニングの堅牢性を確保するために、ドロップアウト操作を定義する

  1. attn_cell = tf.contrib.rnn.DropoutWrapper(lstm_cell,
  2.  
  3. output_keep_prob = config.keep_prob)

層の数に応じて多層RNNニューラルネットワークを定義する

  1. セル = tf.contrib.rnn.MultiRNNCell( [ attn_cell _範囲(config.num_layers)],
  2.  
  3. state_is_tuple = True )

辞書のサイズに基づいて単語ベクトルを定義する

  1. 埋め込み = tf.get_variable( "埋め込み" ,
  2.  
  3. [vocab_size,サイズ], dtype=data_type())

下の図に示すように、単語インデックスに従って単語ベクトルを見つけます。単語インデックスから対応する One-hot エンコーディングを見つけると、赤の重みは出力ノードの値、つまり対応する埋め込みベクトルに直接対応します。

  1. 入力 = tf.nn.embedding_lookup(埋め込み、input_.input_data)

RNNネットワークを定義します。ここで、stateはLSTMセルの状態、cell_outputはLSTMセルの出力です。

  1. time_steprange(num_steps)場合:
  2.  
  3. time_step > 0 の場合: tf.get_variable_scope().reuse_variables()
  4.  
  5. (セル出力、状態) = セル(入力[:、時間ステップ、:]、状態)
  6.  
  7. 出力を追加します(セル出力)

トレーニングの損失値は次の式のように定義されます。

  1. softmax_w = tf.get_variable( "softmax_w" 、[サイズ, vocab_size], dtype=data_type())
  2. softmax_b = tf.get_variable( "softmax_b" 、[vocab_size]、dtype=data_type())
  3. ロジット = tf.matmul(出力, softmax_w) + softmax_b

損失額

  1. 損失 = tf.contrib.legacy_seq2seq.sequence_loss_by_example([logits],
  2.  
  3. [tf.reshape(input_.targets, [-1])], [tf.ones([batch_size * num_steps], dtype=data_type())])

勾配と最適化操作の定義

  1. コスト = tf.reduce_sum(損失) / バッチサイズ
  2.  
  3. tvars = tf.trainable_variables()
  4.  
  5. grads, _ = tf.clip_by_global_norm(tf.gradients(cost, tvars), config.max_grad_norm)
  6.  
  7. オプティマイザー = tf.train.GradientDescentOptimizer(self._lr)

言葉の困惑 eloss

  1. 困惑度 = np.exp(コスト / 反復)

TensorFlow 言語翻訳モデル

このセクションでは、主に TensorFlow を使用して RNN および LSTM 言語翻訳モデルを実装する方法について説明します。基本的なシーケンスツーシーケンス モデルは主に 2 つの RNN ネットワークで構成され、1 つの RNN ネットワークはシーケンスの入力をエンコードするために使用され、もう 1 つの RNN ネットワークはシーケンスの出力を生成するために使用されます。基本的なアーキテクチャを下図に示します。

上図の各ボックスは、RNN 内のセルを表します。上記のモデルでは、各入力は固定長の状態ベクトルにエンコードされ、デコーダーに渡されます。 2014 年、Bahdanau は論文「Neural Machine Translation by Jointly Learning to Align and Translate」で Attention メカニズムを紹介しました。 Attention メカニズムにより、デコーダーは各出力ステップで元のテキストのさまざまな部分に注意を払うことができ、モデルは入力文と生成されたコンテンツに基づいて翻訳結果に影響を与えることができます。アテンション メカニズムを備えた多層 LSTM シーケンス間ネットワークの構造を下図に示します。

上記のシーケンスからシーケンスへのモデルの場合、TensorFlow はそれを直接呼び出すことができる関数 API にカプセル化します。基本的な翻訳モデルを実装するには、数百行のコードだけが必要です。 tf.nn.seq2seq ファイルは合計 5 つの seq2seq 関数を実装します。

  • basic_rnn_seq2seq: 入力と出力は両方とも埋め込み形式です。エンコーダーとデコーダーは同じ RNN セルを使用しますが、重みパラメータは共有しません。
  • tied_rnn_seq2seq: basic_rnn_seq2seq と同じですが、エンコーダーとデコーダーは重みパラメーターを共有します。
  • embedding_rnn_seq2seq: basic_rnn_seq2seq と同じですが、入力と出力が id の形式に変更されます。この関数は、エンコーダとデコーダの埋め込み行列をそれぞれ内部的に作成します。
  • embedding_tied_rnn_seq2seq: tied_rnn_seq2seq と同じですが、入力と出力が id 形式に変更されます。この関数は、エンコーダとデコーダの埋め込み行列をそれぞれ内部的に作成します。
  • embedding_attention_seq2seq:embedding_rnn_seq2seqと同じですが、追加のアテンションメカニズムがあります。

embedding_rnn_seq2seq 関数インターフェースの使用手順は次のとおりです。

  • エンコーダ入力: エンコーダ入力
  • デコーダー入力: デコーダー入力
  • セル: RNN_Cell のインスタンス
  • num_encoder_symbols、num_decoder_symbols: それぞれエンコードとデコードのサイズ
  • 埋め込みサイズ: 単語ベクトルの次元
  • output_projection: デコーダーの出力ベクトルを語彙空間に投影するときに使用される投影行列とバイアス項
  • feed_previous: True の場合、最初のデコーダー入力シンボルのみが有用であり、すべてのデコーダー入力は前のステップの出力に依存します。
  1. 出力、状態 =embedding_rnn_seq2seq(
  2. エンコーダ入力、デコーダ入力、セル、
  3. num_encoder_symbols、num_decoder_symbols、
  4. 埋め込みサイズ、出力投影=なし、
  5. feed_previous = False )

TensorFlow は、statmt Web サイトから提供されるコーパス データ (主に 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 で表されるトレーニング シーケンスに変換します。次の図に示すように:

(画像をクリックすると拡大します)

translate.py: メイン関数のエントリ、翻訳モデルのトレーニングを実行します

モデルトレーニングを実行する

  1. Python 翻訳.py
  2.  
  3. --data_dir [データディレクトリ] --train_dir [チェックポイントディレクトリ]  
  4.  
  5. --en_vocab_size=40000 --fr_vocab_size=40000  

要約する

TensorFlow の新しいバージョンが継続的にリリースされ、新しいモデルが継続的に増加しているため、TensorFlow は主流のディープラーニング プラットフォームになりました。この記事では、主に自然言語処理分野における TensorFlow の関連モデルとアプリケーションについて紹介します。まず、Word2Vec の数学的原理と TensorFlow を使用して単語ベクトルを学習する方法を紹介しました。次に、RNN と LSTM の技術的原理を確認し、TensorFlow の言語予測モデルについて説明しました。最後に、TensorFlow のシーケンス間機械翻訳 API と公式の例を例によって分析しました。

<<:  2017年にディープラーニングを学ばなければならない理由

>>:  フロントエンドの面接でよく聞かれるアルゴリズムに関する質問

推薦する

機械学習における3つの重要なデータ課題

機械学習にとってデータがどれほど重要であるかは誰もが知っています。データ アクセス パターンを理解す...

救世主か、それとも公敵か? 人工知能の現在と未来を説明する記事

囲碁チャンピオンのイ・セドルを破ったロボット「アルファ碁」から、卓球ができるKUKAロボット、遠隔手...

マーケティングにおける人工知能の 4 つの実際の応用

人工知能 (AI) は誕生以来長い道のりを歩み、大きな進歩を遂げています。これは、Amazon や ...

Google の時間は残りわずか: 18 歳の従業員が辞職し、経営陣を非難

インターネット企業の中で、Google は間違いなく勝者であり、方向性をリードする企業です。同社の技...

鍵となるのは人工知能コンピューティングセンターを構築し、それを活用することだ

デジタル経済の発展に伴い、全国の各省市がコンピューティングインフラの構築を競って推進し、人工知能コン...

...

2021 年に注目すべき 27 の建設技術トレンド (パート 2)

テクノロジーは建設業界にかつてないほど大きな影響を与えています。クラウドベースのコラボレーションやデ...

...

一般開発者もBaidu Brain Industry Application Innovation Challengeに参加して大きな賞金を獲得できる

[51CTO.comからのオリジナル記事] 2018年、人工知能の発展は消費者向け人工知能から企業向...

未来に向けて、自動運転のための初のマルチビュー予測+計画世界モデルが登場

最近、ワールドモデルという概念が大きな盛り上がりを見せており、自動運転の分野もただ黙って見ているわけ...

Spring Boot 3.2フレームワークはほぼ完成、VMWareは利用が大幅に増加したと主張

ティム・アンダーソン編纂者:ヤン・ジェン制作:51CTO テクノロジースタック(WeChat ID:...

...

コーダーの皆さん、おめでとうございます!マイクロソフトは、LLMを使用して168のコードベースにわたるコーディングタスクを自動化するCodePlanを提案している。

大規模なモデルの場合、ローカライズされたエンコード タスクに優れています。しかし、タスクが複数の相互...

このAI商用リストをお見逃しなく: 生産上の問題はアプリケーションによって解決されるかもしれません

[[219776]]リアム・ヘーネル編纂者:趙怡雲、江宝尚、銭天培人工知能があらゆる分野に浸透してい...

サイバーセキュリティにおける人工知能の動向

[[429763]]今日の世界はデータ主導であり、手動のプロセスだけではすべてのデータを監視または保...