# 日本語でのBERT、XLNet、ALBERTとかをまとめてみた
この記事は、[茨大 Advent Calendar 2019](https://adventar.org/calendars/4240) 9日目の記事です。
茨大で機械学習を中心に自然言語処理やときどき画像処理をやってます。
NLPの専門知識をあさり始めて1年くらいなので間違ってたらごめんね
## はじめに
自然言語処理では事前学習による言語モデルが流行りで、次から次へと色々なモデルが発表されている。最も人気なのはBERTで、国際会議論文でもBERTを使ってどうなりました、分析しました、改良しました、等々の話は多いみたい。
そんな事前学習モデルを、日本語で訓練したモデルを使いたいって時のお話
自分が調査できた観測範囲だけで、全てのモデルを網羅してはいません。
## BERT
初めはBERTから。
論文は以下のリンクより
[BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https://arxiv.org/abs/1810.04805)
### モデル
BERTのモデルの肝はMulti-head AttentionによるScaled Dot-Product AttentionのSelf Attention。とにかくAttention。RNNとは違うんだよ
BERTで使われてるAttentionはTransformerのモデルで用いられたもの。
Transformerの論文は以下のリンクから。
[Attention Is All You Need](https://arxiv.org/abs/1706.03762)
Attentionの解説はこのあたりを読むといいかも
[論文解説 Attention Is All You Need (Transformer)](http://deeplearning.hatenablog.com/entry/transformer)
BERTのモデルの主なポイントは
* 文脈を双方向に見ることができる点
* 単語と埋め込み表現が一対一対応ではなく文に応じた表現になる点
RNNでは、基本的に一方向しか見ることができない。Bi-LSTMでも、LSTMを2つでやっと双方向を見ることができる。
BERTはAttentionこれ一つで、ある単語の予測に対してその両側(双方向)から情報を得られる。
### 言語モデル
Attentionで双方向に学習するには言語モデルの考え方が大事になる。
純粋な言語モデルは、ある単語列$w_{1},w_{2},...w_{n}$が与えられた時、その中の単語$w_{i}$がくる確率を以下のように表して計算する。
$$
P(w_{i}|w_{1},w_{2},...w_{i-1})
$$
これは、時系列モデルを扱うRNNと相性が良い。
ただし、これをAttentionで用いようとすると少々面倒になる。
単純にAttentionを使うと双方向の情報を得てしまうため、$w_{i}$に対して$w_{i+1},w_{i+2},...w_{n}$はマスクをかけてカンニングしないようにする必要がある。
これでは、折角のAttentionの旨味を生かせない。
BERTでは、言語モデルとしてMasked Language Modelによって学習を行う。
入力文に対して2割の単語を特殊トークンの[MASK]や他の単語に置き換えて、元の完全な文を復元する。数式にするとこんな感じ
$$
\log P(\mathbf{\bar x} | \mathbf{\hat x})\approx \sum_{t=1}^{T}m_{t}\log P(x_{t}|\mathbf{\hat x})
$$
このような問題にすることで、先読みしないようにマスクをかける必要はなくなり、双方向に情報を得られる。
また、BERTの事前学習ではこれに加えてNext Sentence Predictionによって学習する。
入力単語列の先頭に[CLS]、1文目、[SEP]、2文目、最後に[SEP]という形でBERTに入力する。そして、[CLS]に対する埋め込み表現から、入力の2つの文が連続した文か否かを学習する。
### 日本語のトークナイザ
このBERTを日本語で扱おうとすると、単語分割をどのようにするかという問題がある。オリジナルのBERTでは、多言語に対応したものもあるが、ほぼ文字単位になってしまうためあまりよくないというのが通説になる。
基本的には各種形態素解析器にかけて使うのが一般的。どんな形態素解析器を用いるかは、公開されている事前学習モデルによって異なっている。
### 日本語の事前学習モデル
BERTの事前学習には膨大なコストがかかるため、公開されている事前学習モデルを用いるのが簡単。感謝して使いたい。
ここでは私が実際に実行して確認したモデルをまとめておく。それぞれ学習に用いたコーパスや形態素解析器が異なる。
(表にしようと思ったけど見やすくならなかったので箇条書きで...見づらくてゴメンナサイ)
[BERT日本語Pretrainedモデル](http://nlp.ist.i.kyoto-u.ac.jp/index.php?BERT日本語Pretrainedモデル)
* 日本語Wikipedia
* JUMAN++, BPE
[大規模日本語ビジネスニュースコーパスを学習したBERT事前学習済(MeCab利用)モデルの紹介](https://qiita.com/mkt3/items/3c1278339ff1bcc0187f)
* 日本語ビジネスニュースコーパス
* MeCab
[BERT with SentencePiece を日本語Wikipediaで学習してモデルを公開しました](https://yoheikikuta.github.io/bert-japanese/)
* 日本語Wikipedia
* SentencePiece
## XLNet
次はXLNet。論文は以下のリンクより
[XLNet: Generalized Autoregressive Pretraining for Launguage Understanding](https://arxiv.org/abs/1906.08237)
### BERT改良版モデル
XLNetはBERTの改良版として発表された。
XLNetはBERTの問題点の一つにMasked Language Modelを挙げている。Masked LMでは、特殊トークンの[MASK]を用いて事前学習を行う。ただし、実際のタスクを解く場合には[MASK]は用いられないために、これがノイズとなってしまうことが問題らしい。
これを解決するために、XLNetでは純粋な言語モデルのような自己回帰モデルベースな問題にしている。
さらに、XLNetはtransformer-XLをもとにセグメントレベルの再帰によって任意の入力長に対応している。
BERTでは、Attentionの性質上、あらかじめ入力長を設定し、それより長い文はその全てをBERTのモデルに与えることはできない。XLNetではその点が改良されている。
Transformer-XLの論文は以下のリンクより
[Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context](https://arxiv.org/abs/1901.02860)
### 日本語事前学習モデル
XLNetの事前学習はBERTよりも高コストになるらしい。やはり、公開されているモデルを使わせてもらうのが簡単。重ねて感謝したい
日本語のXLNetについては、私が確認したモデルは一つ。
[大規模日本語ビジネスニュースコーパスを学習したXLNet(MeCab+Sentencepiece利用)モデルの紹介](https://qiita.com/mkt3/items/4d0ae36f3f212aee8002)
* 日本語ビジネスニュースコーパス
* MeCab + SentencePiece
## ALBERT
最後にALBERT。論文は以下のリンクより
[ALBERT: A Lite BERT for Self-supervised Learning of Launguage Representations](https://arxiv.org/abs/1909.11942)
### 軽量版BERT
A Lite BERTと呼んでいるように、ALBERTはBERTを軽量化したモデルとして発表された。
主な点は2つ。
#### Factorized embedding parameterization
一つはWord Embeddingに用いるパラメータ数をボトルネック構造にすることで小さくし、軽量化するというもの。
扱う語彙数を$V$、ベクトルの次元数を$H$とすると、パラメータ量は$V\times H$と表せる。
語彙数は一般的に多くなり、BERTで扱われる語彙数も3万をこえるため、ここのパラメータ量は大きくなる。
そこで、Word Embeddingに用いるベクトルを小さい次元数$E$に落として、その後線形変換で$H$に戻す。
このときのパラメータ量は$V\times E + E\times H$と表せる。$E$を$H$より小さくすることで軽量化できることになる。
#### Cross-layer parameter sharing
もう一つはパラメータシェアリング。
BERTではMulti-head Attentionと線形変換のセットをtransformer layerの1層として数えて、これを12層重ねたものをbase、24層重ねたものをlargeと呼んでいる。
ALBERTのパラメータシェアリングでは、このtransformer layerが各層で持つパラメータを全てシェアして同じものを使う。
### Sentence Order Prediction
ALBERTでは、BERTのNext Sentence Predictionも改良している。
Next Sentence PredictionのNegative Samplingには問題があることが指摘されている。連続する文を当てるためのデータを作成する際、正例に関しては連続する文からとってくるだけでよい。ただし、負例に関して、NSPではランダムな組み合わせとなる。これでは、トピック分析などで次文予測より簡単に解けてしまい、次文予測の学習に寄与しにくい。
NSPの問題に対処して、ALBERTのSOPでは、Negative Samplingに正例の文の順序を逆にしたものを使う。
### 日本語事前学習モデル
ALBERTは、BERTの軽量版なだけあって比較的学習が容易になっている。
私はBERTのbaseと同じ12層でALBERTの事前学習を行った。
学習済みのモデルは以下のリンクで公開している。
[研究内容|深層学習による言語データ解析研究拠点](http://nlp.dse.ibaraki.ac.jp/research.html)
* 日本語Wikipedia
* Mecab
## おわりに
今回はBERT、XLNet、ALBERTと3つのモデルについて、日本語で用いる際の事前学習モデルと合わせてまとめてみた。
ただし、事前学習モデルによるSOTA更新が過熱している中で、「あるタスクで精度が良くなったからといって、本当に高度な性能を持ってるかは分からないよね?」って釘をさす指摘も多い。事前学習モデルが実際のところどんな性能をもっているか、詳しく分析する手法を提案する論文が注目を集めている。
その話はまた今度機会があれば
#### 個人的な反省
文字文字文字!文字ばっか!図とか使って分かりやすくしたいね...
あと本当はモデルを使うところまで書きたかった
でも記事書くのにこれで休日が潰れてるからもうムリカナ_(:3」∠)_