Calcula la propagación hacia atrás de la celda GRU para 1 paso de tiempo.
Args x: Entrada a la celda GRU. h_prev: Entrada de estado de la celda GRU anterior. w_ru: Matriz de peso para la puerta de reinicio y actualización. w_c: Matriz de pesos para la puerta de conexión de la celda. b_ru: Vector de sesgo para la puerta de reinicio y actualización. b_c: Vector de sesgo para la puerta de conexión de la celda. r: Salida de la puerta de reinicio. u: Salida de la puerta de actualización. c: Salida de la puerta de conexión de la celda. d_h: Gradientes de h_new wrt a la función objetivo.
Devuelve d_x: gradientes de x wrt a la función objetivo. d_h_prev: Gradientes de la h wrt a la función objetivo. d_c_bar Gradientes de c_bar wrt a la función objetivo. d_r_bar_u_bar Gradientes de r_bar y u_bar wrt a la función objetivo.
Esta operación del núcleo implementa las siguientes ecuaciones matemáticas:
Nota sobre la notación de las variables:
La concatenación de ayb está representada por a_b El producto escalar por elementos de ayb está representado por ab El producto escalar por elementos está representado por \ circ La multiplicación de matrices está representada por *
Notas adicionales para mayor claridad:
`w_ru` se puede segmentar en 4 matrices diferentes.
w_ru = [w_r_x w_u_x
w_r_h_prev w_u_h_prev]
mismo modo, `w_c` puede segmentarse en 2 matrices diferentes. w_c = [w_c_x w_c_h_prevr]
mismo ocurre con los sesgos. b_ru = [b_ru_x b_ru_h]
b_c = [b_c_x b_c_h]
Otra nota en notación: 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
matemáticas detrás de los gradientes siguientes: 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
(. no en el núcleo de gradiente) A continuación se realiza el cálculo de la envoltura de Python para los gradientes 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
Constantes
Cuerda | OP_NAME | El nombre de esta operación, como lo conoce el motor central de TensorFlow |
Métodos públicos
estática <T se extiende TNumber > GRUBlockCellGrad <T> | |
Salida <T> | dCBar () |
Salida <T> | dHPrev () |
Salida <T> | dRBarUBar () |
Salida <T> | dX () |
Métodos heredados
Constantes
OP_NAME pública final static String
El nombre de esta operación, como lo conoce el motor central de TensorFlow
Métodos públicos
public static GRUBlockCellGrad <T> crear ( Alcance alcance, operando <T> x, operando <T> hPrev, operando <T> wru, operando <T> WC, operando <T> Bru, operando <T> bC, operando <T > r, operando <T> u, operando <T> c, operando <T> dH)
Método de fábrica para crear una clase que envuelva una nueva operación GRUBlockCellGrad.
Parámetros
alcance | alcance actual |
---|
Devoluciones
- una nueva instancia de GRUBlockCellGrad