Transformers documentation
RWKV
تمت مساهمة هذا النموذج في Hugging Face Transformers في 2023-05-09.
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.Tensor, **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) — قيمة الإيبسلون المستخدمة في طبقات تطبيع الطبقة. - 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.Tensor] = Nonestate: list[torch.Tensor] | None = Noneuse_cache: bool | None = Noneoutput_attentions: bool | None = Noneoutput_hidden_states: bool | None = Nonereturn_dict: bool | None = None**kwargs ) → RwkvOutput or tuple(torch.Tensor)
المعاملات
- 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_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.Tensorمن الشكل(batch_size, sequence_length, hidden_size)، اختياري) — اختياريًا، بدلاً من تمريرinput_ids، يمكنك اختيار تمرير تمثيل مضمّن مباشرة. وهذا مفيد إذا كنت ترغب في الحصول على مزيد من التحكم في كيفية تحويل فهارسinput_idsإلى المتجهات المرتبطة بها، مقارنةً بمصفوفة البحث المضمّنة الداخلية للنموذج. - state (
tupleمن خمسةtorch.Tensorعلى شكل(batch_size, hidden_size, num_hidden_layers)، اختياري) — إذا تم تمريره، يستخدم النموذج الحالة السابقة في جميع الكتل (مما سيُنتج المخرجات الخاصة بـinput_idsالمُقدَّمة وكأن النموذج أضافstate_input_ids + input_idsكسياق). - use_cache (
bool، اختياري) — إذا تم تعيينه إلىTrue، يُعاد آخر حالة ويمكن استخدامه لتوليد logits التالية بسرعة. - output_attentions (
bool، اختياري) — ما إذا كان يجب إرجاع تensors الانتباه لجميع طبقات الانتباه أم لا. راجعattentionsضمن tensors المُرجعة لمزيد من التفاصيل. - output_hidden_states (
bool، اختياري) — ما إذا كان يجب إرجاع حالات الطبقات المخفية لجميع الطبقات. راجعhidden_statesضمن الموترات المُرجعة للحصول على مزيد من التفاصيل. - return_dict (
bool، اختياري) — ما إذا كان يجب إرجاع ModelOutput بدلاً من tuple عادي.
يعيد
RwkvOutput أو tuple(torch.Tensor)
RwkvOutput أو مجموعة مرتبة من
torch.Tensor (في حال تمرير return_dict=False أو عندما يكون config.return_dict=False) وتتضمن عناصر مختلفة
تعتمد على الإعداد (RwkvConfig) والمدخلات.
تتجاوز طريقة RwkvModel الخاصة بالتقديم (forward) الطريقة الخاصة __call__.
على الرغم من أنه يجب تعريف وصفة المرور الأمامي داخل هذه الدالة، إلا أنه ينبغي استدعاء كائن
Moduleبدلاً من هذه الدالة، لأن الكائن يتولى تنفيذ خطوات المعالجة المسبقة والمعالجة اللاحقة، بينما تتجاهل الدالة هذه الخطوات بصمت.
last_hidden_state (
torch.Tensorمن الشكل(batch_size, sequence_length, hidden_size)، اختياري) — تسلسل حالات مخفية عند مخرجات الطبقة الأخيرة من النموذج.state (
listمن خمسةtorch.Tensorبأبعاد(batch_size, hidden_size, num_hidden_layers)) — حالة النموذج عند آخر خطوة زمنية. يمكن استخدامها في طريقة forward معinput_idsالتالية لتجنب تقديمinput_idsالقديمة.hidden_states (
tuple[torch.Tensor, ...]، اختياري، يُعاد عند تمريرoutput_hidden_states=Trueأو عند تعيينconfig.output_hidden_states=True) — مجموعة منtorch.Tensor(واحدة لإخراج الطبقات المضمنة، إذا كان النموذج يحتوي على طبقة تضمين، + واحدة لإخراج كل طبقة) بأبعاد(batch_size, sequence_length, hidden_size).حالات النموذج المخفية عند مخرج كل طبقة بالإضافة إلى مخرجات التضمين الأولي الاختيارية.
attentions (
tuple[torch.Tensor, ...]، اختياري، يُعاد عند تمريرoutput_attentions=Trueأو عند تعيينconfig.output_attentions=True) — مجموعة منtorch.Tensor(واحدة لكل طبقة) بأبعاد(batch_size, num_heads, sequence_length, sequence_length).أوزان الانتباه بعد تطبيق دالة softmax على الانتباه، وتُستخدم لحساب المتوسط الموزون في رؤوس الانتباه الذاتي.
RwkvLMHeadModel
فئة transformers.RwkvForCausalLM
< source >( config: RwkvConfig )
المعاملات
- config (RwkvConfig) — فئة إعدادات النموذج التي تحتوي على جميع معاملات النموذج. لا يؤدي التهيئة باستخدام ملف الإعداد إلى تحميل الأوزان المرتبطة بالنموذج، بل الإعدادات فقط. راجع طريقة from_pretrained() لتحميل أوزان النموذج.
نموذج RWKV Transformer مع رأس لنمذجة اللغة في الأعلى (طبقة خطية بأوزان مرتبطة بتضمينات الإدخال).
يرث هذا النموذج من 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.Tensor] = Nonestate: list[torch.Tensor] | 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.Tensor)
المعاملات
- 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_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.Tensorمن الشكل(batch_size, sequence_length, hidden_size)، اختياري) — اختياريًا، بدلاً من تمريرinput_ids، يمكنك اختيار تمرير تمثيل مضمّن مباشرة. وهذا مفيد إذا كنت ترغب في الحصول على مزيد من التحكم في كيفية تحويل فهارسinput_idsإلى المتجهات المرتبطة بها، مقارنةً بمصفوفة البحث المضمّنة الداخلية للنموذج. - state (
tupleمن خمسةtorch.Tensorعلى شكل(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، اختياري) — ما إذا كان يجب إرجاع تensors الانتباه لجميع طبقات الانتباه أم لا. راجعattentionsضمن tensors المُرجعة لمزيد من التفاصيل. - output_hidden_states (
bool، اختياري) — ما إذا كان يجب إرجاع حالات الطبقات المخفية لجميع الطبقات. راجعhidden_statesضمن الموترات المُرجعة للحصول على مزيد من التفاصيل. - return_dict (
bool، اختياري) — ما إذا كان يجب إرجاع ModelOutput بدلاً من tuple عادي. - logits_to_keep (
Union[int, torch.Tensor]، اختياري، القيمة الافتراضية0) — إذا كانint، يتم حساب logits لآخرlogits_to_keepرموز. إذا كانت القيمة0، يتم حساب logits لجميعinput_ids(حالة خاصة). لا يُحتاج إلى logits إلا للرمز الأخير في عملية التوليد، ويمكن أن يوفر حسابها لذلك الرمز وحده ذاكرة كبيرة، وهو أمر مهم بشكل ملحوظ للتسلسلات الطويلة أو حجم المفردات الكبير. إذا كانtorch.Tensor، يجب أن يكون بعدًا واحدًا (1D) ويتوافق مع الفهارس التي يجب الاحتفاظ بها في بُعد طول التسلسل. يكون هذا مفيدًا عند استخدام تنسيق المصفوفات المعبأة (packed tensor format) (بعد واحد لكل من الدفعة وطول التسلسل).
يعيد
RwkvCausalLMOutput أو tuple(torch.Tensor)
RwkvCausalLMOutput أو مجموعة مرتبة من
torch.Tensor (في حال تمرير return_dict=False أو عندما يكون config.return_dict=False) وتتضمن عناصر مختلفة
تعتمد على الإعداد (RwkvConfig) والمدخلات.
تُعيد طريقة RwkvForCausalLM الخاصة بالتقديم (forward) تعريف الطريقة الخاصة __call__.
على الرغم من أنه يجب تعريف وصفة المرور الأمامي داخل هذه الدالة، إلا أنه ينبغي استدعاء كائن
Moduleبدلاً من هذه الدالة، لأن الكائن يتولى تنفيذ خطوات المعالجة المسبقة والمعالجة اللاحقة، بينما تتجاهل الدالة هذه الخطوات بصمت.
loss (
torch.Tensorof shape(1,), اختياري, يُعاد عند توفيرlabels) — خسارة نمذجة اللغة (لتوقع الرمز التالي).logits (
torch.Tensorمن الشكل(batch_size, sequence_length, config.vocab_size)) — درجات التنبؤ لرأس نمذجة اللغة (درجات لكل رمز في المفردات قبل SoftMax).state (
listمن خمسةtorch.Tensorبأبعاد(batch_size, hidden_size, num_hidden_layers)) — حالة النموذج عند آخر خطوة زمنية. يمكن استخدامها في طريقة الأمامية معinput_idsالتالية لتجنب تقديمinput_idsالقديمة.hidden_states (
tuple[torch.Tensor, ...]، اختياري، يُعاد عند تمريرoutput_hidden_states=Trueأو عند تعيينconfig.output_hidden_states=True) — مجموعة منtorch.Tensor(واحدة لإخراج الطبقات المضمنة، إذا كان النموذج يحتوي على طبقة تضمين، + واحدة لإخراج كل طبقة) بأبعاد(batch_size, sequence_length, hidden_size).حالات النموذج المخفية عند مخرج كل طبقة بالإضافة إلى مخرجات التضمين الأولي الاختيارية.
attentions (
tuple[torch.Tensor, ...]، اختياري، يُعاد عند تمريرoutput_attentions=Trueأو عند تعيينconfig.output_attentions=True) — مجموعة منtorch.Tensor(واحدة لكل طبقة) بأبعاد(batch_size, num_heads, sequence_length, sequence_length).أوزان الانتباه بعد تطبيق دالة softmax على الانتباه، وتُستخدم لحساب المتوسط الموزون في رؤوس الانتباه الذاتي.
انتباه Rwkv والصيغ التكرارية
في نموذج Transformer ذاتي التوليد تقليدي، تُكتب عملية الانتباه على النحو التالي
مع $Q$، و مصفوفات ذات أبعاد seq_len x hidden_size تُسمى الاستعلام والمفتاح والقيمة (في الواقع هي مصفوفات أكبر تحتوي على بُعد الدفعة وبُعد رأس الانتباه، لكننا نهتم فقط بالأبعاد الأخيرة حيث يتم حساب ضرب المصفوفات، لذا سنكتفي بها فقط من أجل التبسيط). يكون ناتج الضرب ذو أبعاد 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