1. BERTとは

ざっくり言うと、、
  • 自然言語処理の深層学習モデル
  • 2018年に発表され、11個の自然言語処理タスクで当時のSoTA(最高値)を達成
  • 様々な派生が提案されており、画像や音声のタスクにも派生モデルあり
 
技術的には、、
  • TransformerのEncoderをベースにしたモデル
  • Googleや研究所などが事前学習したモデルを、使用者がfine-tuningすることで様々なタスクに対応可能
 
Transformerは簡単に言うと
  • 翻訳などの自然言語処理、時系列データ処理に使われるモデル
  • 並列計算が可能で訓練時間が短い
  • EncoderとDecoderからなる
イメージとしては、Encoderで既知の周辺情報を取り入れて、Decoderで未知の別の情報に変換する感じ
このEncoderを12または24層重ねたものがBERTの構造になる
notion image
事前学習として、文章中の単語穴埋め問題と2文間のつながり有無問題を学習させる
事前学習は学習時間やデータ数が非常に多くいるので、Googleや研究所が公開しているものを利用するのが一般的
 
事前学習の後、BERTに全結合層を加えて文書分類、固有表現抽出などの個別タスクで学習(fine-tuning)して利用する
 

2. BERTで解かれる主なタスク

文書分類・・・コメントのポジティブ/ネガティブ判断、文章間の類似度判断、文章の作者分類
固有表現抽出・・・人名の抽出、批判的な言葉の抽出
など、fine-tuningにより文書分類や固有表現抽出では自作の幅広い問題設定に対応可能
 
直接的に文章生成系、翻訳タスクには用いられない
→BERTは文章をencodeするだけなので、1層追加+fine-tuningのみで新たな文章を生成するのには向かない(encoder部分として使用するのは可能)

3. 実装の手順

TensorFlow HubHugging Faceにあるトークナイザー(文章を分割しBERT入力のトークンに変換するもの)と事前学習モデルを用いることで、KerasやPytorchのモデルとしてfine-tuningや推論ができる

4. 実装上の苦労

  • 実行時間、メモリ
1文章を入力したとき、タスクにもよるが
CPU(Intel Core-i9(10コア20スレッド))で0.5秒くらいかかり、
GPU(GeForce RTX 2080 Ti)で0.05秒くらいかかる
GPU(GeForce RTX 2080 Ti)使用時はGPUメモリを6GB程度使用する
 
複数タスクのために複数モデルを同時に使用したり、入力文章が多くなったりするとコンピュータへの負荷が大きくなるため注意
 
  • 入力文章の長さ制限
Transformer内のAttention機構により、BERTへの入力は固定長となり、最大入力トークン数は512となる
また、最大入力トークン数を長くするほどメモリ使用量も大きくなり、例えばGoogle Colabでは128を超えた最大入力トークン数を指定しようとするとメモリ不足となり実行できない
そのため、小説など長い文章を入力するには、冒頭部分のみ使用するなどの前処理を施す必要がある
 
  • 固有表現抽出の難しさ
固有表現抽出では、各トークンがどの固有表現に相当するか分類し、その連続部分を抜きだすことで表現を抽出する
そのため、抜き出したい表現の一部が別クラスに分類されることで、抽出表現が途切れ途切れになってしまったり、不完全な表現になってしまったりすることがある
 
特に、日本語用のBERTのトークナイザーでは文章がほぼ1文字単位のトークンに分割されるので、長い表現は不完全になってしまうことも多い
うまくロジックを組んで途中の誤分類を無視することもできるが、助詞(「は」「に」など)で区切られた別単語を結合してしまうなどの可能性もあるため、完全に対処するのは難しい