# CPM

## Tổng quan

Mô hình CPM được đề xuất trong [CPM: A Large-scale Generative Chinese Pre-trained Language Model](https://huggingface.co/papers/2012.00413) bởi 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.

Tóm tắt từ bài báo như sau:

*Các mô hình ngôn ngữ được huấn luyện trước (PLM) đã chứng minh được lợi ích của chúng đối với nhiều tác vụ NLP hạ nguồn khác nhau. Gần đây, GPT-3, với 175 tỷ tham số và 570GB dữ liệu huấn luyện, đã thu hút nhiều sự chú ý nhờ khả năng học ít mẫu (thậm chí không mẫu). Tuy nhiên, việc áp dụng GPT-3 để giải quyết các tác vụ NLP tiếng Trung vẫn còn nhiều thách thức, vì tập dữ liệu huấn luyện của GPT-3 chủ yếu là tiếng Anh và các tham số không được công bố công khai. Trong báo cáo kỹ thuật này, chúng tôi công bố Mô hình Ngôn ngữ được Huấn luyện trước cho tiếng Trung (CPM) với huấn luyện trước theo phương pháp sinh trên dữ liệu huấn luyện tiếng Trung quy mô lớn. Theo hiểu biết của chúng tôi, CPM, với 2,6 tỷ tham số và 100GB dữ liệu huấn luyện tiếng Trung, là mô hình ngôn ngữ được huấn luyện trước lớn nhất cho tiếng Trung, có thể hỗ trợ một số tác vụ NLP tiếng Trung hạ nguồn, chẳng hạn như hội thoại, tạo bài luận, bài kiểm tra điền từ và hiểu ngôn ngữ. Các thí nghiệm rộng rãi cho thấy CPM đạt hiệu suất mạnh mẽ trên nhiều tác vụ NLP trong các thiết lập học ít mẫu (thậm chí không mẫu).*

Mô hình này được đóng góp bởi [canwenxu](https://huggingface.co/canwenxu). Bản triển khai gốc có thể được tìm thấy tại đây: https://github.com/TsinghuaAI/CPM-Generate

Kiến trúc của CPM giống với GPT-2, ngoại trừ phương pháp tokenization. Tham khảo [tài liệu GPT-2](gpt2) để biết thông tin tham chiếu API.

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

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm.py#L34)

Chạy tiền phân tách token bằng công cụ phân đoạn Jieba-RS. Nó được sử dụng trong các mô hình 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)
```

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm.py#L230)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID mà các token đặc biệt sẽ được thêm vào.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

**Trả về:** `list[int]`

Danh sách [input IDs](../glossary#input-ids) với các token đặc biệt phù hợp.

Xây dựng đầu vào mô hình từ một chuỗi hoặc một cặp chuỗi cho các tác vụ phân loại chuỗi bằng cách nối và thêm các token đặc biệt. Một chuỗi XLNet có định dạng như sau:

- một chuỗi đơn: `X <sep> <cls>`
- cặp chuỗi: `A <sep> B <sep> <cls>`

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

```python
convert_tokens_to_string(tokens)
```

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm.py#L225)

Chuyển đổi một chuỗi các token (chuỗi ký tự cho các từ con) trong một chuỗi duy nhất.

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

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm.py#L283)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

**Trả về:** `list[int]`

Danh sách [token type IDs](../glossary#token-type-ids) theo chuỗi được cho.

Tạo một mask từ hai chuỗi được truyền vào để sử dụng trong một tác vụ phân loại cặp chuỗi. Một XLNet

mặt nạ cặp chuỗi có định dạng như sau:

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

Nếu `token_ids_1` là `None`, phương thức này chỉ trả về phần đầu tiên của mask (các số 0).

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

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm.py#L255)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

already_has_special_tokens (`bool`, *tùy chọn*, mặc định là `False`) : Xác định xem danh sách token đã được định dạng với các token đặc biệt cho mô hình hay chưa.

**Trả về:** `list[int]`

Một danh sách các số nguyên trong khoảng [0, 1]: 1 cho một token đặc biệt, 0 cho một token chuỗi.

Lấy các id của chuỗi từ một danh sách token chưa được thêm token đặc biệt. Phương thức này được gọi khi thêm token đặc biệt bằng cách sử dụng phương thức `prepare_for_model` của 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)
```

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm_fast.py#L28)

Chạy tiền phân tách token bằng công cụ phân đoạn Jieba-RS. Nó được sử dụng trong các mô hình 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)
```

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm_fast.py#L145)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID mà các token đặc biệt sẽ được thêm vào.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

**Trả về:** `list[int]`

Danh sách [input IDs](../glossary#input-ids) với các token đặc biệt phù hợp.

Xây dựng đầu vào mô hình từ một chuỗi hoặc một cặp chuỗi cho các tác vụ phân loại chuỗi bằng cách nối và thêm các token đặc biệt. Một chuỗi XLNet có định dạng như sau:

- một chuỗi đơn: `X <sep> <cls>`
- cặp chuỗi: `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)
```

[Nguồn](https://github.com/huggingface/transformers/blob/main/src/transformers/models/cpm/tokenization_cpm_fast.py#L170)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

**Trả về:** `list[int]`

Danh sách [token type IDs](../glossary#token-type-ids) theo chuỗi được cho.

Tạo một mask từ hai chuỗi được truyền vào để sử dụng trong một tác vụ phân loại cặp chuỗi. Một XLNet

mặt nạ cặp chuỗi có định dạng như sau:

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

Nếu `token_ids_1` là `None`, phương thức này chỉ trả về phần đầu tiên của mask (các số 0).

