Démonstration de l'encodeur de phrases universel SentEval

Voir sur TensorFlow.org Exécuter dans Google Colab Voir sur GitHub Télécharger le cahier Voir le modèle TF Hub

Ce colab demostrates le modèle de phrase Universal Encoder CMLM en utilisant la SentEval boîte à outils, qui est une bibliothèque pour mesurer la qualité des incorporations de phrase. La boîte à outils SentEval comprend un ensemble diversifié de tâches en aval capables d'évaluer le pouvoir de généralisation d'un modèle d'intégration et d'évaluer les propriétés linguistiques encodées.

Exécutez les deux premiers blocs de code pour configurer l'environnement, dans le troisième bloc de code, vous pouvez choisir une tâche SentEval pour évaluer le modèle. Un runtime GPU est recommandé pour exécuter ce Colab.

Pour en savoir plus au sujet de la phrase universelle modèle Encoder CMLM, voir https://openreview.net/forum?id=WDVD4lUCTzU

Installer les dépendances

Télécharger SentEval et les données de tâche

Cette étape télécharge SentEval depuis github et exécute le script de données pour télécharger les données de la tâche. Cela peut prendre jusqu'à 5 minutes.

Installez SentEval et téléchargez les données de tâche

Cloning into 'SentEval'...
remote: Enumerating objects: 691, done.[K
remote: Counting objects: 100% (2/2), done.[K
remote: Compressing objects: 100% (2/2), done.[K
remote: Total 691 (delta 0), reused 0 (delta 0), pack-reused 689[K
Receiving objects: 100% (691/691), 33.25 MiB | 21.21 MiB/s, done.
Resolving deltas: 100% (434/434), done.

Exécuter une tâche d'évaluation SentEval

Le bloc de code suivant exécute une tâche SentEval et génère les résultats, choisissez l'une des tâches suivantes pour évaluer le modèle USE CMLM :

MR  CR  SUBJ    MPQA    SST TREC    MRPC    SICK-E

Sélectionnez un modèle, des paramètres et une tâche à exécuter. Les paramètres de prototypage rapide peuvent être utilisés pour réduire le temps de calcul pour un résultat plus rapide.

Il faut généralement 5-15 minutes pour remplir une tâche avec les params « de prototypage rapide » et jusqu'à une heure avec les params « plus lents, les meilleures performances ».

params = {'task_path': PATH_TO_DATA, 'usepytorch': True, 'kfold': 5}
params['classifier'] = {'nhid': 0, 'optim': 'rmsprop', 'batch_size': 128,
                                 'tenacity': 3, 'epoch_size': 2}

Pour un meilleur résultat, utilisez le ralentissement « plus lent, les meilleures performances » params, le calcul peut prendre jusqu'à 1 heure:

params = {'task_path': PATH_TO_DATA, 'usepytorch': True, 'kfold': 10}
params['classifier'] = {'nhid': 0, 'optim': 'adam', 'batch_size': 16,
                                 'tenacity': 5, 'epoch_size': 6}
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

import sys
sys.path.append(f'{os.getcwd()}/SentEval')

import tensorflow as tf

# Prevent TF from claiming all GPU memory so there is some left for pytorch.
gpus = tf.config.list_physical_devices('GPU')
if gpus:
  # Memory growth needs to be the same across GPUs.
  for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)

import tensorflow_hub as hub
import tensorflow_text
import senteval
import time

PATH_TO_DATA = f'{os.getcwd()}/SentEval/data'
MODEL = 'https://tfhub.dev/google/universal-sentence-encoder-cmlm/en-base/1'
PARAMS = 'rapid prototyping'
TASK = 'CR'

params_prototyping = {'task_path': PATH_TO_DATA, 'usepytorch': True, 'kfold': 5}
params_prototyping['classifier'] = {'nhid': 0, 'optim': 'rmsprop', 'batch_size': 128,
                                 'tenacity': 3, 'epoch_size': 2}

params_best = {'task_path': PATH_TO_DATA, 'usepytorch': True, 'kfold': 10}
params_best['classifier'] = {'nhid': 0, 'optim': 'adam', 'batch_size': 16,
                                 'tenacity': 5, 'epoch_size': 6}

params = params_best if PARAMS == 'slower, best performance' else params_prototyping

preprocessor = hub.KerasLayer(
    "https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3")
encoder = hub.KerasLayer(
    "https://tfhub.dev/google/universal-sentence-encoder-cmlm/en-base/1")

inputs = tf.keras.Input(shape=tf.shape(''), dtype=tf.string)
outputs = encoder(preprocessor(inputs))

model = tf.keras.Model(inputs=inputs, outputs=outputs)

def prepare(params, samples):
    return

def batcher(_, batch):
    batch = [' '.join(sent) if sent else '.' for sent in batch]
    return model.predict(tf.constant(batch))["default"]


se = senteval.engine.SE(params, batcher, prepare)
print("Evaluating task %s with %s parameters" % (TASK, PARAMS))
start = time.time()
results = se.eval(TASK)
end = time.time()
print('Time took on task %s : %.1f. seconds' % (TASK, end - start))
print(results)
Evaluating task CR with rapid prototyping parameters
Time took on task CR : 46.5. seconds
{'devacc': 90.42, 'acc': 88.98, 'ndev': 3775, 'ntest': 3775}

Apprendre encore plus

Référence