mirror of
https://github.com/skindhu/Build-A-Large-Language-Model-CN.git
synced 2026-07-29 15:20:24 +08:00
add seventh chapter
This commit is contained in:
@@ -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])`):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user