Transformers documentation

RWKV

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Эта модель была добавлена в 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()])

Примечания

RwkvConfig

класс transformers.RwkvConfig

< >

( 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.config

RwkvModel

класс transformers.RwkvModel

< >

( config: RwkvConfig )

Параметры

  • config (RwkvConfig) — Класс конфигурации модели, содержащий все параметры модели. Инициализация с помощью файла конфигурации не загружает веса, связанные с моделью, а только конфигурацию. Чтобы загрузить веса модели, используйте метод from_pretrained().

Модель Rwkv без дополнительных слоёв, выводящая необработанные скрытые состояния.

Эта модель наследуется от PreTrainedModel. См. документацию родительского класса для общих методов, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка голов и т. д.)

Эта модель также является подклассом torch.nn.Module в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.

forward

< >

( 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

< >

( config: RwkvConfig )

Параметры

  • config (RwkvConfig) — Класс конфигурации модели, содержащий все параметры модели. Инициализация с помощью файла конфигурации не загружает веса, связанные с моделью, а только конфигурацию. Чтобы загрузить веса модели, используйте метод from_pretrained().

Трансформер модели RWKV с головной частью для моделирования языка (линейный слой с весами, связанными с входными эмбеддингами).

Эта модель наследуется от PreTrainedModel. См. документацию родительского класса для общих методов, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка голов и т. д.)

Эта модель также является подклассом torch.nn.Module в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.

forward

< >

( 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 внимание записывается как O=softmax(QKT/d)VO = \hbox{softmax}(QK^{T} / \sqrt{d}) V

с $Q$, KK и VV — это матрицы размера seq_len x hidden_size называемые query, key и value (на самом деле это более крупные матрицы с размерностями batch и attention head, но нас интересуют только последние две, так как именно с ними выполняется умножение матриц, поэтому для простоты рассматриваем только их). Произведение QKTQK^{T} тогда имеет размер seq_len x seq_len и мы можем выполнить умножение матриц с VV чтобы получить выход OO того же размера, что и остальные.

Подстановка значения softmax даёт: Oi=∑j=1ieQiKjT/dVj∑j=1ieQiKjT/dO_{i} = \frac{\sum_{j=1}^{i} e^{Q_{i} K_{j}^{T} / \sqrt{d}} V_{j}}{\sum_{j=1}^{i} e^{Q_{i} K_{j}^{T} / \sqrt{d}}}

Обратите внимание, что элементы в QKTQK^{T} с $j > i$ маскируются (суммирование останавливается на $j$), поскольку внимание не может обращать внимание на будущие токены (только на прошлые).

В отличие от этого, внимание в RWKV определяется выражением Oi=σ(Ri)∑j=1ieWi−j+KjVj∑j=1ieWi−j+KjO_{i} = \sigma(R_{i}) \frac{\sum_{j=1}^{i} e^{W_{i-j} + K_{j}} V_{j}}{\sum_{j=1}^{i} e^{W_{i-j} + K_{j}}}

где RR — новая матрица, которую автор называет «рецептанс», KK а VV — это по-прежнему ключ и значение (здесь $\sigma$ — функция сигмоиды). WW — новый вектор, представляющий позицию токена, который задаётся выражением W0=u and Wk=(k−1)w for k≥1W_{0} = u \hbox{ and } W_{k} = (k-1)w \hbox{ for } k \geq 1

с uu и ww обучаемые параметры, которые в коде называются time_first и time_decay соответственно. Числитель и знаменатель можно выразить рекурсивно. Обозначив их как NiN_{i} и DiD_{i} получаем: Ni=eu+KiVi+N^i where N^i=eKi−1Vi−1+ew+Ki−2Vi−2⋯+e(i−2)w+K1V1N_{i} = e^{u + K_{i}} V_{i} + \hat{N}_{i} \hbox{ where } \hat{N}_{i} = e^{K_{i-1}} V_{i-1} + e^{w + K_{i-2}} V_{i-2} \cdots + e^{(i-2)w + K_{1}} V_{1}

так N^i\hat{N}_{i} (называемая numerator_state в коде) удовлетворяет условию N^0=0 and N^j+1=eKjVj+ewN^j\hat{N}_{0} = 0 \hbox{ and } \hat{N}_{j+1} = e^{K_{j}} V_{j} + e^{w} \hat{N}_{j}

и Di=eu+Ki+D^i where D^i=eKi−1+ew+Ki−2⋯+e(i−2)w+K1D_{i} = e^{u + K_{i}} + \hat{D}_{i} \hbox{ where } \hat{D}_{i} = e^{K_{i-1}} + e^{w + K_{i-2}} \cdots + e^{(i-2)w + K_{1}}

так D^i\hat{D}_{i} (называемый denominator_state в коде) удовлетворяет D^0=0 and D^j+1=eKj+ewD^j\hat{D}_{0} = 0 \hbox{ and } \hat{D}_{j+1} = e^{K_{j}} + e^{w} \hat{D}_{j}

Фактическая рекуррентная формула немного сложнее, поскольку ради численной стабильности мы не хотим вычислять экспоненты от больших чисел. Обычно softmax вычисляется не напрямую, а числитель и знаменатель делятся на экспоненту максимального члена: exi∑j=1nexj=exi−M∑j=1nexj−M\frac{e^{x_{i}}}{\sum_{j=1}^{n} e^{x_{j}}} = \frac{e^{x_{i} - M}}{\sum_{j=1}^{n} e^{x_{j} - M}}

с MM максимумом всех $x_{j}$. Таким образом, помимо сохранения числителя ($\hat{N}$) и знаменателя ($\hat{D}$), мы также отслеживаем максимум всех членов, встречающихся в экспонентах. Поэтому мы фактически используем N~i=e−MiN^i and D~i=e−MiD^i\tilde{N}_{i} = e^{-M_{i}} \hat{N}_{i} \hbox{ and } \tilde{D}_{i} = e^{-M_{i}} \hat{D}_{i}

определяются следующими рекуррентными формулами: N~0=0 and N~j+1=eKj−qVj+ew+Mj−qN~j where q=max⁡(Kj,w+Mj)\tilde{N}_{0} = 0 \hbox{ and } \tilde{N}_{j+1} = e^{K_{j} - q} V_{j} + e^{w + M_{j} - q} \tilde{N}_{j} \hbox{ where } q = \max(K_{j}, w + M_{j})

и D~0=0 and D~j+1=eKj−q+ew+Mj−qD~j where q=max⁡(Kj,w+Mj)\tilde{D}_{0} = 0 \hbox{ and } \tilde{D}_{j+1} = e^{K_{j} - q} + e^{w + M_{j} - q} \tilde{D}_{j} \hbox{ where } q = \max(K_{j}, w + M_{j})

и $M_{j+1} = q$. Тогда мы можем вычислить Ni=eu+Ki−qVi+eMiN~i where q=max⁡(u+Ki,Mi)N_{i} = e^{u + K_{i} - q} V_{i} + e^{M_{i}} \tilde{N}_{i} \hbox{ where } q = \max(u + K_{i}, M_{i})

и Di=eu+Ki−q+eMiD~i where q=max⁡(u+Ki,Mi)D_{i} = e^{u + K_{i} - q} + e^{M_{i}} \tilde{D}_{i} \hbox{ where } q = \max(u + K_{i}, M_{i})

что в итоге даёт нам Oi=σ(Ri)NiDiO_{i} = \sigma(R_{i}) \frac{N_{i}}{D_{i}}

Update on GitHub