add seventh chapter

This commit is contained in:
skindhu
2024-11-18 16:21:25 +08:00
parent 93c824127d
commit 22159816da
2 changed files with 30 additions and 30 deletions

View File

@@ -76,7 +76,7 @@
虽然我们可以使用预训练模型(例如 Word2Vec为机器学习模型生成嵌入但 LLM 通常会生成自己的嵌入,这些嵌入是输入层的一部分,并在训练过程中进行更新。将嵌入作为 LLM 训练的一部分进行优化,而不直接使用 Word2Vec有一个明确的优势就是嵌入能够针对特定的任务和数据进行优化。我们将在本章后面实现这样的嵌入层。此外LLM 还能够创建上下文化的输出嵌入,这一点我们将在第三章中讨论。
高维嵌入在可视化中面临挑战,因为我们的感官感知和常见的图形表示本质上只限于三维或更少的维度,这也是图 2.3 采用二维散点图展示二维嵌入的原因。然而,在处理 LLMs 时,我们通常使用的嵌入的维度远高于图 2.3 所示的维度。对于 GPT-2 和 GPT-3嵌入的大小通常称为模型隐状态的维度会根据具体的模型变体和大小而有所不同。这是性能与效率之间的权衡。以具体示例为例最小的 GPT-2 模型117M 和 125M 参数)使用 768 维的嵌入大小,而最大的 GPT-3 模型175B 参数)则使用 12,288 维的嵌入大小。
高维嵌入在可视化中面临挑战,因为我们的感官感知和常见的图形表示本质上只限于三维或更少的维度,这也是图 2.3 采用二维散点图展示二维嵌入的原因。然而,在处理 LLM 时,我们通常使用的嵌入的维度远高于图 2.3 所示的维度。对于 GPT-2 和 GPT-3嵌入的大小通常称为模型隐状态的维度会根据具体的模型变体和大小而有所不同。这是性能与效率之间的权衡。以具体示例为例最小的 GPT-2 模型117M 和 125M 参数)使用 768 维的嵌入大小,而最大的 GPT-3 模型175B 参数)则使用 12,288 维的嵌入大小。
本章接下来的部分将系统地介绍准备 LLM 使用的嵌入所需的步骤这些步骤包括将文本拆分为单词、将单词转换为token以及将token转化为嵌入向量。
@@ -98,7 +98,7 @@ print("Total number of character:", len(raw_text))
print(raw_text[:99])
```
另外,您可以在本书的 GitHub 仓库中找到名为 "the-verdict.txt" 的文件,网址是 [https://github.com/rasbt/LLMs-from-scratch/tree/main/ch02/01_main-chapter-code](https://github.com/rasbt/LLMs-from-scratch/tree/main/ch02/01_main-chapter-code)
另外,您可以在本书的 GitHub 仓库中找到名为 "the-verdict.txt" 的文件,网址是 [https://github.com/rasbt/LLM-from-scratch/tree/main/ch02/01_main-chapter-code](https://github.com/rasbt/LLM-from-scratch/tree/main/ch02/01_main-chapter-code)
便于演示的目的print命令输出文件的总字符数以及前100个字符。
@@ -443,7 +443,7 @@ print(tokenizer.decode(tokenizer.encode(text)))
通过将上面的去token化文本与原始输入文本进行比较我们可以得知训练数据集即艾迪丝·华顿的短篇小说《判决》并不包含单词 "Hello" 和 "palace"。
到目前为止,我们已经讨论了分词作为处理文本输入到 LLMs 中的重要步骤。根据不同的 LLM一些研究人员还考虑其他特殊token例如以下几种
到目前为止,我们已经讨论了分词作为处理文本输入到 LLM 中的重要步骤。根据不同的 LLM一些研究人员还考虑其他特殊token例如以下几种
+ [BOS]序列开始这个token表示文本的起始位置指示 LLM 内容的开始。
+ [EOS]序列结束这个token位于文本的末尾在连接多个无关文本时特别有用类似于 <|endoftext|>。例如,在合并两个不同的维基百科文章或书籍时, [EOS] token指示一篇文章结束和下一篇文章开始。
@@ -903,7 +903,7 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
>
> **嵌入层与矩阵乘法**
>
> 对于那些熟悉独热编码的人来说,上述嵌入层方法本质上只是实现独热编码后再进行矩阵乘法的一种更高效的方式,相关内容在 GitHub 的补充代码中进行了说明,链接为[https://github.com/rasbt/LLMs-from-scratch/tree/main/ch02/03_bonus_embedding-vs-matmul](https://github.com/rasbt/LLMs-from-scratch/tree/main/ch02/03_bonus_embedding-vs-matmul)。由于嵌入层只是独热编码和矩阵乘法方法的更高效实现,因此可以视为一个可以通过反向传播进行优化的神经网络层。
> 对于那些熟悉独热编码的人来说,上述嵌入层方法本质上只是实现独热编码后再进行矩阵乘法的一种更高效的方式,相关内容在 GitHub 的补充代码中进行了说明,链接为[https://github.com/rasbt/LLM-from-scratch/tree/main/ch02/03_bonus_embedding-vs-matmul](https://github.com/rasbt/LLM-from-scratch/tree/main/ch02/03_bonus_embedding-vs-matmul)。由于嵌入层只是独热编码和矩阵乘法方法的更高效实现,因此可以视为一个可以通过反向传播进行优化的神经网络层。
之前我们已经看到如何将单个token ID 转换为三维嵌入向量。现在让我们将其应用于之前定义的所有四个输入 ID`torch.tensor([2, 3, 5, 1])`