LSTM & GRU

Revisão Rápida de algumas operações de Álgebra Linear
Produto Escalar
Produto Vetorial
Produto de Hadamard

Como vimos na aula passada, Redes Neurais Recorrentes sofrem de vanishing gradient.

Vanishing Gradient

A LSTM combate isso ao criar um cell state onde informações podem fluir de um estado anterior ao próximo, gerando uma espécie de memória na rede.
A LSTM possui 3 gates principais:
-
Forget gate
-
Input gate
-
Output gate

Forget Gate
O que deve ser esquecido?
Decide o que apagar do cell state, valores próximos de 1 serão mantidos e próximos de 0 serão descartados.
Input Gate
\(\tilde{C}_t\) calcula candidatos a serem armazenados no cell state
O input gate decide quais desses valores candidatos devem ser atualizados no cell state

Cell State
Os valores “selecionados” do cell state anterior e do candidato serão combinados para formar o novo cell state

Output Gate
Novamente uma sigmoide, “seleciona” os elementos do cell state que serão utilizados como output.

Recapitulando LSTM
O forget gate decide o que manter das etapas anteriores, o input gate decide que informação manter da etapa atual e o output gate determina o próximo hidden state.

tf.keras.layers.LSTM(
units,
activation="tanh",
recurrent_activation="sigmoid",
use_bias=True,
kernel_initializer="glorot_uniform",
recurrent_initializer="orthogonal",
bias_initializer="zeros",
unit_forget_bias=True,
kernel_regularizer=None,
recurrent_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
recurrent_constraint=None,
bias_constraint=None,
dropout=0.0,
recurrent_dropout=0.0,
implementation=2,
return_sequences=False,
return_state=False,
go_backwards=False,
stateful=False,
time_major=False,
unroll=False,
**kwargs
)
Forget e input gates são unidos em um unico update gate z
Cell state e hidden state passam a ser uma única entidade

GRU - Gated Recurrent Unit
-
Update Gate z controla se o estado h deve ser atualizado com \(\tilde{h}\)
- Reset Gate r controla se o estado h anterior deve ser ignorado

tf.keras.layers.GRU(
units,
activation="tanh",
recurrent_activation="sigmoid",
use_bias=True,
kernel_initializer="glorot_uniform",
recurrent_initializer="orthogonal",
bias_initializer="zeros",
kernel_regularizer=None,
recurrent_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
recurrent_constraint=None,
bias_constraint=None,
dropout=0.0,
recurrent_dropout=0.0,
implementation=2,
return_sequences=False,
return_state=False,
go_backwards=False,
stateful=False,
unroll=False,
time_major=False,
reset_after=True,
**kwargs
)
GRU Vs LSTM
LSTM é um pouco mais poderosa mas GRU é mais rápida
Quando usar cada uma?
Dificilmente você encontrará uma RNN pura sendo usada, mesmo para arquiteturas encoder decoder é mais comum usarmos LSTM, GRU, ou outras redes derivadas.
Redes Bi-direcionais
Mesma ideia, mas as 2 redes recebem as tokens em ordem contrária e seus hidden states no final são concatenados.
Isso permite incluir contexto de ambas as direções.
Redes Bi-direcionais
Adicionar probabilidades condicionais em ambas as direcoes aqui
tf.keras.layers.Bidirectional(
layer,
merge_mode="concat",
weights=None,
backward_layer=None,
**kwargs
)
06 - Lstm&gru
By barzilay
06 - Lstm&gru
- 96

