Universal Sentence Encoder SentEval demo

Zobacz na TensorFlow.org Uruchom w Google Colab Zobacz na GitHub Pobierz notatnik Zobacz model piasty TF

Ten colab demostrates ten uniwersalny Sentence modelu Encoder CMLM używając SentEval Toolkit, który jest biblioteką do pomiaru jakości zanurzeń zdanie. Zestaw narzędzi SentEval zawiera zróżnicowany zestaw dalszych zadań, które są w stanie ocenić moc uogólniania modelu osadzania i ocenić zakodowane właściwości językowe.

Uruchom pierwsze dwa bloki kodu, aby skonfigurować środowisko, w trzecim bloku kodu możesz wybrać zadanie SentEval, aby ocenić model. Do uruchomienia tego programu Colab zalecane jest środowisko wykonawcze GPU.

Aby dowiedzieć się więcej o Uniwersalny Zdanie modelu Encoder CMLM patrz https://openreview.net/forum?id=WDVD4lUCTzU

Zainstaluj zależności

Pobierz SentEval i dane zadań

W tym kroku pobierz SentEval z github i wykonaj skrypt danych, aby pobrać dane zadania. Może to potrwać do 5 minut.

Zainstaluj SentEval i pobierz dane zadania

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.

Wykonaj zadanie oceny SentEval

Poniższy blok kodu wykonuje zadanie SentEval i wyświetla wyniki, wybierz jedno z następujących zadań, aby ocenić model USE CMLM:

MR  CR  SUBJ    MPQA    SST TREC    MRPC    SICK-E

Wybierz model, parametry i zadanie do uruchomienia. Parametry szybkiego prototypowania można wykorzystać do skrócenia czasu obliczeń w celu uzyskania szybszych wyników.

To zwykle trwa 5-15 minut, aby zakończyć zadanie z „szybkiego prototypowania” params a nawet godzinę z „wolniejszych, najlepsze wyniki” 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}

Dla lepszego efektu, użyj wolniej „wolniej, najlepsze wyniki” params, obliczenie może potrwać do 1 godziny:

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}

Ucz się więcej

Odniesienie