Transformers documentation
RWKV
Эта модель была добавлена в Hugging Face Transformers 09.05.2023.
RWKV
Обзор
Модель RWKV (версия 4) была предложена в этом репозитории
Она предлагает модификацию традиционного механизма внимания в Transformer, чтобы сделать его линейным. Благодаря этому модель можно использовать как рекуррентную сеть: передача входных данных для временных меток 0 и 1 одновременно эквивалентна передаче входных данных для временной метки 0, а затем входных данных для временной метки 1 вместе с состоянием на временной метке 0 (см. пример ниже).
Это может быть эффективнее обычного Transformer и позволяет обрабатывать предложения любой длины (даже если модель обучалась с фиксированной длиной контекста).
Эта модель была предоставлена пользователем sgugger. Исходный код можно найти здесь.
Пример использования
import torch
from transformers import AutoTokenizer, RwkvModel
model = RwkvModel.from_pretrained("sgugger/rwkv-430M-pile", device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("sgugger/rwkv-430M-pile")
inputs = tokenizer("This is an example.", return_tensors="pt").to(model.device)
# Feed everything to the model
outputs = model(inputs["input_ids"])
output_whole = outputs.last_hidden_state
outputs = model(inputs["input_ids"][:, :2])
output_one = outputs.last_hidden_state
# Using the state computed on the first inputs, we will get the same output
outputs = model(inputs["input_ids"][:, 2:], state=outputs.state)
output_two = outputs.last_hidden_state
torch.allclose(torch.cat([output_one, output_two], dim=1), output_whole, atol=1e-5)Если вы хотите убедиться, что модель прекращает генерацию при обнаружении '\n\n', мы рекомендуем использовать следующие критерии остановки:
from transformers import StoppingCriteria
class RwkvStoppingCriteria(StoppingCriteria):
def __init__(self, eos_sequence = [187,187], eos_token_id = 537):
self.eos_sequence = eos_sequence
self.eos_token_id = eos_token_id
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
last_2_ids = input_ids[:,-2:].tolist()
return self.eos_sequence in last_2_ids
output = model.generate(inputs["input_ids"], max_new_tokens=64, stopping_criteria = [RwkvStoppingCriteria()])Примечания
- Используйте левое выравнивание (left padding) для пакетной генерации. См. Сторона выравнивания.
RwkvConfig
класс transformers.RwkvConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonevocab_size: int = 50277context_length: int = 1024hidden_size: int = 4096num_hidden_layers: int = 32attention_hidden_size: int | None = Noneintermediate_size: int | None = Nonelayer_norm_epsilon: float = 1e-05bos_token_id: int | None = 0eos_token_id: int | list[int] | None = 0rescale_every: int = 6tie_word_embeddings: bool = Falseuse_cache: bool = True )
Параметры
- vocab_size (
int, необязательный, по умолчанию50277) — Размер словаря модели. Определяет количество различных токенов, которые могут быть представлены вinput_ids. - context_length (
int, необязательный, по умолчанию 1024) — Максимальная длина последовательности, с которой можно использовать данную модель за один прямой проход (при использовании в режиме RNN допустима любая длина последовательности). - hidden_size (
int, необязательный, по умолчанию4096) — Размерность скрытых представлений. - num_hidden_layers (
int, необязательный, по умолчанию32) — Количество скрытых слоев в декодере Transformer. - attention_hidden_size (
int, необязательный) — Размерность скрытых состояний внимания. Если не задано, по умолчанию используетсяhidden_size. - intermediate_size (
int, необязательный) — Размерность представлений MLP. - layer_norm_epsilon (
float, необязательный, по умолчанию1e-05) — Значение epsilon, используемое слоями нормализации. - bos_token_id (
int, необязательный, по умолчанию0) — Идентификатор токена, используемого для обозначения начала потока в словаре. - eos_token_id (
Union[int, list[int]], необязательный, по умолчанию0) — Идентификатор токена, используемого для обозначения конца потока в словаре. - rescale_every (
int, необязательный, по умолчанию 6) — На этапе инференса скрытые состояния (и веса соответствующих выходных слоёв) делятся на 2 каждыеrescale_everyслоёв. Если установлено значение 0 или отрицательное число, рескейлинг не выполняется. - tie_word_embeddings (
bool, необязательный, по умолчаниюFalse) — Определяет, следует ли связывать веса эмбеддингов согласно маппингуtied_weights_keysмодели. - use_cache (
bool, необязательный, по умолчаниюTrue) — Указывает, должен ли модель возвращать последние ключи/значения внимания (не используется во всех моделях). Актуально только еслиconfig.is_decoder=Trueили если модель является генеративной моделью только с декодером.
Это класс конфигурации для хранения настроек модели RwkvModel. Он используется для создания модели Rwkv в соответствии с указанными аргументами, определяя архитектуру модели. Создание конфигурации с параметрами по умолчанию даст конфигурацию, аналогичную конфигурации RWKV/rwkv-4-169m-pile
Объекты конфигурации наследуются от PreTrainedConfig и могут использоваться для управления выводами модели. Подробнее читайте в документации PreTrainedConfig.
Пример:
>>> from transformers import RwkvConfig, RwkvModel
>>> # Initializing a Rwkv configuration
>>> configuration = RwkvConfig()
>>> # Initializing a model (with random weights) from the configuration
>>> model = RwkvModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configRwkvModel
класс transformers.RwkvModel
< source >( config: RwkvConfig )
Параметры
- config (RwkvConfig) — Класс конфигурации модели, содержащий все параметры модели. Инициализация с помощью файла конфигурации не загружает веса, связанные с моделью, а только конфигурацию. Чтобы загрузить веса модели, используйте метод from_pretrained().
Модель Rwkv без дополнительных слоёв, выводящая необработанные скрытые состояния.
Эта модель наследуется от PreTrainedModel. См. документацию родительского класса для общих методов, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка голов и т. д.)
Эта модель также является подклассом torch.nn.Module в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.LongTensor] = Noneinputs_embeds: typing.Optional[torch.FloatTensor] = Nonestate: list[torch.FloatTensor] | None = Noneuse_cache: bool | None = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → RwkvOutput or tuple(torch.FloatTensor)
Параметры
- input_ids (
torch.LongTensorформы(batch_size, input_ids_length)) —input_ids_length=sequence_lengthеслиpast_key_valuesравноNoneиначеpast_key_values.get_seq_length()(sequence_lengthдлина входных состояний past key value). Индексы токенов входной последовательности в словаре.Если используется
past_key_values, в качествеinput_idsследует передавать только теinput_ids, для которых ещё не вычислено прошлое.Индексы можно получить с помощью AutoTokenizer. Подробности см. в PreTrainedTokenizer.encode() и PreTrainedTokenizer.call().
- attention_mask (
torch.LongTensorформы(batch_size, sequence_length), , необязательный) — Маска для исключения токенов-заполнителей из внимания. Значения маски из диапазона[0, 1]:- 1 для токенов, которые не замаскированы,
- 0 для токенов, которые замаскированы.
- inputs_embeds (
torch.FloatTensorформы(batch_size, sequence_length, hidden_size), необязательный) — При необходимости, вместо передачиinput_idsможно напрямую передать встроенное представление. Это полезно, если требуется больший контроль над тем, как индексыinput_idsпреобразуются в соответствующие векторы, чем это обеспечивает внутренняя матрица поиска эмбеддингов модели. - state (
tupleиз пятиtorch.FloatTensorформы(batch_size, hidden_size, num_hidden_layers), необязательный) — Если передан, модель использует предыдущее состояние во всех блоках (что даст вывод дляinput_ids, как если бы модель добавилаstate_input_ids + input_idsв контекст). - use_cache (
bool, необязательный) — Если установлено вTrue, возвращается последнее состояние, которое можно использовать для быстрого генерирования следующих logits. - output_attentions (
bool, необязательный) — Указывает, следует ли возвращать тензоры внимания всех слоев внимания. Подробности см. в описанииattentionsв разделе возвращаемых тензоров. - output_hidden_states (
bool, необязательный) — Указывает, следует ли возвращать скрытые состояния всех слоев. Подробности см. в описанииhidden_statesсреди возвращаемых тензоров. - return_dict (
bool, необязательный) — Указывает, следует ли возвращать ModelOutput вместо обычного кортежа.
Возвращает
RwkvOutput или tuple(torch.FloatTensor)
Объект RwkvOutput или кортеж из
torch.FloatTensor (если передано return_dict=False или если config.return_dict=False), содержащий различные
элементы в зависимости от конфигурации (RwkvConfig) и входных данных.
Метод forward класса RwkvModel переопределяет специальный метод __call__.
Хотя рецепт для прямого прохода должен быть определён внутри этой функции, после этого следует вызывать экземпляр
Module, а не эту функцию, поскольку первый вариант обеспечивает выполнение шагов предварительной и последующей обработки, тогда как второй молча их игнорирует.
last_hidden_state (
torch.FloatTensorформы(batch_size, sequence_length, hidden_size), необязательный) — Последовательность скрытых состояний на выходе последнего слоя модели.state (
listиз пятиtorch.FloatTensorформы(batch_size, hidden_size, num_hidden_layers)) — состояние модели на последнем шаге. Может использоваться в forward-методе вместе с новымиinput_ids, чтобы избежать передачи старыхinput_ids.hidden_states (
tuple[torch.FloatTensor, ...], необязательный, возвращается, если переданоoutput_hidden_states=Trueили еслиconfig.output_hidden_states=True) — Кортежtorch.FloatTensor(один для вывода слоя встраиваний, если у модели есть слой встраиваний, + один для вывода каждого слоя) формы(batch_size, sequence_length, hidden_size).Скрытые состояния модели на выходе каждого слоя, а также необязательные выходные значения начального слоя встраивания.
attentions (
tuple[torch.FloatTensor, ...], необязательный, возвращается при передачеoutput_attentions=Trueили когдаconfig.output_attentions=True) — Кортежtorch.FloatTensor(по одному для каждого слоя) формы(batch_size, num_heads, sequence_length, sequence_length).Веса внимания после softmax в механизме внимания, используемые для вычисления взвешенного среднего в головах само-внимания.
RwkvLMHeadModel
класс transformers.RwkvForCausalLM
< source >( config: RwkvConfig )
Параметры
- config (RwkvConfig) — Класс конфигурации модели, содержащий все параметры модели. Инициализация с помощью файла конфигурации не загружает веса, связанные с моделью, а только конфигурацию. Чтобы загрузить веса модели, используйте метод from_pretrained().
Трансформер модели RWKV с головной частью для моделирования языка (линейный слой с весами, связанными с входными эмбеддингами).
Эта модель наследуется от PreTrainedModel. См. документацию родительского класса для общих методов, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка голов и т. д.)
Эта модель также является подклассом torch.nn.Module в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.LongTensor] = Noneinputs_embeds: typing.Optional[torch.FloatTensor] = Nonestate: list[torch.FloatTensor] | None = Nonelabels: typing.Optional[torch.LongTensor] = Noneuse_cache: bool | None = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = Nonelogits_to_keep: typing.Union[int, torch.Tensor] = 0**kwargs ) → RwkvCausalLMOutput or tuple(torch.FloatTensor)
Параметры
- input_ids (
torch.LongTensorформы(batch_size, input_ids_length)) —input_ids_length=sequence_lengthеслиpast_key_valuesравноNoneиначеpast_key_values.get_seq_length()(sequence_lengthдлина входных состояний past key value). Индексы токенов входной последовательности в словаре.Если используется
past_key_values, в качествеinput_idsследует передавать только теinput_ids, для которых ещё не вычислено прошлое.Индексы можно получить с помощью AutoTokenizer. Подробности см. в PreTrainedTokenizer.encode() и PreTrainedTokenizer.call().
- attention_mask (
torch.LongTensorформы(batch_size, sequence_length), , необязательный) — Маска для исключения токенов-заполнителей из внимания. Значения маски из диапазона[0, 1]:- 1 для токенов, которые не замаскированы,
- 0 для токенов, которые замаскированы.
- inputs_embeds (
torch.FloatTensorформы(batch_size, sequence_length, hidden_size), необязательный) — При необходимости, вместо передачиinput_idsможно напрямую передать встроенное представление. Это полезно, если требуется больший контроль над тем, как индексыinput_idsпреобразуются в соответствующие векторы, чем это обеспечивает внутренняя матрица поиска эмбеддингов модели. - state (
tupleиз пятиtorch.FloatTensorформы(batch_size, hidden_size, num_hidden_layers), необязательный) — Если передан, модель использует предыдущее состояние во всех блоках (что даст вывод дляinput_ids, как если бы модель добавилаstate_input_ids + input_idsв контекст). - labels (
torch.LongTensorформы(batch_size, sequence_length), необязательный) — Метки для моделирования языка. Обратите внимание, что метки сдвигаются внутри модели, то есть можно задатьlabels = input_idsИндексы выбираются из диапазона[-100, 0, ..., config.vocab_size]Все метки, установленные в-100, игнорируются (маскируются); потеря вычисляется только для меток из диапазона[0, ..., config.vocab_size] - use_cache (
bool, необязательный) — Если установлено вTrue, возвращается последнее состояние, которое можно использовать для быстрого генерирования следующих logits. - output_attentions (
bool, необязательный) — Указывает, следует ли возвращать тензоры внимания всех слоев внимания. Подробности см. в описанииattentionsв разделе возвращаемых тензоров. - output_hidden_states (
bool, необязательный) — Указывает, следует ли возвращать скрытые состояния всех слоев. Подробности см. в описанииhidden_statesсреди возвращаемых тензоров. - return_dict (
bool, необязательный) — Указывает, следует ли возвращать ModelOutput вместо обычного кортежа. - logits_to_keep (
Union[int, torch.Tensor], необязательный, по умолчанию0) — Если передано значение типаint, вычисляет logits для последнихlogits_to_keepтокенов. Если указано0, logits вычисляются для всехinput_ids(особый случай). Для генерации нужны logits только последнего токена, и вычисление их только для этого токена позволяет сэкономить память, что становится весьма значимым для длинных последовательностей или большого размера словаря. Если передано значение типаtorch.Tensor, оно должно быть одномерным и соответствовать индексам, которые нужно сохранить в измерении длины последовательности. Это полезно при использовании упакованного формата тензоров (один размер для batch и длины последовательности).
Возвращает
RwkvCausalLMOutput или tuple(torch.FloatTensor)
RwkvCausalLMOutput или кортеж из
torch.FloatTensor (если передано return_dict=False или если config.return_dict=False), содержащий различные
элементы в зависимости от конфигурации (RwkvConfig) и входных данных.
Метод forward класса RwkvForCausalLM переопределяет специальный метод __call__.
Хотя рецепт для прямого прохода должен быть определён внутри этой функции, после этого следует вызывать экземпляр
Module, а не эту функцию, поскольку первый вариант обеспечивает выполнение шагов предварительной и последующей обработки, тогда как второй молча их игнорирует.
loss (
torch.FloatTensorформы(1,), необязательный, возвращается, если заданlabels) — Потери языковой модели (для предсказания следующего токена).logits (
torch.FloatTensorформы(batch_size, sequence_length, config.vocab_size)) — Оценки предсказаний языковой модели (оценки для каждого токена словаря до применения SoftMax).state (
listиз пятиtorch.FloatTensorформы(batch_size, hidden_size, num_hidden_layers)) — состояние модели на последнем шаге. Может использоваться в forward-методе вместе с новымиinput_ids, чтобы избежать передачи старыхinput_ids.hidden_states (
tuple[torch.FloatTensor, ...], необязательный, возвращается, если переданоoutput_hidden_states=Trueили еслиconfig.output_hidden_states=True) — Кортежtorch.FloatTensor(один для вывода слоя встраиваний, если у модели есть слой встраиваний, + один для вывода каждого слоя) формы(batch_size, sequence_length, hidden_size).Скрытые состояния модели на выходе каждого слоя, а также необязательные выходные значения начального слоя встраивания.
attentions (
tuple[torch.FloatTensor, ...], необязательный, возвращается при передачеoutput_attentions=Trueили когдаconfig.output_attentions=True) — Кортежtorch.FloatTensor(по одному для каждого слоя) формы(batch_size, num_heads, sequence_length, sequence_length).Веса внимания после softmax в механизме внимания, используемые для вычисления взвешенного среднего в головах само-внимания.
Внимание Rwkv и рекуррентные формулы
В традиционном авто-регрессивном Transformer внимание записывается как
с $Q$, и — это матрицы размера seq_len x hidden_size называемые query, key и value (на самом деле это более крупные матрицы с размерностями batch и attention head, но нас интересуют только последние две, так как именно с ними выполняется умножение матриц, поэтому для простоты рассматриваем только их). Произведение тогда имеет размер seq_len x seq_len и мы можем выполнить умножение матриц с чтобы получить выход того же размера, что и остальные.
Подстановка значения softmax даёт:
Обратите внимание, что элементы в с $j > i$ маскируются (суммирование останавливается на $j$), поскольку внимание не может обращать внимание на будущие токены (только на прошлые).
В отличие от этого, внимание в RWKV определяется выражением
где — новая матрица, которую автор называет «рецептанс», а — это по-прежнему ключ и значение (здесь $\sigma$ — функция сигмоиды). — новый вектор, представляющий позицию токена, который задаётся выражением
с и обучаемые параметры, которые в коде называются time_first и time_decay соответственно. Числитель и знаменатель можно выразить рекурсивно. Обозначив их как и получаем:
так (называемая numerator_state в коде) удовлетворяет условию
и
так (называемый denominator_state в коде) удовлетворяет
Фактическая рекуррентная формула немного сложнее, поскольку ради численной стабильности мы не хотим вычислять экспоненты от больших чисел. Обычно softmax вычисляется не напрямую, а числитель и знаменатель делятся на экспоненту максимального члена:
с максимумом всех $x_{j}$. Таким образом, помимо сохранения числителя ($\hat{N}$) и знаменателя ($\hat{D}$), мы также отслеживаем максимум всех членов, встречающихся в экспонентах. Поэтому мы фактически используем
определяются следующими рекуррентными формулами:
и
и $M_{j+1} = q$. Тогда мы можем вычислить
и
что в итоге даёт нам
Update on GitHub