Traitement des séquences en
utilisant des réseaux de neurones
récurrents
Groupe des étudiants : Licence d’Excellence
Intelligence Artificielle et Ingénierie des Données
Noureddine MOHTARAM
E-Mail : [email protected]
Réseaux de neurones récurrents
(RNN, Recurrent Neural Network)
Séquence
▪ Une séquence est une donnée qui suit un ordre bien précis
Source : https://www.coursera.org/lecture/nlp-sequence-models/why-sequence-models-0h7gT
Séquence
▪ Une séquence est une donnée qui suit un ordre bien précis
▪ L'ordre d'une séquence doit être conservé au moment
de l'apprentissage et au moment de la prédiction
L'utilisation des MLP ou des
CNN n'est pas possible
▪ Les séquences peuvent avoir des tailles différentes
Séquence
▪ Une séquence est une donnée qui suit un ordre bien précis
▪ L'ordre d'une séquence doit être conservé au moment
de l'apprentissage et au moment de la prédiction
L'utilisation des MLP ou des
CNN n'est pas possible
▪ Les séquences peuvent avoir des tailles différentes
Solution
Utilisation des réseaux de neurones
récurrents (RNN : Recurrent Neural Network)
RNN (Recurrent Neural Network)
● RNN avec un simple neurone
RNN (Recurrent Neural Network)
● RNN avec un simple neurone ● RNN avec plusieurs neurones
RNN (Recurrent Neural Network)
● RNN avec un simple neurone ● RNN avec plusieurs neurones
● Une couche de plusieurs RNN
RNN (Recurrent Neural Network)
▪ Sortie d'une couche de RNN pour une instance
Fonction d'activation
▪ Sortie d'une couche de RNN pour tous les instances d'un batch
Apprentissage d'un RNN
▪ Les RNNs réalisent leur apprentissage via la stratégie backpropagation through time
(BPTT) = similaire qu'un MLP ou un CNN
Fonction de coût
Forward
Backward
RNN (Recurrent Neural Network)
● RNN en Keras
Nombre de neurones
dans chaque cellule
model = keras.models.Sequential([
keras.layers.SimpleRNN(1, input_shape =[None, 1])
])
La fonction d'activation utilisée par défaut
est la tangente hyperbolique → Elle résout
le problème de l'explosion et de la
disparition du gradient
Flexibilité des RNNs
Seq-to-seq
Exemple : prédire le
future prix d'un stock
Flexibilité des RNNs
Seq-to-seq
Exemple : prédire le Seq-to-vec
future prix d'un stock Exemple : score
d'un tweet
Flexibilité des RNNs
Seq-to-seq
Exemple : prédire le Seq-to-vec
future prix d'un stock Exemple : score
d'un tweet
Vec-to-seq
Exemple : description
d'une image
Flexibilité des RNNs
Seq-to-seq
Exemple : prédire le Seq-to-vec
future prix d'un stock Exemple : score
d'un tweet
Vec-to-seq
Exemple : description Encoder-Decoder
d'une image Exemple : traduction
des phrases
Seq-to-vec Vec-to-seq
RNN profond
▪ Un RNN profond est un RNN avec plusieurs couches de cellule
Couches
RNN profond
Couches
model = keras.models.Sequential([
keras.layers.SimpleRNN(3, return_sequences = True, input_shape =[ None, 1]),
keras.layers.SimpleRNN(3, return_sequences = True),
keras.layers.Dense(1)
])
RNN profond
Nombre de neurones
▪ RNN en Keras dans chaque cellule
Problématique : SimpleRNN n'est pas adapté au traitement des longues
séquences à cause du problème Short-Term Memory
La fonction d'activation utilisée par défaut
▪ Un RNN profond est un RNN avec plusieurs couches est la tangente hyperbolique → Elle résout
de cellule le problème de l'explosion et de la
disparition du gradient
model = keras.models.Sequential([
keras.layers.SimpleRNN(3, return_sequences = True, input_shape =[ None, 1]),
keras.layers.SimpleRNN(3, return_sequences = True),
keras.layers.Dense(1)
])
Solution :
- Utilisation du LSTM (Long short-term memory)
Long short-term memory (LSTM)
LSTM
▪ La méthode Long Short-Term Memory (LSTM) [1] a été proposée par Sepp Hochreiter et
Jürgen Schmidhuber.
▪ Cellule LSTM :
[1] Hochreiter, Sepp, and Jürgen Schmidhuber. "Long short-term memory." Neural computation 9.8 (1997): 1735-1780.
20 Deep Learning [email protected]
Cellule LSTM
● Le réseau peut apprendre ce qu'il faut stocker dans h(t), ce qu'il faut jeter et ce qu'il faut en lire.
Long-term state
Short-term state
Cellule LSTM
Supprime quelques Ajoute quelques Filtrage des mémoires
mémoires mémoires
Long-term state
Short-term state
Cellule LSTM
Output gate :
quelle partie
doit être lue
Long-term state
Short-term state
Forget gate :
quelle partie
de la cellule
doit être
supprimée
Input gate :
quelle partie de
g(t) doit être FC = Fully Connected Layer
ajoutée à c(t)
23 Deep Learning [email protected]
Cellule LSTM
LSTM en Keras
model = tf.keras.Sequential([
tf.keras.layers.LSTM(32, return_sequences=True, input_shape=[None, 5]),
tf.keras.layers.Dense(14)
])
Gated Recurrent Unit (GRU)
GRU
▪ Gated Recurrent Unit (GRU) est une variante de LSTM proposée par Cho et al. [1]
[1] Cho, Kyunghyun, et al. "Learning phrase representations using RNN encoder-decoder for statistical machine translation." Empirical Methods in
Natural Language Processing (EMNLP) 2014
GRU
▪ Gated Recurrent Unit (GRU) est une variante de LSTM proposée par Cho et al. [1]
[1] Cho, Kyunghyun, et al. "Learning phrase representations using RNN encoder-decoder for statistical machine translation." Empirical Methods in
Natural Language Processing (EMNLP) 2014
GRU
▪ Gated Recurrent Unit (GRU) est une variante de LSTM proposée par Cho et al. [1]
[1] Cho, Kyunghyun, et al. "Learning phrase representations using RNN encoder-decoder for statistical machine translation." Empirical Methods in
Natural Language Processing (EMNLP) 2014
GRU
▪ Gated Recurrent Unit (GRU) est une variante de LSTM proposée par Cho et al. [1]
[1] Cho, Kyunghyun, et al. "Learning phrase representations using RNN encoder-decoder for statistical machine translation." Empirical Methods in
Natural Language Processing (EMNLP) 2014
GRU
▪ Gated Recurrent Unit (GRU) est une variante de LSTM proposée par Cho et al. [1]
GRU a moins de paramètres à apprendre
contrairement à LSTM
[1] Cho, Kyunghyun, et al. "Learning phrase representations using RNN encoder-decoder for statistical machine translation." Empirical Methods in
Natural Language Processing (EMNLP) 2014
GRU en Keras
model = keras.models.Sequential([
keras.layers.GRU( 20, return_sequences = True, input_shape =[ None, 1]),
keras.layers.GRU( 20, return_sequences = True),
])
1D CNN
▪ Problématique : LSTM et GRU ont un temps chronophage pour l'entraînement
▪ Solution : Réduire la taille de la séquence par un 1D CNN
model = keras.models.Sequential([
keras.layers.Conv1D(filters = 20, kernel_size = 4, strides = 2, padding =" valid", input_shape =[ None, 5]),
keras.layers.GRU(32, return_sequences = True),
tf.keras.layers.Dense(14)
])
Traitement automatique du langage naturel
Définition
▪ Le Traitement Automatique du Langage Naturel (TALN = NLP : Natural language
processing) est un domaine multidisciplinaire impliquant la linguistique, l'informatique
et l'intelligence artificielle, qui vise à créer des outils de traitement de la langue
naturelle pour diverses applications. [1]
▪ Vers 2017, GoogleTranslate utilisait un LSTM avec 6 couches très larges
Préparation des données textuelles
1. Standardization : réduire la taille des données
a. Majuscule → Minuscule
b. Supprime la ponctuation (tout dépend de
l'application envisagée)
Préparation des données textuelles
1. Standardization
2. Tokenization : Phrase → mots ou groupe de mots.
Elle peut être effectuée avec l'une des trois
méthodes :
a. Word-level tokenization : sequence models
b. N-gram tokenization : bag-of-words models
c. Character-level tokenization
Préparation des données textuelles
1. Standardization
2. Tokenization
3. Indexation du vocabulaire
a. Exemple
Préparation des données textuelles
1. Standardization
2. Tokenization
3. Indexation du vocabulaire
4. Encodage One-hot ou Word Embedding
Préparation des données textuelles
1. Standardization
2. Tokenization
3. Indexation du vocabulaire
4. Encodage One-hot ou Word Embedding
Apprentissage d'une
représentation de mots
Préparation des données textuelles
1. Standardization
2. Tokenization
3. Indexation du vocabulaire
4. Encodage One-hot ou Word Embedding
Apprentissage d'une
représentation de mots
Standardization + Tokenization
▪ Vectorisation via TextVectorization layer
from tensorflow.keras.layers import TextVectorization
text_vectorization = TextVectorization(output_mode="int")
dataset = [
"I write, erase, rewrite", - Majuscule → Minuscule
"Erase again, and then",
"A poppy blooms.", - Supprimer la ponctuation
] - Sépare les mots en utilisant l'espace
text_vectorization.adapt(dataset)
vocabulary = text_vectorization.get_vocabulary()
print(vocabulary) # ['', '[UNK]', 'erase', 'write', 'then', 'rewrite', 'poppy', 'i', 'blooms', 'and', 'again', 'a']
Je ne suis pas
un mot Unknown word = out of vocabulary (OOV)
42 Deep Learning [email protected]
Standardization + Tokenization
+ Indexation du vocabulaire
▪ Vectorisation via TextVectorization layer
from tensorflow.keras.layers import TextVectorization
text_vectorization = TextVectorization(output_mode="int")
dataset = [
"I write, erase, rewrite",
"Erase again, and then",
"A poppy blooms.",
]
text_vectorization.adapt(dataset)
vocabulary = text_vectorization.get_vocabulary()
print(vocabulary) # ['', '[UNK]', 'erase', 'write', 'then', 'rewrite', 'poppy', 'i', 'blooms', 'and', 'again', 'a']
test_sentence = "I write, rewrite, and still rewrite again"
encoded_sentence = text_vectorization(test_sentence)
print(encoded_sentence) # tf.Tensor([ 7 3 5 9 1 5 10], shape=(7,), dtype=int64)
Standardization + Tokenization
+ Indexation du vocabulaire
▪ Vectorisation via TextVectorization layer
from tensorflow.keras.layers import TextVectorization
text_vectorization = TextVectorization(output_mode="int")
dataset = [
"I write, erase, rewrite", TextVectorization peut
"Erase again, and then", être aussi utilisée
"A poppy blooms.", directement comme
]
text_vectorization.adapt(dataset) une couche d'un
vocabulary = text_vectorization.get_vocabulary() réseau de neurones
print(vocabulary) # ['', '[UNK]', 'erase', 'write', 'then', 'rewrite', 'poppy', 'i', 'blooms', 'and', 'again', 'a'] profond (Exemple)
test_sentence = "I write, rewrite, and still rewrite again"
encoded_sentence = text_vectorization(test_sentence)
print(encoded_sentence) # tf.Tensor([ 7 3 5 9 1 5 10], shape=(7,), dtype=int64)
Word Embedding
▪ Word Embedding via Embedding Layer
array([[-0.00931244, 0.03682263, -0.04573409, 0.03624215, -0.03655146],
embedding_layer = tf.keras.layers.Embedding(10, 5) [-0.00114477, -0.03821769, 0.03520611, -0.00974722, 0.00306096],
result = embedding_layer(tf.constant([1, 2, 3])) [ 0.02072425, -0.00217276, -0.03132828, -0.01690926, 0.03033217]],
result.numpy() dtype=float32)
Word Embedding
▪ Word Embedding via Embedding Layer
array([[-0.00931244, 0.03682263, -0.04573409, 0.03624215, -0.03655146],
embedding_layer = tf.keras.layers.Embedding(10, 5) [-0.00114477, -0.03821769, 0.03520611, -0.00974722, 0.00306096],
result = embedding_layer(tf.constant([1, 2, 3])) [ 0.02072425, -0.00217276, -0.03132828, -0.01690926, 0.03033217]],
result.numpy() dtype=float32)
On peut utiliser une méthode de "Word Embedding" pré-entraînée sur
une grande base de données (même principe que le transfer Learning) :
- Word2Vec
- Global Vectors for Word Representation (GloVe)
- ...
Préparation des données textuelles en Keras
▪ Padding : avoir des séquences de même tailles
raw_inputs = [
[711, 632, 71],
[73, 8, 3215, 55, 927],
[83, 91, 1, 645, 1253, 927],
]
padded_inputs = tf.keras.preprocessing.sequence.pad_sequences(
raw_inputs,
padding="post")
print(padded_inputs)
Préparation des données textuelles en Keras
▪ Padding : avoir des séquences de même tailles
▪ Masking : informer le modèle des "token" de "padding" à ignorer
embedding = layers.Embedding(input_dim=5000, output_dim=16, mask_zero=True)
masked_output = embedding(padded_inputs)