リモート開発メインのソフトウェア開発企業のエンジニアブログです

BERTについて勉強したことまとめ (3) 自己教師学習と汎用性について

前回の続きです。今回はBERTにおける2つのトピック、自己教師学習と汎用性についてです。

自己教師学習

アノテーション

機械学習において、教師ありデータというものの多くは、人間が手動でラベル付をします。
例えば犬の画像から犬種を判定するモデルを作るために、事前に犬の画像に対して人間が正しい犬種をラベル付けします。
このような作業をアノテーションと呼びます。

アノテーションは、わざわざ人間が手作業でラベル付をしなければならないので、高コストな作業になります。

文章データ自身からアノテーションデータを取り出す

機械学習全般で言えば、教師あり学習、教師なし学習という分類があるように、教師データが必要なものとそうでないものがあります。しかし、ディープラーニングの場合は、大抵の場合、教師データの準備が必要です。
あくまで個人的な観測範囲での印象ですが、普通にディープラーニングを勉強して知る範囲のモデルは、ほとんど教師データを用意するタイプのものであると感じました。

しかし自然言語処理においては、これを低コストで用意する方法があります。大量の文章データを用意して、その文章自体から教師データを用意するという方法です。

例えば、言語モデルのときに出てきた「1~m単語が分かっているときの次のm+1単語目を予測する」といったタスクは、大量の文章さえあれば、文章ごとにm単語目までを入力として利用すればいくらでも手に入ります。

この事実自体は、BERT以前の各種の自然言語処理で既に使われているようです。
自然言語処理のための深層学習 p129に、大量の文章から教師データを得られる、ということは述べられています。この教科書はBERT以前の範囲のサーベイ論文をわかりやすく書籍化されたものです。

このような手法は、教師あり、なしという分類とは別に、self-supervised learning(直訳で自己教師学習)と呼ばれており、ディープラーニングにおいてよく研究されているようです。

BERTにおいても2つの事前学習タスクは、どちらもこの仕組みのおかげで人間の手によるアノテーションが必要がありません。
実際、googleによる実装ではwikipediaの文章データとbook corpusというデータが利用されました。

自己教師学習は、BERTの高い性能を発揮するための一要素であると考えられます。

文章以外の分野でも

画像処理の分野においても、画像データを用意した上で、わざとその画像の画質を落とし、その画質を高画質に戻そうとするタスクを定義することで、同様にアノテーション抜きでの学習をする例があるようです。
他にも、画像や動画の一部を切り抜いて、その穴を埋めるというMasked LMの画像版とも言えるタスクもあるようですが、BERTほどの成功はまだ起きていないようです。

参考:AAAI2020でのLeCunn氏のスピーチ(の記事)

Moba Pro

汎用性がもたらしたこと

BERTはファインチューニングをすることで複数のタスクを同時にSoTAを出し、事前学習部分は汎用的な学習ができていることがわかりました。

誰かが事前学習を行い、その訓練済みのパラメータを公開すれば、他の人は残りのファインチューニングを追加でやるだけで、高い精度を得ることができます。

また、下流タスクでのファインチューニングは、少ない教師データでも良い性能が得られることがわかりました。
(補足:いままで注釈が要らないと書いていたのは、事前学習のフェーズにおいてです。下流タスクでは、そのタスクに応じて教師データを用意する必要があります)

誰かが事前学習を済ませて、そのパラメータを公開してしまえば、その言語において良い精度を出しやすい便利なモデルを他の人が利用できることになります。
これはプログラミングにおけるOSS、ライブラリやフレームワークの公開と通ずるものがあります。
実際、日本語においても多くの事前学習モデルが、研究室、企業、個人から公開されています。

以下は、私が知っている範囲での上記のQiita記事に含まれない事前学習モデルです

OSSと事情が異なる点も多いので、機械学習のモデルデータが公のものとして公開され、みんながそれをライブラリのように利用するという文化が広がるかどうかはわかりません。しかし、技術の進歩によって、モデル自体が軽量になったり、教師データの用意が簡単になれば、そのような文化が広がるのかもしれません。

まとめ

以上、複数回の投稿でBERTに関して書きました。

また、当初はELECTRAにも触れようかと思いましたが、BERTに関してだけでブログが長くなりましたので、こちらについてはもう少し実際に実験してからブログに書こうかと思います。

← 前の投稿

kedro触ってみた

次の投稿 →

AKS上のKubernetesの秘匿情報をAzure Key Vaultで管理する方法

コメントを残す