PaddlePaddle ディープラーニング実践 - 英語-フランス語翻訳マシン

PaddlePaddle ディープラーニング実践 - 英語-フランス語翻訳マシン

自然言語処理[1]は、コンピュータサイエンスと人工知能の分野におけるもう一つの重要な方向性です。重要な側面の1つは、音声認識、機械翻訳、インテリジェントロボットです。
言語関連の技術はさまざまな場所で応用できます。例えば、日本の富国生命保険は、顧客の言葉をテキストに変換し、その言葉が肯定的なものか否定的なものかを分析するAIシステムを導入するために170万ドルを費やした。これらの自動化されたタスクは、人間が保険業務をより迅速に処理するのに役立ちます。さらに、現在の人工知能企業も研究の方向性としてインテリジェントな顧客サービスに注力しています。

画像認識とは異なり、自然言語処理の入力は音声やテキストであることが多いです。入力データの長さは不確実で、コンテキストと密接に関係しているため、リカレントニューラルネットワーク (RNN) モデルがよく使用されます。

このセクションでは、自然言語モデルの選択とニューラル機械翻訳の原理を紹介します。最後に、200 行を超える PaddlePaddle コードを使用して、英語からフランス語への翻訳マシンを作成する手順を段階的に説明します。

自然言語処理モデルの選択

次に、異なる入力と異なるデータを使用する場合にどのモデルが適しているか、またそれをどのように適用するかを紹介します。

下の図では、各四角形はベクトルであり、矢印は関数 (行列の乗算など) を表しています。下の行は入力ベクトル、上の行は出力ベクトル、真ん中の行は RNN の状態です。

図は左から右に次の状況を示しています。

(1)1対1:固定サイズの入力から固定サイズの出力を得るバニラモデルのようなRNNは使用されない(画像分類に適用される)。

(2)1対多:順番に出力(画像記述に適用、画像を入力してテキストシーケンスを出力。これにはCNNとRNNの組み合わせ、つまり画像と言語の組み合わせが必要になることが多い。詳細は第12章を参照)。

写真

(3)多対一:シーケンス入力(感情分析に応用され、テキストを入力して肯定的または否定的な感情に分類します。たとえば、Taobaoの商品に対するコメントの分類など)、LSTMの使用など。

(4)多対多:非同期シーケンス入力とシーケンス出力(RNNが英語の文章を読み取ってフランス語で出力するなど、機械翻訳に応用)。

(5)多対多:同期シーケンス入力とシーケンス出力(ビデオ分類に適用され、ビデオ内の各フレームをマークする)。

上記の説明では、中間 RNN の状態は固定されており、複数回使用できるため、シーケンスの長さを事前に指定する必要がないことに注意してください。より詳細な議論については、Andrej Karpathyの論文「リカレントニューラルネットワークの不合理な有効性」[2]を参照してください。

自然言語処理には通常、音声合成 (テキストから音声を生成する)、音声認識、声紋認識 (声紋認証)、およびそれらの拡張アプリケーションの一部、さらに単語分割、感情分析、テキストマイニングなどのテキスト処理が含まれます。

ニューラル機械翻訳の原理

機械翻訳の機能は、ソース言語シーケンス (英語の Economic growth has slowed down in recent years など) をターゲット言語シーケンス (フランス語の La croissance economique sest ralentie ces dernieres annees など) に変換することです。翻訳機はトレーニングに既存のコーパス(Corpora)を使用する必要があります。

いわゆるニューラルネットワーク機械翻訳は、ニューラルネットワークを使用して上記の翻訳機械を実装するものです。多くのニューラルネットワークベースの技術は、ベンジオの独創的な論文[3]から派生しています。ここでは、機械翻訳で最も一般的に使用されている重要なテクノロジーとその進化について紹介します。

自然言語処理モデルの進化の概要

畳み込みニューラル ネットワーク (CNN) が LeNet から AlexNet、VggNet、GoogLeNet、そして最終的に ResNet へと進化する過程には一定のパターンがあり、120 万枚の画像と 1,000 種類のラベルを使用した ImageNet LSVRC コンテストでも優れた結果を達成していることがわかっています。リカレント ニューラル ネットワーク (RNN) は、バニラ RNN から洗練された隠し層構造を持つ GRU や LSTM、そして双方向および多層の Deep Bidirectional RNN へと進化してきましたが、それらはすべて何らかの構造と進化のコンテキストを持っています。まず、これについて以下で説明します。

オリジナルLSTM

1997 年、Hochreiter と Schmidhuber は初めて LSTM ネットワーク構造を提案し、従来の RNN では長いシーケンス データのトレーニング プロセス中に勾配が消失したり爆発したりする傾向があるという問題を解決しました。オリジナル LSTM の構造は次のとおりです。

写真

標準LSTM

しかし、従来の LSTM には問題があります。時系列の数が増えると、LSTM ネットワークにはリセット メカニズムがないため (たとえば、2 つの文を 1 つの文にまとめて入力する場合、最初の文の終わりにリセットが実行されることを期待します)、セルの状態が飽和しやすくなります。一方、出力 h は 1 に近づき、セルの出力が出力ゲートの出力とほぼ等しくなり、ネットワークがメモリ機能を失っていることを意味します。単純な再帰型ニューラル ネットワークと比較して、LSTM にはメモリ ユニット、入力ゲート、忘却ゲート、および出力ゲートが追加されています。これらのゲートとメモリ ユニットを組み合わせることで、リカレント ニューラル ネットワークが長いデータ シーケンスを処理する能力が大幅に向上します。

標準 LSTM の構造は次のとおりです。

図[4]

GRU[5]

単純な RNN と比較すると、LSTM にはメモリ セル、入力ゲート、忘却ゲート、出力ゲートが追加されています。これらのゲートとメモリ セルの組み合わせにより、RNN が長距離依存性の問題を処理する能力が大幅に向上します。

GRU は Cho らが提案した LSTM の簡略版であり、下の図に示すように RNN の拡張でもあります。 GRU セルにはゲートが 2 つだけあります。

- リセット ゲート: リセット ゲートが閉じられている場合、履歴情報は無視されます。つまり、無関係な履歴情報は将来の出力に影響を与えません。

- 更新ゲート: LSTM の入力ゲートと忘却ゲートを統合して、現時点での隠れ層出力に対する履歴情報の影響を制御します。更新ゲートが 1 に近い場合、履歴情報は渡されます。

GRU (ゲートリカレントユニット)

一般的に言えば、短範囲の依存関係プロパティを持つシーケンスのリセット ゲートはよりアクティブになり、逆に、長距離の依存関係プロパティを持つシーケンスの更新ゲートはよりアクティブになります。 GRU はパラメータが少ないにもかかわらず、複数のタスクで LSTM と同様のパフォーマンスを発揮します。

双方向リカレントニューラルネットワーク

双方向再帰型ニューラル ネットワーク構造の目的は、シーケンスを入力し、各瞬間にその特徴表現を取得することです。つまり、出力の各瞬間は、その瞬間のコンテキスト意味情報を表す固定長ベクトルによって表されます。

具体的には、双方向リカレント ニューラル ネットワークは、時間次元の入力シーケンスを順次および逆の順序、つまり前方および後方に処理し、各時間ステップでの RNN の出力を最終出力層に連結します。このようにして、各タイム ステップの出力ノードには、入力シーケンスの現在の瞬間の完全な過去と未来のコンテキスト情報が含まれます。

下の図は、時間ステップごとに拡張された双方向リカレント ニューラル ネットワークを示しています。ネットワークには、順方向 RNN と逆方向 RNN が含まれており、6 つの重み行列があります。入力から順方向隠し層と逆方向隠し層への重み行列 (W1、W3W1、W3)、隠し層から隠し層自体への重み行列 (W2、W5W2、W5)、順方向隠し層と逆方向隠し層から出力層への重み行列 (W4、W6W4、W6) です。このネットワークの前方隠し層と後方隠し層の間には接続がないことに注意してください。

時間ステップグラフ拡張を備えた双方向リカレントニューラルネットワーク

seq2seq+注意

seq2seq モデルは、主に 1 つのシーケンスを別のシーケンスに変換する変換モデルです。その基本的な考え方は、2 つの RNNLM を、1 つをエンコーダーとして、もう 1 つをデコーダーとして使用して、RNN エンコーダー/デコーダーを形成することです。

テキスト処理の分野では、図に示すように、エンコーダー-デコーダー フレームワークがよく使用されます。

写真

これは、コンテキストから生成されたターゲットを処理するのに適した一般的な処理モデルです。したがって、文のペア <X, Y> の場合、特定の文 X が入力されると、エンコーダー-デコーダー フレームワークを通じてターゲット文 Y が生成されます。 X と Y は異なる言語である場合があり、これは機械翻訳です。X と Y は会話の質問と回答である場合があり、これはチャットボットです。X と Y は画像とそれに対応する説明 (画像の説明) である場合もあります。

X は x1、x2 などの単語のシーケンスで構成され、Y も y1、y2 などの単語のシーケンスで構成されます。エンコーダーは入力 X をエンコードして中間セマンティック コード C を生成し、デコーダーは中間セマンティック コード C をデコードします。各時刻 i で、生成された y1、y2、…、yi-1 の履歴情報を組み合わせて Yi を生成します。ただし、このフレームワークには、生成された文内の各単語に使用される中間意味エンコーディングが同じ (C) であるという欠点があります。したがって、文が短い場合はまったく適切ですが、文が長い場合は明らかに意味的に矛盾しています。

実際にチャットシステムを実装する場合、エンコーダーとデコーダーではRNNモデルとRNNモデルの改良モデルLSTMを使用するのが一般的です。文の長さが30を超えると、LSTMモデルの効果が急激に低下します。一般的に、この時点でAttentionモデルが導入され、長い文に対するシステム効果が大幅に向上します。

注意メカニズムは認知心理学の概念です。つまり、人が何かをしているとき、そのことに集中し、周囲の他のものを無視するということです。たとえば、本を読むことに集中している人は、隣で話している人の声を無視してしまうことがあります。この仕組みはチャットボットや機械翻訳などの分野で応用されており、生成された文章にとって重要なソース文中のキーワードの重みを高め、より正確な応答を生成します。

Attention モデルを追加したエンコーダー/デコーダー フレームワークを下図に示します。

中間セマンティックエンコーディングは、常に変化する Ci になり、より正確なターゲット Yi を生成できるようになります。

写真

目標結果表示[6]

中国語 - 英語翻訳モデルを例に挙げます。モデルをトレーニングするときに、次のセグメント化された中国語の文が入力されるとします。

これらは希望の光であり、安堵の兆しです。

表示される翻訳結果の数を 3 に設定した場合、生成される英語の文は次のようになります。

0 -5.36816 これらは希望と安堵の兆しです。

1 -6.23177 これらは希望と安堵の光です。<e>

2 -7.7914 これらは希望の光であり、希望の安堵である。

左から 1 列目は生成された文のシーケンス番号です。左から 2 列目は文のスコア (大きいものから小さいものへ) で、スコアが高いほど優れています。左から 3 列目は生成された英語の文です。 另外有两个特殊标志:<e>表示句子的结尾,<unk>表示未登录词(unknown word),即未在训练字典中出现的词。

パドルパドルのベストプラクティス[7]

次に、200 行を超えるコードを持つ英語 - フランス語翻訳マシンを構築します。

データセットとデータの前処理

この実践では、WMT-14[8]データセット内のバイテキスト(選択後)をトレーニングセットとして使用し、開発+テストデータをテストセットと生成セットとして使用します。

データセットの形式は次のとおりです。

bitexts.selected データセットには 12,075,604 行、多数の英語/フランス語の並列データ ペア、および約 8 億 5000 万のフランス語の単語が含まれています。このデータは非常にノイズが多く、ニューラル ネットワークのトレーニングにとって大きな課題となります。そのため、最も適切なデータを抽出するためにデータ選択を実施しました。

「pc」の後の数字はパーセンテージを示します。 通常、フレーズベースのベースライン システムは、このデータのみでトレーニングされます。

ep7_pc45 ユーロパール バージョン 7 (27.8M)

nc9 ニュースコメント バージョン 9 (5.5M)

dev08_11 2008年から2011年までの古い開発データ (0.3M)

共通クロールデータ(90M)をクロール

ccb2_pc30 10^9 並列コーパス (81M)

un2000_pc34 国連コーパス (143M)
ダウンロードしたデータファイルは次のとおりです。

調べるために、Europarl バージョン 7 (ep7_pc45) データを開きます。

ep7_pc45.en より少ない

英語版の 8 行目に「Me?」とあります。

ep7_pc45.fr より少ない

ご覧のとおり、フランス語版の対応する行 8 は Moi? です。

完全なデータセットのサイズが大きいため、トレーニング プロセスを検証するために、PaddlePaddle インターフェイス paddle.dataset.wmt14 では、前処理済みの小規模データセット (wmt14) がデフォルトで提供されます。データセットには、193,319 個のトレーニング データ、6,003 個のテスト データ、および 30,000 個の辞書長が含まれています。このデータセットでモデルを試すことはできますが、トレーニングが本当に必要な場合は、元のデータセットを使用することをお勧めします。

この小さなデータセットを前処理します。前処理されたファイルは次のとおりです。

前処理プロセスには 3 つのステップが含まれます。

1. 各ソース言語とターゲット言語のパラレルコーパスファイルを 1 つのファイルにマージします。

2. 各 XXX.src ファイルと XXX.trg ファイルを XXX にマージします。 - XXX の i 行目の内容は、XXX.src の i 行目と XXX.trg の i 行目を '\t' で区切って連結したものです。 下の図の各行は、train と test で処理した後、フランス語と英語の文の並列コーパスになります。赤いボックスは、2 つの文を '\t' で区切った部分を表しています。

3. トレーニング データの「ソース辞書」と「ターゲット辞書」を作成します。每个字典都有dictsize个单词、包括、包括:语料中词频最高的( dictsize -3結果として得られる src.dict (フランス語辞書) と trg.dict (英語辞書) は次のようになります。

ベストプラクティス[9]

データが処理されたら、ニューラル ネットワークを構築してトレーニングするためのコードの記述を開始します。 [10]

パドルの初期化

まず、Paddle を初期化し、TensorFlow に非常によく似た Paddle ライブラリの Python バージョンを直接インポートします。

# パドルPythonパッケージをロードする

インポートシステム

paddle.v2をpaddleとしてインポートする

#CPUのみを使用するように設定し、トレーニングには1つのCPUを使用する

パドル.init(use_gpu=False、trainer_count=1)

# トレーニングモード False、生成モード True

is_generating = False

グローバル変数とハイパーパラメータ定義

ここでは、データを前処理して 30,000 次元のデータ辞書を作成したので、グローバル変数にも対応する値を入力します。

dict_size = 30000 # 辞書の次元

source_dict_dim = dict_size # ソース言語辞書の次元

target_dict_dim = dict_size # ターゲット言語の辞書の次元

word_vector_dim = 512 # 単語ベクトルの次元

エンコーダー_size = 512 # エンコーダー内の GRU 隠し層のサイズ

デコーダー_size = 512 # デコーダー内の GRU 隠し層のサイズ

beam_size = 3 # ビーム幅

max_length = 250 # 生成される文の最大長

モデルを構築する

まず、エンコーダー フレームワークを構築します。

入力は整数のシーケンスとして表されるテキストのシーケンスです。シーケンス内の各要素は、辞書内の単語のインデックスです。そのため、データ層のデータ型をinteger_value_sequence(整数シーケンス)として定義し、シーケンス内の各要素の範囲は[0、source_dict_dim]となります。

src_word_id = パドル.レイヤー.データ(

name='ソース言語の単語',

タイプ = paddle.data_type.integer_value_sequence(source_dict_dim))

上記のエンコーディングを低次元言語空間の単語ベクトル s にマッピングします。

src_embedding = パドル.レイヤー.embedding(

入力=src_word_id、サイズ=word_vector_dim)

双方向 GRU を使用してソース言語シーケンスをエンコードし、2 つの GRU のエンコード結果を連結して h を取得します。

src_forward = パドル.ネットワーク.シンプル_gru(

入力=src_embedding、サイズ=encoder_size)

src_backward = paddle.networks.simple_gru(

入力=src_embedding、サイズ=encoder_size、リバース=True)

エンコードされたベクトル = paddle.layer.concat(入力 = [src_forward, src_backward])

次に、アテンション メカニズムに基づいてデコーダー フレームワークを構築します。

ソース言語シーケンスのエンコード結果 (つまり、上記の encoding_vector) は、フィードフォワード ニューラル ネットワークに渡され、マッピングが取得されます。

エンコードされたプロジェクト = パドル.レイヤー.fc(

act=パドル.アクティベーション.リニア(),

サイズ=デコーダーサイズ、

バイアス属性=False、

入力=エンコードされたベクトル)

デコーダー RNN の初期状態を構築します。

backward_first = paddle.layer.first_seq(入力 = src_backward)

デコーダーブート = パドル.レイヤー.fc(

サイズ=デコーダーサイズ、

act=paddle.activation.Tanh(),

バイアス属性=False、

入力=後方優先)

デコードフェーズ中の各タイムステップでの RNN の動作を定義します。

gru_decoder_with_attention を定義します(enc_vec、enc_proj、現在の単語):

デコーダーメモリ = パドル.レイヤー.メモリ(

名前='gru_decoder'、サイズ=decoder_size、ブートレイヤー=decoder_boot)

コンテキスト = paddle.networks.simple_attention(

エンコードされたシーケンス=enc_vec、

エンコードされたプロジェクト=enc_proj、

デコーダー状態=デコーダーメモリ)

デコーダー入力 = パドル.レイヤー.fc(

act=パドル.activation.Linear(),

サイズ=デコーダーサイズ * 3、

バイアス属性=False、

入力=[コンテキスト, 現在の単語],

レイヤー属性 = パドル.属性.ExtraLayerAttribute(

error_clipping_threshold=100.0))

gru_step = パドル.レイヤー.gru_step(

名前='gru_decoder',

入力=デコーダー入力、

出力メモリ=デコーダメモリ、

サイズ=デコーダーサイズ)

出力 = パドル.レイヤー.ミックス(

サイズ=ターゲット辞書寸法、

バイアス属性=True、

act=paddle.activation.Softmax(),

入力 = paddle.layer.full_matrix_projection(入力 = gru_step))

戻る

トレーニングモードでデコーダーを呼び出す方法は?

まず、ターゲット言語シーケンスの単語ベクトル trg_embedding が、トレーニング モードで current_word として gru_decoder_with_attention 関数に直接渡されます。

次に、recurrent_group 関数を使用してループし、gru_decoder_with_attention 関数を呼び出します。

次に、ターゲット言語の次の単語シーケンスをラベル層 lbl として使用し、ターゲット単語を予測します。

最後に、マルチクラスクロスエントロピー損失関数 classified_cost を使用して損失値を計算します。

コードは次のとおりです。

そうでない場合 is_generating:

trg_embedding = パドル.レイヤー.embedding(

入力 = パドル.レイヤー.データ(

name='ターゲット言語の単語',

タイプ=paddle.data_type.integer_value_sequence(target_dict_dim))、

サイズ=単語ベクトル次元、

param_attr=paddle.attr.ParamAttr(name='_target_language_embedding'))

グループ入力を追加します(trg_embedding)

# 注意機構を備えたデコーダーの場合、トレーニングでは、

# ターゲット埋め込み(グラウンドトゥルース)はデータ入力であり、

# エンコードされたソースシーケンスは無制限のメモリとしてアクセスされます。

# ここで、StaticInputは読み取り専用メモリを定義します

# recurrent_group 用。

デコーダー = paddle.layer.recurrent_group(

name=デコーダーグループ名、

ステップ=gru_decoder_with_attention、

入力=グループ入力)

lbl = パドルレイヤーデータ(

name = 'ターゲット言語の次の単語',

タイプ = paddle.data_type.integer_value_sequence(target_dict_dim))

コスト = paddle.layer.classification_cost(入力 = デコーダー、ラベル = lbl)

生成(予測)モードでデコーダーを呼び出すにはどうすればいいですか?

まず、シーケンス生成タスクでは、デコード段階のRNNは常に前の瞬間に生成された単語ベクトルを現在の瞬間の入力として参照するため、

次に、beam_search 関数を使用してループし、gru_decoder_with_attention 関数を呼び出してシーケンス ID を生成します。

生成中の場合:

# 生成では、デコーダーは次のターゲット単語を予測します。

# エンコードされたソースシーケンスと以前に生成されたターゲット単語。

# エンコードされたソースシーケンス(エンコーダの出力)は、

# 読み取り専用メモリである StaticInput。

# 前回生成された単語の埋め込みは自動的に取得されます

# 開始マーク <s> によって初期化された GeneratedInputs によって。

trg_embedding = パドル.レイヤー.生成された入力(

サイズ=ターゲット辞書寸法、

埋め込み名='_ターゲット言語埋め込み',

埋め込みサイズ=単語ベクトルの次元)

グループ入力を追加します(trg_embedding)

ビーム生成 = パドル.レイヤー.ビーム検索(

name=デコーダーグループ名、

ステップ=gru_decoder_with_attention、

入力=グループ入力、

ボスID=0,

eos_id=1,

ビームサイズ=ビームサイズ、

最大長=最大長)

モデルのトレーニング

1. データ定義を構築する

wmt14 データセット リーダーを取得します。

そうでない場合 is_generating:

wmt14_reader = パドル.batch(

パドル.リーダー.シャッフル(

paddle.dataset.wmt14.train(dict_size=dict_size)、buf_size=8192)、

バッチサイズ=5)

2. トレーナーを構築する

最適化ターゲットコスト、ネットワークトポロジ、モデルパラメータに応じて、トレーニング用のトレーナーが構築されます。構築時に最適化方法も指定する必要があります。ここでは、最も基本的な SGD 方式が使用されます。

そうでない場合 is_generating:

オプティマイザ = paddle.optimizer.Adam(

学習率=5e-5、

正規化 = paddle.optimizer.L2Regularization(レート=8e-4))

トレーナー = paddle.trainer.SGD(コスト = コスト、

パラメータ=パラメータ、

update_equation=オプティマイザー)

3. event_handlerを構築する

カスタム コールバック関数を使用して、トレーニング プロセス中にエラー率などのさまざまな状態を評価できます。次のコードでは、event.batch_id % 2 == 0 を使用して、コストなどの情報を含むログが 2 バッチごとに印刷されることを指定します。

そうでない場合 is_generating:

イベントハンドラを定義します。

インスタンスの場合(イベント、paddle.event.EndIteration):

event.batch_id % 2 == 0の場合:

print "\nパス %d、バッチ %d、コスト %f、%s" % (

イベント.pass_id、イベント.batch_id、イベント.cost、イベント.metrics)

4. トレーニングを始める

そうでない場合 is_generating:

トレーナー.train(

リーダー=wmt14_reader、イベントハンドラー=event_handler、num_passes=2)

その後、トレーニングを開始できます。トレーニングが開始されると、次のように event_handler によって出力されるログを確認できます。

パス 0、バッチ 0、コスト 148.444983、{'classification_error_evaluator': 1.0}

.........

パス 0、バッチ 10、コスト 335.896802、{'classification_error_evaluator': 0.9325153231620789}

.........

予測モデル

事前トレーニング済みのモデルをロードし、wmt14 生成セットからサンプルを読み取って結果を生成してみます。

1. 事前学習済みモデルをロードする

生成中の場合:

パラメータ = paddle.dataset.wmt14.model()

2. データの定義

wmt14 の生成セットから最初の 3 つのサンプルをソース言語の文として読み取ります。

生成中の場合:

gen_creator = paddle.dataset.wmt14.gen(dict_size)

生成データ = []

ジェネレーション番号 = 3

gen_creator() 内のアイテムの場合:

gen_data.append((item[0], ))

len(gen_data) == gen_numの場合:

壊す

3. 推測する

推論は、ネットワークトポロジと生成モデルパラメータに基づいて構築されます。予測時には、出力ドメインフィールドも指定する必要があります。ここでは、文を生成する確率 prob と文中の各単語の ID が使用されます。

生成中の場合:

ビーム結果 = パドル.推論(

出力レイヤー=ビーム生成、

パラメータ=パラメータ、

入力=gen_data、

フィールド=['prob', 'id'])

4. 生成された結果を印刷する

ソース言語の文と、ソース/ターゲット言語辞書に従って、beam_size で生成された文を出力します。

生成中の場合:

# 辞書を読み込む

src_dict、trg_dict = paddle.dataset.wmt14.get_dict(dict_size)

gen_sen_idx = np.where(beam_result[1] == -1)[0]

len(gen_sen_idx) == len(gen_data) * beam_size をアサートする

# -1 は生成されたシーケンスの区切り文字です。

# 生成された各シーケンスの最初の要素とその長さ。

開始位置、終了位置 = 1, 0

iの場合、enumerate(gen_data)のサンプル:

print(" ".join([src_dict[w] for w in sample[0][1:-1]]))

xrange(beam_size)内のjの場合:

end_pos = gen_sen_idx[i * ビームサイズ + j]

print("%.4f\t%s" % (beam_result[0][i][j], " ".join(

trg_dict[w] は、beam_result[1][start_pos:end_pos] 内の w です。

開始位置 = 終了位置 + 2

印刷("\n")

生成が開始されると、次のように出力ログを確認できます。

ログの最初の行はソース言語の文です。次の 3 行は、生成された英語翻訳結果を高スコアから低スコアの順に並べたものです。

要約する

ここでは、自然言語処理におけるニューラル機械翻訳の原理と、200 行を超える PaddlePaddle コードを使用して英語からフランス語への翻訳者を作成する方法に焦点を当てます。詳細については、PaddlePaddleをご覧ください。

線形回帰、数値認識、画像分類、単語ベクトル、パーソナライズされた推奨、感情分析、意味役割ラベル付けなど、さまざまな分野で非常に成熟したアプリケーションと簡潔で使いやすい例もあります。 皆様と議論できることを楽しみにしています。

1. 自然言語処理は、広義では音声処理とテキスト処理を含みますが、狭義ではテキストの理解と処理のみを指します。これは広い概念を指します。 ↑

2. http://karpathy.github.io/2015/05/21/rnn-effectiveness/ ↑

3. ニューラル確率言語モデル ↑

4. https://github.com/PaddlePaddle/book/blob/develop/06.understand_sentiment/README.cn.md ↑

5.http://staging.paddlepaddle.org/docs/develop/book/08.machine_translation/index.cn.html#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE ↑

6.http://staging.paddlepaddle.org/docs/develop/book/08.machine_translation/index.cn.html#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE ↑

7.http://staging.paddlepaddle.org/docs/develop/book/08.machine_translation/index.cn.html#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE ↑

8. http://www-lium.univ-lemans.fr/~schwenk/cslm_joint_paper/ ↑

9.http://staging.paddlepaddle.org/docs/develop/book/08.machine_translation/index.cn.html#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE ↑

10. https://github.com/PaddlePaddle/book/blob/develop/08.machine_translation/train.py ↑

<<:  テキストからキーワードを抽出するにはどうすればいいですか? Daguan Dataが使用する3つのアルゴリズムから始めましょう

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

ブログ    

推薦する

...

インテル、コード名「NLP Architect」の自然言語処理用オープンソースライブラリを発表

[[230933]] 1年前に設立されたインテルAIラボは最近、新たな動きを見せている。数日前、In...

医学と人工知能が出会うとき、将来の医学の5つの主要なトレンドを知っておく必要があります

[[257227]] 2015年、映画『ベイマックス』は多くの人々の心を動かし、『ベイマックス』とい...

新型コロナウイルスワクチンの製造はAIに頼っているのか?ジョンソン・エンド・ジョンソンとPwCがAIをどのように活用しているかを学ぶ

現在までに、多くの企業は AI 実験による大きな影響を感じていません。この点について、一部の専門家は...

人工知能の時代、どう生き残るのか?

[[355352]] 1 この時代、誰もがまだ新人ですが、世界が3つの部分に分かれていることはすで...

2021年にデータセンターに起こる変化と傾向

2020 年は、IT プロフェッショナルがインフラストラクチャを管理およびプロビジョニングする方法を...

...

二分木の再帰的および非再帰的トラバーサルアルゴリズムテンプレート

[[423968]] Leetcode を実践するには、いくつかのアルゴリズム テンプレートを知って...

リアルタイムの洞察を強化: コンピューター ビジョンとエッジ コンピューティングの相乗効果

今日の急速に変化する世界では、最先端技術のシームレスな統合がイノベーションの基盤となっています。その...

...

...

2020年に人工知能を変える8つのトレンド

人工知能は長い間、架空の物語、SF、さらには映画にも登場してきました。人々の目には、これは技術的な魔...

Google のような大企業を辞めた後、彼らはどうやって次の仕事を見つけるのでしょうか?

今年上半期、中国と米国のインターネット・テクノロジー企業は、程度の差はあれ、レイオフや人員削減を経験...

顔認識:最高裁は規則に従うよう求めている

近年、顔認識技術は急速に発展し、入場時の顔スキャンや支払い時の顔スキャンに広く使用され、私たちの日常...

人工知能によりデータの痕跡を監視できるようになりました。このとき、ユーザーのプライバシーとセキュリティをどのように維持できるのでしょうか?

近年、ソーシャル ネットワーキング プラットフォームのユーザー数は飛躍的に増加しています。これらのプ...