Bidirectional RNN

RNN では、ある状態の中間層の出力値を次の状態に順伝播するネットワークである。これに対して、Bidirectional RNN は、中間層の出力を、未来への順伝播と過去への逆伝播の両方向に伝播するネットワークである。BRNN では、学習時に、過去と未来の情報の入力を必要とすることから、運用時も過去から未来までのすべての情報を入力してはじめて予測できるようになる。そのため、BRNN の応用範囲が限定される。例えば、DNA 塩基を k-mer ごとに区切れば、塩基配列解析に BRNN が使えるようになる。あるいは、1 文全体を入力して、文中にある誤字・脱字の検出などに応用されている。

Bidirectional RNN のアーキテクチャ

順伝播

順伝播では、状態 t における中間層は、入力値と状態 t-1 から入力を受け取り、それぞれに重みをかけて、活性化関数に代入して得られる値を、この中間層の出力値としている。

\[ \overrightarrow{\mathbf{z}}_{t} = \mathbf{U}^{(f)}\mathbf{x}_{t} + \mathbf{V}^{(f)}\mathbf{z}_{t-1} + \mathbf{b}_{z}^{(f)} \] \[ \overrightarrow{\mathbf{H}}_{t} = \phi \left(\overrightarrow{\mathbf{z}}_{t} \right) \]
Bidirectional RNN 中間状態の順伝播

逆伝播

逆伝播では、状態 t における中間層は、入力値と状態 t+1 から入力を受け取り、それぞれに重みをかけて、活性化関数に代入して得られる値を、この中間層の出力値としている。

\[ \overleftarrow{\mathbf{z}}_{t} = \mathbf{U}^{(b)}\mathbf{x}_{t} + \mathbf{V}^{(b)}\mathbf{z}_{t+1} + \mathbf{b}_{z}^{(b)} \] \[ \overleftarrow{\mathbf{H}}_{t} = \phi \left(\overleftarrow{\mathbf{z}}_{t} \right) \]
Bidirectional RNN 中間状態の逆伝播

出力層

状態 t における出力層の出力値は、順伝播および逆伝播の中間層の値から計算する。具体的に順伝播の状態を表すベクトル \( \overrightarrow{\mathbf{H}}_{t} \) と逆伝播の状態を表すベクトル \( \overleftarrow{\mathbf{H}}_{t} \) を縦に結合して一つのベクトルを作る。このとき、\( \overrightarrow{\mathbf{H}}_{t} \in \mathbb{R}^{n\times h} \) および \( \overleftarrow{\mathbf{H}}_{t} \in \mathbb{R}^{n\times h} \) ならば、結合後のベクトルの次元は \( \mathbb{R}^{n\times 2h} \) となる。ベクトルの結合後に、これに重みをかけ、それを活性化関数に代入して出力値を計算する。なお、出力層の活性化関数は恒等関数などが使われる。

\[ \mathbf{y}_{t} = \phi \left( \begin{pmatrix} \overrightarrow{\mathbf{H}}_{t} \\ \overleftarrow{\mathbf{H}}_{t} \end{pmatrix} \mathbf{W} + \mathbf{b}_{y} \right) \]
Bidirectional RNN 出力層