4/25 研究メモ
この記事について
調べたことを緩く書く。人はそれをメモと呼ぶ。
モデルメモ
BERT
言わずと知れた、Bidirectional Encoder Representations from Transformers(Transformerによる双方向のエンコード表現)のこと。モデルはデカい。
京都大学大学院の人。日本語事前学習済みBERTモデル。導入方法の記事も豊富に揃っている。
BERT日本語Pretrainedモデル - KUROHASHI-MURAWAKI LAB
hugging faceのtransformersの日本語事前学習済みBERTモデル。これは使ったことある。
(Part 2) tensorflow 2 でhugging faceのtransformers公式のBERT日本語学習済みモデルを文書分類モデルにfine-tuningする - メモ帳
XLNet
BERTの「事前学習で使用する[MASK]による転移学習への影響」と「予測単語間の依存関係が取れない(?)」を克服させ、Transformerの「固定長の系列しか扱えない」を克服したTransformer-XLの技術を取り入れたモデル。ただ、あまりにもデカいため札束で殴るしかない。アプリで導入することを考えると、あまり適切ではなさそう。
日本語事前学習済みXLNetモデルがあるそう。ただ、基本性能は落ちているらしい。やはり札束なのだろうか。
大規模日本語ビジネスニュースコーパスを学習したXLNet(MeCab+Sentencepiece利用)モデルの紹介 - Qiita
hugging faceでもXLNetは実装されているらしいけど、日本語学習済みTensorflow版はなさそう。hugging faceはPytorchメインらしいから仕方ない。宗教が違う。
ALBERT
google検索で「ALBERT」と打っても他の検索ワードしか出ないのが弱点。素直に「ALBERT 自然言語処理」とか「ALBERT BERT」とか打つべし。
A Lite BERT。BERTはクソデカモデルなので、それの軽量版がALBERTらしい。モデルが軽いだけでなく学習速度も速いんだとか。しかも精度が良いらしい。(←デカいALBERT-xxlargeの話)正直これを使いたい。ただ推論も速いのかはよく判っていない。アプリにするらしいし、メモリを少なくするのは必須だけど。
日本語学習済みALBERTモデルもあるらしい。精度もBERTより僅かに低い程度。
大規模日本語ビジネスニュースコーパスを学習したALBERT(MeCab+Sentencepiece利用)モデルの紹介 - Qiita
茨城大学の人。日本語学習済みモデル。Wikpedia。
企業の方。wikipedia。
日本語ALBERTモデルを公開したというお話と起こったことの記録|海苔|note
hugging faceには日本語事前学習モデルがない。残念。
ALBERT
ALBERTを採用したいので、論文とか解説記事とか読んでみた。
概要
BERTの軽量化モデル。サイズを大きくすればBERTよりも精度が向上する。
BERTの欠点としては、
- パラメータが多い
- 学習時間が長い
- デカい故に学習が難しい
こんな感じ。その欠点を全て改良したのがALBERT。DSLiteみたいな感じ。
使用されている技術としては、
- (軽量化)Cross-Layer Parameter Sharing
- (軽量化)Factorized Embedding
- (性能向上)Sentence Order Prediction
こんな感じ。それぞれ軽くメモしていく。
Cross-Layer Parameter Sharing
BERTはAttention機構が入ったレイヤーを積み重ねるけど、そのレイヤーごとのパラメータを共有するのがCross-Layer Parameter Sharing。利点としては、
- 入力と出力のばらつきが少ない
- モデルの表現力が大幅に落ちない
all_sharedがレイヤ全てを共有、not-sharedはBERTと同じ。モデルの表現力があまり落ちないのは大きい。
Factorized Embedding
単語分散表現の埋め込みを分解して、パラメータを大幅に削減する。語彙数V、単語埋め込みベクトルHとするとH×Vになる。学習はH×Vの分だけ行うので凄く大変。それをE×VとH×Eの行列に分解する。
H=1024、V=30000、E=128とすると、
- H×V=30,720,000
- E×V+H×E=3,971,072
元の13%ほどまで削減できる。それでも性能はあまり落ちない。
Sentence Order Prediction
今までは軽量化だったけど、これは事前学習タスクの改良。
BERTの事前学習タスクNext Sentence Prediction (NSP)は、2つの文が繋がっている文なのか当てるもの。しかし、用いられた2つの文が違う分野の内容だったりしたので、文が繋がっているかどうかではなく、同じ分野なのか当てるだけで良いため、その存在が怪しくなってきたらしい。
そこで登場したのがSentence Order Prediction(SOP)で、用いられる2つの文が違う文ではなく、連続する2つの文で順番が正しいものと反転させたものを用意するらしい。
繋がっている文なのか当てるタスク→正しい文の順番なのか当てるタスク
に変更させたらしい。これで性能がアップしたのだとか。凄い。
まとめ
個人レベルで組み込むシステムを作るとしたら、ほぼALBERT一択。サイズを小さくできるのは単純に最強。ただし、学習速度は大幅に短縮されたわけではないらしい。base同士を比較すると1.2倍程度の向上。それでも学習は数時間単位でかかるので、実時間にすれば大きな差だと思う。
参考文献
論文はこれ。
[1909.11942] ALBERT: A Lite BERT for Self-supervised Learning of Language Representations
ちなみに、核となる部分は殆どAI-SCHOLARで解説されていた。
BERTはまだまだ進化する!軽くて強いALBERTが登場! | AI-SCHOLAR.TECH
ALBERTの実装
Tensorflow派閥なので、Pytorch派閥のモデルは使用が難しい。Tensorflowで日本語事前学習してくれてあるALBERTを探すぞ!ということで見つけました。本当にありがとうございます!
ただ、詳しい実装方法とか判ってないので、まずは動作させることが優先ですね。
GitHub - yoheikikuta/bert-japanese: BERT with SentencePiece for Japanese text.
ソケット通信
なんですかソケット通信って、という感じ。HTMLだとストリームキツいらしい。俺が学ぶべきものはソケット通信だった。
ソケットとは
プログラムの世界とTCP/IPの世界を結ぶ特別な出入り口らしい。
PythonとC
研究室でゲームを作ることになったけど、学習モデルとゲーム部分を組み合わせる必要が出て来た。学習モデルは言わずもがなPython、ここは譲れない。しかし、ゲーム部分はどうだろうか。正直Pythonでは書ける気がしないので、Cか何かで書きたい。
組み合わせるのは簡単に行くだろうか、わからねぇ~
明日
連想語と機械学習を調べます。