1 タイム ステップの GRU セル バックプロパゲーションを計算します。
Args x: GRU セルへの入力。 h_prev: 前の GRU セルからの状態入力。 w_ru: リセットおよび更新ゲートの重み行列。 w_c: セル接続ゲートの重み行列。 b_ru: リセットおよびアップデート ゲートのバイアス ベクトル。 b_c: セル接続ゲートのバイアス ベクトル。 r: リセットゲートの出力。 u: アップデートゲートの出力。 c: セル接続ゲートの出力。 d_h: 目的関数に対する h_new の勾配。
戻り値 d_x: 目的関数に対する x の勾配。 d_h_prev: 目的関数に対する h の勾配。 d_c_bar 目的関数に対する c_bar の勾配。 d_r_bar_u_bar r_bar と u_bar の勾配は目的関数に対応します。
このカーネル演算は、次の数式を実装します。
変数の表記に関する注意:
a と b の連結は a_b で表されます a と b の要素ごとの内積は ab で表されます 要素ごとの内積は \circ で表されます 行列の乗算は * で表されます
明確にするための追加のメモ:
`w_ru` は 4 つの異なる行列に分割できます。
w_ru = [w_r_x w_u_x
w_r_h_prev w_u_h_prev]
同様に、「w_c」は 2 つの異なる行列に分割できます。 w_c = [w_c_x w_c_h_prevr]
偏見についても同様です。 b_ru = [b_ru_x b_ru_h]
b_c = [b_c_x b_c_h]
表記に関するもう 1 つの注意事項: d_x = d_x_component_1 + d_x_component_2
where d_x_component_1 = d_r_bar * w_r_x^T + d_u_bar * w_r_x^T
and d_x_component_2 = d_c_bar * w_c_x^T
d_h_prev = d_h_prev_component_1 + d_h_prevr \circ r + d_h \circ u
where d_h_prev_componenet_1 = d_r_bar * w_r_h_prev^T + d_u_bar * w_r_h_prev^T
以下の勾配の背後にある数学: d_c_bar = d_h \circ (1-u) \circ (1-c \circ c)
d_u_bar = d_h \circ (h-c) \circ u \circ (1-u)
d_r_bar_u_bar = [d_r_bar d_u_bar]
[d_x_component_1 d_h_prev_component_1] = d_r_bar_u_bar * w_ru^T
[d_x_component_2 d_h_prevr] = d_c_bar * w_c^T
d_x = d_x_component_1 + d_x_component_2
d_h_prev = d_h_prev_component_1 + d_h_prevr \circ r + u
以下の計算は、グラデーションの Python ラッパーで実行されます (グラデーション カーネルではありません)。 d_w_ru = x_h_prevr^T * d_c_bar
d_w_c = x_h_prev^T * d_r_bar_u_bar
d_b_ru = sum of d_r_bar_u_bar along axis = 0
d_b_c = sum of d_c_bar along axis = 0
パブリックメソッド
static <T extends Number> GRUBlockCellGrad <T> | |
出力<T> | dCBar () |
出力<T> | dHPrev () |
出力<T> | dRBarUBar () |
出力<T> | dX () |
継承されたメソッド
パブリックメソッド
public static GRUBlockCellGrad <T> create (スコープscope,オペランド<T> x,オペランド<T> hPrev,オペランド<T> wRu,オペランド<T> wC,オペランド<T> bRu,オペランド<T> bC,オペランド<T > r、オペランド<T> u、オペランド<T> c、オペランド<T> dH)
新しい GRUBlockCellGrad オペレーションをラップするクラスを作成するためのファクトリ メソッド。
パラメータ
範囲 | 現在のスコープ |
---|
返品
- GRUBlockCellGrad の新しいインスタンス