Transformer 编码器

Transformer 编码器通常用于 NLP 任务。它是 BERT、RoBERTa、DistilBERT 等模型的主干,也是 T5 模型的编码器部分。

整体的 Transformer 编码器由 N 个相同的层组成,每一层有两个主要的子层:

  1. 多头自注意力机制(Multi-Head Self-Attention)
  2. 前馈神经网络(Feed-Forward Neural Network,FNN)

每个子层都有残差连接和层归一化。

输入嵌入(Input Embeddings)
	→ [添加位置编码]
	→ [编码器层 1]
	→ [编码器层 2]
	→ ...
	→ [编码器层 N]
	→ 最终编码器输出

单个编码器层内部结构:

输入
	→ [多头自注意力 + 相加与归一化]
	→ [前馈网络 + 相加与归一化]
	→ 输出

1. 输入嵌入 + 位置编码

2. 多头自注意力机制

3. 相加与归一化

4. 前馈神经网络(FFN)

5. 再次相加与归一化

6. 最终输出

Read more...

Tokenization 和 Word Embedding

Tokenization 和 Word Embedding 是在进行任何其他 NLP 处理之前的两个常见过程。原因是 AI 模型只能处理数字作为输入和输出,但 NLP 处理的目标主要是语言数据,如单词或句子。因此需要 tokenization 和 word embedding 将自然语言转换为数字,以便 AI 模型可以处理它们。

什么是 Tokenization?

Tokenization 通常非常简单直接。对于给定的单词序列,tokenization 会将它们转换为一系列数字。通常一个序列单元对应输出数字序列中的一个数字。

在 Hugging Face Transformer 库的某些 tokenizer 中,输出通常会添加两个特殊标记:[CLS] 和 [SEP],分别表示序列的开始和结束。

"你好,世界!" → ["CLS", "你好", ",", "世界", "!", "[SEP]"]

在 Hugging Face Transformer 库中,我们可以这样使用 tokenization:

from transformers import BertTokenizer

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")

text = "Hello, world!"
tokens = tokenizer(text, return_tensors="pt")

print(tokens)
print(tokenizer.convert_ids_to_tokens(tokens["input_ids"][0]))

输出:

{'input_ids': tensor([[ 101, 7592, 1010, 2088,  999,  102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1]])}

['[CLS]', 'hello', ',', 'world', '!', '[SEP]']

什么是 Word Embedding?

现在我们可以使用 tokenization 将原始文本转换为模型的结构化输入。但仍然存在一些问题:

Read more...