カプセルシリーズテキスト分類のための動的ルーティングを使用したカプセル ネットワークの調査

1. 背景の紹介

テキスト モデリングに関する初期の研究では、単純なバッグオブワード分類器を使用したテキスト分類である程度の成功を収めています (Joachims、1998 年; McCallum 他、1998 年)。つまり、個々の単語や N グラム フレーズの意味を理解することは研究であるということです。複雑なモデルに必要なステップ。したがって、分散型単語表現、つまり単語埋め込み/単語ベクトルの出現が NLP コミュニティから大きな注目を集め、基本レベルで何を (単語の意味を) モデル化すべきかという問題が解決されることは驚くべきことではありません (Mikolov et al 、2013年;ペニントン他、2014年)。テキスト内のより高いレベルの概念と事実をモデル化するために、NLP 研究者は、単語の意味以外に実際にモデル化する必要があるものは何か、という問題について考える必要があります。この問題に対する一般的なアプローチは、テキストをシーケンスとして扱い、その空間パターンに焦点を当てることであり、その代表的なものには畳み込みニューラル ネットワーク (CNN) (Kim, 2014; Zhang et al., 2015; Conneau et al., 2017) やロング ショート メモリ ネットワーク (LSTM) (Taietal、2015; Mousa & Schuller、2017) もう 1 つの一般的なアプローチは、単語の順序を完全に無視し、単語を確率論的なトピック モデルを含む表現のセットとして扱うことです (Blei et al.、 2003; Mcauliffe & Blei、2008)および Earth Mover の距離ベースのモデリング(Kusner et al.、2015; Ye et al.、2017)。
スペースに依存するモデルである CNN は、グリッド上で特徴検出器を複製する非効率性の代償を払っています。(Sabour et al., 2017) で説明したように、次元の増加に伴ってサイズが指数関数的に増加する複製検出器を使用するか、同様に指数関数的にラベル付きトレーニング セットの量を増加させるかを選択する必要があります。一方、スペースに依存しない方法は、単語の順序や局所的なパターンに関係なく、判断シナリオで完全に有効です。

従来の分類問題は一般的に CNN または RNN を使用し、階層的に特徴を抽出しますが、これら 2 つの基本構造にはそれぞれ次のような問題があります。

  • CNN は、特徴検出器を使用して特徴を抽出した後、多くの場合、最大プーリングを通じて顕著な特徴を選択しますが、ヒントン氏の言葉を借りれば、この方法の結果は悲惨です。さらに、CNN の特徴抽出および一般化機能にも特定の問題があります。詳細については、以前の記事「カプセル シリーズのカプセル間の動的ルーティング」を参照してください。
  • RNN はシーケンス モデルであるため、私の実験と経験によれば、分類問題自体にはそれほど強力な時間的意味論はなく、また、RNN 自体の学習時間は比較的長いです。

2. モデルの特徴

画像処理へのカプセルの応用に続き、nlpの分野でもカプセルが初めて使われ、分類問題(特徴抽出というほうが正確だと思います)でも良い結果を示しました。

この記事のモデルの特徴:

  • 従来のモデルのアイデア (CNN の低レベルでは、特徴検出器を使用して特徴と最大プーリングを抽出し、レイヤーごとに特徴を抽出します) を採用し、2 層のカプセル構造を通じて、最初の層で局所特徴を抽出し、2 番目の層で局所特徴を抽出します。完全な機能。
  • ルーティング戦略を変更します。
    • オーファン カテゴリの概念の導入、具体的には、最終的な分類カテゴリを追加すると、このベクトルは「背景」情報 (具体的にはテキスト内のストップ ワードやその他の役に立たない単語) をキャプチャできます。
    • カプセル内では、予測ベクトルC ij C_{ij}の重みC計算する際には、softmax の代わりに Leaky-Softmax を使用し、計算量を増やすことなくllを処理します。ll + 1 l+1+レイヤ1のノイズ子カプセルの問題は、
      leak = tf.zeros_like(b, optimize=True)
      leak = tf.reduce_sum(leak, axis=1, keep_dims=True)
      leaky_logits = tf.concat([leak, b], axis=1)
      leaky_routing = tf.nn.softmax(leaky_logits, dim=1)        
      c = tf.split(leaky_routing, [1, output_capsule_num], axis=1)[1]
      
    • Leaky-softmaxをベースにCoefficients Amendmentのパラメータ修正を追加 具体的な操作は以下の通りです(この部分がソースコードになく、理由がよくわかりません。上司に教えていただければ幸いです)
      ここに画像の説明を挿入します

3.モデル詳細

3.1.基本構造

基本的なモデルプロセスは次のとおりです:
ここに画像の説明を挿入します
ソースコードをベースに、ソースコードをプレイしているときに自分でモデルを作成しました:
ここに画像の説明を挿入します
2019.9.3 更新:
実際には、ルート化プロセスの 2 つの層はそれぞれ、各単語の意味ベクトルを取得します。レベルとパッセージ全体のベクトル表現

  • 最初の層への入力は[バッチ バッチバッチレンレン_ _ __l e ncap _ in cap\_inc a p _ i nポーズポーズp o s e ]、つまり、cap _ in cap\_inc a p _ i n長さはポーズですp o s e wordi word_iのベクトル表現言葉_ _ _私はこれに基づいて、各位置は 3 つの隣接するワードを使用して現在の位置ベクトルを表します。つまり、各位置は 3* cap _ in cap\_inを使用します。c a p _ i n長さはポーズですp o s eのベクトル表現バッチ バッチバッチレンレン_ _ __l e n ,3*cap _ in cap\_inc a p _ i nポーズポーズp o s e ]、出力は [バッチ バッチバッチ*レンレン_ _ __l e ncap _ out cap\_outキャップ_アウトポーズポーズ_ _ _p o s e ] つまり、各位置は、長さ passwordi word_i言葉_ _ _私は
  • 次に[バッチバッチに転置しますバッチレンレン_ _ __l e n *cap _ out cap\_outキャップ_アウトポーズポーズ_ _ _p o s e ] は、章全体をルート化し、章レベルの表現を取得する、つまり最終的な分類結果を取得するための入力として使用されます。

3.2.モデル構造

上記の詳細なアイデアとして、この記事では 2 つのモデル構造も示しています。
ここに画像の説明を挿入します

ソースコード: zsweet/capsule_text_classification
その他の実装ソースコードおよびその他のタスクソースコード:
AidenHuen/Capsule-Text-Classification
JerrikEph/Capsule4TextClassification

3.3.損失関数

マージン損失は依然として使用されており、詳細は次のとおりです:
ここに画像の説明を挿入します
ソース コード内のその他のオプションの損失:

def spread_loss(labels, activations, margin):
    activations_shape = activations.get_shape().as_list()
    mask_t = tf.equal(labels, 1)
    mask_i = tf.equal(labels, 0)    
    activations_t = tf.reshape(
      tf.boolean_mask(activations, mask_t), [activations_shape[0], 1]
    )    
    activations_i = tf.reshape(
      tf.boolean_mask(activations, mask_i), [activations_shape[0], activations_shape[1] - 1]
    )    
    gap_mit = tf.reduce_sum(tf.square(tf.nn.relu(margin - (activations_t - activations_i))))
    return gap_mit        
def cross_entropy(y, preds):    
    y = tf.argmax(y, axis=1)
    loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=preds, labels=y)                                               
    loss = tf.reduce_mean(loss) 
    return loss

def margin_loss(y, preds):    
    y = tf.cast(y,tf.float32)
    loss = y * tf.square(tf.maximum(0., 0.9 - preds)) + \
        0.25 * (1.0 - y) * tf.square(tf.maximum(0., preds - 0.1))
    loss = tf.reduce_mean(tf.reduce_sum(loss, axis=1))
#    loss = tf.reduce_mean(loss)    
    return loss

4. まとめ

モデル全体としてはいくつかの革新があり、ルーティング時にいくつかのトリックが追加されていますが、Capsule-B では最終的に max-pooling が使用され、カプセルの本来の意図に反していますが、その特徴抽出能力は良好です。したがって、nlp 関連のタスクでカプセルを使用する方法については、現時点で良い研究点だと思います。
更新 (2019.5.13): 非常に良い記事:テキスト分類における動的ルーティングに基づくカプセル ネットワークの探索

5. 新しいトレンド

ICLR2020-反転ドット付きカプセル-積アテンションルーティング-Yao-Hung Tsai

参考

この記事は私の見解と理解の一部を列挙したものにすぎず、原文にはより適切な詳細が記載されています。

おすすめ

転載: blog.csdn.net/u014665013/article/details/89109351