大規模言語モデルが世の中で使われるようになったことで、Self-Supervised Learning (自己教師あり学習)という言葉が良く使われるようになった。SSLとも略される。しかし、以前からSemi-Supervised Learningという枠組みがあり、こちらもSSLと略されていたので少し紛らわしい。
Self-Supervised Learningの成功例は2013年にMikolovらが発表したword2vecだろう。word2vec以前は、単語をベクトル化する方法は、one-hotベクトルによる方法が通例だった。すべての単語に単語番号を振り、単語種類数の次元のベクトルを用意して、対象単語の番号の要素の位置に1を立ててあとはゼロにする。実装上は、ほとんどがゼロのベクトルなのでメモリ消費を抑えるためスパースベクトルとして保存する。一方、word2vecでは、(CBOWの場合)大量の文書を用いて、文中に現れるある単語の前後の単語列からその単語を予想する問題を解く学習をすることで、その単語のベクトルを獲得する。例えば、100次元の単語ベクトルのすべての要素に学習された実数が並んでいる。ただ、これらの実数値が何を表しているかは見てもわからない。Vaswaniらが2018年に発表したBERTと異なり、文脈を考慮しないので、word2vecでは1つの単語には1つの固定されたベクトルが割り当てられる。このようにして学習された単語ベクトルには興味深い特徴があった。実際にKingのベクトルからManのベクトルを引いて、Womanのベクトル足すとQueenのベクトルに(近く)なる。これは、周囲の単語から学習することで、その単語が持つ意味のようなものがベクトルの中に埋め込まれているということが示している。(註:類似したケースでもベクトル計算がうまくいかないこともある)
word2vecは、ラベルなしのデータからこのような学習を行う。つまり人手による正解データ作成のコストはかからないので大量のデータから学習できる。少し紛らわしいのは、ラベルなしデータを使っているからといって、「教師なし学習」ではなく「教師あり学習」である。一時期、word2vecやBERTを教師なし学習だとしている解説があったが、それは機械学習アルゴリズムに関する分類から見ると正確ではない。なぜなら学習アルゴリズムに対して教師情報は与えているから。word2vecでは、前後の単語列が入力
で、対象の単語(=正解)が
なので、教師あり学習の正解データ
を与えている。ただ、通常の教師あり学習と異なる点は正例しかないということだ。30年ぐらい前から「正例からの教師あり学習」という機械学習の枠組みがあり、特に新しい問題設定ではない。ただ、当時は情報量基準などを用いて汎化する範囲を制限することで過剰・過少に一般化されることを制限していた。
word2vecでは疑似負例を用いて汎化の範囲を調整する contrastive learning (対照学習)を使っている。contrastive learning とは、正例間はベクトルを近づけ、正例と負例はベクトルを遠ざけるような学習をすること。疑似負例は、真の負例ではなくたぶん負例だろうというものデータ中から負例として選択する。word2vecの場合は、別の文から持ってきた単語は対象単語を予測するときには負例になると見做す。疑似となるのは、その持ってきた単語がたまたまその文脈に当てはまることがないとは言えないので疑似とする。だいたいにおいて実際に負例であれば、大量のデータで学習していれば負例の間違いの影響はほとんどない。
人手でラベル付けしていない「ラベルなしデータ」しか使ってない学習であれば「教師なし学習」だ、と思えるかもしれませんので、もう1つ例を挙げる。毎日の温度と湿度と日照時間を記録したデータがあるとする。このようなデータは、センサーから自動的に集められるので、人手による教師情報は入ってない。これを使って、明日の日照時間が4時間以上かどうかを予想する学習をするとき、過去に貯めたデータだけから教師あり学習ができる。ある日の日照時間が4時間以上かどうかを予想する学習を、その前日(とそれ以前)のデータを使って行えば良い。つまり、機械学習のフレームワークとしては、学習アルゴリズムに正解を与えるかどうかで、教師あり or 教師なしが決まるのであって、人手でラベル付けしたデータを使うかどうかは別の話になる。
では、どういう学習が教師なし学習かというと、代表例はクラスタリング。ラベルなしのデータに対して、類似度を用いてデータの塊(クラスタ)を形成して、そのクラスタをある種の分類クラスとみなす。たとえば、過去の日ごとの温度と湿度のデータに対してクラスタリングをすると、なんとなく晴れの日のクラスタと雨の日のクラスタのように分かれていく。ただし、教師なし学習は、なんの制御もしないので、直感や希望と異なる学習結果になることは避けられないし、各クラスタの意味(=晴れの日、雨の日など)は人間が解釈しないといけない。
さらに似た用語として、Active Learning(能動学習)がある。Active Learningは、学習アルゴリズムではなくデータ作成の方法である。データにラベル付けするときに、途中までラベル付けしたデータで学習し、これからラベル付けするデータに対して予測を行う。このとき、何かの基準で次にラベル付けするデータを選択するとラベル付け作業が効率化できる、というのがActive Learning。例えば、予測確率が低い(=自信がない)データを優先的に人手でラベル付けすることで、ラベル付けの回数を減らすことができる。似たようなデータばかり正解データをたくさん作っても効果が少なく、より予測が難しいケースのラベルを優先的に与えた方が学習の性能が早くあげらえるという直感だ。
BERTも、word2vecと同様に単語を数値ベクトルに変換する学習済みモデルだが、単語のベクトルに文脈が入る点が異なる。与える文脈によって、単語のベクトルが変わる。ただ学習のアプローチとしては、Masked Language ModelingもNext Sentence Predictionも教師あり学習である。大規模言語モデルは、ベースはSelf-Supervised Learningだが、その後にインストラクションによる教師あり学習や強化学習を膨大に行い、不適切な答えをしないようにしている。
ここまでSelf-Supervised Learningという言葉を使ってきたが、この用語は以前から存在するSelf-Trainingと語感がよく似ているにもかかわらず、全く別の用語なのであまり宜しくない。Self-TrainingはSemi-Supervised Learningで使われる学習手法で、正解付きのデータを使って学習したモデルにより、ラベルなしデータにラベル付けし、その中のもっともらしいものを、あたかも正解データのように訓練データに追加して再度学習する方法である。Self-Supervised Learningという言葉からはSelf-Trainingを想起してしまう。本来Self-Supervised Learningは、Supervised Learning from Unlabelled Dataであり、多くはSupervised Learning from Unlabelled Data using Contrastive Learningと呼ばれるべきものであると考える。
余談になるが、私の大学時代の恩師は、Robinsonの定理証明法のResolution Principleを「導出原理」と訳すことに異議を唱えていた。「導出」は論理学ではderivationの定訳であるので、Resolutionを導出と訳すのは良くない、融合原理または分解証明法と訳すのが正しいというお考えだった。実際には導出原理という訳語は既に一般に広まってしまっているのでそのまま受け入れ続けるだろう。専門用語の使い方については常に注意深くありたいと思っている。