# CPM

## Genel Bakış

CPM modeli, 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 ve Maosong Sun tarafından [CPM: A Large-scale Generative Chinese Pre-trained Language Model](https://huggingface.co/papers/2012.00413) makalesinde önerilmiştir.

Makalenin özeti aşağıdaki gibidir:

*Önceden eğitilmiş dil modelleri (PLM), çeşitli aşağı akış NLP görevleri için faydalı olduğu kanıtlanmıştır. Son zamanlarda, 175 milyar parametreye ve 570GB eğitim verisine sahip GPT-3, az örnekli (hatta sıfır örnekli) öğrenme kapasitesi nedeniyle çok fazla ilgi çekti. Ancak GPT-3'ün Çin NLP görevlerini çözmek için uygulanması hâlâ zorlu, çünkü GPT-3'ün eğitim korpusu ağırlıklı olarak İngilizcedir ve parametreler kamuya açık değildir. Bu teknik raporda, büyük ölçekli Çin eğitim verisi üzerinde üretken ön eğitimle eğitilmiş Çin Ön-eğitilmiş Dil Modelini (CPM) yayımlıyoruz. Bilgimize göre, 2,6 milyar parametreye ve 100GB Çin eğitim verisine sahip CPM, en büyük Çin ön-eğitilmiş dil modelidir ve sohbet, deneme üretimi, boşluk doldurma testi ve dil anlama gibi çeşitli aşağı akış Çin NLP görevlerini kolaylaştırabilir. Kapsamlı deneyler, CPM'nin az örnekli (hatta sıfır örnekli) öğrenme ayarlarında birçok NLP görevinde güçlü performans elde ettiğini göstermektedir.*

Bu model [canwenxu](https://huggingface.co/canwenxu) tarafından katkıda bulunmuştur. Orijinal uygulama burada bulunabilir: https://github.com/TsinghuaAI/CPM-Generate

CPM'nin mimarisi, tokenizasyon yöntemi dışında GPT-2 ile aynıdır. API referans bilgileri için [GPT-2 belgeleri](gpt2)ne başvurun.

## 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)
```

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/cpm/tokenization_cpm.py#L34)

Jieba-RS segmentasyon aracıyla ön-tokenizasyonu çalıştırır. CPM modellerinde kullanılır.

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

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

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/cpm/tokenization_cpm.py#L230)

**Parametreler:**

token_ids_0 (`list[int]`) : Özel jetonların ekleneceği kimliklerin listesi.

token_ids_1 (`list[int]`, *isteğe bağlı*) : Sıralı çiftler için isteğe bağlı ikinci kimlik listesi.

**Dönüş:** `list[int]`

Uygun özel jetonlarla [girdi kimlikleri](../glossary#input-ids) listesi.

Sınıflandırma görevleri için bir dizi veya dizi çiftinden model girdilerini birleştirerek ve özel jetonlar ekleyerek oluşturun. Bir XLNet dizisi aşağıdaki biçime sahiptir:

- tek dizi: `X <sep> <cls>`
- dizi çifti: `A <sep> B <sep> <cls>`

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

```python
convert_tokens_to_string(tokens)
```

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/cpm/tokenization_cpm.py#L225)

Tek bir dizideki token dizisini (alt kelimeler için dizeler) dönüştürür.

#### 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[int], token_ids_1: list[int] | None = None)
```

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/cpm/tokenization_cpm.py#L283)

**Parametreler:**

token_ids_0 (`list[int]`) : Kimlik listesi.

token_ids_1 (`list[int]`, *isteğe bağlı*) : Sıralı çiftler için isteğe bağlı ikinci kimlik listesi.

**Dönüş:** `list[int]`

Verilen dizilere göre [token type kimlikleri](../glossary#token-type-ids) listesi.

Sıralama çifti sınıflandırma görevinde kullanılacak şekilde, iletilen iki diziden bir maske oluşturun. Bir XLNet

sequence pair mask aşağıdaki formata sahiptir:

```
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` ise, bu yöntem maskenin yalnızca ilk bölümünü (0'ları) döndürür.

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

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

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/cpm/tokenization_cpm.py#L255)

**Parametreler:**

token_ids_0 (`list[int]`) : Kimlik listesi.

token_ids_1 (`list[int]`, *isteğe bağlı*) : Sıralı çiftler için isteğe bağlı ikinci kimlik listesi.

already_has_special_tokens (`bool`, *isteğe bağlı*, varsayılan `False`) : Token listesinin, model için özel token'larla zaten biçimlendirilmiş olup olmadığı.

**Dönüş:** `list[int]`

[0, 1] aralığında tamsayıların bir listesi: özel bir jeton için 1, bir dizi jetonu için 0.

Özel token eklenmemiş bir token listesinden dizi kimliklerini alır. Bu yöntem, tokenizer'ın `prepare_for_model` yöntemi kullanılarak özel token eklenirken çağrılır.

## 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)
```

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/cpm/tokenization_cpm_fast.py#L28)

Jieba-RS segmentasyon aracıyla ön-tokenizasyonu çalıştırır. CPM modellerinde kullanılır.

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

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

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/cpm/tokenization_cpm_fast.py#L145)

**Parametreler:**

token_ids_0 (`list[int]`) : Özel jetonların ekleneceği kimliklerin listesi.

token_ids_1 (`list[int]`, *isteğe bağlı*) : Sıralı çiftler için isteğe bağlı ikinci kimlik listesi.

**Dönüş:** `list[int]`

Uygun özel jetonlarla [girdi kimlikleri](../glossary#input-ids) listesi.

Sınıflandırma görevleri için bir dizi veya dizi çiftinden model girdilerini birleştirerek ve özel jetonlar ekleyerek oluşturun. Bir XLNet dizisi aşağıdaki biçime sahiptir:

- tek dizi: `X <sep> <cls>`
- dizi çifti: `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[int], token_ids_1: list[int] | None = None)
```

[Kaynak](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/cpm/tokenization_cpm_fast.py#L170)

**Parametreler:**

token_ids_0 (`list[int]`) : Kimlik listesi.

token_ids_1 (`list[int]`, *isteğe bağlı*) : Sıralı çiftler için isteğe bağlı ikinci kimlik listesi.

**Dönüş:** `list[int]`

Verilen dizilere göre [token type kimlikleri](../glossary#token-type-ids) listesi.

Sıralama çifti sınıflandırma görevinde kullanılacak şekilde, iletilen iki diziden bir maske oluşturun. Bir XLNet

sequence pair mask aşağıdaki formata sahiptir:

```
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` ise, bu yöntem maskenin yalnızca ilk bölümünü (0'ları) döndürür.

