Tokens and Embeddings
#deepLearning/llm/2
基于单词(Word-based)的分词
将文本字符串分割成单词作为最小单位。这种方法的基本原则是:每个空格、标点符号、换行符等自然语言的分隔符都作为分词的边界。 ![[word-based spilt.png]]
词汇表大小和ID分配:基于单词的分词方法会将每个独立的单词分配一个唯一的 ID,ID 从 0 开始到词汇表的大小。为了完全覆盖一种语言,必须为每个单词分配一个 ID,这样会生成一个非常大的词汇表。例如,英语中有超过 500,000 个单词,需要为每个单词创建一个标识符。
相似词问题:基于单词的分词方法将每个词当作独立的 token,像“dog”和“dogs”或“run”和“running”这样的词会被视为不相关的 token,而忽略它们的相似性。
未知词(Unknown token):如果词汇表中没有某个单词,tokenizer 会使用一个特殊的“未知”标记(通常为 “[UNK]” 或 “”)表示该单词。这通常是个不好的信号,表示分词器无法识别该词的合理表示,可能会导致信息丢失。
减少未知词:为了减少“未知”标记的出现,可以使用更细粒度的分词方法,如基于字符的分词器(character-based tokenizer),从而降低词汇表的需求,并帮助模型更好地处理词形变化。
基于字符(Character-based)的 tokenization
将文本拆分为字符,而不是单词,每个字符作为一个独立的 token。 ![[char-based spilt.png]] 基于字符的分词方法虽然解决了OOV问题,但字符本身缺乏语义信息,且会产生大量tokens,增加计算复杂度。
基于子词(subword)的 tokenization
subword 算法把 tokenization 分为两部分,保持空间效率的同时具有语义意义(只需要两个 tokens 就能表示一个长词)
![[Subword token.png]]
prompt = "Write an email apologizing to Sarah for the tragic gardening mishap. Explain how it happened.<|assistant|>" |
Pipeline 内部
pipeline 集成了三个步骤:预处理、模型计算和后处理: ![[Pipeline 内部.png]] ## 使用 tokenizer( tokenizer )进行预处理
与其他神经网络一样,Transformer 模型无法直接处理原始文本,因此管道的第一步是将文本输入转换为模型能够理解的数字。为此,我们使用 tokenizer( tokenizer ),它将负责:
- 将输入拆分为单词、子单词或符号(如标点符号),称为 token
- 将每个标记(token)映射到一个数字,称为 input ID
- 添加模型需要的其他输入,例如特殊标记(如
[CLS]
和[SEP]
) - 位置编码:指示每个标记在句子中的位置。
- 段落标记:区分不同段落的文本。
- 特殊标记:例如 [CLS] 和 [SEP] 标记,用于标识句子的开头和结尾。
tokenizer = AutoTokenizer.from_pretrained(model_name) |
当有了 tokenizer,把 prompt 传给它,会得到 Input ID
prompt = "Write an email apologizing to Sarah for the tragic gardening mishap. Explain how it happened.<|assistant|>" |
Transformers 通常有三个维度:
- Batch size(批次大小):一次处理的序列数。
- Sequence length(序列长度):表示序列(句子)的长度。
- Hidden size(隐藏层大小):每个模型输入的向量维度。
将预处理的之后的值输入到模型中,会得到以下输入:
outputs = model(**inputs) |
Embedding
Word Embedding (与 LLM 无关)
Word2vec会显示意思相近的词源,但对于上下文意思不同但词源相同的文本 outputs 还是一样的。
import gensim.downloader as api |
上下文相关的 Embedding
Contextualized Word Embeddings From a Language Model (Like BERT)
from transformers import AutoModel, AutoTokenizer |
output.shape |
for token in tokens['input_ids'][0]: |
output |
文本向量(句向量)
Text Embeddings (For Sentences and Whole Documents)
from sentence_transformers import SentenceTransformer |
vector.shape |