Demo di SentEval del codificatore di frasi universale

Visualizza su TensorFlow.org Esegui in Google Colab Visualizza su GitHub Scarica taccuino Vedi il modello del mozzo TF

Questo CoLab demostrates il modello di encoder CMLM universale Frase utilizzando il SentEval toolkit, che è una libreria per misurare la qualità di incastri di frase. Il toolkit SentEval include un insieme diversificato di attività a valle che sono in grado di valutare il potere di generalizzazione di un modello di incorporamento e di valutare le proprietà linguistiche codificate.

Esegui i primi due blocchi di codice per configurare l'ambiente, nel terzo blocco di codice puoi scegliere un'attività SentEval per valutare il modello. Si consiglia un runtime GPU per eseguire questo Colab.

Per saperne di più sul modello di universale Frase Encoder CMLM, vedere https://openreview.net/forum?id=WDVD4lUCTzU

Installa le dipendenze

Scarica SentEval e i dati dell'attività

Questo passaggio scarica SentEval da github ed esegue lo script di dati per scaricare i dati dell'attività. Potrebbero essere necessari fino a 5 minuti per il completamento.

Installa SentEval e scarica i dati dell'attività

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.

Eseguire un'attività di valutazione SentEval

Il seguente blocco di codice esegue un'attività SentEval e genera i risultati, scegli una delle seguenti attività per valutare il modello USE CMLM:

MR  CR  SUBJ    MPQA    SST TREC    MRPC    SICK-E

Seleziona un modello, parametri e attività da eseguire. I parametri di prototipazione rapida possono essere utilizzati per ridurre il tempo di calcolo per risultati più rapidi.

Si richiede in genere 5-15 minuti per completare un compito con il params 'prototipazione rapida' e fino a un'ora con i 'più lenti, migliori performance' 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}

Per un risultato migliore, utilizzare il più lento 'più lento, migliori performance' params, il calcolo può richiedere fino a 1 ora:

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}

Per saperne di più

Riferimento