ตัวเข้ารหัสประโยคสากล SentEval demo

Colab นี้ demostrates สากลประโยครุ่น Encoder CMLM ใช้ SentEval เครื่องมือซึ่งเป็นห้องสมุดสำหรับการวัดคุณภาพของ embeddings ประโยค ชุดเครื่องมือ SentEval ประกอบด้วยชุดงานดาวน์สตรีมที่หลากหลายซึ่งสามารถประเมินพลังการทำให้เป็นภาพรวมของแบบจำลองการฝัง และเพื่อประเมินคุณสมบัติทางภาษาที่เข้ารหัส

เรียกใช้โค้ดบล็อกสองบล็อกแรกเพื่อตั้งค่าสภาพแวดล้อม ในบล็อกโค้ดที่สาม คุณสามารถเลือกงาน SentEval เพื่อประเมินโมเดลได้ ขอแนะนำให้รันไทม์ GPU เพื่อเรียกใช้ Colab นี้

ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับยูนิเวอร์แซประโยครุ่น Encoder CMLM ดู https://openreview.net/forum?id=WDVD4lUCTzU

ติดตั้งการพึ่งพา

pip install --quiet tensorflow-text
pip install --quiet torch==1.8.1

ดาวน์โหลด SendEval และข้อมูลงาน

ขั้นตอนนี้ดาวน์โหลด SentEval จาก github และรันสคริปต์ข้อมูลเพื่อดาวน์โหลดข้อมูลงาน อาจใช้เวลาถึง 5 นาทีจึงจะเสร็จสมบูรณ์

ติดตั้ง SentEval และดาวน์โหลดข้อมูลงาน

rm -rf ./SentEval
git clone https://github.com/facebookresearch/SentEval.git
cd $PWD/SentEval/data/downstream && bash get_transfer_data.bash > /dev/null 2>&1

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.

ดำเนินการงานการประเมิน SentEval

บล็อกโค้ดต่อไปนี้ทำงาน SentEval และส่งออกผลลัพธ์ เลือกงานใดงานหนึ่งต่อไปนี้เพื่อประเมินโมเดล USE CMLM:

MR  CR  SUBJ    MPQA    SST TREC    MRPC    SICK-E

เลือกรุ่น พารามิเตอร์ และงานที่จะเรียกใช้ สามารถใช้พารามิเตอร์การสร้างต้นแบบอย่างรวดเร็วเพื่อลดเวลาในการคำนวณเพื่อให้ได้ผลลัพธ์ที่รวดเร็วยิ่งขึ้น

มันมักจะใช้เวลา 5-15 นาทีเพื่อให้งานกับ 'การสร้างต้นแบบอย่างรวดเร็ว' params และถึงหนึ่งชั่วโมงกับ 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}

สำหรับผลดีกว่าการใช้ช้า 'ช้าประสิทธิภาพที่ดีที่สุด' params คำนวณอาจใช้เวลาถึง 1 ชั่วโมง:

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}

เรียนรู้เพิ่มเติม

อ้างอิง