まったりAI勉強記

AI(人工知能)について、特にゆかりがあるわけでもない社会人が、まったりとAIについて勉強していく勉強日記です。

【G検定】音声処理と自然言語処理分野 その2

どうも、カタミチです。

さて、音声処理と自然言語処理の続きです。今日は、RNN(リカレントニューラルネットワーク)についてです。畳み込みニューラルネットワークのNASNetのところでも、ちらっと出てきたやつですね。見てみましょう。

RNN(リカレントニューラルネットワーク

RNNの代表例として、過去に入力された単語列から次に来る単語を予測する「言語モデルがあります。音声処理、自然言語処理の両方で使われます。RNNもCNN同様、いくつかのモデルが考えられているようです。

RNNの基本形

時間依存性の学習のために、過去の状態を反映するための隠れ層を表現したものがRNNです。このRNNのモデルに対し、時間軸に沿ったデータを古いものから順番に入力していきます。入力層から隠れ層にネットワークの重みを伝って情報が伝播するのは通常のニューラルネットワークと同じですが、RNNはそこに加えて、過去の隠れ層から現在の隠れ層に対してもつながり(重み)があることが大きな違いです。誤差を逆伝播する際に、時間軸に沿って誤差を反映していくため、BackPropagation Through-Time(BPTT)と呼ばれています。また、RNNからの出力を別のRNNの入力とすることで、RNNを何層も積み重ねることができます。

RNNは音声認識でも使われますが、入力された音声データの数と、認識すべき正解の音素の数が一致するとは限りません。RNNの入力と出力の数は一致するという原理があり、ここに矛盾が生じます。その問題を解決したのがConnectionist Temporal Classification(CTC)です。空文字を追加したり、連続して同じ音素を出力した場合には1度だけ出力する縮約処理を行ったりすることで、入力と出力の数を合わせます。

LSTM

このRNNですが、通常のニューラルネットワーク同様、勾配消失問題が存在します。過去に遡るにつれて勾配が消えていってしまうんですね。

また、時系列データ特有の問題もあります。ネットワークの重みは、関係あるほど大きく、関係ないほど小さくするのが基本ですが、時系列データの場合は「今の時点では関係ないけど、将来の時点では関係ある」ようなデータもあります。この場合、重みを大きくすべきか小さくすべきか?この問題が、入力重み衝突と呼ばれます。同様に、出力重み衝突というものもあり、学習を妨げる要因となります。

そうした問題を解決するために考えられたのがLSTM(Long Short-Term Memory)と呼ばれる手法です。LSTMでは、LSTMブロックと呼ばれる機構を導入します。これは大まかに2つの機構から成っています。

・誤差を内部にとどまらせるためのセル
・必要な情報を必要なタイミングで保持・消却させるためのゲート

f:id:feh_asama:20220208084406j:image

セルはCEC(Constant Error Carousel)とも言われ、誤差を内部にとどめ、勾配消失を防ぐためのものになります。入力ゲート、出力ゲートはそれぞれ、入力重み衝突、出力重み衝突のためのゲート機構になります。忘却ゲートは誤差が過剰にセルに停留するのを防ぐため、リセットの役割を果たすゲート機構になります。

…まぁ、あまりピンとは来ませんが、とりあえず勾配消失を防ぎつつ、入力重み、出力重みの衝突を避けるための工夫がなされたモデルである…という点だけひとまず覚えておきますかねー。

このLSTMが、時系列データを扱うデファクトスタンダードとなっているようですが、計算を少し簡略化したGRU(Gated Recurrent Unit)と呼ばれる手法が使われる場合もあるようですね。

Bidirectional RNN

時間情報の途中が欠けていて、それが何かを予測したい場合、過去の情報だけでなく未来の情報も使って予測したほうが効果的…ということで、RNNを2つ組み合わせることで未来から過去方向への学習をできるようにしたモデルにBidirectional RNN(BiRNN)があります。RNNを組み合わせるといっても、それぞれは過去用と未来用で独立しています。

過去からだけでなく未来からも学ぶ、という考え方は、なんだかそれ自体近未来的な匂いがしますねー。

エンコーダ-ディコーダ

言語モデルにおいては、入力が時系列で出力は単語1つでした。一方、入力が時系列で、出力も時系列にしたい場合に対処したモデルが、sequence-to-sequence(Seq2seq)です。代表的な例は、おなじみの機械翻訳ですね。

用いられるのは、RNNエンコーダ-ディコーダという名前の手法。…何度も見た言葉ですね、エンコーダとディコーダ。しかしなぜ今回は「デコーダ」ではなく「ディコーダ」なのか…。英語だと同じdecorderなので、表記揺れしてますよ、ええ。

モデルは大きくエンコーダとデコーダの2つのRNNに分かれており、エンコーダが入力データを処理して符号化(エンコード)し、符号化された入力情報を使ってデコーダが復号化(デコード)します。

最近では、RNNに限らず、入力されたデータを処理するニューラルネットワークをエンコーダ、出力を生成するニューラルネットワークデコーダと呼ぶようです。

Attention

ここまでで、時系列タスクで高い精度を達成するようになったんですが、さらに進みます。RNNは、過去のどの時刻の状態がどれだけ次の状態に影響するかまで直接求めていません。そこで、「時間の重み」をネットワークに組み込んだのがAttentionと呼ばれる機構です。これにより、時系列タスクのさらなる精度向上が図られたようですね。

Attentionは、出力から見たときの各入力の貢献度を表しているので、入出力の対応関係を可視化することもできます。

ということで

RNNが音声処理や自然言語処理で有効だ、ということはとりあえず理解できました。このあたりも、実際のデータを使って実際にモデル組んでやってみるとおもしろいんでしょうねー。今後、機会があればやってみたいと思います(^-^)

ではまた。

勉強に使ってる書籍はこちら↓
深層学習教科書 ディープラーニング G検定(ジェネラリスト)公式テキスト 第2版