自己注意メカニズムとは何ですか?

自己注意メカニズムとは何ですか?

[[241487]]

著者: キオン・キム

マシンハートが編集

参加者: Geek AI、Liu Xiaokun

注意メカニズムは、生物学的観察行動の内部プロセスを模倣したもの、つまり内部経験と外部感覚を整合させて、一部の領域の観察精度を高めるメカニズムです。アテンション メカニズムは、スパース データの重要な特徴をすばやく抽出できるため、自然言語処理タスク、特に機械翻訳で広く使用されています。自己注意メカニズムは注意メカニズムの改良版であり、外部情報への依存を減らし、データや機能の内部相関をより適切に捉えることができます。この記事では、テキスト感情分析の事例を使用して、スパーステキスト内の単語ペアの重み付け表現に自己注意メカニズムを適用し、モデルの効率を効果的に向上させる方法を説明します。

文章の表現方法にはさまざまなものがあります。この記事の著者は、以前のブログ投稿で、単語表現に基づいた 5 つの異なる文表現方法について説明しました。詳細については、次のリンクをご覧ください。

https://kionkim.github.io/ (ほとんどの情報は韓国語です)

文章表現

テキスト分類の問題では、文中の単語の埋め込みを単純に平均化するだけで良い結果が得られます。テキスト分類は、実際には比較的簡単で単純な作業です。意味論的な観点から文の意味を理解する必要はありません。単語を数えるだけで十分です。たとえば、感情分析の場合、アルゴリズムは、位置や具体的な意味に関係なく、肯定的または否定的な感情に大きく関連する単語をカウントする必要があります。もちろん、そのようなアルゴリズムは単語自体の感情を学習する必要があります。

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

文章をよりよく理解するためには、単語の順序にもっと注意を払う必要があります。これを実現するために、リカレント ニューラル ネットワークは、次の隠し状態を持つ一連の入力単語 (トークン) から関連情報を抽出できます。

この情報を使用する場合、通常は最後のタイムステップの隠し状態のみを使用します。しかし、小規模なベクトルにのみ格納された文のすべての情報を表現することは簡単な作業ではありません。

畳み込みニューラルネットワーク

N グラム技術のアイデアを借用して、畳み込みニューラル ネットワーク (CNN) は、関心のある単語の周囲のローカル情報を要約できます。これを行うには、下の図に示すように 1D 畳み込みを適用します。もちろん、以下は単なる例であり、他の異なるアーキテクチャを試すこともできます。

サイズ 3 の 1D 畳み込みカーネルは、情報を要約する位置の周囲の単語をスキャンします。これを行うには、フィルタリング後の長さが元の長さ T と同じになるように、サイズ 1 のパディング値を使用する必要があります。これに加えて、出力チャンネルの数は c_1 です。

次に、特徴マップに別のフィルターを適用し、最終的に入力のサイズを c_2*T に変更します。この一連のプロセスは、実際には人間が文章を読む方法を模倣したもので、まず 3 つの単語の意味を理解し、次にそれらをまとめて考えてより高レベルの概念を理解します。派生技術として、ディープラーニングフレームワークに実装された最適化された畳み込みニューラルネットワークアルゴリズムを使用して、より高速な計算速度を実現できます。

関係ネットワーク

単語のペアは、文に関するより明確な情報を提供してくれるかもしれません。実際には、単語は使用方法に応じて異なる意味を持つ場合があります。たとえば、「私は好きです」の「好き」という言葉は、「このように」という言葉とは意味が異なります。 「好き」と「これ」を一緒に考えるのではなく、「私」と「好き」を一緒に考えると、文章の感情をより明確に把握できます。これは間違いなく良い兆候です。スキップ グラムは、単語ペアが直接隣接していなくても、単語ペアから情報を取得する手法です。 「skip」という単語が示すように、これらの単語の間にスペースを入れることができます。

上の図からわかるように、単語のペアが関数 f(⋅) に入力され、それらの間の関係が抽出されます。特定の位置 t には、要約される単語のペアが T-1 個あり、合計や平均化、またはその他の関連する手法によって文を表します。このアルゴリズムを実装する場合、現在の単語自体を含む T 個の単語のペアに対してこの計算を実行します。

妥協が必要だ

これら 3 つの異なるメソッドは、次のように同じ一般的な形式で記述できます。

すべての I_{t,⋅} が 1 の場合、一般的な形式では、任意の「スキップ バイグラム」がモデルに均一に寄与することを示します。

RNN の場合、x_t という単語の後のすべての情報は無視されるため、上記の式は次のように簡略化できます。

双方向 RNN の場合、x_T から x_t への逆方向の関係を考慮することができます。

一方、CNN は、関心のある単語の周囲の情報のみを参照します。単語 x_t の前後の k 個の単語のみに注目する場合、一般的な式は次のように書き直すことができます。

ただし、関係ネットワークが大きすぎるため、すべての単語ペアの関係を考慮することはできない可能性があります。しかし、CNN の規模は小さすぎるため、それらの間のローカルな関係のみを考慮することはできません。したがって、私たちはこれら 2 つの極端なものの間の妥協点、いわゆる注意メカニズムを見つける必要があります。

自己注意メカニズム

上記の一般的な形式は、より柔軟にするために次のように書き直すことができます。

ここで、α(⋅,⋅)は各単語の組み合わせの起こりうる影響を制御します。たとえば、「私はあなたのこういうところが好きです」という文では、「私」と「あなた」という 2 つの単語は、文の感情を判断するのに役立たない可能性があります。しかし、「I」と「like」を組み合わせると、文章の感情が明確に伝わります。この場合、前者の組み合わせにはあまり注意を払わず、後者の組み合わせに多くの注意を払います。重みベクトルα(⋅,⋅)を導入することで、アルゴリズムが単語の組み合わせの重要度を調整できるようになります。

i番目の文のT個の単語がH_{i1},…,H_{iT}に埋め込まれていると仮定します。各単語の埋め込みには重みα_{it}が割り当てられます。これは、単語を統一された表現に要約することの相対的な重要性を表します。

ここで得たい最終結果は、各入力文の重みマトリックスです。 10 個の文をネットワークに入力すると、以下に示すように 10 個の注意行列が生成されます。

自己注意メカニズムの実装

自己注意メカニズムは、論文「構造化された自己注意文埋め込み」で初めて提案されました。この論文の著者は、双方向 LSTM の隠れ層に自己注意メカニズムを適用しました。モデル構造を下図に示します。

論文アドレス: https://arxiv.org/pdf/1703.03130.pdf

ただし、単語表現(必ずしも単語表現ではなく、文表現の前の段階を意味します)に LSTM を使用する必要はなく、リレーショナル ネットワークに基づく単語表現に自己注意メカニズムを適用します。

元の論文の自己注意メカニズムとは異なり (上の図に示すように、数学的な詳細は以前のブログ投稿で確認できます)、リレーショナル ネットワークの注意メカニズムは次のように定義できます。

参照:

https://kionkim.github.io/_posts/2018-07-12-sentiment_analysis_self_attention.md

上の図を説明するために、i 番目の単語の表現を取得したいとします。 i 番目の単語を含む単語の組み合わせに対して、2 つの出力が生成されます。1 つは特徴抽出用 (緑の円)、もう 1 つは注意の重み付け用 (赤の円) です。これら 2 つの出力は潜在的に同じネットワークを共有できますが、このホワイト ペーパーでは出力ごとに個別のネットワークを使用します。注意の出力 (赤い円) は、最高の注意重みを取得する前に、シグモイド層とソフトマックス層を通過する必要があります。これらの注目重みは抽出された特徴と乗算され、関心のある単語の表現が得られます。

Gluon による自己注意メカニズムの実装

具体的な実装部分では、ネットワーク構造が非常に単純で、関係抽出用の 2 つの完全接続層と、アテンション メカニズム用の 1 つの完全接続層があると想定します。これに続いて、分類用の 2 つの連続した完全接続層が続きます。ここでは、関係抽出と注目抽出に次のコード スニペットが使用されます。

  1. クラス Sentence_Representation(nn.Block):
  2. def __init__(self, **kwargs):
  3. super(文表現、self).__init__()
  4. kwargs.items() 内の (k, v) について:
  5. setattr(自分自身、k、v)
  6.  
  7. self.name_scope() を使用する場合:
  8. self.embed = nn.Embedding (self.vocab_size、self.emb_dim)埋め込みは、
  9. self.g_fc1 = nn.Dense (self.hidden_​​dim、アクティベーション= 'relu' )
  10. self.g_fc2 = nn.Dense (self.hidden_​​dim、アクティベーション= 'relu' )
  11. self.attn = nn.Dense (1、アクティベーション= 'tanh' )
  12.  
  13. def forward(self, x):
  14. embeds = self .embed(x) # バッチ * 時間ステップ * 埋め込み
  15. x_i =埋め込み.expand_dims (1)
  16. x_i = nd .repeat(x_i, repeats = self .sentence_length, axis = 1 ) # バッチ * 時間ステップ * 時間ステップ * 埋め込み
  17. x_j =埋め込み.expand_dims (2)
  18. x_j = nd .repeat(x_j, repeats = self .sentence_length, axis = 2 ) # バッチ * 時間ステップ * 時間ステップ * 埋め込み
  19. x_full = nd .concat(x_i,x_j, dim = 3 ) # バッチ * 時間ステップ * 時間ステップ * (2 * 埋め込み)
  20. # 新しい入力データ
  21. _x = x_full .reshape((-1, 2 * self.emb_dim))
  22.  
  23. # 注目を集めるネットワーク
  24. _attn =自分自身.attn(_x)
  25. _att = _attn .reshape((-1, self.sentence_length, self.sentence_length))
  26. _att = nd.シグモイド(_att)
  27. att = nd.softmax (_att、= 1 )
  28.  
  29. _x = self .g_fc1(_x) # (バッチ * 時間ステップ * 時間ステップ) * hidden_​​dim
  30. _x = self .g_fc2(_x) # (バッチ * 時間ステップ * 時間ステップ) * hidden_​​dim
  31. # (sentence_length*sentence_length) サイズの結果をすべて追加して文の表現を生成します
  32.  
  33. x_g = _x .reshape((-1, self.sentence_length, self.sentence_length, self.hidden_​​dim))
  34.  
  35. _inflated_att = _att.expand_dims(=-1)
  36. _inflated_att = nd .repeat(_inflated_att、 repeats = self .hidden_​​dim、 axis = 3 )
  37.  
  38. x_q = nd .multiply(_inflated_att, x_g)
  39.  
  40. sentence_rep = nd .mean(x_q.reshape( shape = (-1, self.sentence_length **2, self.hidden_​​dim)), axis = 1 )
  41. sentence_rep、attを返す

特徴抽出と注意メカニズムには別々のネットワークを使用します。注目ベクトルの最終的なサイズは T*1 で、抽出された特徴ベクトルのサイズは T*d です (d はハイパーパラメータ)。 2 つを掛け合わせるには、抽出された特徴ベクトルのサイズに合わせて注目ベクトルをスケーリングするだけです。ここで提供しているのはほんの一例であり、他の実装の方が優れている可能性があります。

完全な実装コードは、次のリンクから入手できます。

http://210.121.159.217:9090/kionkim/stat-analysis/blob/master/nlp_models/notebooks/text_classification_RN_SA_umich.ipynb を参照してください。

結果

以下はランダムに選択された 9 つの注目マトリックスです。

テキストを分類するときに、アルゴリズムがどの単語に重点を置くかを知ることができます。予想通り、「愛」「素晴らしい」「バカ」「最悪」などの感情を表す言葉は、分類プロセス中に大きな注目を集めました。

参考リンク: https://medium.com/@kion.kim/self-attention-a-clever-compromise-4d61c28b8235

[この記事は51CTOコラム「Machine Heart」、WeChatパブリックアカウント「Machine Heart(id: Almosthuman2014)」からのオリジナル記事です]

この著者の他の記事を読むにはここをクリックしてください

<<:  AI時代のネイティブ:3歳でパズルを作り、5歳でプログラミングを学ぶ

>>:  いいえ!機械学習は単なる美化された統計ではありません。

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

AI面接ロボットのバックエンドアーキテクチャの実践

01 はじめにAI面接ロボットは、Lingxiインテリジェント音声セマンティックプラットフォームの人...

生成 AI は企業の知識管理をどのように改善できるのでしょうか?

生成 AI を使用すると、ナレッジ管理チームは知識の取得と維持のプロセスを自動化できます。この記事で...

機械学習を利用してデータベースの運用と保守の問題を解決します

著者についてPing An Technology のデータベース チームの運用保守開発エンジニアであ...

自己教師学習の効率限界を突破! Ma Yi と LeCun が共同で EMP-SSL をリリース: 特別なトリックは不要、30 エポックで SOTA を達成可能

過去数年間、教師なし学習と自己教師あり学習 (SSL) は大きな進歩を遂げてきました。SSL を通じ...

...

清朗智能の新型消毒ロボットが海外市場を席巻

新型コロナウイルスの感染力が高いため、防疫期間中、一般の人々は、インテリジェント消毒ロボットが医療産...

アリババの音声ロボットが李佳琦の生放送室に登場、その応答速度はSiriの20倍

10月30日、終了したばかりの李佳琦のライブ放送室で、オンラインショッピング客はアリババの音声ロボッ...

訓練されたディープラーニングモデルは、もともとこのように展開されていました

データの収集、データのクリーンアップ、環境の構築、モデルのトレーニング、モデルの評価とテストに一生懸...

NvidiaとFoxconnがAIに特化した新しいデータセンターの開発で提携

ジェンセン・フアンとヤンウェイ・リウが、AIイノベーションに特化した「工場」を建設するという新しいプ...

推奨システムにおける自然言語処理 (NLP) の応用

[[195357]]パーソナライズされた推奨はビッグデータ時代に欠かせない技術であり、電子商取引、情...

...

2021年のAIに関する10の大胆な予測の科学的分析 学術見出し

2020年は忘れられない年です。今年に入って、新型コロナウイルスの感染拡大に伴い、人工知能(AI)が...

世界初のAI生成薬がヒト臨床試験に進出

6月30日のニュースによると、今週、完全に人工知能によって設計された世界初の医薬品が人間の臨床試験段...

AIエージェントに完全な人生を与えましょう! HKU NYU Xie Sainingらによる最新の知的研究:仮想は現実である

より強力な AI エージェントを構築するにはどうすればよいでしょうか?答えは、彼らに完全で現実的な世...

DGX-2 および SXM3 カードが GTC 2018 で発表されました

最近、GTC 2018 で、Vicor チームは NVIDIA DGX-2 の発表を目撃しました。 ...