# Decision Transformer

## Обзор

Модель Decision Transformer была предложена в статье [Decision Transformer: Reinforcement Learning via Sequence Modeling](https://huggingface.co/papers/2106.01345) авторами Lili Chen, Kevin Lu, Aravind Rajeswaran, Kimin Lee, Aditya Grover, Michael Laskin, Pieter Abbeel, Aravind Srinivas, Igor Mordatch.

Аннотация из статьи следующая:

*Мы представляем фреймворк, который абстрагирует обучение с подкреплением (RL) как задачу моделирования последовательностей. Это позволяет нам использовать простоту и масштабируемость архитектуры Transformer, а также связанные с ней достижения в области моделирования языка, такие как GPT-x и BERT. В частности, мы предлагаем Decision Transformer — архитектуру, которая рассматривает задачу RL как условное моделирование последовательностей. В отличие от предыдущих подходов к RL, которые подгоняют функции ценности или вычисляют градиенты политики, Decision Transformer просто выводит оптимальные действия, используя каузально замаскированный Transformer. Условливая авторегрессионную модель на желаемый возврат (награду), прошлые состояния и действия, наша модель Decision Transformer может генерировать будущие действия, достигающие желаемого возврата. Несмотря на свою простоту, Decision Transformer соответствует или превосходит по производительности передовые базовые методы model-free offline RL на задачах Atari, OpenAI Gym и Key-to-Door.*

Эта версия модели предназначена для задач, в которых состояние представляет собой вектор.

Эта модель была предоставлена пользователем [edbeeching](https://huggingface.co/edbeeching). Исходный код можно найти [здесь](https://github.com/kzl/decision-transformer).

## DecisionTransformerConfig[[transformers.DecisionTransformerConfig]]

#### transformers.DecisionTransformerConfig[[transformers.DecisionTransformerConfig]]

```python
transformers.DecisionTransformerConfig(transformers_version: str | None = None, architectures: list[str] | None = None, output_hidden_states: bool | None = False, return_dict: bool | None = True, dtype: str | torch.dtype | None = None, chunk_size_feed_forward: int = 0, is_encoder_decoder: bool = False, id2label: dict[int, str] | dict[str, str] | None = None, label2id: dict[str, int] | dict[str, str] | None = None, problem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = None, state_dim: int = 17, act_dim: int = 4, hidden_size: int = 128, max_ep_len: int = 4096, action_tanh: bool = True, vocab_size: int = 1, n_positions: int = 1024, n_layer: int = 3, n_head: int = 1, n_inner: int | None = None, activation_function: str = 'relu', resid_pdrop: float | int = 0.1, embd_pdrop: float | int = 0.1, attn_pdrop: float | int = 0.1, layer_norm_epsilon: float = 1e-05, initializer_range: float = 0.02, scale_attn_weights: bool = True, use_cache: bool = True, bos_token_id: int | None = 50256, eos_token_id: int | list[int] | None = 50256, scale_attn_by_inverse_layer_idx: bool = False, reorder_and_upcast_attn: bool = False, add_cross_attention: bool = False)
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/decision_transformer/configuration_decision_transformer.py#L24)

**Параметры:**

state_dim (`int`, *optional*, по умолчанию 17) : Размер состояния для среды RL

act_dim (`int`, *optional*, по умолчанию 4) : Размер пространства выходных действий

hidden_size (`int`, *optional*, по умолчанию `128`) : Размерность скрытых представлений.

max_ep_len (`int`, *необязательный*, по умолчанию 4096) : максимальная длина эпизода в среде

action_tanh (`bool`, *необязательный*, по умолчанию True) : Использовать ли активацию tanh для предсказания действия

vocab_size (`int`, *необязательный*, по умолчанию `1`) : Размер словаря модели. Определяет количество различных токенов, которые могут быть представлены в `input_ids`.

n_positions (`int`, *необязательный*, по умолчанию `1024`) : Максимальная длина последовательности, с которой может использоваться данная модель.

n_layer (`int`, *необязательный*, по умолчанию `3`) : Количество скрытых слоев в декодере Transformer.

n_head (`int`, *необязательный*, по умолчанию `1`) : Количество головок внимания для каждого слоя внимания в декодере Transformer.

n_inner (`int`, *необязательный*) : Размерность представлений MLP.

activation_function (`str`, *необязательный*, по умолчанию `relu`) : Нелинейная функция активации (функция или строка) в декодере. Например, `"gelu"`, `"relu"`, `"silu"` и т. д.

resid_pdrop (`Union[float, int]`, *необязательный*, по умолчанию `0.1`) : Вероятность dropout для всех полносвязных слоев в эмбеддингах, энкодере и пулере.

embd_pdrop (`Union[float, int]`, *необязательный*, по умолчанию `0.1`) : Коэффициент dropout для эмбеддингов.

attn_pdrop (`Union[float, int]`, *необязательный*, по умолчанию `0.1`) : Доля dropout для вероятностей внимания.

layer_norm_epsilon (`float`, *необязательный*, по умолчанию `1e-05`) : Значение epsilon, используемое слоями нормализации.

initializer_range (`float`, *необязательный*, по умолчанию `0.02`) : Стандартное отклонение truncated_normal_initializer для инициализации всех матриц весов.

scale_attn_weights (`bool`, *необязательный*, по умолчанию `True`) : Масштабирование весов внимания путём деления на sqrt(hidden_size)..

use_cache (`bool`, *необязательный*, по умолчанию `True`) : Следует ли модели возвращать последние значения внимания key/values (не используется во всех моделях). Актуально только при `config.is_decoder=True` или если модель является генеративной моделью только с декодером.

bos_token_id (`int`, *необязательный*, по умолчанию `50256`) : Идентификатор токена, используемый для обозначения начала потока в словаре.

eos_token_id (`Union[int, list[int]]`, *необязательный*, по умолчанию `50256`) : Идентификатор токена, используемый для обозначения конца потока в словаре.

scale_attn_by_inverse_layer_idx (`bool`, *необязательный*, по умолчанию `False`) : Указывает, следует ли дополнительно масштабировать веса внимания на `1 / layer_idx + 1`.

reorder_and_upcast_attn (`bool`, *необязательный*, по умолчанию `False`) : Указывает, следует ли масштабировать ключи (K) перед вычислением внимания (скалярного произведения) и повышать точность скалярного произведения/softmax внимания до float() при обучении с смешанной точностью.

add_cross_attention (`bool`, *необязательный*, по умолчанию `False`) : Следует ли добавлять слои кросс-внимания в модель.

Это класс конфигурации для хранения настроек модели DecisionTransformerModel. Он используется для создания модели Decision Transformer в соответствии с указанными аргументами, определяя архитектуру модели. Создание конфигурации с параметрами по умолчанию даст конфигурацию, аналогичную конфигурации [](https://huggingface.co/)

Объекты конфигурации наследуются от [PreTrainedConfig](/docs/transformers/main/ru/main_classes/configuration#transformers.PreTrainedConfig) и могут использоваться для управления выводами модели. Подробнее см. в документации [PreTrainedConfig](/docs/transformers/main/ru/main_classes/configuration#transformers.PreTrainedConfig).

Пример:

```python
>>> from transformers import DecisionTransformerConfig, DecisionTransformerModel

>>> # Initializing a DecisionTransformer configuration
>>> configuration = DecisionTransformerConfig()

>>> # Initializing a model (with random weights) from the configuration
>>> model = DecisionTransformerModel(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config
```

## DecisionTransformerGPT2Model[[transformers.DecisionTransformerGPT2Model]]

#### transformers.DecisionTransformerGPT2Model[[transformers.DecisionTransformerGPT2Model]]

```python
transformers.DecisionTransformerGPT2Model(config: DecisionTransformerConfig)
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/decision_transformer/modeling_decision_transformer.py#L346)

#### forward[[transformers.DecisionTransformerGPT2Model.forward]]

```python
forward(input_ids: typing.Optional[torch.LongTensor] = None, past_key_values: transformers.cache_utils.Cache | None = None, attention_mask: typing.Optional[torch.Tensor] = None, token_type_ids: typing.Optional[torch.LongTensor] = None, position_ids: typing.Optional[torch.LongTensor] = None, inputs_embeds: typing.Optional[torch.Tensor] = None, encoder_hidden_states: typing.Optional[torch.Tensor] = None, encoder_attention_mask: typing.Optional[torch.Tensor] = None, use_cache: bool | None = None, **kwargs: *<class 'transformers.utils.generic.TransformersKwargs'>)
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/decision_transformer/modeling_decision_transformer.py#L372)

## DecisionTransformerModel[[transformers.DecisionTransformerModel]]

#### transformers.DecisionTransformerModel[[transformers.DecisionTransformerModel]]

```python
transformers.DecisionTransformerModel(config: DecisionTransformerConfig)
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/decision_transformer/modeling_decision_transformer.py#L505)

**Параметры:**

config ([DecisionTransformerConfig](/docs/transformers/main/ru/model_doc/decision_transformer#transformers.DecisionTransformerConfig)) : Класс конфигурации модели со всеми параметрами модели. Инициализация с файлом конфигурации не загружает веса, связанные с моделью, только конфигурацию. Используйте метод [from_pretrained()](/docs/transformers/main/ru/main_classes/model#transformers.PreTrainedModel.from_pretrained) для загрузки весов модели.

Модель Decision Transformer

Эта модель наследуется от [PreTrainedModel](/docs/transformers/main/ru/main_classes/model#transformers.PreTrainedModel). Общие методы, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка головок и т. д.), описаны в документации родительского класса.

Эта модель также является подклассом [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.

#### forward[[transformers.DecisionTransformerModel.forward]]

```python
forward(states: typing.Optional[torch.Tensor] = None, actions: typing.Optional[torch.Tensor] = None, rewards: typing.Optional[torch.Tensor] = None, returns_to_go: typing.Optional[torch.Tensor] = None, timesteps: typing.Optional[torch.LongTensor] = None, attention_mask: typing.Optional[torch.Tensor] = None, output_hidden_states: bool | None = None, output_attentions: bool | None = None, return_dict: bool | None = None, **kwargs)
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/decision_transformer/modeling_decision_transformer.py#L538)

**Параметры:**

states (`torch.Tensor` формы `(batch_size, episode_length, state_dim)`) : Состояния для каждого шага в траектории

actions (`torch.Tensor` формы `(batch_size, episode_length, act_dim)`) : Действия, предпринятые «экспертной» политикой для текущего состояния; они маскируются для авто-регрессивного предсказания

rewards (`torch.Tensor` формы `(batch_size, episode_length, 1)`) : Награды для каждого состояния и действия

returns_to_go (`torch.Tensor` формы `(batch_size, episode_length, 1)`) : Возвраты для каждого состояния в траектории

timesteps (`torch.LongTensor` формы `(batch_size, episode_length)`) : Шаг времени для каждого шага в траектории

attention_mask (`torch.Tensor` формы `(batch_size, sequence_length)`, *необязательный*) : Маска для предотвращения применения внимания к индексам токенов отсечки. Значения маски выбираются из `[0, 1]`:  - 1 для токенов, которые **не замаскированы**, - 0 для токенов, которые **замаскированы**.  [Что такое маски внимания?](../glossary#attention-mask)

output_hidden_states (`bool`, *необязательный*) : Нужно ли возвращать скрытые состояния всех слоёв. Подробнее о `hidden_states` в разделе возвращаемых тензоров.

output_attentions (`bool`, *необязательный*) : Нужно ли возвращать тензоры внимания всех слоев внимания. Подробнее см. `attentions` в разделе возвращаемых тензоров.

return_dict (`bool`, *необязательный*) : Нужно ли возвращать [ModelOutput](/docs/transformers/main/ru/main_classes/output#transformers.utils.ModelOutput) вместо обычного кортежа.

**Возвращает:** `DecisionTransformerOutput` или `tuple(torch.Tensor)`

Объект `DecisionTransformerOutput` или кортеж из `torch.Tensor` (если передано `return_dict=False` или если `config.return_dict=False`), содержащий различные элементы в зависимости от конфигурации ([DecisionTransformerConfig](/docs/transformers/main/ru/model_doc/decision_transformer#transformers.DecisionTransformerConfig)) и входных данных.

Метод forward модели [DecisionTransformerModel](/docs/transformers/main/ru/model_doc/decision_transformer#transformers.DecisionTransformerModel) переопределяет специальный метод `__call__`.

Хотя рецепт для прямого прохода должен быть определён внутри этой функции, после этого следует вызывать экземпляр `Module`, а не эту функцию, поскольку первый выполняет шаги предварительной и постобработки, тогда как второй молча их игнорирует.

- **state_preds** (`torch.Tensor` формы `(batch_size, sequence_length, state_dim)`) -- Прогнозы состояния среды
- **action_preds** (`torch.Tensor` формы `(batch_size, sequence_length, action_dim)`) -- Предсказания действий модели
- **return_preds** (`torch.Tensor` формы `(batch_size, sequence_length, 1)`) -- Предсказанные доходности для каждого состояния
- **hidden_states** (`torch.Tensor`, *необязательный*, возвращается при передаче `output_hidden_states=True` или при `config.output_hidden_states=True`) — кортеж `torch.Tensor` (один для вывода слоя встраиваний, если модель имеет слой встраиваний, + один для вывода каждого слоя) формы `(batch_size, sequence_length, hidden_size)`.

  Скрытые состояния модели на выходе каждого слоя, а также необязательные выходные значения начального слоя встраивания.
- **attentions** (`torch.Tensor`, *необязательный*, возвращается при передаче `output_attentions=True` или при `config.output_attentions=True`) -- Кортеж `torch.Tensor` (по одному на каждый слой) формы `(batch_size, num_heads, sequence_length, sequence_length)`.

  Веса внимания после softmax в механизме внимания, используемые для вычисления взвешенного среднего в головах само-внимания.
- **last_hidden_state** (`torch.Tensor` формы `(batch_size, sequence_length, hidden_size)`, *необязательный*) -- Последовательность скрытых состояний на выходе последнего слоя модели.

Примеры:

```python
>>> from transformers import DecisionTransformerModel
>>> import torch

>>> model = DecisionTransformerModel.from_pretrained("edbeeching/decision-transformer-gym-hopper-medium")
>>> # evaluation
>>> model = model.to(device)
>>> model.eval()

>>> env = gym.make("Hopper-v3")
>>> state_dim = env.observation_space.shape[0]
>>> act_dim = env.action_space.shape[0]

>>> state = env.reset()
>>> states = torch.from_numpy(state).reshape(1, 1, state_dim).to(device=device, dtype=torch.float32)
>>> actions = torch.zeros((1, 1, act_dim), device=device, dtype=torch.float32)
>>> rewards = torch.zeros(1, 1, device=device, dtype=torch.float32)
>>> target_return = torch.tensor(TARGET_RETURN, dtype=torch.float32).reshape(1, 1)
>>> timesteps = torch.tensor(0, device=device, dtype=torch.long).reshape(1, 1)
>>> attention_mask = torch.zeros(1, 1, device=device, dtype=torch.float32)

>>> # forward pass
>>> with torch.no_grad():
...     state_preds, action_preds, return_preds = model(
...         states=states,
...         actions=actions,
...         rewards=rewards,
...         returns_to_go=target_return,
...         timesteps=timesteps,
...         attention_mask=attention_mask,
...         return_dict=False,
...     )
```

