本系列生成式人工智能导论博文基于国立台湾大学李宏毅老师发布的课程视频整理而来, 仅用作复习参考.
可以算是人工智能领域的入门课程.
需要明确的是, 李宏毅老师上传的课程已经是2024年的课程, 距今有两年的时间, 知识难免有过时的可能, 如果出现了这种情况, 博主会尽可能补足当前的状态.
生成式人工智能导论 Chap.4 语言模型的内里细节与评估方式
我们回顾下前几章中所说的:
- 模型的本质是一个含有大量参数的函式, 其训练过程就是将这些参数确定的过程.
- 函式的参数量过大, 需要使用一个特定的表示方式, 在当前, 通常使用 类神经网络 来表示它.
最出名的类神经网络我们也提到过, 相信对各位也耳熟能详: Transformer
4.1 Transformer 概述
模型的演进并非一步到位, 事实上, Transformer之前有很多别的模型架构, 例如RNN, Feed-forward Network等等. 不过限于本课程的导论性质, 我们只对当下最流行的Transformer进行简要介绍.
Transformer通过以下五层, 将输入转化为概率分布进行输出:
- Tokenization
- Input Layer
- Attention
- Feed Forward
- Output Layer
值得注意的是, 3与4这两层被并称为一个 Transformer Block , 而这一个结构事实上在一个类神经网络中具有多层, 模型会反复思考, 最终才能得到输出.
4.1.1 Tokenization
Tokenization这一层的目的是将输入的语句转化为Token Sequence. 简单来讲, 就是把我们的输入切成一段一段的, 这被切开的每一份叫做一个Token.
显然, 分割这个工作是需要相应的标准的 (就连split函数都需要传入切割参数呢, 你说是吧) , Tokenization也不例外, 它通过一个预先设定好的 Token list 来进行分割.
当然, 这个Token list怎么来呢? 方法比较五花八门. 比较常用的一个是通过一种叫 Byte Pair Encoding(BPE) 的方式, 通过大量文字以及前后文的关联连接性, 来得到Token list.
4.1.2 Input Layer
Input Layer的目的是让模型 理解 每一个Token都是什么意思.
欸, 怎么理解呢? 在机器学习中, 这个步骤在做的就是将每一个Token都变成一个Vector(向量), 这个过程也被我们称为 Embedding .
注: 从严谨性上来看, 我们应该使用Vector, 但实际上, 我们常常直接用Embedding来直接指代某个Token的对应向量, 只是一种习惯性表述.
为啥转化成向量, 模型就能理解词义了呢? 事实上, 原先一个Token的形式, 对机器而言只是一个标识, 但Embedding不同, 它能够被量化了, 这意味着机器可以通过计算向量间的距离来具体得知两个词的含义是否相近. 也相应地就是一种词义的理解工作.
好, 现在的问题是, 每个Token对应的Embedding是从哪里来的呢?
相信各位应该很容易想到, 我们只要把Token list中所有的Token的Embedding提前算出来不就好了?
没错! 这个东西确实存在, 并且就叫做 Token Embedding , 它本质上就是一个映射表, 将每个Token映射到其对应的Embedding上. 至于这个东西怎么来, 就是我们训练时期的工作了.
实际上, 每个Token对应的Embedding正是组成我们模型中未知参数的一部分, 甚至可以说是一大部分.
到现在为止, 我们已经得到了一个句子中每个Token的Embedding, 但实际上, 还有个对于词义比较关键的东西, 我们没考虑:
这个Token在句子中的 位置 .
举个简单的例子:
“我爱你” 跟 “你爱我” . 如果不考虑这种位置信息, 这两句话在模型中就是同一个意思. (我靠, 这简直乱套了)
因此, 除了Token本身的Embedding之外, 还有一种Embedding需要加在我们的Input Layer中, 它被称为 Positional Embedding . 这种Positional Embedding可以人为预先定义, 当然, 也可以通过在训练过程中找出.
4.1.3 Transformer Block
Transformer Block的目的是让模型能够考虑上下文. 它接受来自上一层Input Layer的Embedding, 结合上下文信息将其转化为融合了上下文信息的Embedding, 这种Embedding也有个专属名词: Contextualized Token Embedding .
好, 现在来看看Transformer Block这两层里面究竟干了点啥.
Step 1 Attention Weight
这一步是将我们所要结合上下文的Token(Selected Token)与这个句子中的每一个其它Token都进行一步计算, 得到两个Token之间的相关性, 这个相关性也有个专有名词: Attention Weight .
这个Attention Weight的计算也是通过一个函数(小模型)来进行的, 这个小模型的参数也是我们训练得到的.
Step 2 Weighted Sum
随后我们将计算出的相关性做一个带权加和, 计算出我们Attention层的最终输出:
Attention Matrix
我们会发现Attention这一层需要所有的Token两两计算出它们的Attention Weight, 这个计算过程可以跟线性代数中的矩阵一块来看:
更多…
事实上, 在实际运作时, 我们不会考虑下文, 也就是一个Token与其后面Token的相关性, 这一机制叫 Causal Attention .
此外, 关于相关性的计算, 往往也不会只通过一个小模型来计算. 这很好理解, 不同的词汇以不同的标准来看相关性显然是不同的. 事实上, 这种计算相关性的组数往往有8组甚至16组之多. 这个机制叫 Multi-head Attention .
显然, Multi-head Attention有了多组输出, 我们后面必须再加一个模块来将多组输出整合, 也就是Transformer Block中另一层Feed Forward要干的事情. Feed Forward本身也是一个模型, 其参数通过训练的过程确定下来, 会将多组来自Attention层的输出组合, 最终形成一个整合起来的Embedding.
而往往一个模型中会有很多很多这样的Transformer Block, 当然, 学术中为了简化称呼, 常常直接将一个Transformer Block成为一个Layer, 在经过很多层Layer的演算后, 最终的结果会被传给最下方一层, Output Layer.
4.1.4 Output Layer
Output Layer的目的是拿到最后一个Layer的输出, 并将其通过Linear Transform与Softmax两步, 形成一个关于词表的概率分布.
其中, Linear Transform负责将模型提取的抽象特征向量, 映射为词表中每一个词对应的原始分值, 又叫 Logits .
Softmax只负责将原始分值转化为总和为 1 的概率分布, 从而明确每个词作为下一个输出的具体可能性.
至此, 我们对Transformer有了一个简要的了解.





