# 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 مقنّع سببيًا. من خلال جعل نموذج التوليد الذاتي (autoregressive) مشروطًا على العائد (المكافأة) المطلوب، والحالات السابقة، والإجراءات، يمكن لنموذج Decision Transformer لدينا توليد إجراءات مستقبلية تحقق العائد المطلوب. وعلى الرغم من بساطته، فإن Decision Transformer تُطابق أداء خطوط الأساس النموذجية الحرة من النموذج (model-free) في RL دون اتصال (offline) أو تتفوق عليها في مهام 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`، *اختياري*، القيمة الافتراضية 17) : حجم الحالة لبيئة التعلم المعزز

act_dim (`int`، *اختياري*، القيمة الافتراضية 4) : حجم مساحة الإخراج

hidden_size (`int`، *اختياري*، القيمة الافتراضية `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) لجميع الطبقات المتصلة بالكامل في التضمينات (embeddings) والمُشفِّر (encoder) والمُجمِّع (pooler).

embd_pdrop (`Union[float, int]`، *اختياري*، القيمة الافتراضية `0.1`) : نسبة الإسقاط (dropout) للتضمينات.

attn_pdrop (`Union[float, int]`، *اختياري*، القيمة الافتراضية `0.1`) : نسبة الإسقاط (dropout) لاحتمالات الانتباه.

layer_norm_epsilon (`float`، *اختياري*، القيمة الافتراضية `1e-05`) : قيمة الإيبسلون المستخدمة في طبقات تطبيع الطبقة.

initializer_range (`float`، *اختياري*، القيمة الافتراضية `0.02`) : الانحراف المعياري لـ truncated_normal_initializer المستخدم في تهيئة جميع مصفوفات الأوزان.

scale_attn_weights (`bool`، *اختياري*، القيمة الافتراضية `True`) : يُقيّم أوزان الانتباه عن طريق القسمة على sqrt(hidden_size).

use_cache (`bool`، *اختياري*، القيمة الافتراضية `True`) : ما إذا كان يجب على النموذج إرجاع قيم المفاتيح/القيم الأخيرة للانتباه (لا تستخدمها جميع النماذج). لا ينطبق إلا إذا كان `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`) : ما إذا كان يجب إضافة طبقات الانتباه المتقاطع إلى النموذج.

This is the configuration class to store the configuration of a DecisionTransformerModel. It is used to instantiate a Decision Transformer model according to the specified arguments, defining the model architecture. Instantiating a configuration with the defaults will yield a similar configuration to that of the [](https://huggingface.co/)

ترث كائنات الإعداد من [PreTrainedConfig](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig) ويمكن استخدامها للتحكم في مخرجات النموذج. اقرأ التوثيق الخاص بـ [PreTrainedConfig](/docs/transformers/main/ar/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/ar/model_doc/decision_transformer#transformers.DecisionTransformerConfig)) : فئة إعدادات النموذج التي تحتوي على جميع معاملات النموذج. عند التهيئة باستخدام ملف إعدادات، لا يتم تحميل الأوزان المرتبطة بالنموذج، بل الإعدادات فقط. راجع طريقة [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained) لتحميل أوزان النموذج.

نموذج Decision Transformer

يرث هذا النموذج من [PreTrainedModel](/docs/transformers/main/ar/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/ar/main_classes/output#transformers.utils.ModelOutput) بدلاً من tuple عادي.

**يعيد:** `DecisionTransformerOutput` أو `tuple(torch.Tensor)`

`DecisionTransformerOutput` أو مجموعة من `torch.Tensor` (إذا تم تمرير `return_dict=False` أو عندما يكون `config.return_dict=False`) وتتضمن عناصر مختلفة اعتماداً على الإعداد ([DecisionTransformerConfig](/docs/transformers/main/ar/model_doc/decision_transformer#transformers.DecisionTransformerConfig)) والمدخلات.

تتجاوز طريقة [DecisionTransformerModel](/docs/transformers/main/ar/model_doc/decision_transformer#transformers.DecisionTransformerModel) الخاصة بالتقديم (forward) الطريقة الخاصة `__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,
...     )
```

