Deep Learningで時系列データを処理する基本手法まとめ

[Deep Learning for Audio Signal Processing](https://arxiv.org/abs/1905.00078)という論文でDeep Learningにおける、音声をはじめとする時系列データの処理方法がまとめられていたので紹介したいと思います。

この記事で紹介するのは

- 1D Convolution
- Dialated 1D Convolution
- RNN
- Bi-directional RNN
- Attention

の５つです。

## 1D Convolution

<img width="300" alt="IMG_710785AACE1B-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231777/5430ca06-cf80-7ca7-cf81-379f23e417a7.jpeg">

上の図は入力時系列$x$が中間層$h$を通り、出力時系列$y$に変換される様子を表しています。

オレンジの破線は時刻$t-1$での出力$y_\{t-1\}$を計算する処理を表し、赤の実線は時刻$t$での出力$y_t$を表します。各ブロックは各層のセルの値を表します。

1D Convolution Layerでは各層のセルの値は前の層のセルと一次元のフィルタの畳み込みによって表されます。この図の例では3つの重みを持つフィルタを用いています。

形式的に書くと、例えば$h_t, y_t$の値は活性化関数を$\sigma$、バイアスを$b$とすると

```math
h_t = \sigma(w_1^{(1)}x_{t-1} + w_2^{(1)}x_{t} + w_3^{(1)}x_{t+1} + b)\\

y_t = \sigma(w_1^{(2)}h_{t-1} + w_2^{(2)}h_{t} + w_3^{(2)}h_{t+1} + b)
```

のように計算できます。

## Dialated 1D Convolution

<img width="300" alt="IMG_2457C264D170-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231777/6ca63315-abc6-c946-a047-ba0598765d94.jpeg">

Dialated 1D Convolutionではdialation $k$に従って畳み込みに使うセルを決めます。

この図の例では$h$から$y$への畳込み層で$k=2$としており、3つの重みを2時刻ずらしながら畳み込んでいます。なので$y$を計算する際には$h_\{t-2\}, h_t, h_\{t+2\}$が使われています。

$x$から$h$への畳み込み層では$k=1$としています。このようにDialated 1D Convolution Layerを用いる際は、入力側から$k$を$(1, 2, 4, \dots)$と増やしていくことで、入力層での受容野をより広く確保することが出来ます。

## RNN

<img width="300" alt="IMG_1688A3A6D313-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231777/be9f93da-0389-db9c-e5ff-e7d0ff032ce4.jpeg">


GRUやLSTMなどのRNNでは、隠れセル$h_t$は現時刻の入力$x_t$と１つ前の時刻の隠れセル$h_\{t-1}$の値によって形式的に次のように計算できます。

```math
ht = \tanh(w_h h_{t-1} + w_x x_t + b)
```

この計算は再帰的に行われ、勾配消失も起きやすくなるため通常は普通のRNNは用いずにGRUやLSTMが使われます。

RNNのより詳しい説明は[ゼロから作るDeep Learning 2](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E7%B7%A8-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873118360)がとてもわかりやすいのでそちらを参照してください。

## Bi-directional RNN

<img width="300" alt="IMG_C01B4B9775BF-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231777/89934c9b-9019-b553-d33e-5781ceda0875.jpeg">

Bi-directional RNN（双方向RNN）では過去の隠れセルの情報だけでなく未来の隠れセルの情報も加味します。

未来の情報を用いるので、オンライン学習には使えません。

## Attention

<img width="300" alt="IMG_E7AE400BC25C-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231777/a5e92946-c929-a406-03b2-9139ab957129.jpeg">

AttentionではEncoderとDecoderという機構を持ちます。それぞれに対応する埋め込み層$h_e$および$h_d$を持ち、コンテキスト$c$が橋渡し役として働きます。この図において、時刻$t$に対応するコンテキスト$c_t$はEncoderの埋め込み層のセル$h_\{e, t-2\}, h_\{e, t-1\}, h_\{e, t\}, h_\{e, t+1\}$の重み付け和で計算でき、その重みはDecoderの埋め込み層のセル$h_\{d, t-1\}$と計算に使われたEncoderの埋め込み層のセルの値から計算されます。この様子は図中の緑の点線で表されています。

最終的に$y_t$は１つ前の時刻$y_\{t-1\}$と１つ前の時刻のDecoderの埋め込み層のセル$h_\{d, t-1\}$とコンテキスト$c_t$によって計算されます。

この計算方法により、入力と出力の相関性を考慮することが出来ます。

## 参考
[Deep Learning for Audio Signal Processing](https://arxiv.org/abs/1905.00078)

[ゼロから作るDeep Learning 2](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E7%B7%A8-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873118360)