輪読会「BERTによる自然言語処理入門」第3回

はじめに

てくますプロジェクトでは、てくますゼミと呼ばれる学習会を開催しています。

少人数であーだこーだ議論しながら、考える楽しさを分かち合うことを大切にしています。

現在は「BERTによる自然言語処理入門」という本を読み進めています。

今回は本書第3回の輪読会ということで、5章と6章を読み進めました!

本記事では、今回の勉強会で学んだことをざっくりと紹介していきます。

学習内容

文章の穴埋め

前回は、BertModelを使いましたが、文章の穴埋めにはBertForMaskedLMを使います。

穴埋めを行うには、文章の一部を特殊トークン[MASK]に置き換えたものを用意します。BertForMaskedLMを用いることで、[MASK]に入るトークンを語彙の中から予測することができます。

BertForMaskedLMの使い方は、BertModelとほとんど同じです。

  1. 穴埋めを行いたい文章を作る
    ‘今日は[MASK]へ行く。’
  2. 文章をトークンに分割する
    [‘今日’, ‘は’, ‘[MASK]’, ‘へ’, ‘行く’, ‘。’]
  3. トークンを符号化する
    [ 2, 3246, 9, 4, 118, 3488, 8, 3]
    2は開始を表す特殊トークンのID、3は終了を表す特殊トークンのID、4は[MASK]を表す特殊トークンのIDです。
  4. BERTに入力し、出力scoresを得る

    1は文章数、8は系列長、32000は語彙数です。
  5. [MASK]トークンのscoreを調べ、最も値の高い語彙が何かを調べる

    トークンID391(東京)が、最も値の高い語彙になります。穴を埋めると、’今日は東京へ行く。’という文章が出来上がります。

今回は最も値の高い語彙のみ調べましたが、高い順トップ10などを調べることも可能です。

また、[MASK]が複数存在する文章を考えることもできます。しかし、[MASK]が増えすぎると、自然な文章が出力されなくなってしまうことがあります。

文章分類

文章分類を行うにはBertForSequenceClassificationを使います。

推論時、文章をトークンに分割し、符号化し、BERTに入力することで出力を得るという流れはこれまでと同じです。出力により、各文章のカテゴリーごとのスコアが得られるので、文章を最もスコアが高かったカテゴリーに分類すればよいです。

これまでと違うことは、文章分類を行うためにファインチューニングが必要であるという点です。先ほどの穴埋めタスクはファインチューニングなしに事前学習のみで対応していました。そのため、私たちは推論の処理のみ書けばよかったです。しかし、今回の文章分類で、私たちが定めたカテゴリーに分類させるためには、それ用の追加学習が必要になります。

ファインチューニングを行うには、ファインチューニング用のデータセットを前処理し、BERTに入力可能な形式に整えておく必要があります。この形式をデータローダと言います。PyTorchのDataLoaderクラスを利用することで、データローダを作成できます。

データローダや作成できたら、ファインチューニングを行います。ファインチューニングやその評価検証は PyTorch Learningで行うことができます。

最後に

今回からタスク編に突入しました。これまでこの輪読会は、少し理論に偏っていた部分があるので、こういう実践があるのはいいですね。

今回使用したBertForMaskedLMやBertForSequenceClassificationですが、内部的には前回学んだBertModelを使用しています。入力テキストをまずBertModelに送り、その出力をタスク固有の分類器に渡して分類を行っています。どのタスクの基盤にもなっているBertModelはすごいですね。

では、また!

本シリーズの記事はこちら

各ゼミの第1回記事はこちら