Это библиотека, построенная на трансформаторах Pytorch и Huggingface для измерения разрыва между нейронным текстом и человеческим текстом с лиловой мерой, представленной в этой статье Neurips 2021 (выдающаяся бумажная награда) и на этой статье JMLR 2023.
Лиловый - это мера разрыва между нейронным текстом и человеческим текстом. Он рассчитывается с использованием дивергенций Kullback -Lebler (KL) между двумя текстовыми распределениями в квантованном пространстве встраивания большой языковой модели. Ликув может выявить различия в качестве, возникающих в результате размеров моделей и алгоритмов декодирования.
Функции :
Более подробную информацию можно найти ниже.
Для сценариев воспроизводить эксперименты в статье, пожалуйста, смотрите этот репозиторий.
Для прямой установки запустите эту команду из вашего терминала:
pip install mauve-text
Если вы хотите отредактировать или внести свой вклад в лиловый, вам следует установить из Source
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Кроме того, если вы хотите использовать функцию в лиловом виде, вам нужно вручную установить:
torch>=1.1.0 : инструкцииtransformers>=3.2.0 : просто запустите pip install transformers после установки Pytorch (подробные инструкции) Пусть p_text и q_text Каждый из них будет списком строк, где каждая строка является полной генерацией (включая контекст). Для получения наилучшей практики, лиловому нужен не менее нескольких тысяч поколений для p_text и q_text (в статье используется 5000 каждый). Для нашей демонстрации мы используем 100 поколений каждый для быстрого времени работы.
Чтобы продемонстрировать функциональные возможности этого пакета на некоторых реальных данных, этот репозиторий предоставляет некоторые функции для загрузки и использования образцов данных в папке ./examples (они не являются частью лилового пакета, вам необходимо клонировать репозиторий для них).
Пусть используйте скачать некоторые обзоры продуктов Amazon, а также поколения машин, предоставленные Repo набора данных GPT-2, запустив эту команду в нашей оболочке (загрузки ~ 17 млн. Размер):
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Теперь мы можем вычислить лику следующим образом (обратите внимание, что это требует установки трансформаторов Pytorch и HF).
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 большой токенизатор и предварительно обученную модель (если у вас их еще не загружают). Даже если у вас есть модель в автономном режиме, для загрузки модели требуется до 30 секунд. out содержит поля:
out.mauve : лиловый балл, число от 0 до 1. Большие значения указывают на то, что P и Q ближе.out.frontier_integral : Frontier Integral, число от 0 до 1. Меньшие значения показывают, что P и Q ближе.out.mauve_star и out.frontier_integral_star : их соответствующие версии, рассчитанные с помощью сглаживания Кричевского Трофимова. Посмотрите на эту статью 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 ), лиц внутренне использует теримальное скрытое состояние из GPT-2, большое в качестве представления признаков. Конечно, более поздние LLMS также можно использовать. Как правило, чем лучше встроить функцию, тем лучше производительность лилового.
Есть несколько способов использовать этот пакет. Например, вы можете использовать кэшированные скрытые состояния напрямую (это не требует установки трансформаторов Pytorch и HF):
# 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 может использоваться для оценки других методов, таких как изображения или аудио с лиловым.
Вы также можете вычислить лиловый, используя токеновое представление (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 , например, p через p_text и q через q_features .
mauve.compute_mauve принимает следующие аргументы
p_features : numpy.ndarray of Shape (n, D), где n - количество поколенийq_features : numpy.ndarray of Shape (n, d), где n - количество поколенийp_tokens : список длины n, каждая запись - Torch.longtensor of Shape (1, длина); Длина может варьироваться между поколениямиq_tokens : Список длины n, каждая запись - TORCH.Longtensor of Shape (1, длина); Длина может варьироваться между поколениямиp_text : список длины n, каждая запись - это строкаq_text : Список длины n, каждая запись - это строкаnum_buckets : размер гистограммы для квантового размещения P и Q. Параметры: 'Auto' (по умолчанию) или целое числоpca_max_data : число данных указывает на использование для сокращения размеров PCA до кластеризации. Если -1 , используйте все данные. По умолчанию -1kmeans_explained_var : Количество дисперсии данных для сохранения в размере размерности с помощью PCA. По умолчанию 0,9kmeans_num_redo : количество раз, чтобы переделать кластеризацию K-средних (лучшая цель сохраняется). По умолчанию 5kmeans_max_iter : максимальное количество итераций K-средних. По умолчанию 500featurize_model_name : имя модели, из которой получены функции. По умолчанию 'gpt2-large' Используйте один из ['gpt2', 'gpt2-medium', 'gpt2-large', 'gpt2-xl'] .device_id : устройство для участия. Предоставьте идентификатор графического процессора (например, 0 или 3) для использования графического процессора. Если GPU с этим идентификатором не найден, используйте процессорmax_text_length : максимальное количество токенов для рассмотрения. По умолчанию 1024divergence_curve_discretization_size : количество точек, которые следует учитывать на кривой дивергенции. По умолчанию 25mauve_scaling_factor : "c" из бумаги. По умолчанию 5.verbose : Если true (по умолчанию), распечатайте обновления времени выполненияseed : случайное семя для инициализации назначений кластеров K -Means.batch_size : размер партии для извлечения функций. ПРИМЕЧАНИЕ: p и q могут иметь разные длины, но рекомендуется, чтобы они имели одинаковую длину.
Лучший способ связаться с авторами в случае любых вопросов или разъяснений (о пакете или статье) - это поднять проблему на GitHub. Мы не можем ответить на запросы по электронной почте.
Если вы найдете какие -либо ошибки, поднимите проблему на GitHub. Если вы хотите внести свой вклад, отправьте запрос на привлечение. Мы поощряем и высоко ценим вклад сообщества.
Некоторые функции, которые были бы хорошо иметь:
Стилочный лист сильно отличается от большинства метрик в общем использовании, поэтому вот несколько рекомендаций по правильному использованию лилового: лило:
Относительные сравнения :
model1 и model2 лучше генерировать человеческое распределение, мы можем сравнить MAUVE(text_model1, text_human) и MAUVE(text_model2, text_human) .MAUVE(text_model1, text_human) может варьироваться в зависимости от гиперпараметров, выбранных ниже, но относительные тенденции остаются прежними.Количество поколений :
Количество кластеров (размер дискретизации) :
num_buckets на 0,1 * количество образцов.Лиловый слишком большой или слишком маленький :
mauve_scaling_parameter управляет абсолютным значением лилового балла, не изменяя относительное упорядочение между различными методами. Основная цель этого параметра - помочь с интерпретацией.mauve_scaling_factor . (Примечание: это также увеличивает стандартное отклонение от лилового цвета для каждого запуска).mauve_scaling_factor .Лиловов требуется слишком много времени, чтобы бежать :
num_buckets . Время выполнения кластеризационного алгоритма масштабируется как квадрат количества кластеров. Как только количество кластеров превышает 500, кластеризация действительно начинает замедляться. В этом случае может быть полезно установить количество кластеров на 500 путем переосмысления по умолчанию (это num_data_points / 10 , поэтому используйте это, когда количество образцов для каждого из P и Q составляет более 5000).kmeans_num_redo на 1 , и если это не работает, kmeans_max_iter до 100 . Это позволяет кластеризации работать быстрее за счет возврата худшей кластеризации.Разница в лиловом является большой по сравнению с различиями, которые мы пытаемся количественно оценить :
Если вы найдете этот пакет полезным или используете его в своем исследовании, пожалуйста, укажите следующие документы:
@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-2023166, программой DARPA MCS через NIWC Pacific (N66001-19-2-4031), CIFAR «Learning in Machines & Brains», программа программы Qualcome Fellow Pellow Single Fellower и Feelavestory.