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と同じ。モデルの表現力があまり落ちないのは大きい。

f:id:jungrave3:20200425134517p:plain

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%ほどまで削減できる。それでも性能はあまり落ちない。

f:id:jungrave3:20200425135429p:plain

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.

GitHub - google-research/albert: ALBERT: A Lite BERT for Self-supervised Learning of Language Representations

 

ソケット通信

なんですかソケット通信って、という感じ。HTMLだとストリームキツいらしい。俺が学ぶべきものはソケット通信だった。

ソケットとは

プログラムの世界とTCP/IPの世界を結ぶ特別な出入り口らしい。

 

PythonとC

研究室でゲームを作ることになったけど、学習モデルとゲーム部分を組み合わせる必要が出て来た。学習モデルは言わずもがなPython、ここは譲れない。しかし、ゲーム部分はどうだろうか。正直Pythonでは書ける気がしないので、Cか何かで書きたい。

組み合わせるのは簡単に行くだろうか、わからねぇ~

 

明日

連想語と機械学習を調べます。