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の一覧と技術原理の図解

ブログ    
ブログ    
ブログ    

推薦する

人気の機械学習プログラミング言語、フレームワーク、ツール14選

[51CTO.com クイック翻訳] 増え続けるプログラミング言語ライブラリやツールの中から、機械学...

Stability AIのCEOが大胆な発言:5年後には人間のプログラマーは存在しなくなる

最近、Stability AIの創設者兼CEOであるEmad Mostaque氏が再び衝撃的な発言を...

...

AI による顔を変える動画が何百万人ものユーザーを獲得。たった 1 ステップで楽しさから恐怖感まで

今朝、私の友人の輪の中に、AI による顔の変形に関する短い動画が大量に現れました。これらの短編動画の...

チューリング賞受賞者ヨシュア・ベンジオ氏:生成フローネットワークがディープラーニングの分野を拡大

最近、「GFlowNet Foundations」と題された論文が注目を集めています。これはチューリ...

わずか60行のコードでディープニューラルネットワークを実装する

01データセットの準備使用されるデータセットは、30 次元の特徴と 569 個のサンプルを含む、sk...

...

来年のIT投資の見通しは有望です。成長率はGDPの3倍です。 CIOの75%がAIへの支出を増やす

現在、世界経済の回復は依然として緩やかです。国際通貨基金(IMF)が最近発表した世界経済見通しレポー...

...

古典的なアルゴリズム: 順序付けられていない配列の K 番目に大きい値を見つける

[[409182]] 1. K番目に大きいものを見つけるタイトル順序付けられていない整数配列がありま...

私の国の人工知能の医療応用シナリオは非常に人気があり、既存の実践では依然として3つのボトルネックを突破する必要があります。

[[261498]]私の国には1,100社以上の人工知能企業があります。人工知能の最もホットな分野...

CESの半導体大手:自動運転のオープンな競争と5Gの秘密の競争

[[255293]]明らかに、自動運転と5Gはチップビジネスそのものよりもはるかに魅力的です。 AI...

AIアーキテクトとはどのような人達でしょうか?

アシュトーシュ・グプタ翻訳者: ブガッティ企画丨孫淑娥亮策要するに:人工知能 (AI) プロジェクト...

企業がビジネスでAIOpsをどのように活用しているか

AIOps が今日最も人気のある用語の 1 つになったことは間違いありません。厳密に言えば、IT 運...

顔検出と認識がますます普及しているのはなぜでしょうか?その背後にある技術は何ですか?

過去数年間、顔認識は広く注目を集めており、画像分析の分野で最も有望なアプリケーションの 1 つと考え...