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

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

[[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コンピューティングの可能性

自動運転はエッジコンピューティングの重要な応用分野です。自動運転には100~1000TOPSのエッジ...

AIデータサービス業界は「認知戦争」に突入。なぜYunce Dataは業界No.1の座を維持しているのか?

新しいインフラストラクチャにより、AI の実装が加速され、その背後にある「糧」である AI データ ...

人工知能は「高度な感情知能」に向かって発展している

[[265376]] [51CTO.com クイック翻訳] 機械知能の分野における現在の成功は主に計...

8つの一般的なアルゴリズムのアイデアを説明する1つの記事

アルゴリズムとデータ構造は、常にプログラマーの基本的なスキルでした。データ構造の基本インフラストラク...

Metaが新しいモバイルAIジェネレーターを公開、5分でAIアプリを作成、AndroidとiOSの両方をサポート

最近、毎年恒例の PyTorch 開発者会議が開催されました。このカンファレンスでは、Meta(旧F...

...

PyTorch がなぜ人気があるのでしょうか?創業者スーミスが成長の秘訣を語る

PyTorch は、ディープラーニング分野で最も人気のあるフレームワークの 1 つです。最初のバージ...

EasyDL モデルのトレーニングから EdgeBoard 推論までのステップバイステップ ガイド

まとめ: EdgeBoard は Baidu が開発した FPGA ベースの組み込み AI ソリュー...

GitHub スター 6000 以上! Pythonで機械学習のバイブルPRMLを実践

ビショップの PRML は機械学習のバイブルと言っても過言ではありません。この本では、パターン認識と...

ビジュアル Transformer アーキテクチャの進歩を整理した記事: CNN と比較して、ViT が勝っているのはどこでしょうか?

注意ベースのエンコーダー/デコーダー アーキテクチャである Transformer は、自然言語処理...

農業用ドローンは熱を帯び続け、今後の開発に向けた3つの大きなトレンドが浮上

農業は国民の衣食住の問題を解決する鍵であり、国民経済の発展を促進する重要な基盤でもあります。我が国は...

米国は人工知能戦争への準備を強化している

海外メディアの報道によると、米国は「防衛パートナーシップ計画」を基盤として、人工知能戦争への備えを同...

何をするにしても使い始めるべき 7 つの超便利な AI ツール

正直なところ、テクノロジーの未来は人工知能 (AI) の進歩と密接に結びついています。 OpenAI...

今年のダブルイレブンでは、ドローン、無人運転車、ロボットがすべて配備されます!

近年、科学技術革命と産業変革の新たな局面の始まりに伴い、わが国の物流業界は情報化、デジタル化、インテ...

英国で新たな自動運転規制が導入され、ドライバーはもはや「集中」する必要がなくなった

自動運転は近年市場で最も活発なトピックの1つです。資金が継続的に流入し、大手企業が存在感を示そうと競...