BiLSTMとCRFアルゴリズムを徹底的に理解する

BiLSTMとCRFアルゴリズムを徹底的に理解する

CRF は、品詞タグ付け、単語分割、固有表現認識などのタスクに使用できる、一般的に使用されるシーケンス ラベリング アルゴリズムです。 BiLSTM+CRF は、BiLSTM と CRF を組み合わせた一般的なシーケンス ラベリング アルゴリズムです。これにより、モデルは CRF のように前のシーケンスと次のシーケンス間の相関関係を考慮でき、LSTM の特徴抽出およびフィッティング機能も備えています。

[[329170]]

1. はじめに

前回の記事「CRF 条件付きランダムフィールド」では、条件付きランダムフィールド CRF について紹介し、CRF と LSTM の違いについて説明しました。単語の分割を例に挙げてみましょう。各単語に対応するラベルは、s、b、m、e になります。

「What is street stall economy」という文が与えられた場合、正しい単語分割方法は「what / is / street stall / economy」であり、各単語に対応する単語分割ラベルは「be / s / be / be」です。下の図は、シーケンスのラベル付けを行う際の LSTM の問題を示しています。

BiLSTM単語分割

BiLSTM は、各単語が異なるタグに属する確率を予測し、Softmax を使用して、最も確率の高いタグを位置の予測値として取得します。この方法では、予測中にラベル間の相関関係は無視されます。たとえば、上の図では、BiLSTM は最初の単語を s と予測し、2 番目の単語を e と予測します。しかし実際には、単語分割中に s の後に e はないので、BiLSTM はラベル間の関係を考慮しません。

そのため、BiLSTM+CRF は BiLSTM の出力層に CRF を追加し、モデルがクラス ラベル間の相関を考慮できるようにします。ラベル間の相関は CRF の転送行列であり、ある状態から別の状態に遷移する確率を表します。 CRF の転送行列が以下に示すとおりであると仮定します。


CRF状態遷移行列

すると、最初の 2 つの単語「什么」の場合、ラベルが「se」である確率は 0.8×0×0.7=0、ラベルが「be」である確率は 0.6×0.5×0.7=0.21 になります。

そのため、BiLSTM+CRF では、単一のクラスラベルの確率だけではなく、クラスラベルパス全体の確率を考慮します。BiLSTM 出力層に CRF を追加すると、次のようになります。

BiLSTM+CRF単語分割

最終的に、すべてのパスの中で、besbebe の確率が最も高いため、予測結果は besbebe になります。

2. BiLSTM+CRFモデル

CRF には 2 つの機能があります。詳しくは、前の記事をご覧ください。最初の特徴関数は状態特徴関数であり、放出確率とも呼ばれ、単語 x がラベル y に対応する確率を表します。


CRF状態機能

BiLSTM+CRFでは、この特徴関数(放出確率)はLSTMの出力を使用して直接計算されます。第1セクションの図に示すように、LSTMは各瞬間の各位置に対応する異なるラベルの確率を計算できます。

CRF の 2 番目の特徴関数は状態遷移特徴関数であり、ある状態 y1 から別の状態 y2 に遷移する確率を表します。


CRF状態遷移機能

CRF の状態転送特徴関数は状態転送行列で表すことができ、トレーニング中に状態転送行列の要素値を調整する必要があります。したがって、BiLSTM+CRF では、BiLSTM モデルに状態転送行列を追加する必要があります。コードは次のようになります。

  1. クラス BiLSTM_CRF(nn.Module):
  2. def __init__(self、vocab_size、tag2idx、embedding_dim、hidden_​​dim):
  3. self.word_embeds = nn.Embedding(vocab_size,embedding_dim) 埋め込みサイズは、
  4. self.lstm = nn.LSTM(embedding_dim, hidden_​​dim // 2,
  5. num_layers=1、双方向= True )
  6.  
  7. # CRFの放出確率、つまり各位置が異なるクラスラベルに対応する確率に対応する
  8. self.hidden2tag = nn.Linear(hidden_​​dim, self.tagset_size)
  9.          
  10. #転送行列、次元はラベルの数に等しく、あるラベルから別のラベルに転送される確率を示します
  11. self.transitions = nn.Parameter(
  12. torch.randn(len(tag2idx), len(tag2idx))

文 x が与えられた場合、そのラベルシーケンスが y である確率は次の式を使用して計算されます。

y と x の積分

式中のスコアは次の式を使用して計算されます。ここで、Emit は放出確率(つまり、LSTM 出力の確率)に対応し、Trans は遷移確率(つまり、CRF 転送行列に対応する値)に対応します。

スコア計算式

BiLSTM+CRF は最大尤度法を使用してトレーニングされ、対応する損失関数は次のようになります。


損失関数

このうち、スコア(x,y)は比較的計算が簡単で、Z(x)はすべてのラベルシーケンス(y)の指数スコアの合計です。シーケンスの長さがlでラベルの数がkの場合、シーケンスの数は(k^l)です。直接計算することはできないため、フォワードアルゴリズムを使用して計算します。

現在主流のディープラーニングフレームワークを使用して損失を導出し、勾配降下法を適用することで、BiLSTM+CRF を最適化できます。モデルをトレーニングした後、Viterbi アルゴリズム (動的プログラミング) を使用して最適なパスを見つけることができます。

3. 損失​​関数の計算

BiLSTM+CRF損失関数を計算する際の難しさは、次の式に示すようにFで表されるlog Z(x)を計算することにあります。

スコアを、放出確率 p と遷移確率 T の合計に分割します。問題を簡略化するために、シーケンスの長さを 3 と仮定すると、以下に示すように、長さがそれぞれ 1、2、3 の場合の log Z 値を計算できます。

上記の式で、p は出力確率、T は遷移確率、Start は文の開始、End は文の終了を表します。 F(3)は最終的なlogZ(x)値です。上記の式を変形すると、F(3)は次のように再帰形式に変換できます。

上記の式の各ステップの演算は、log_sum_expを含めて同じであることがわかります。たとえば、F(1)は次のようになります。

  • まず、expを計算する必要があります。すべてのy1について、exp(p(y1)+T(Start,y1))を計算します。
  • 前のステップで得られたexp値を合計します
  • 対数を求め、合計の対数を計算する

したがって、log Z を計算するフォワード アルゴリズムのコードは次のように記述できます。

  1. def forward_algorithm(self, probs):
  2. def forward_algorithm(問題):
  3. 「」 「
  4. probs: LSTM によって出力される確率値、サイズは [seq_len, num_tags]、num_tags はタグの数
  5. 「」 「
  6.  
  7. # forward_var(記事ではFとして理解できます)は、num_tagsに等しい次元のベクトルである前の瞬間の値を保存します。
  8. # 最初は Start のみが 0 で、他はすべて非常に小さな値 (-10000) です。
  9. forward_var = torch.full ((1, num_tags), -10000.0) # [1, num_tags]
  10. forward_var[0][開始] = 0.0
  11.  
  12. for p in probs: # probs [seq_len, num_tags]、シーケンスを走査する
  13. alphas_t = [] # alphas_tは次の瞬間に異なるラベルを取る累積確率値を保存します
  14. for next_tag in range(num_tags): # タグをトラバースする
  15.  
  16. # 次の瞬間に next_tag を放出する確率
  17. 出力スコア = p[次のタグ] .view (1, -1).expand(1, num_tags)
  18.  
  19. # すべてのタグから next_tag に遷移する確率は、長さと幅が num_tags の行列です。
  20. trans_score = 遷移[next_tag] .view (1, -1)
  21.  
  22. # 次のタグバージョン = F(i-1) + p + T
  23. next_tag_var = forward_var + trans_score + emitting_score
  24.  
  25. alphas_t.append(log_sum_exp(next_tag_var) .view (1))
  26.  
  27. forward_var = torch.cat(alphas_t) .view (1, -1)
  28.  
  29. terminary_var = forward_var + self.transitions[Stop] # 最後に、文の終わりを示すためにStopに遷移します
  30. アルファ = log_sum_exp(端末変数)
  31. アルファを返す

4. ビタビアルゴリズムのデコード

モデルをトレーニングした後、予測プロセスでは Viterbi アルゴリズムを使用してシーケンスをデコードする必要があります。興味のある方は、「統計的学習方法」を参照してください。以下はビタビの公式の紹介です。まず、いくつかの記号の意味は次のとおりです。


すると、ビタビアルゴリズムの再帰式が得られる。


最後に、ビタビによって計算された値に基づいて最も適切なシーケンスを見つけることができます。


最後に、pytorch 公式サイトの BiLSTM+CRF コードを読むことをお勧めします。コードを通じて理解するのが簡単です。

5. 参考文献

上級: 動的な意思決定と BI-LSTM CRF

<<:  小売業におけるロボット工学

>>:  人工知能の代表的な応用分野トップ10の一覧と技術原理の図解

ブログ    
ブログ    
ブログ    

推薦する

機械に漢字の一画一画の謎を理解させるにはどうすればいいでしょうか?

[[227335]]背景インテリジェントな顧客サービスから機械翻訳、テキスト要約の生成からユーザー...

心を込めてツイートしましょう! Synchron 脳コンピューターインターフェースは ALS 患者が自分の考えで携帯電話を閲覧するのを助けます

こんにちは世界!プログラマーが初めて新しいプログラミング言語に触れるとき、その言語が世に登場したこと...

インテリジェントコンピューティングセンター構築の「サンゴ礁」と「灯台」

インテリジェント コンピューティング センターを「誰でもアクセス可能かつ無料」にする時が来ています。...

生成AI: 電子商取引の新たなフロンティア

AI の真の可能性が現れ始めたばかりですが、テクノロジーは電子商取引業界の生産性向上と優れた顧客サー...

アルファベットのウィングがドローン配達サービスをダラス・フォートワース地域に導入

ドローンはまもなく、タイレノールとバンドエイドが詰まった小型容器を積んでダラス・フォートワース上空を...

IoT セキュリティ: RSA 暗号化および復号化アルゴリズム

[[357279]] WeChat パブリックアカウント: コンピューターとネットワークのセキュリテ...

...

AI導入における主な障壁とその解決策

COVID-19 パンデミックにより、企業はデジタル変革の取り組みを数か月、場合によっては数年も加速...

将来、人間に取って代わるのはAIではなく、AIのスキルを習得した人間です。

[[264419]] 「機械学習」「ディープラーニング」「ニューラルネットワーク」に関する高度な技...

強力な暗号化アルゴリズムによる SQL インジェクション事例

暗号化には、情報の機密性などさまざまな利点があります。ただし、アプリケーションのセキュリティを確保す...

Nvidiaの生成AIスーパーチップGH200はH100の2倍の計算能力を持つ。黄仁訓:それは狂ったように推論できる

アーキテクチャの革新を待つことができず、Nvidia は生成 AI 専用のチップを「先行して」リリー...

Google、AIの地位強化のためデータサイエンスコミュニティKaggleの買収を発表

Google は本日、データサイエンスと機械学習のコンテストを主催するオンライン サービスである K...

...

...