Demo SentEval Encoder Kalimat Universal

Lihat di TensorFlow.org Jalankan di Google Colab Lihat di GitHub Unduh buku catatan Lihat model TF Hub

Colab ini demostrates yang Universal Kalimat Model Encoder CMLM menggunakan SentEval toolkit, yang merupakan perpustakaan untuk mengukur kualitas embeddings kalimat. Toolkit SentEval mencakup serangkaian tugas hilir yang beragam yang mampu mengevaluasi kekuatan generalisasi dari model embedding dan untuk mengevaluasi properti linguistik yang dikodekan.

Jalankan dua blok kode pertama untuk mengatur lingkungan, di blok kode ketiga Anda dapat memilih tugas SentEval untuk mengevaluasi model. Waktu proses GPU direkomendasikan untuk menjalankan Colab ini.

Untuk mempelajari lebih lanjut tentang Universal Kalimat Model Encoder CMLM, lihat https://openreview.net/forum?id=WDVD4lUCTzU

Instal dependensi

Unduh SentEval dan data tugas

Langkah ini unduh SentEval dari github dan jalankan skrip data untuk mengunduh data tugas. Mungkin perlu waktu hingga 5 menit untuk menyelesaikannya.

Instal SentEval dan unduh data tugas

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.

Jalankan tugas evaluasi SentEval

Blok kode berikut menjalankan tugas SentEval dan menampilkan hasilnya, pilih salah satu tugas berikut untuk mengevaluasi model USE CMLM:

MR  CR  SUBJ    MPQA    SST TREC    MRPC    SICK-E

Pilih model, params, dan tugas untuk dijalankan. Params prototyping cepat dapat digunakan untuk mengurangi waktu komputasi untuk hasil yang lebih cepat.

Ini biasanya memakan waktu 5-15 menit untuk menyelesaikan tugas dengan 'cepat prototyping' params dan hingga satu jam dengan 'lebih lambat, kinerja terbaik' 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}

Untuk hasil yang lebih baik, gunakan lebih lambat 'lebih lambat, kinerja terbaik' params, perhitungan bisa memakan waktu hingga 1 jam:

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}

Belajarlah lagi

Referensi