どうもPanamixkedaです。
本記事の目的としては、私が自然言語処理についてある程度すでに知っていることのアピールでして、内容としては自然言語処理の歴史紹介に近くなるかもしれないです。
あと、諸事情で今そこまで頭はたらいていないことが自覚できており、変なことを書いていたらすみません、また見直しますがとりあえずアップ。
##再帰モデル(RNN/LSTM)
画像処理などと比べて自然言語の構造の特徴とは何か、それは順序性が重要だということ、な感じがしますよね。
その構造をうまく学習するように発案されたのが、RNNなどの再帰モデルです。
時刻tのセルの状態が、t番目のインプットだけでなく、時刻t-1の状態からの発火の値も入力値として受け取るような構造となっております。学習は(巡回グラフが形成されていないので)バックプロパゲーションで行えます。
ただ、このモデルで問題となったのが、時刻が離れたセル同士の相関関係が、バックプロパゲーションだと過度に減衰してしまい、うまく伝播しないということ、だった’らしい’です。
この問題を解決するためのモデルが、LSTMと呼ばれるものです、出力を行うメインストリームのセル以外に、状態を保持するためのセルを別に設定し、このセルからのインプットもメインセルは受け取ります。かつ忘却ゲートというものも設定し、忘れないだけではなく逆に忘れるものは忘れるという作用も加えます。
実装コード(LSTM)は以下。
import torch.nn as nn
lstm = nn.LSTM(input_dim, hidden_dim, num_reccurent_layers)
#input(seq_length × batch_size × input_dim)
output, (hn, cn) = lstm(input) #正式にはlstm(input, (h0, c0))だが省略可能な認識
##ワードベクトル
さて、文章をモデルに食わせる、といっても文章のままインプットにはできませんので、単語レベルでエンコードをしてベクトル化しインプットとする手法がよくとられます。(ちなみにエンコードの単位として何がベストかは不明ですしケースバイケースな認識。一文字単位でエンコードする研究も確かFaceBoookあたりがしていたはず。)
適当なワンホットコーディングのようにしてインプットとしても動くのは動き、学習が進むにつれ各モデル・教師データでのエンコード表現が形成されていくわけですが、代表的な学習済みワードベクトルが知られており、これは確かに単語の意味をある程度実際に表している、といわれています。どういうことかというと例えば、王+女というベクトルの加算をすると王女のベクトルが出てくるということです。
学習済みワードベクトルでよく知られているのは、gensimライブラリのword2vec(やfasttext)というものです。
##Transformerの登場
近年の大イベント、Transformerモデルの登場です。これは、時系列性こそ自然言語学習の勘所だという思い込みを打破したモデルです。
このモデルは文章をワードベクトルを連続させた、長い1次元配列のように受け取ります。そして、Attention層という構造を何度も通らせることで、アウトプットとします。
このセンスはAttention、つまり(自己)注意機構、さらにつまり言えば「文の中でどの文領域とどの文領域が強く相関しているか」を学習することが、自然言語を理解することになるのだ、というセンスです。例えば、Attention層で「おなかが痛い」と「傷んだものを食べた」の間にある’Attention’が強く発火していれば、それはこの2事象の相関性を理解できている、自然言語が分かっている、という発想になるわけです。
このAttention層の構造についてもう少し数式として説明します。(Self-Attentionに限って説明しますね。)
ある層の発火をベクトル$X$とします。行列$XX^T$はどの領域がどの領域に’似ているか’を示す行列であると言えますよね。これをAttention Mapといいますv。こいつをもとのベクトル$X$にかけたものは、$X$の各領域がどの程度他領域との相関(類似度)の強さを持つかという値を示すベクトルだと言えますよね。このベクトルの$Softmax$をとりまして(規格化的な意味)、出てきたベクトルをもとの$X$に加算します。これでAttention層の完成です!
学習後のAttention Mapを見て、行(列)「おなかが痛い」と列(行)「傷んだものを食べた」のクロスしたとこが強く発火してれば、Attentionらしい学習ができていることになる、と。これは経験的に言って割とうまく学習されているように見えるようです。(まあ機械学習の収束可能性あたりは大体そうですけど、このような学習が生じることがマストなのかという理論的証明は未だされていないかと思います。)
このTransformerにはConvolution層がなかったはずで、論文の題名も「Attention is all you need」となっております。必要なのは時系列性でもConvolutionでもなかったんですね。※とりあえずは
こいつが性能として強すぎるので、逆にあまりこの後の革新的モデルがでることが妨げられている感じになってますね。
ちなみにこのTransformer、画像処理でも強いことが知られており、Vi-Transformerといいます。画像の中のAttentionが見えるので、説明可能性的にもGood。素晴らしいです。
TransformerのPytorchでの使用方法は以下。
import torch.nn as nn
transformer_model = nn.Transformer()
src = torch.rand((10, 32, 512)) #src_length × batch_size × emb_dim
tgt = torch.rand((20, 32, 512)) #tgt_length × batch_size × emb_dim
out = transformer_model(src, tgt)
##BERT
基本Transformer。事前学習の方法のバリエーションが増え、色んな自然言語系のデータセットに対して高性能を示すようになってます。
こいつが使えます!というだけで、一定数の職に応募できるようになったりするんじゃないでしょうか?
##GPT-3
こいつがですね、莫大な重みパラメータ数を誇り、ネットから自動的に情報を収集し(なんかこれがゼロショット学習と言われていて違和感はありますが)、対話型のプロンプトを持ち、
こちらから「こういうアプリをつくってくれ」と説明していって、GPT-3さんが「理解」と言えばそういうアプリをつくってくれるという、もはや有能すぎて気持ちの悪い性能を持っているらしいです。
こちらも構造としてはTransformerで、ざっくり言えばいくつもTransformerを重ねたような構造であるみたいですね。
ただその出力結果のアプリが的を射ている確率は30%前後と言われていたり、GPT-3はネット上で収集したデータを出力するので、倫理的フィルタリングが甘かったりする、'らしい'です。
私の自然言語処理についての理解はこんなところですかね。結局Transformer前とTransformer後に別れ、前では再帰モデルのRNN/LSTM、後ではBERT/GPT-3あたりを知っていればいい、という歴史観が共通認識として形成されてきてるのかなと。
ではお疲れさまでした。
またよろしくお願いいたします。