# CPM

## نظرة عامة

قُدم نموذج CPM في [CPM: A Large-scale Generative Chinese Pre-trained Language Model](https://huggingface.co/papers/2012.00413) من قِبل Zhengyan Zhang وXu Han وHao Zhou وPei Ke وYuxian Gu وDeming Ye وYujia Qin وYusheng Su وHaozhe Ji وJian Guan وFanchao Qi وXiaozhi Wang وYanan Zheng وGuoyang Zeng وHuanqi Cao وShengqi Chen وDaixuan Li وZhenbo Sun وZhiyuan Liu وMinlie Huang وWentao Han وJie Tang وJuanzi Li وXiaoyan Zhu وMaosong Sun.

المستخلص من الورقة البحثية هو كالتالي:

*أثبتت نماذج اللغة المُسبقة التدريب (PLMs) فائدتها في مهام NLP المختلفة. مؤخراً، لفت GPT-3، الذي يضم 175 مليار معامل وبيانات تدريب بحجم 570GB، انتباهاً كبيراً بسبب قدرته على التعلم بعدد قليل من الأمثلة (few-shot) وحتى بدون أمثلة (zero-shot). ومع ذلك، لا يزال تطبيق GPT-3 لمعالجة مهام NLP الصينية تحدياً، إذ أن مجموعة بيانات التدريب الخاصة به تتكون بشكل أساسي من الإنجليزية، كما أن المعايير غير متاحة للعامة. في هذا التقرير التقني، نُطلق نموذج اللغة الصينية المُسبق التدريب (CPM) الذي خضع لتدريب توليدي على بيانات تدريب صينية واسعة النطاق. وبفضل معرفتنا، يُعد CPM، الذي يضم 2.6 مليار معامل وبيانات تدريب صينية بحجم 100GB، أكبر نموذج لغة صيني مُسبق التدريب، مما قد يُسهّل عدة مهام NLP صينية لاحقة، مثل المحادثة، وتوليد المقالات، واختبار الفراغات، وفهم اللغة. تُظهر التجارب الواسعة أن CPM يحقق أداءً قوياً في العديد من مهام NLP في إعدادات التعلم بعدد قليل من الأمثلة (few-shot) وحتى بدون أمثلة (zero-shot).*

تمت مساهمة هذا النموذج من قِبل [canwenxu](https://huggingface.co/canwenxu). يمكن العثور على التنفيذ الأصلي هنا: https://github.com/TsinghuaAI/CPM-Generate

بنية CPM هي نفسها بنية GPT-2، باستثناء طريقة الترميز. راجع [توثيق GPT-2](gpt2) للحصول على معلومات مرجعية حول واجهة برمجة التطبيقات.

## CpmTokenizer[[transformers.CpmTokenizer]]

#### transformers.CpmTokenizer[[transformers.CpmTokenizer]]

```python
transformers.CpmTokenizer(vocab_file, do_lower_case = False, remove_space = True, keep_accents = False, bos_token = '<s>', eos_token = '</s>', unk_token = '<unk>', sep_token = '<sep>', pad_token = '<pad>', cls_token = '<cls>', mask_token = '<mask>', additional_special_tokens = ['<eop>', '<eod>'], sp_model_kwargs: dict[str, typing.Any] | None = None, **kwargs)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm.py#L34)

يُنفّذ ما قبل التقطيع باستخدام أداة التقطيع Jieba-RS. يُستخدم في نماذج CPM.

#### build_inputs_with_special_tokens[[transformers.CpmTokenizer.build_inputs_with_special_tokens]]

```python
build_inputs_with_special_tokens(token_ids_0: list, token_ids_1: list[int] | None = None)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm.py#L230)

**المعاملات:**

token_ids_0 (`list[int]`) : قائمة بالمعرّفات التي ستُضاف إليها الرموز الخاصة.

token_ids_1 (`list[int]`، *اختياري*) : قائمة ثانية اختيارية من المعرّفات لأزواج التسلسلات.

**يعيد:** `list[int]`

قائمة [معرفات الإدخال](../glossary#input-ids) مع الرموز الخاصة المناسبة.

build_model_inputs يبني مدخلات النموذج من تسلسل أو زوج من التسلسلات لمهام تصنيف التسلسل عن طريق دمجها وإضافة الرموز الخاصة. يتبع تسلسل XLNet التنسيق التالي:

- تسلسل واحد: `X <sep> <cls>`
- زوج من التسلسلات: `A <sep> B <sep> <cls>`

#### convert_tokens_to_string[[transformers.CpmTokenizer.convert_tokens_to_string]]

```python
convert_tokens_to_string(tokens)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm.py#L225)

يحوّل تسلسلًا من الرموز (نصوص للكلمات الفرعية) داخل سلسلة واحدة.

#### create_token_type_ids_from_sequences[[transformers.CpmTokenizer.create_token_type_ids_from_sequences]]

```python
create_token_type_ids_from_sequences(token_ids_0: list, token_ids_1: list[int] | None = None)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm.py#L283)

**المعاملات:**

token_ids_0 (`list[int]`) : قائمة من المعرّفات.

token_ids_1 (`list[int]`، *اختياري*) : قائمة ثانية اختيارية من المعرّفات لأزواج التسلسلات.

**يعيد:** `list[int]`

قائمة [معرّفات أنواع الرموز](../glossary#token-type-ids) وفقاً للتسلسل(ات) المُعطى(ة).

أنشئ قناعاً من التسلسلين المُمرَّرين لاستخدامه في مهمة تصنيف أزواج التسلسلات. نموذج XLNet

للقناع المزدوج للترتيب (sequence pair mask) الصيغة التالية:

```
0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
| first sequence    | second sequence |
```

إذا كانت `token_ids_1` هي `None`، فإن هذه الطريقة تُرجع الجزء الأول من القناع (الأصفار) فقط.

#### get_special_tokens_mask[[transformers.CpmTokenizer.get_special_tokens_mask]]

```python
get_special_tokens_mask(token_ids_0: list, token_ids_1: list[int] | None = None, already_has_special_tokens: bool = False)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm.py#L255)

**المعاملات:**

token_ids_0 (`list[int]`) : قائمة من المعرّفات.

token_ids_1 (`list[int]`، *اختياري*) : قائمة ثانية اختيارية من المعرّفات لأزواج التسلسلات.

already_has_special_tokens (`bool`، *اختياري*، القيمة الافتراضية `False`) : ما إذا كانت قائمة الرموز مُنسّقة مسبقًا برموز خاصة للنموذج أم لا.

**يعيد:** `list[int]`

قائمة من الأعداد الصحيحة في المدى [0, 1]: 1 للرمز الخاص، و0 لرمز التسلسل.

استرجاع معرّفات التسلسل من قائمة رموز لم تُضف إليها رموز خاصة. يُستدعى هذا الأسلوب عند إضافة رموز خاصة باستخدام أسلوب `prepare_for_model` في tokenizer.

## CpmTokenizerFast[[transformers.CpmTokenizerFast]]

#### transformers.CpmTokenizerFast[[transformers.CpmTokenizerFast]]

```python
transformers.CpmTokenizerFast(vocab_file = None, tokenizer_file = None, do_lower_case = False, remove_space = True, keep_accents = False, bos_token = '<s>', eos_token = '</s>', unk_token = '<unk>', sep_token = '<sep>', pad_token = '<pad>', cls_token = '<cls>', mask_token = '<mask>', additional_special_tokens = ['<eop>', '<eod>'], **kwargs)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm_fast.py#L28)

يُنفّذ ما قبل التقطيع باستخدام أداة التقطيع Jieba-RS. يُستخدم في نماذج CPM.

#### build_inputs_with_special_tokens[[transformers.CpmTokenizerFast.build_inputs_with_special_tokens]]

```python
build_inputs_with_special_tokens(token_ids_0: list, token_ids_1: list[int] | None = None)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm_fast.py#L145)

**المعاملات:**

token_ids_0 (`list[int]`) : قائمة بالمعرّفات التي ستُضاف إليها الرموز الخاصة.

token_ids_1 (`list[int]`، *اختياري*) : قائمة ثانية اختيارية من المعرّفات لأزواج التسلسلات.

**يعيد:** `list[int]`

قائمة [معرفات الإدخال](../glossary#input-ids) مع الرموز الخاصة المناسبة.

build_model_inputs يبني مدخلات النموذج من تسلسل أو زوج من التسلسلات لمهام تصنيف التسلسل عن طريق دمجها وإضافة الرموز الخاصة. يتبع تسلسل XLNet التنسيق التالي:

- تسلسل واحد: `X <sep> <cls>`
- زوج من التسلسلات: `A <sep> B <sep> <cls>`

#### create_token_type_ids_from_sequences[[transformers.CpmTokenizerFast.create_token_type_ids_from_sequences]]

```python
create_token_type_ids_from_sequences(token_ids_0: list, token_ids_1: list[int] | None = None)
```

[المصدر](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm_fast.py#L170)

**المعاملات:**

token_ids_0 (`list[int]`) : قائمة من المعرّفات.

token_ids_1 (`list[int]`، *اختياري*) : قائمة ثانية اختيارية من المعرّفات لأزواج التسلسلات.

**يعيد:** `list[int]`

قائمة [معرّفات أنواع الرموز](../glossary#token-type-ids) وفقاً للتسلسل(ات) المُعطى(ة).

أنشئ قناعاً من التسلسلين المُمرَّرين لاستخدامه في مهمة تصنيف أزواج التسلسلات. نموذج XLNet

للقناع المزدوج للترتيب (sequence pair mask) الصيغة التالية:

```
0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
| first sequence    | second sequence |
```

إذا كانت `token_ids_1` هي `None`، فإن هذه الطريقة تُرجع الجزء الأول من القناع (الأصفار) فقط.

