Demostración de Universal Sentence Encoder SentEval

Ver en TensorFlow.org Ejecutar en Google Colab Ver en GitHub Descargar cuaderno Ver modelo TF Hub

Esta colab demostrates la universal Sentencia modelo de codificador CMLM utilizando el SentEval conjunto de herramientas, que es una biblioteca para la medición de la calidad de incrustaciones de oraciones. El kit de herramientas de SentEval incluye un conjunto diverso de tareas posteriores que pueden evaluar el poder de generalización de un modelo de incrustación y evaluar las propiedades lingüísticas codificadas.

Ejecute los dos primeros bloques de código para configurar el entorno, en el tercer bloque de código puede elegir una tarea de SentEval para evaluar el modelo. Se recomienda un tiempo de ejecución de GPU para ejecutar este Colab.

Para obtener más información acerca de la oración universal modelo de codificador CMLM, ver https://openreview.net/forum?id=WDVD4lUCTzU

Instalar dependencias

Descargar SentEval y datos de tareas

Este paso descarga SentEval de github y ejecuta el script de datos para descargar los datos de la tarea. Puede tardar hasta 5 minutos en completarse.

Instale SentEval y descargue los datos de la tarea

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.

Ejecutar una tarea de evaluación de SentEval

El siguiente bloque de código ejecuta una tarea SentEval y genera los resultados, elija una de las siguientes tareas para evaluar el modelo USE CMLM:

MR  CR  SUBJ    MPQA    SST TREC    MRPC    SICK-E

Seleccione un modelo, parámetros y tarea para ejecutar. Los parámetros de creación rápida de prototipos se pueden utilizar para reducir el tiempo de cálculo para obtener resultados más rápidos.

Normalmente se tarda 5-15 minutos para completar una tarea con los parametros 'Rapid Prototyping' y hasta una hora con los mejores 'un rendimiento más lento' params.

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

Para un mejor resultado, utilice el lento 'más lento, mejor rendimiento' params, computación pueden tardar hasta 1 hora:

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}

Aprende más

Referencia