1タイムステップのGRUセルバックプロパゲーションを計算します。
Args x:GRUセルへの入力。 h_prev:前のGRUセルからの状態入力。 w_ru:リセットおよび更新ゲートの重み行列。 w_c:セル接続ゲートの重み行列。 b_ru:リセットおよび更新ゲートのバイアスベクトル。 b_c:セル接続ゲートのバイアスベクトル。 r:リセットゲートの出力。 u:更新ゲートの出力。 c:セル接続ゲートの出力。 d_h:目的関数に対するh_newwrtの勾配。
d_xを返します:目的関数へのxwrtの勾配。 d_h_prev:目的関数に対するhwrtの勾配。 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]
表記に関する別の注意事項: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 (スコープスコープ、オペランド<T> x、オペランド<T> hPrev、オペランド<T> wRu、オペランド<T> wC、オペランド<T> bRu、オペランド<T> bC、オペランド<T > r、オペランド<T> u、オペランド<T> c、オペランド<T> dH)
新しいGRUBlockCellGrad操作をラップするクラスを作成するファクトリメソッド。
パラメーター
範囲 | 現在のスコープ |
---|
戻り値
- GRUBlockCellGradの新しいインスタンス