ディープラーニング(深層学習)の勉強をしていると必ずといってよいほど出てくるBERT(バート)。
BERTってなんとなく大事な気がしますが、使い方は難しそうなイメージありますよね。BERTを使うとすごく性能が良いモデルを作れることは聞いたことがあるんだけど、どういう仕組みなの?どんなときに使うの?どうやって使うの? こんな疑問感じたこともあるかもしれません。
BERTは、ディープラーニングによる自然言語処理モデルで、最近の多くの自然言語処理技術に使われています。代表的なものとしては、Googleの検索エンジンなどにも使用されています。BERTは検索エンジンだけでなく、機械翻訳やチャットボットなど様々な自然言語処理で使用されています。この記事を通して、是非身につけましょう。
そこで今回は、BERTの概要から実装までをできるだけわかりやすくご紹介します。それではまず、BERTとは何かについての解説から始めましょう。
BERTとは
BERTはBidirectional Encoder Representations from Transformersの略で、Transformerと呼ばれるディープラーニングのモデルが使われています。
BERTはこのTransformerを用いて作られた、自然言語処理の汎用的なモデルになります。BERTは文書分類や質問応答といった多くの自然言語処理のタスクで当時の最高性能(SOTA:state of the art)を達成し、大きな注目を集めました。
BERTの学習には大量のデータが必要になりますが、一度作成したモデルは文書分類や質問応答など様々なタスクに適用できるという利点があります。
BERTを学習させるための大量の学習データが手元になくても、学習済みの日本語モデルは、京都大学や東北大学、NICTで配布されていて、誰でもBERTを試せます。BERTの使い方を身につけて、自然言語処理タスクを精度アップさせましょう。
BERTの特徴
続いてBERTの特徴について詳しく説明しましょう。
まず、BERTの学習では事前学習とファインチューニングの2段階で行われます。事前学習ではコーパスと呼ばれる大量の言語データを学習します。コーパスには正解ラベルを付与しておく必要はなく、教師なし学習として行います。京都大学、東北大学、NICTで配布しているモデルは、この事前学習済みのモデルとなります。
次のステップであるファインチューニングでは、事前学習済みのモデルを使用して自然言語処理タスクの学習を行います。ファインチューニングでは、学習データに正解ラベルを付与したものを使用します。教師あり学習となります。事前学習済みのモデルを使用することで、様々な種類の自然言語処理タスクに対応できることがBERTの特徴であり、汎用的と呼ばれる所以です。
一方、BERTは、1つの単語に対して複数のベクトルを持つことができます。例えば「弾む」という単語は「ボールが弾む」といった使い方もあれば、「心が弾む」といった使い方もしますよね。このように同じ単語でも意味が異なる場合は複数のベクトル表現を持つことができます。つまり、BERTは文脈に依存した埋め込み表現を得ることができるという特徴があります。
BERTの仕組み
次にBERTの仕組みについて、更に詳しく見ていきましょう。BERTの事前学習では、TransformerがMasked Language ModelとNext Sentence Predictionという2種類の手法で学習を進めます。
BERTはTransformerを用いて、Masked Language ModelとNext Sentence Predictionを行うことで、BERTの特徴である文脈理解を実現しました。
BERTを使用するには
それでは、具体的なBERTの使用方法についてみていきましょう。ここでは、日本語の事前学習モデルの一つである京都大学の事前学習モデルを例に取り上げます。
京都大学が公開している事前学習モデルにはBASEとLARGE、通常版とWhole Word Masking (WWM)版の種類があります。ファインチューニングをした際に、BASEよりもLARGE、通常版よりもWhole Word Masking (WWM)版の方が、精度が良い傾向があります。
ここでは、LARGE WWM版を使用することとします。京都大学のWebページよりJapanese_L-24_H-1024_A-16_E-30_BPE_WWM.zipをダウンロードしましょう。ダウンロードしたファイルを解凍するとpytorchで使用可能なモデルが含まれています。今回はpytorchで試します。
pythonプログラムで以下を実行することで事前学習モデルをロードできます。
>> from pytorch_pretrained_bert import BertTokenizer, BertModel
>> bert_model = BertModel.from_pretrained(“/path/to/Japanese_L-24_H-1024_A-16_E-30_BPE_WWM/”)
>> bert_tokenizer = BertTokenizer(“/path/to/Japanese_L-24_H-1024_A-16_E-30_BPE_WWM/vocab.txt”, do_lower_case=False, do_basic_tokenize=False)
続いて、事前学習済みモデルに文を入力する際は、日本語の分かち書きを行い、単語をidに変換します。日本語の分かち書きは京都大学が公開している日本語形態素解析システムJUMAN++などを使用すると良いでしょう。idへの変換はbert_tokenizer.convert_tokens_to_ids()を実行することにより可能です。
最後に、自分が目的とする自然言語処理タスクのファインチューニングを行うプログラムを作成すれば、BERTを使うことができます。
BERTを用いる注意点
最後にBERTを用いる注意点をお伝えします。
BERTは非常に性能が高いモデルになりますが、事前学習を行うには、大量の学習データが必要で、高性能なマシンで何日も学習に時間がかかるという課題があります。
BERTを使ってみようと思ったときに大量の学習データを高性能なマシンを用意するのはなかなか難しいですよね。このため、京都大学や東北大学、NICTなどが配布している事前学習済みのモデルを使って、ファインチューニングのみ行うという使い方がやりやすいでしょう。
さて、今回はBERTについてご紹介しました。BERTについてお伝えした内容は以下です。
- BERTは、ディープラーニングによる自然言語処理モデルで、多くの自然言語処理技術に使われている
- BERTにはTransformerと呼ばれるディープラーニングのモデルが使われている
- BERTの学習では事前学習とファインチューニングの2段階で行われる
- BERTの日本語の事前学習済みモデルは京都大学、東北大学、NICTが配布している
- BERTの事前学習は、Masked Language ModelとNext Sentence Predictionという手法で行われる
- BERTの事前学習には、大量の学習データが必要で、高性能なマシンで何日も時間がかかる
BERTは自然言語処理を行う上で、必須の技術となっています。BERTの改良も行われてきており、ALBERなどの新しいモデルも出てきています。BERTは事前学習を行おうとすると非常に大変ですが、配布されている事前学習済みのモデルをうまく活用して、是非使いこなせるようになりましょう。
【お知らせ】
当メディア(AIZINE)を運営しているAI(人工知能)/DX(デジタルトランスフォーメーション)開発会社お多福ラボでは「福をふりまく」をミッションに、スピード、提案内容、価格、全てにおいて期待を上回り、徹底的な顧客志向で小規模から大規模ソリューションまで幅広く対応しています。
御社の悩みを強みに変える仕組みづくりのお手伝いを致しますので、ぜひご相談ください。