BERTとは?理論から実装まで解説

自然言語処理

今回は、現在実務でがつくほど注目され、応用されている自然言語モデルであるBERTを解説していきます。有名なので、名前だけは聞いたことあるという方もいるかと思いますが、そのBERTは何なのか、何がすごいのかといったところから、どのように使うのかまでAI初学者の方にも分かりやすく解説していきます。
Google Colabで動かせる実装コードも用意したので、ぜひTryしてみてください!より理解が深まり、実務で応用できるようになると思います。

BERTとは

Bidirectional Encoder Representations from Transformersの略です。
文章の意味をベクトルにしたり、単語の意味をベクトルにしたりできます。モデルは、Transformer Encoderを用いています(図-1)。Google検索で用いられたり、法律関係の文章が得意なBERT(LEGAL BERT)が登場したり、ビジネスの現場でも用いられていたりと様々なところで利用されています。詳細を知りたい方は下記論文まで。

図-1 Transformerモデルの構造

論文
Devlin, Jacob, et al. “Bert: Pre-training of deep bidirectional transformers for language understanding.” arXiv preprint arXiv:1810.04805 (2018).
https://arxiv.org/pdf/1810.04805.pdf

BERTのすごさ

BERTのすごさは下記の2点です。
・高精度
・誰でも使える

高精度

一言で表すと、Transformerのポテンシャルを活かしている点にあります。Transformerは、Huggingface社が提供しているオープンソースのライブラリで、様々なニューラルネットワークを用いた言語モデルが実装されています。Transformerの特徴として、注目する情報を上手く選べることと、並列処理との相性が良いことを活かしている点が挙げられます。

誰でも使える

一言でいうと、Pre-Training & Fine-Tuningのおかげです。

従来のDeep Learning
一気に高精度モデルを作ろうとしたため、大量の教師データと大量の計算資源が必要でした。そのため、普通の人には厳しいことが課題として挙げられます。懐かしのたまごっちを例にいうと、たまごから大人(くちぱっちなど)を作るということです。

 

BERT
二つの段階に分けて高精度のモデルを作ります。
第一段階は、pre-training(事前学習)と呼ばれ、言語の基礎理解を目指して、大量のデータと大量の計算資源で学習します。ここでの特徴として、教師データが必要ではないということと、一度事前学習したモデルは使い回せるということです。
第二段階は、fine-tuningと呼ばれ、事前学習したモデルを個別のタスクに習熟させることを目指して、学習します。ここで、少ないデータと少ない計算資源でも高精度なモデルを作ることができることから、誰でも使えると言われるようになりました。
たまごっちを例にいうと、たまごから事前学習によって成人(くちたまっち)を作り、そこからくちぱっちやたらこっち、にょろっちなどの大人を作るということです。成人(くちたまっち)の作成には、大学の機関やでかい企業などにまかせてしまい、作りたい大人のごっちを自分で作るということです。

BERTの実装

習うより慣れろということで、実際にBERTを用いて穴埋め問題を解いていきます。本記事では、東北大学の研究チームによって作成された事前学習モデルを使用します。

前処理

ライブラリのインストールと読み込み

以下のコードはGoogle Colabで動かす形にしてあります。GPUを使えるようにColaboratoryを設定しておいてください。Colaboratoryに標準でインストールされているライブラリに加えて、次のライブラリをインストールして用います。
・Transformers:ニューラル言語モデルのライブラリ
・Fugashi:日本語の形態素解析ツールのMeCabをPythonから使えるようにしたライブラリ
・ipadic:MeCabで形態素解析を行う際に用いる辞書
BERTを用いた処理は、① 文章をトークン化して、BERTに入力できるような形にする。② ①で処理したデータをBERTに入力し、出力を得る。の二つのステップに分けられます。それぞれについて実行します。

文章をトークン化する

文章をトークンに分割し、BERTに入力できる形に変換するためにトークナイザを用います。トークナイザは、以下の流れでトークン化を行います。
①MeCabを用いて文章を単語に分割する
②WordPieceを用いて単語をトークンに分割する。
なお、トークナイザは、BertJapaneseTokenizerクラスの関数from_pretrainedに日本語のBERTモデル(cl-tohoku/bert-base-japanese-whole-word-masking)を指定することで使用することができます。
単語に分割する

[‘サーフィン’, ‘しよ’, ‘う’, ‘!’]

[‘オン’, ‘##ショ’, ‘##ア’, ‘強く’, ‘なっ’, ‘て’, ‘き’, ‘まし’, ‘た’, ‘。’]
※単語がWordPieceによってサブワードに分割されたときに、単語の一番最初以外のトークンに付与されます。
サブワードとは、テキストの中で低頻度で現れる単語を文字や部分文字列に分解する考え方です(##がついてる文字)
単語をトークンに分割する
BERTにトークンを入力するときには、トークンを数字に置き換えます(符号化)。文章を符号化するためには、関数encodeを用い、文章を入力するとID列をリストとして出力します。

[2, 27677, 2132, 205, 679, 3]

関数encodeはBERTに入力するために、トークン列の先頭に[CLS]、末期に[SEP]の特殊トークンを加えています。
[‘[CLS]’, ‘サーフィン’, ‘しよ’, ‘う’, ‘!’, ‘[SEP]’]

BERTモデルの実装 文章の穴埋め

BertForMaskedLMはBertModelから得られる最終レイヤーの出力に対して、線形変換、GELU関数、線形変換を適用して、分類スコアを計算しています。BERTモデルの主な情報は下記のとおりです。
BERTモデルの主な情報
レイヤー数は12
BERTの出力は768次元
最大で入力できるトークンの長さは512
BERTモデルの主な情報
レイヤー数は12
BERTの出力は768次元
最大で入力できるトークンの長さは512
BERTによる穴埋めを行うには、文章の一部を特殊トークン[MASK]に置き換えたものを用意します。ここでは、私のプロフィールである、
”独学でデータサイエンティストを目指す大学院生”
”データサイエンティスト”[MASK]に置き換えます。BertForMaskedLMは[MASK]に入るトークンを言語の中から予測します。
[‘独学’, ‘で’, ‘[MASK]’, ‘を’, ‘目指す’, ‘大学院’, ‘##生’]
文章iにおいて、scoreから[MASK]に入るトークンを予測するには、下記の順で進めます。

①[MASK]のトークンがどこにあるのかを調べる。ここではjとする。→[MASK]のトークンIDが4なので、4のインデックスを調べる
②スコアが最も良いトークンのIDを取り出す。
③[MASK]を②で求めたトークンに変換する。

独学でプロを目指す大学院生

上位10件も気になるので出力してみます。ここでは関数化して試してみます。

独学でプロを目指す大学院生
独学で作家を目指す大学院生
独学でアナウンサーを目指す大学院生
独学でジャーナリストを目指す大学院生
独学で文学を目指す大学院生
独学でトップを目指す大学院生
独学で声優を目指す大学院生
独学で芸術を目指す大学院生
独学で音楽を目指す大学院生
独学で学問を目指す大学院生

復数の[MASK]が存在しているケース

私のプロフィールである、
”独学でデータサイエンティストを目指す大学院生”
”データサイエンティスト””独学”[MASK]に置き換えます。 [MASK]1つに対して32,000通りの候補があるため、二つの場合には32,000の二乗通り組み合わせの候補が存在するため、近似的な方法(ビームサーチ)を用います。
ビームサーチは、[MASK]を1つ穴埋めするたびに合計スコアの高い10の文章を残しておき、それをもとに次の[MASK]の穴埋めをおこない、合計スコアの高い10の文章を残すということを繰り返す方法です。

進んで大学を目指す大学院生
自力で大学を目指す大学院生
進んでトップを目指す大学院生
現役でプロを目指す大学院生
大学で教員を目指す大学院生
自力でトップを目指す大学院生
日本で起業を目指す大学院生
自力で卒業を目指す大学院生
進んで進学を目指す大学院生
社会で自立を目指す大学院生

文章のほとんどが[MASK]のケース

私のプロフィールである、
”独学でデータサイエンティストを目指す大学院生”
”データサイエンティスト””目指す””大学院生”[MASK]に置き換えます。

独学で武道を学ぶ。
独学で外交を学ぶ。
独学で武道を習得。
独学で本を読む。
独学で文化を学ぶ。
独学で社会を学ぶ。
独学で本を書く。
独学で社会を知る。
独学で武道を覚える。
独学で話を覚える。

BERTの限界
大部分が[MASK]であると、意味のある文章は出力されません。理由としては、大部分のトークンが[MASK]で、それを予測するというタスクは学習していないからです。この対策として、事前学習で現在までのトークンから次のトークンを予測する必要があります。これに対応するのがGPTと呼ばれるモデルです。

まとめ・考察

BERTについて理論と実践に分けて見てきました。
理論についてたまごっちを例に解説したことと、BERTを試してみて感じたことについてまとめてみました。

理論
従来のDeep Learning:たまごから大人(くちぱっち)

Pre-Training & Fine-Tuning:たまごから成人(くちたまっち)を得て大人(くちぱっちなど)
実践
・データサイエンティストなどの少し専門的な用語は出てきづらい↔広く知られている用語が出てきやすい。
・復数のMASKが存在しているケースでも自然な日本語の文章が作成された。
・一方、文章のほとんどがMASKだと”独学で社会を知る。”のように?というような文章が作成された。

今後は、BERTを用いて文単位のタスク(分類など)や単語単位のタスクに挑戦していきたいと思います。

タイトルとURLをコピーしました