Bản demo SentEval câu mã hóa phổ quát

Xem trên TensorFlow.org Chạy trong Google Colab Xem trên GitHub Tải xuống sổ ghi chép Xem mô hình TF Hub

Colab này demostrates sự phổ Câu mô hình mã hóa CMLM sử dụng SentEval toolkit, mà là một thư viện để đo lường chất lượng embeddings câu. Bộ công cụ SentEval bao gồm một tập hợp đa dạng các tác vụ xuôi dòng có thể đánh giá sức mạnh tổng quát của một mô hình nhúng và đánh giá các thuộc tính ngôn ngữ được mã hóa.

Chạy hai khối mã đầu tiên để thiết lập môi trường, trong khối mã thứ ba, bạn có thể chọn một nhiệm vụ SentEval để đánh giá mô hình. Thời gian chạy GPU được khuyến nghị để chạy Colab này.

Để tìm hiểu thêm về Universal Câu mô hình mã hóa CMLM, xem https://openreview.net/forum?id=WDVD4lUCTzU

Cài đặt phần phụ thuộc

Tải xuống SentEval và dữ liệu tác vụ

Bước này tải xuống SentEval từ github và thực thi tập lệnh dữ liệu để tải xuống dữ liệu tác vụ. Có thể mất đến 5 phút để hoàn thành.

Cài đặt SentEval và tải xuống dữ liệu tác vụ

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.

Thực thi nhiệm vụ loại bỏ SentEval

Khối mã sau thực hiện một tác vụ SentEval và xuất ra kết quả, hãy chọn một trong các tác vụ sau để đánh giá mô hình USE CMLM:

MR  CR  SUBJ    MPQA    SST TREC    MRPC    SICK-E

Chọn một mô hình, thông số và nhiệm vụ để chạy. Các thông số tạo mẫu nhanh có thể được sử dụng để giảm thời gian tính toán để có kết quả nhanh hơn.

Nó thường mất 5-15 phút để hoàn thành một nhiệm vụ với 'mẫu nhanh' params và lên đến một tiếng đồng hồ với sự 'chậm hơn, hiệu suất tốt nhất' 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}

Đối với kết quả tốt hơn, sử dụng chậm hơn 'chậm hơn, hiệu suất tốt nhất' params, tính toán có thể mất đến 1 giờ:

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}

Tìm hiểu thêm

Tài liệu tham khảo