Python: ディープラーニング用語②(様々なニューラルネットワーク)
備忘録です。今回はディープラーニングの内、自然言語処理の用語をまとめたものです。
Define by Run(動的計算グラフ)
- ディープラーニングで行う計算の「つながり」を計算を行うタイミングで自動で作る仕組み
- 繋がりを作ることによって逆伝播などを自動で作ることができる
自然言語処理の方法
シソーラスを使用した手法、カウントベースの手法、推論ベースの手法(word 2vec)などがある
シソーラスを使用した手法
類語辞書を使用して単語の意味を求める
全ての単語に対して類義語の集合を作り、それぞれの単語の関係をグラフで表現することで単語間のつながりを定義する
カウントベースの手法
単語を固定長の密なベクトルで表す(単語の分散表現という)
単語ベクトルでは意味的に近い単語はその距離が近くなる
推論ベースの手法(word 2vec)
モデルを使用するニューラルネットワーク。コンテキストを入力として受け取り各単語の出現する確率を出力する。
word2vecのモデル
CBOW、skip-gramの2つのモデルがword2vecの本来のモデル
密なベクトル
ベクトルの各要素が0ではない実数値として表される
コーパス
大量の目的(人の自然言語に対する知識)を持って集められたテキストデータ。Wikipedia, Google Newsなどがある
分布仮説
単語の意味は周囲の単語(単語のコンテキスト)によって形成されるという仮説
共起行列
各行が、共起するかどうかを値で表した成分で構成されているベクトル
ベクトル間の類似度
ベクトルの内積やユーグリッド距離、コサイン類似度などで計測が可能
コサイン類似度
x=(x1, x2, ....xn)と y=(y1, y2,.....yn)としたとき
$$similarity(x, y) = \frac{x*y}{||x||||y||} = \frac{x_1y_1+・・・・x_ny_n}{\sqrt{ x_1^2+・・・・x_n^2 }\sqrt{ y_1^2+・・・・y_n^2 }}$$
相互情報量(PMI)
単語同士の出現回数を考慮し類似度の精度を上げる
$$ PMI(x,y) = \frac{P(x,y)}{P(x)P(y)}$$
正の相互情報量(PositivePMI)
PMIは2つの単語で共起する回数が0の時にlog2 0=-∞となってしまうのでそれに対応したもの
- PPMI(x, y) = max(0, PMI(x, y))
- 単語間の関連性を0以上の実数によって表し、より良い指標からなる行列を求めることができる
次元削減
ベクトルの次元を重要な情報をできるだけ残した上で削減する
疎なベクトルから重要な軸を見つけてより少ない次元で密なベクトルに変換させる
疎なベクトル(行列)
ベクトルの中のほとんどの要素が0であるようなベクトル(行列)
密なベクトル(行列)
ベクトルの中のほとんどの要素が0でないベクトル(行列)
特異値分解(SVD)
任意の行列Xを3つの行列(U, S, V)の積へ分解する
$$X = USV^T$$
UとVは直行行列、Sは体格行列
この内Uを単語空間として扱うことができるPPMIを密な行列にするためにSVDを適用することが可能
CBOW
コンテキストからターゲットを推測することを目的としたニューラルネットワーク。入力層がコンテキストの数ある(コンテキストが2個なら入力層は2つ)
- 入力層から中間層への変換で使用される重みが単語の分散表現そのものとなる
skip-gramモデル
CBOWで扱うコンテキストとターゲットを逆転させ、コンテキストが周囲の単語に挟まれた中央の単語、ターゲットがその単語を挟む周囲の単語となるモデル
同時確率
AとBが同時に起きる確立(※P(A, B)と表す)
事後確率
Bが起こった後のAが起きる確立(※P(A|B)
乗法定理
P(A, B) = P(A|B)P(B)
AとBの両方が起こる確率はBが起こる確率とBが起こった後にAが起こった確率を掛け合わせたもの
Negative Sampling
多値分類→二値分類へ(何ですか?と問う分類をYes/Noで答える分類○○に変更)変化させ、正例と負例を合わせて学習させる。正例は1つ。負例に関してはサンプリング数をあらかじめ決め確率分布などでサンプリングする。最終的な損失は政令と負例の損失を足し合わせたものを最終的な損失とする
転移学習
ある分野で学んだ知識を別の分野にも適用する。学習済みの単語の分散表現などを転移学習で利用する
リカレントニューラルネットワーク
フィードフォワード
流れが一方向のネットワーク。時系列のデータの性質を十分に学習できない。
言語モデル
語の並びに対して確率を与え、それがどれだけ自然な単語の並びであるのかを確率で評価する。機械翻訳や音声認識などさまざまなアプリケーションで利用可能。
リカレントニューラルネットワーク(RNN)
どんなに長いコンテキストであってもそのコンテキストの情報を記憶できるメカニズムをもつ。
- RNNレイヤは時刻をtとして(x0, x1, ....xt)というデータが入力され、(h0, h1,....ht)が出力される。
- xtはベクトル(文章を扱う場合、各単語の分散表現(単語ベクトル)をxtとして入力する)
- RNNレイヤは出力時に同じものがコピーされて2つに分岐し、その1つが自分自身への入力となる。
Backpropagation Throgh Time (BPTT)
RNNは通常の誤差逆伝播法を使用可能(時間方向に展開したニューラルネットワークの誤差逆伝播法。
Truncated BPTT
大きな時系列データを扱うとき、ネットワークのつながりを適当長さで断ち切り、小さなネットワークを複数作り、切り取った小さなネットワークに対して誤差逆伝播法を使用する方法。切り取るのは逆伝播のつながりだけ。
RNNLM
RNNによる言語モデル。これまでに入力された単語を記憶し、それをもとに次に出現する単語を予測する。
パープレキシティ
言語モデルの予測性能の良さを評価する指標。
- 確率の逆数で計算する(確率が0.8とすると1/0.8=1.25)ため小さければ小さいほどよい。
- 複数データの場合は、Nで平均を出した値
ゲート付きRNN
勾配消失や勾配爆発を抑えるために使用する手法。LSTMとGRUが代表的な手法。
行列の特異値
行列のデータにどれだけ広がりがあるかを表す。最大値が1より大きいとそれを乗算した値は指数的に大きくなる可能性があり、1より小さいと指数的に小さくなる可能性がある
勾配クリッピング
勾配爆発への対処法。勾配のL2ノルムが閾値を超えた場合に修正が入る。
$$ if ||\hat{g}|| >= threshold(閾値)$$
$$ \hat{g} = \frac{threshold}{||\hat{g}||}\hat{g}$$
LSTMの順伝播
下記のようなゲートを設け情報の流入、流出、つながりを操作する。
記憶セル(LSTM専用の記憶部)
- LSTMレイヤないだけで完結し他のレイヤへは出力しない。
- 過去から時刻tまでにおいて必要な情報が全て格納されている。
outputゲート
どれくらいの量を流すか自動でコントロールする。
forgetゲート
記憶セルに対して何を忘れるかを明示的に指示する。
新しく覚えるべき情報用のゲート
新しく覚えるべき情報を指示する。
inputゲート
新しく覚えるべき情報がどれだけ価値があるか判断する。
LSTMの改良
LSTMレイヤを多層化したり、Dropoutにより過学習を抑制、また重みの共有などで改良する。
Dropout
- アンサンブル学習と同じ効果を一つのネットワークで擬似的に実現可能
- 学習時にDropoutを使用した場合、テスト時にスケールを調整する必要がある
- テスト時は全てのニューロンを使って計算し、なおかつ学習時に生き残った割合分をかけることでスケールを合わせる(学習時に先にかけておくことも可能(invented Dropout))
変分Dropout
通常RNNモデルでは時間の方向ではなく深さの方向にDropoutレイヤを配置するが、変分Dropoutは時間方向へのDropoutの挿入に成功したDropout。
文章の生成
seq2seqニューラルネットワーク
時系列から時系列へデータを渡し、Encoder-Decoderモデルと呼ばれRNNが使用可能。改善方法として入力データを反転したり覗き見(Peeky)と呼ばれる方法などを使用する。
Encoder
RNNを利用して時系列データをhという隠れ状態ベクトルに変換、最後の文字を処理した後で隠れ状態hをDecoderに渡す
Decoder
Encoderのhを受け取りDecoder内の各レイヤを通り出力を行う。
パディング
可変長の時系列データをミニバッチ学習するために、本来のデータを無効なデータで埋めてデータの長さを金一に揃えるテクニック。
Attention
必要な情報だけに注意を向けさせ、その情報から時系列変換を行うこと。Seq 2seqではAttentionde単語の対応関係を表す情報などを自動で取り入れている。
双方向RNN
LSTMを左から右、右から左の双方向から処理させる(逆方向に処理させるレイヤを追加する)
skipコネクション
skipコネクションの接続部では加算が行われる。そのため逆伝播時はそのまま流すことになるので、勾配消失、勾配爆発などの問題が起きにくくなる。