自然言語処理入門 導入 自然言語処理 (NLP) は、言語を処理および理解することで特定のタスクを実行できるシステムを構築する問題を研究します。これらのタスクには以下が含まれます
従来の NLP 手法には、言語学の分野自体に関する多くの知識が必要です。音素や形態素などの用語を理解することは、それらの研究がすべて言語の問題であるかのように非常に基本的なことです。従来の NLP が次の文をどのように理解しようとしているかを見てみましょう。 私たちの目標が、単語に関する情報(感情の特徴付け、定義の発見など)を収集することだとします。言語領域に関する知識を活用すると、この単語を 3 つの部分に分割できます。 接頭辞「un」は反対または反対の考えを示すことがわかっており、「ed」は単語の期間(過去形)を指定できることもわかっています。 「interest」という語幹の意味を特定することで、単語全体の定義と感情を簡単に推測できます。十分簡単なように思えますね。しかし、英語のさまざまな接頭辞と接尾辞を考慮すると、すべての可能な組み合わせと意味を理解するには非常に熟練した言語学者が必要です。 ディープラーニングはどのようにしてこれらの問題をうまく解決するのでしょうか? 最も基本的なレベルでは、ディープラーニングは表現学習です。畳み込みニューラル ネットワーク (CNN) を使用すると、さまざまなフィルターの組み合わせを使用してさまざまなオブジェクトを分類できることがわかります。ここでは、同様のアプローチを採用し、大規模なデータセットを使用してさまざまな単語の表現を作成します。 導入 この記事は、まず NLP のディープ ネットワークを構築するための基本的な構成要素について説明し、次に最近の研究論文によって可能になったいくつかのアプリケーションについて説明するという構成になっています。なぜ RNN を使用するのか、なぜ LSTM がこれほどうまく機能するのか疑問に思われるかもしれません。こうした疑問は当然のものですが、以下の研究論文を読めば、ディープラーニング技術が NLP をこれほど大きく進歩させることができた理由をより深く理解していただけると思います。 単語ベクトル ディープラーニングは数学を扱うのが好きなので、各単語を d 次元ベクトルとして表現します。 d = 6 としましょう。 [画像: https://quip.com/-/blob/cGAAAAubYyb/u9YfGL3mGnMUFhrXOfGArQ] では、これらの値をどのように入力するかを考えてみましょう。ベクトルが何らかの形で単語とその文脈、意味、またはセマンティクスを表すような方法で値を入力する必要があります。 1 つのアプローチは、共起マトリックスを作成することです。次の文があるとします。 この文から、特定の単語ごとに単語ベクトルを作成します。 共起マトリックスは、コーパス(またはトレーニング セット)内の他のすべての単語の後に各単語が何回出現するかのカウントを含むマトリックスです。このマトリックスを見てみましょう。 この行列から行を抽出すると、単語ベクトルを簡単に初期化できます。 この単純なマトリックスを使用すると、非常に役立つ洞察が得られることに注意してください。たとえば、「love」と「like」という単語はどちらも、名詞(NLP と dog)の後のカウントに 1 が含まれていることに注意してください。 「I」との交差も 1 なので、これらの単語は動詞であることがわかります。 1 つの文よりもはるかに大きいデータセットの場合、「like」、「love」、その他の同義語はすべて同様のコンテキストで使用されるため、同様の単語ベクトルを持ち始め、この類似性がさらに明確になることが想像できます。 さて、これは素晴らしい出発点ですが、各単語の次元はコーパスのサイズに応じて直線的に増加することがわかります。 100 万語 (NLP の基準ではそれほど多くありません) があった場合、100 万 x 100 万のサイズの行列ができ、非常にスパース (ゼロが多数) になります。ストレージ効率の点では、これは決して最良ではありません。これらの単語ベクトルを表現する最適な方法を見つける作業は大きく進歩しました。最も有名なのは Word2Vec です。 ワード2ベクトル 単語埋め込み初期化技術の基本的な考え方は、次元を管理可能なサイズ (25 ~ 1000 次元が理想的) に保ちながら、単語埋め込みにできるだけ多くの情報を保存したいというものです。 Word2Vec は、各単語の周囲の可能性のある単語を予測するという考えに基づいて機能します。前の文「私はNLPが大好きで、犬も好きです」を例に挙げてみましょう。この文の最初の3つの単語を見てみましょう。したがって、ウィンドウ サイズ m の値は 3 になります。 さて、私たちの目標は、中心となる単語「love」を見つけ、その前後の単語を予測することです。どうやってこれを実現するのでしょうか? もちろん、何らかの関数を最大化/最適化することによってです! 正式に述べると、関数は現在の中心単語を与えられたコンテキスト単語の対数確率を最大化しようとします。 これをもう少し詳しく調べてみましょう。上記のコスト関数は基本的に、「I」と「love」、および「NLP」と「love」の対数確率を追加することを意味します (どちらの場合も「love」が中心となる単語です)。変数 T はトレーニング文の数を表します。その対数確率をもう少し詳しく見てみましょう。 Vc は中心の単語の単語ベクトルです。各単語は 2 つのベクトル (Uo と Uw) で表されます。1 つは単語が中心単語として使用される場合、もう 1 つは単語が外部単語として使用される場合を表します。ベクトルは確率的勾配降下法 (SGD) を使用してトレーニングされます。これは間違いなく、理解するのが最も難しい方程式の 1 つです。そのため、まだ疑問があり、何が起こっているかを理解したい場合は、次の 2 つのリソースを確認してください。
一言で要約すると、Word2Vec は、中心の単語を与えられたコンテキスト単語の対数確率を最大化し、SGD を介してベクトルを変更することで、さまざまな単語のベクトル表現を見つけようとします。 (オプション: 論文「単語と句の分散表現とその構成性」の著者は、頻出単語のネガティブサンプリングとサブサンプリングを使用してより正確な単語埋め込みを取得する方法について詳しく説明しています。) Word2Vec の最も興味深い貢献は、異なる単語ベクトルが線形関係を示すことができる点であると考える人もいます。トレーニング後、単語埋め込みはさまざまな文法および意味の概念を捉えるようになります。単純な目的関数と最適化手法を使用して、これらの線形関係を形成できるというのは、実に驚くべきことです。 追加補足: 別のクールな単語ベクトル初期化方法: GloVe (共起行列のアイデアと Word2Vec を組み合わせたもの): http://nlp.stanford.edu/pubs/glove.pdf リカレントニューラルネットワーク (RNN) さて、単語の埋め込みができたので、それを再帰型ニューラル ネットワークとどのように組み合わせるかを見てみましょう。 RNN は、今日のほとんどの NLP タスクで選択される方法です。 RNN の最大の利点は、以前のタイムステップのデータを効率的に使用できることです。これは RNN の小さなスライスの外観です。 したがって、最下位レベルには、単語ベクトル (xt、xt-1、xt+1) があります。各ベクトルには、同じ時間ステップ (ht、ht-1、ht+1) における隠れ状態ベクトルがあります。これをモジュールと呼びましょう。 RNN の各モジュールの隠れ状態は、前のタイムステップの単語ベクトルと隠れ状態ベクトルの両方の関数です。 上付き文字をよく見ると、入力に掛ける重み行列 Whx と、前のタイム ステップで隠れ状態ベクトルに掛ける繰り返し重み行列 Whh があることがわかります。これらの再帰重み行列はすべての時間ステップで同じであることを覚えておいてください。これが RNN の重要なポイントです。よく考えてみると、これは従来のもの(例えば 2 層ニューラル ネットワーク)とは大きく異なります。この場合、通常、各レイヤー (W1 と W2) ごとに異なる W マトリックスが使用されます。ここで、再帰重み行列はネットワーク全体で同じです。 特定のモジュールの出力 (Yhat) を取得するには、h に別の重み行列である WS を掛けます。 ここで少し立ち止まって、RNN の利点を理解しましょう。従来のニューラル ネットワークとの最も明らかな違いは、RNN が入力のシーケンス (この場合は単語) を受け取ることです。これを、入力として 1 つの画像のみを必要とする一般的な CNN と比較することができます。ただし、RNN の場合、入力は短い文から 5 段落の記事までさまざまな長さになります。さらに、シーケンス内の入力の順序は、トレーニング中に重み行列と隠れ状態ベクトルがどのように変更されるかに大きく影響する可能性があります。トレーニング後、隠れた状態は過去(前の時間ステップ)からの情報を取得することが期待されます。 ゲートリカレントユニット (GRU) それでは、Gated Recurrent Unit (GRU) を見てみましょう。このユニットの目的は、RNN 内の隠れ状態ベクトルを計算するためのより洗練された方法を提供することです。このアプローチにより、長距離の依存関係をキャプチャした情報を保存できます。従来の RNN 設定で長期的な依存関係が問題になる理由について考えてみましょう。バックプロパゲーション中、エラーは最新のタイムステップから最も古いタイムステップまで RNN を通過します。初期勾配が小さい数値(例:< 0.25)の場合、3 番目または 4 番目のモジュールでは勾配は事実上消滅します(連鎖律によって勾配が乗算されます)。そのため、それ以前の時間ステップでの隠し状態は更新されません。 従来の RNN では、隠れ状態ベクトルは次の式で計算されます。 GRU は、この隠れ状態ベクトル h(t) を計算する別の方法を提供します。計算は、更新ゲート、リセット ゲート、および新しいメモリ コンテナーの 3 つのコンポーネントに分かれています。両方のゲートは、入力ワードベクトルと前のタイムステップでの隠れ状態の関数です。 主な違いは、各ゲートが異なる重みを使用することです。この区別は異なる上付き文字によって示されます。更新ゲートは Wz と Uz を使用し、リセット ゲートは Wr と Ur を使用します。 新しいメモリ コンテナーは次のように計算されます。 中空の点はアダマール積を表す。 ここで、式を注意深く見ると、リセット ゲート ユニットが 0 に近い場合、項全体も 0 になり、前のタイム ステップの ht-1 からの情報は無視できることがわかります。この場合、単位は新しい単語ベクトル xt の関数になります。 h(t) の最終的な式は次のように表されます。 ht は、リセット ゲート、更新ゲート、メモリ コンテナーの 3 つの部分で構成される関数です。これを理解する最良の方法は、zt が 1 に近づき、0 に近づくときに何が起こるかを見ることです。 zt が 1 に近づくにつれて、新しい隠れ状態ベクトル ht は主に以前の隠れ状態に依存し、(1-zt) が 0 になるため、現在のストレージ コンテナーは無視されます。 zt が 0 に近い場合、新しい隠し状態ベクトル ht は主に現在のストレージ コンテナーに依存し、以前の隠し状態は無視されます。これら 3 つの部分を観察する最も直感的な方法は、次のように要約できます。
GRU の有効性を示す一般的な例は次のとおりです。次のような段落があるとします。 関連する質問は「2 つの数字の合計はいくらですか?」です。中間文は現在の問題にはまったく影響を及ぼさないため、リセット ゲートと更新ゲートにより、ネットワークは中間文をある意味で「忘れる」ことができ、隠れた状態を変更すべき特定の情報 (この場合は数値) のみを学習します。 長期短期記憶 (LSTM) GRU に満足している場合、LSTM では満足できません。 LSTM も一連のゲートで構成されています。 収集すべき情報は確かにさらにあります。これは GRU の背後にあるアイデアの拡張と考えられるため、詳細には分析しません。各ゲートと計算の各ステップについてさらに詳しく知りたい場合は、Chris Olah による優れたブログ投稿をご覧ください: http://colah.github.io/posts/2015-08-Understanding-LSTMs/。これは、LSTM に関する最も人気のあるチュートリアルであり、これらのユニットがなぜ、どのようにうまく機能するかを理解するのに役立ちます。 LSTMとGRUの比較 まずは両者の類似点から始めましょう。これら 2 つのユニットには、シーケンス内の単語間の長期的な依存関係を維持できるという特別な機能があります。長期的な依存関係とは、2 つの単語またはフレーズが異なる時間に出現する可能性があるが、それらの間の関係が最終目標の解決に依然として重要である状況を指します。 LSTM と GRU は、シーケンス内の特定の情報を無視または保持するゲートを通じてこれらの依存関係をキャプチャできます。 2 つのユニットの違いは、ゲートの数です (GRU – 2、LSTM – 3)。これは、入力が通過する非線形性の数に影響し、最終的には全体的な計算に影響します。 GRU には LSTM と同じメモリ セル (ct) もありません。 論文を読む前に ちょっとしたメモです。自然言語処理 (NLP) に役立つ他のディープ モデルも存在します。自然言語処理 (NLP) 用の再帰ニューラル ネットワークと畳み込みニューラル ネットワーク (CNN) は実際に使用されることもありますが、再帰ニューラル ネットワークほど普及していません。リカレント ニューラル ネットワーク (RNN) は、ほとんどのディープラーニング自然言語処理 (NLP) システムのバックボーンです。 わかりました自然言語処理 (NLP) に関連するディープラーニングについて十分に理解できたので、いくつかの論文を見てみましょう。自然言語処理 (NLP) にはさまざまな問題 (機械翻訳から質問応答まで) があるため、研究できる論文は多数ありますが、特に洞察に富んでいると感じた論文が 3 つあります。 2016 年には自然言語処理 (NLP) が大きく進歩しましたが、まずは 2015 年の論文から始めましょう。
はじめに: この最初の記事では、質問応答のサブフィールドにおける非常に影響力のある論文について説明します。 Jason Weston、Sumit Chopra、Antoine Bordes によって書かれたこの論文では、メモリ ネットワークと呼ばれるモデルのクラスを紹介しています。 記憶ネットワークの背後にある直感的な考え方は、テキストに関する質問に正確に答えるためには、与えられた最初の情報を何らかの方法で覚えておく必要があるというものです。 「RNN とは何の略ですか?」と尋ねたら(この記事を最後まで読んだと仮定します)、答えが返ってくるでしょう。この記事の最初の部分を読んで得た情報は、あなたの記憶のどこかに保存されるからです。この情報を探し出して言葉で表現するには、ほんの数秒しかかかりません。さて、脳がこれをどうやって行うのかは分かりませんが、情報のための記憶スペースを確保するという考えは今でも存在しています。 この論文で説明するメモリ ネットワークは、読み取りと書き込みが可能な連想メモリであるという点で独特です。興味深いことに、畳み込みニューラル ネットワークや Q ネットワーク (強化学習で使用)、または従来のニューラル ネットワークには、このタイプのメモリはありません。これは、質問応答タスクが、ストーリー内の登場人物やイベントのタイムラインの追跡など、長期的な依存関係をモデル化または追跡する能力に大きく依存しているためです。畳み込みニューラル ネットワークと Q ネットワークでは、「メモリ」はネットワークに組み込まれた一種の重みです。状態からアクションまでのさまざまなフィルターやマッピングを学習できるためです。まず、RNN と LSTM は使用できますが、通常は過去の入力を記憶できません (これはタスクに回答する上で非常に重要です)。 ネットワークアーキテクチャ さて、ここでこのネットワークが与えられた初期テキストをどのように処理するかを見てみましょう。ほとんどの機械学習アルゴリズムと同様に、最初のステップは入力を特徴表現に変換することです。これには、単語の埋め込みや品詞タグなどの使用が必要です。それは本当にプログラマー次第です。 次のステップは、特徴表現I(x)を取得し、受信した最新の入力xを反映するようにメモリmを更新できるようにすることです。 メモリ m は、個々のメモリ mi の一種の配列と考えることができます。これらの個々のメモリmiはそれぞれ、表現I(x)および/またはそれ自体を特徴とする全体的なメモリmとして機能することができます。関数Gは、表現I(x)全体を単一のメモリセルmiに格納するだけで済みます。新しい入力に基づいて、関数 G を変更して過去のメモリを更新できます。 3 番目と 4 番目のステップでは、質問に基づいてメモリを読み取って特徴表現 o を取得し、それをデコードして最終的な回答 r を出力します。 R 関数を使用すると、メモリ内の特徴表現を質問に対する信頼性が高く正確な回答に変換できます。 さて、ステップ3を見てみましょう。この O モジュールでは、特定の質問 X に対する可能な回答に最も一致する特徴表現を出力する必要があります。ここで、質問は個々のメモリ セルに一致し、メモリ セルが質問をどの程度サポートしているかに基づいて「スコア付け」されます。 スコアリング関数の argmax 値を使用して、質問をサポートする最適な出力表現を見つけます (複数のトップスコアリングユニットを取得することもできます。1 つに限定する必要はありません)。スコアリング関数は、さまざまな質問と選択されたメモリ位置のさまざまな埋め込み間の行列積を計算する関数です (詳細については論文を参照してください)。 2 つの単語の単語ベクトルを掛け合わせて類似度を調べる、というように考えることもできます。出力表現 o は、信頼性の高い回答を出力する RNN や LSTM などのスコアリング関数に入力されます。 ネットワークは教師あり方式でトレーニングされ、トレーニング データには元のテキスト、質問、補足文、および実際の回答が含まれます。これが目的関数です。 興味のある方のために、このメモリ ネットワーク アプローチを構築した論文を紹介します。 エンドツーエンドのメモリネットワーク: https://arxiv.org/pdf/1503.08895v5.pdf 動的メモリネットワーク: https://arxiv.org/pdf/1506.07285v5.pdf 動的 Coattention ネットワーク: https://arxiv.org/pdf/1611.01604v2.pdf 論文: 感情分析のためのツリー LSTM リンク: https://arxiv.org/pdf/1503.00075v3.pdf はじめに: 次の記事では、フレーズが肯定的な意味合いを持つか否定的な意味合いを持つかを判断する感情分析の進歩について説明します。より正式には、感情は「状況や出来事に対する見方や態度」と定義できます。当時、感情分析ネットワークで最も一般的に使用されていたのは LSTM でした。著者: Kai Sheng Tai、Richard Socher、Christopher Manning。この論文では、LSTM を非線形構造で連結する新しい方法を紹介しています。 この非線形の組み合わせの背後にある動機は、単語のシーケンスをフレーズに変換できるという自然言語の特性にあります。これらのフレーズは、単語の順序に応じて、元の構成単語とは異なる意味を持つことがあります。この特性を表現するために、LSTM ユニットのネットワークはツリー構造に配置され、異なるユニットがその子ノードの影響を受けます。 ネットワークアーキテクチャ LSTM ツリーと標準ツリーの違いの 1 つは、後者の隠し状態が現在の入力と前のタイム ステップでの隠し状態の関数である点です。ただし、LSTM ツリーの場合、その隠し状態は現在の入力とその子ユニットの隠し状態の関数になります。 新しいツリーベースの構造、忘却ゲートを持つサブユニットを含むいくつかの数学的変換があります。詳細にご興味のある方は、論文をご覧ください。しかし、私はこれらのモジュールが線形 LSTM よりも優れている理由に焦点を当てたいと思います。 LSTM ツリーを使用すると、単一のユニットにすべての子の隠し状態を組み込むことができます。これは非常に興味深いことです。なぜなら、セルはそれぞれの子を別々に評価できるからです。トレーニング中に、ニューラル ネットワークは、特定の単語 (感情分析では「not」や「very」など) が文全体の感情にとって非常に重要であることを認識する場合があります。ノードを高く評価すると、ネットワークの柔軟性が向上し、パフォーマンスが向上します。 論文: ニューラル機械翻訳 リンク: https://arxiv.org/pdf/1609.08144v2.pdf はじめに: 今日議論する最後の論文では、機械翻訳のタスクに対する代替アプローチについて説明します。著者の Jeff Dean、Greg Corrado、Orial Vinyals および Google Brain の他のメンバーが、Google の人気の翻訳タスクの基盤となる機械翻訳システムを紹介します。このシステムにより、以前使用されていた Google 制作システムと比較して、翻訳エラーが平均 60% 削減されました。 従来の自動翻訳方法には、フレーズ一致に基づくバリエーションが含まれます。このアプローチには言語ドメインに関する多くの知識が必要であり、最終的にその設計は脆弱すぎて一般化能力に欠けていることが判明しました。従来のアプローチの問題の 1 つは、入力された文を 1 つずつ翻訳しようとすることです。その結果、より効率的なアプローチ(ニューラル機械翻訳(NMT)で使用される方法)は、文章全体を一度に翻訳し、より広いコンテキストを考慮し、言語をより自然に再配置することです。 ネットワークアーキテクチャ 著者らは、8 つのエンコーダー層とデコーダー層でエンドツーエンドでトレーニングできるディープ LSTM ネットワークを紹介します。このシステムは、エンコーダー RNN、デコーダー RNN、アテンション モジュールの 3 つの部分に分けることができます。大まかに言うと、エンコーダーは入力文をベクトル表現に変換し、デコーダーは出力表現を生成し、次にアテンション モジュールがデコーダーにデコード タスク中に何に焦点を当てるかを指示します (これが文の全体的なコンテキストを使用するという考え方です)。 このホワイト ペーパーの残りの部分では、このようなサービスを大規模に展開する際に発生する課題に焦点を当てます。コンピューティング リソースの量、レイテンシ、大規模な展開などのトピックについて詳しく説明します。 Machine Heart では、この研究の解釈についてレポートしています。「詳細 | レイヤーごとの分析、Google の機械翻訳のブレークスルーの背後にあるニューラル ネットワーク アーキテクチャとは?」を参照してください。 結論は ディープラーニングが自然言語処理タスクにどのように役立つかをまとめます。私の意見では、この分野における将来の目標は、顧客サービス チャットボットの改善、機械翻訳の完成、そしてできれば質問応答システムが構造化されていないテキストや長いテキスト (Wikipedia ページなど) をより深く理解できるようにすることに重点が置かれています。 [この記事は、51CTOコラムニストのMachine Heart、WeChatパブリックアカウント「Machine Heart(id: Almosthuman2014)」からのオリジナル記事です] この著者の他の記事を読むにはここをクリックしてください |
>>: ディープラーニングにおける次の大きな進歩は機械読み取りでしょうか?
C# 選択ソート アルゴリズムとは何ですか?これはどのように達成されるのでしょうか?この紹介が C#...
[[345683]]日々の努力の究極の目的は、生活をより楽に、より便利にすることです。これが人類の歴...
春の始まりの2月4日、世界の注目は北京に集まった。音楽、光、影が流れる中、オリーブの枝に囲まれた巨大...
MIT-IBM Watson AI ラボの研究者たちは、電力網の問題のトラブルシューティングに人工知...
科学研究でも産業界でも、機械学習はホットな話題であり、新しい機械学習手法が次々と登場しています。機械...
みなさんこんにちは。私はDiaobaiです。最近、対照学習が流行っているので、ICLR2020では、...
前回の記事では、オペレーティング システムが CPU を仮想化する方法についてすでに説明しました。今...
【51CTO.com クイック翻訳】チェックアウト時に銀行カード取引が拒否されると、イライラしたり恥...