นี่คือห้องสมุดที่สร้างขึ้นบน Pytorch และ HuggingFace Transformers เพื่อวัดช่องว่างระหว่างข้อความประสาทและข้อความมนุษย์ด้วย MAUVE MEAMENT ที่แนะนำใน NEURIPS นี้ 2021 PAPER (Award Paper Award) และกระดาษ JMLR 2023 นี้
Mauve เป็นตัวชี้วัดช่องว่างระหว่างข้อความประสาทและข้อความของมนุษย์ มันถูกคำนวณโดยใช้ความแตกต่างของ Kullback - Leibler (KL) ระหว่างการแจกแจงข้อความทั้งสองในพื้นที่ฝังเชิงปริมาณของแบบจำลองภาษาขนาดใหญ่ MAUVE สามารถระบุความแตกต่างของคุณภาพที่เกิดขึ้นจากขนาดของแบบจำลองและอัลกอริทึมการถอดรหัส
คุณสมบัติ :
รายละเอียดเพิ่มเติมสามารถดูได้ด้านล่าง
สำหรับสคริปต์เพื่อทำซ้ำการทดลองในกระดาษโปรดดูที่เก็บนี้
สำหรับการติดตั้งโดยตรงให้เรียกใช้คำสั่งนี้จากเทอร์มินัลของคุณ:
pip install mauve-text
หากคุณต้องการแก้ไขหรือมีส่วนร่วมใน MAUVE คุณควรติดตั้งจากแหล่งที่มา
git clone [email protected]:krishnap25/mauve.git
cd mauve
pip install -e .
ฟังก์ชั่นบางอย่างต้องใช้แพ็คเกจเพิ่มเติม โปรดดูข้อกำหนดด้านล่าง
คำสั่งการติดตั้งด้านบนติดตั้งข้อกำหนดหลักซึ่ง ได้แก่ :
numpy>=1.18.1scikit-learn>=0.22.1faiss-cpu>=1.7.0tqdm>=4.40.0นอกจากนี้หากคุณต้องการใช้ featurization ภายใน Mauve คุณต้องติดตั้งด้วยตนเอง:
torch>=1.1.0 : คำแนะนำtransformers>=3.2.0 : เพียงแค่เรียกใช้ pip install transformers หลังจากติดตั้ง pytorch (คำแนะนำโดยละเอียด) ให้ p_text และ q_text แต่ละรายการเป็นรายการสตริงที่แต่ละสตริงเป็นรุ่นที่สมบูรณ์ (รวมถึงบริบท) เพื่อการปฏิบัติที่ดีที่สุด MAUVE ต้องการอย่างน้อยสองสามพันรุ่นสำหรับ p_text และ q_text (กระดาษใช้ 5,000 ชิ้น) สำหรับการสาธิตของเราเราใช้ 100 ชั่วอายุคนในเวลาทำงานที่รวดเร็ว
เพื่อแสดงให้เห็นถึงฟังก์ชันการทำงานของแพ็คเกจนี้ในข้อมูลจริงบางส่วนที่เก็บนี้มีฟังก์ชันการทำงานบางอย่างในการดาวน์โหลดและใช้ข้อมูลตัวอย่างในโฟลเดอร์ ./examples (สิ่งเหล่านี้ไม่ใช่ส่วนหนึ่งของแพ็คเกจ MAUVE คุณต้องโคลนพื้นที่เก็บข้อมูลสำหรับสิ่งเหล่านี้)
ปล่อยให้ใช้ดาวน์โหลดบทวิจารณ์ผลิตภัณฑ์ Amazon บางส่วนรวมถึงรุ่นเครื่องจักรที่จัดทำโดยชุดข้อมูลเอาต์พุต GPT-2 โดยใช้คำสั่งนี้ในเชลล์ของเรา (ดาวน์โหลดขนาด ~ 17m):
python examples/download_gpt2_dataset.py
ข้อมูลจะถูกดาวน์โหลดลงในโฟลเดอร์ ./data เราสามารถโหลดข้อมูล (100 ตัวอย่างจาก 5000 ที่มีอยู่) ใน Python เป็น
from examples import load_gpt2_dataset
p_text = load_gpt2_dataset ( 'data/amazon.valid.jsonl' , num_examples = 100 ) # human
q_text = load_gpt2_dataset ( 'data/amazon-xl-1542M.valid.jsonl' , num_examples = 100 ) # machineตอนนี้เราสามารถคำนวณ MAUVE ดังนี้ (โปรดทราบว่าสิ่งนี้ต้องมีการติดตั้ง Pytorch และ HF Transformers)
import mauve
# call mauve.compute_mauve using raw text on GPU 0; each generation is truncated to 256 tokens
out = mauve . compute_mauve ( p_text = p_text , q_text = q_text , device_id = 0 , max_text_length = 256 , verbose = False )
print ( out . mauve ) # prints 0.9917 การดาวน์โหลดครั้งแรกนี้ GPT-2 Tokenizer ขนาดใหญ่และรุ่นที่ผ่านการฝึกอบรมมาก่อน (หากคุณยังไม่ได้ดาวน์โหลดมาแล้ว) แม้ว่าคุณจะมีโมเดลออฟไลน์ก็ใช้เวลานานถึง 30 วินาทีในการโหลดโมเดลในครั้งแรก ตอน out มีฟิลด์:
out.mauve : คะแนน MAUVE ตัวเลขระหว่าง 0 ถึง 1 ค่าที่ใหญ่กว่าระบุว่า P และ Q อยู่ใกล้มากขึ้นout.frontier_integral : Frontier Integral จำนวนระหว่าง 0 ถึง 1 ค่าที่เล็กกว่าบ่งชี้ว่า P และ Q อยู่ใกล้มากขึ้นout.mauve_star และ out.frontier_integral_star : เวอร์ชันที่สอดคล้องกันของพวกเขาคำนวณด้วย Kricevsky-Trofimov Smoothing ดูกระดาษ JMLR 2023 นี้ว่าทำไมสิ่งนี้ถึงดีกว่าout.divergence_curve : numpy.ndarray ของรูปร่าง (m, 2); พล็อตด้วย matplotlib เพื่อดูเส้นโค้งความแตกต่างout.p_hist : การแจกแจงแบบไม่ต่อเนื่องซึ่งเป็นเวอร์ชันเชิงปริมาณของการแจกแจงข้อความ p_textout.q_hist : เหมือนกับข้างบน แต่ด้วย q_textคุณสามารถพล็อตเส้นโค้งความแตกต่างโดยใช้
# Make sure matplotlib is installed in your environment
import matplotlib . pyplot as plt
plt . plot ( out . divergence_curve [:, 1 ], out . divergence_curve [:, 0 ]) สำหรับแต่ละข้อความ (ทั้ง p_text และ q_text ) MAUVE ภายในใช้สถานะที่ซ่อนอยู่ภายในจาก GPT-2 ขนาดใหญ่เป็นตัวแทนคุณลักษณะ แน่นอนว่า LLMs ล่าสุดสามารถใช้งานได้ โดยทั่วไปยิ่งมีการฝังคุณลักษณะที่ดีกว่าเท่าใดก็คือประสิทธิภาพของ Mauve
มีหลายวิธีในการใช้แพ็คเกจนี้ ตัวอย่างเช่นคุณสามารถใช้สถานะที่ซ่อนอยู่ได้โดยตรง (ไม่จำเป็นต้องติดตั้ง Pytorch และ HF Transformers):
# call mauve.compute_mauve using features obtained directly
# p_feats and q_feats are `np.ndarray`s of shape (n, dim)
# we use a synthetic example here
import numpy as np
p_feats = np . random . randn ( 100 , 1024 ) # feature dimension = 1024
q_feats = np . random . randn ( 100 , 1024 )
out = mauve . compute_mauve ( p_features = p_feats , q_features = q_feats )โปรดทราบว่า API นี้สามารถใช้เพื่อประเมินรังสีอื่น ๆ เช่นรูปภาพหรือเสียงด้วย MAUVE
นอกจากนี้คุณยังสามารถคำนวณ MAUVE โดยใช้การแสดง tokenized (BPE) โดยใช้คำศัพท์ GPT-2 (เช่นที่ได้รับจากการใช้การโทรที่ชัดเจนไปยัง transformers.GPT2Tokenizer )
# call mauve.compute_mauve using tokens on GPU 1
# p_toks, q_toks are each a list of LongTensors of shape [1, length]
# we use synthetic examples here
import torch
p_toks = [ torch . LongTensor ( np . random . choice ( 50257 , size = ( 1 , 32 ), replace = True )) for _ in range ( 100 )]
q_toks = [ torch . LongTensor ( np . random . choice ( 50257 , size = ( 1 , 32 ), replace = True )) for _ in range ( 100 )]
out = mauve . compute_mauve ( p_tokens = p_toks , q_tokens = q_toks , device_id = 1 , max_text_length = 1024 ) หากต้องการดูข้อความความคืบหน้าให้ส่งต่อในอาร์กิวเมนต์ verbose=True to mauve.compute_mauve นอกจากนี้คุณยังสามารถใช้รูปแบบที่แตกต่างกันเป็นอินพุตสำหรับ p และ q , EG, p ผ่าน p_text และ q ผ่าน q_features
mauve.compute_mauve ใช้อาร์กิวเมนต์ต่อไปนี้
p_features : numpy.ndarray ของรูปร่าง (n, d) โดยที่ n คือจำนวนรุ่นq_features : numpy.ndarray ของรูปร่าง (n, d) โดยที่ n คือจำนวนรุ่นp_tokens : รายการความยาว n แต่ละรายการคือคบเพลิง longtensor ของรูปร่าง (1, ความยาว); ความยาวอาจแตกต่างกันระหว่างรุ่นq_tokens : รายการความยาว n แต่ละรายการคือคบเพลิง longtensor ของรูปร่าง (1, ความยาว); ความยาวอาจแตกต่างกันระหว่างรุ่นp_text : รายการความยาว n แต่ละรายการเป็นสตริงq_text : รายการความยาว n แต่ละรายการเป็นสตริงnum_buckets : ขนาดของฮิสโตแกรมเพื่อหาปริมาณ P และ Q ตัวเลือก: 'อัตโนมัติ' (ค่าเริ่มต้น) หรือจำนวนเต็มpca_max_data : จุดข้อมูลตัวเลขที่จะใช้สำหรับการลดขนาด PCA ก่อนการจัดกลุ่ม ถ้า -1 ให้ใช้ข้อมูลทั้งหมด ค่าเริ่มต้น -1kmeans_explained_var : จำนวนความแปรปรวนของข้อมูลที่จะลดลงในการลดขนาดโดย PCA เริ่มต้น 0.9kmeans_num_redo : จำนวนครั้งที่จะทำซ้ำการจัดกลุ่ม k-mean (วัตถุประสงค์ที่ดีที่สุดจะถูกเก็บไว้) ค่าเริ่มต้น 5kmeans_max_iter : จำนวนสูงสุดของการทำซ้ำ K-mean ค่าเริ่มต้น 500featurize_model_name : ชื่อของรุ่นที่ได้รับคุณสมบัติ ค่าเริ่มต้น 'gpt2-large' ใช้หนึ่งใน ['gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl']device_id : อุปกรณ์สำหรับ featurization จัดหา GPU ID (เช่น 0 หรือ 3) เพื่อใช้ GPU หากไม่พบ GPU ที่มี ID นี้ให้ใช้ CPUmax_text_length : จำนวนโทเค็นสูงสุดที่ควรพิจารณา ค่าเริ่มต้น 1024divergence_curve_discretization_size : จำนวนคะแนนที่ควรพิจารณาบนเส้นโค้งความแตกต่าง ค่าเริ่มต้น 25mauve_scaling_factor : "C" จากกระดาษ ค่าเริ่มต้น 5.verbose : ถ้าเป็นจริง (ค่าเริ่มต้น) พิมพ์การอัปเดตเวลาทำงานseed : สุ่มเมล็ดเพื่อเริ่มต้นการกำหนดคลัสเตอร์ K -meansbatch_size : ขนาดแบทช์สำหรับการสกัดคุณลักษณะ หมายเหตุ: p และ q อาจมีความยาวที่แตกต่างกัน แต่ขอแนะนำให้พวกเขามีความยาวเท่ากัน
วิธีที่ดีที่สุดในการติดต่อผู้เขียนในกรณีที่มีคำถามหรือคำชี้แจงใด ๆ (เกี่ยวกับแพ็คเกจหรือกระดาษ) คือการทำให้เกิดปัญหาเกี่ยวกับ GitHub เราไม่สามารถตอบคำถามทางอีเมลได้
หากคุณพบข้อบกพร่องใด ๆ โปรดเพิ่มปัญหาเกี่ยวกับ GitHub หากคุณต้องการมีส่วนร่วมโปรดส่งคำขอดึง เราสนับสนุนและให้ความสำคัญกับการมีส่วนร่วมของชุมชน
คุณสมบัติบางอย่างที่ดีที่มี:
MAUVE ค่อนข้างแตกต่างจากตัวชี้วัดส่วนใหญ่ในการใช้งานทั่วไปดังนั้นนี่คือแนวทางบางประการเกี่ยวกับการใช้งานที่เหมาะสมของ MAUVE:
การเปรียบเทียบสัมพัทธ์ :
model1 และ model2 ใดที่ดีกว่าในการสร้างการกระจายของมนุษย์เราสามารถเปรียบเทียบ MAUVE(text_model1, text_human) และ MAUVE(text_model2, text_human)MAUVE(text_model1, text_human) สามารถแตกต่างกันไปตาม hyperparameters ที่เลือกไว้ด้านล่าง แต่แนวโน้มสัมพัทธ์ยังคงเหมือนเดิมจำนวนรุ่น :
จำนวนกลุ่ม (ขนาด discretization) :
num_buckets เป็น 0.1 * จำนวนตัวอย่างMauve มีขนาดใหญ่เกินไปหรือเล็กเกินไป :
mauve_scaling_parameter ควบคุมค่าสัมบูรณ์ของคะแนน MAUVE โดยไม่ต้องเปลี่ยนการสั่งซื้อสัมพัทธ์ระหว่างวิธีการต่างๆ วัตถุประสงค์หลักของพารามิเตอร์นี้คือการช่วยในการตีความmauve_scaling_factor (หมายเหตุ: สิ่งนี้ยังเพิ่มค่าเบี่ยงเบนมาตรฐานต่อการวิ่งของ MAUVE)mauve_scaling_factorMauve ใช้เวลานานเกินไปในการวิ่ง :
num_buckets ช่วงเวลาการทำงานของอัลกอริทึมของการจัดกลุ่มเป็นสแควร์ของจำนวนกลุ่ม เมื่อจำนวนกลุ่มเกิน 500 การจัดกลุ่มจะเริ่มช้าลง ในกรณีนี้อาจเป็นประโยชน์ในการตั้งจำนวนกลุ่มเป็น 500 โดยการเอาชนะค่าเริ่มต้น (ซึ่งเป็น num_data_points / 10 ดังนั้นใช้สิ่งนี้เมื่อจำนวนตัวอย่างสำหรับแต่ละ p และ q มีมากกว่า 5,000)kmeans_num_redo เป็น 1 และถ้าสิ่งนี้ไม่ทำงาน kmeans_max_iter เป็น 100 สิ่งนี้ช่วยให้การจัดกลุ่มสามารถทำงานได้เร็วขึ้นด้วยค่าใช้จ่ายในการคืนค่าการจัดกลุ่มที่แย่ลงความแปรปรวนของ Mauve นั้นมีขนาดใหญ่เมื่อเทียบกับความแตกต่างที่เราพยายามหาปริมาณ :
หากคุณพบว่าแพ็คเกจนี้มีประโยชน์หรือใช้ในการวิจัยของคุณโปรดอ้างอิงเอกสารต่อไปนี้:
@article{pillutla-etal:mauve:jmlr2023,
title={{MAUVE Scores for Generative Models: Theory and Practice}},
author={Pillutla, Krishna and Liu, Lang and Thickstun, John and Welleck, Sean and Swayamdipta, Swabha and Zellers, Rowan and Oh, Sewoong and Choi, Yejin and Harchaoui, Zaid},
journal={JMLR},
year={2023}
}
@inproceedings{pillutla-etal:mauve:neurips2021,
title={MAUVE: Measuring the Gap Between Neural Text and Human Text using Divergence Frontiers},
author={Pillutla, Krishna and Swayamdipta, Swabha and Zellers, Rowan and Thickstun, John and Welleck, Sean and Choi, Yejin and Harchaoui, Zaid},
booktitle = {NeurIPS},
year = {2021}
}
@inproceedings{liu-etal:mauve-theory:neurips2021,
title={{Divergence Frontiers for Generative Models: Sample Complexity, Quantization Effects, and Frontier Integrals}},
author={Liu, Lang and Pillutla, Krishna and Welleck, Sean and Oh, Sewoong and Choi, Yejin and Harchaoui, Zaid},
booktitle={NeurIPS},
year={2021}
}
งานนี้ได้รับการสนับสนุนโดย NSF DMS-2134012, NSF CCF-2019844, NSF DMS-20123166, โปรแกรม DARPA MCS ผ่าน NIWC Pacific (N66001-19-2-4031) โปรแกรมการเรียนรู้ของ Cifar "