type
status
date
slug
summary
tags
category
icon
password
comments
Transformer的相关理解
神经网络的本质是给线性函数套上激活函数,然后不断地组合
Transformer出现之前,RNN没办法理解上下文的长语境
Transformer的结构

Transformer的输入是什么

输入数字化,文字数字化,数字向量化,矩阵加上位置信息
将输入划分成一个一个单词,输入每个单词对应的id

1.Tokenization
1.1tokenization的作用:
1.将文本序列转化成数字序列,作为Transformer的输入
2.是训练和微调llm必不可少的一部分

1.2三种不同分词颗粒度的Tokenizers
1)Word-based
将文本划分成一个个词(包括标点)
“Don’t you love 😂 Transformers?We sure do.”
[“Don’t”,“you”,”love”,”😂”,”Transformers?”,”We”,”sure”,”do.”]
没有把标点分开
[“Don’t”,“you”,”love”,”😂”,”Transformers“,”?”,”We”,”sure”,”do,”.”]
Don’t实际上是do not,应该划分成 do和n’t
需要引入各种各样的规则,会让事情变得复杂
基于Word-based的spaCy和Moses可以基于规则将英文规则划分的比较好
优点:符合人的自然语言和直觉
缺点:
1.例:dog→14,dogs→15 相同意思的词被划分为不同的token
2.词表非常大
可以限制词表大小,比如上限为10K,但是会造成信息丢失,效果大打折扣
2)Character-based
将文本划分为一个个字符(包括标点)
“What is your name?”
[”W”,”h”,”a”,”t”,”i”,”s”,”y”,”o”,”u”,”r”,”n”,”a”,”m”,”e”,”?”]
优点:
1.可以任意表示英文文本,不会出现word-based中的unknown情况
2.对西文来说,不需要很大的词表,英文只需要不到256个字符
缺点:
1.相对单词来说信息量非常低,模型性能一般很差
2.相对于word-based来说,会产生很长的Token序列
3.中文仍需要一个很大的词表
3)Subword-based

使用subword划分符合英文词群,能够充分表达意思

三个主要的方法:WordPiece,Unigram,Byte-Pair Encoding
总结:

典型模型

1.3四种常用的Subword Tokenizers
1)Byte-Pair Encoding(BPE)
主要包含两部分:词频统计和词表合并

BPE合并的次数是超参数,需要设定合并到一定的次数后停止合并

2)WordPiece



3)Unigram





计算很耗时
4)SentencePiece

例子

各个方法的优劣

1.4tokenization的计算方法
将文字放入模型中训练的时候,实际上训练的并不是文字,而是数字。建立一个向量词典,把每个可能出现的数字和一个个独立的数字对应上

每个token的维度为768维(64*12)
2.Attention 注意力机制
给每个词一个位置编码,表示词出现在句子中的位置信息,此时的问题是,每个词还没有其他词的上下文信息

用WQ矩阵和q向量相乘(WQ矩阵是可以通过训练过程学习的一组权重值)WK,WV矩阵同理



对应其他词向量也重复操作,得到自己对应的QKV向量
注(实际运算中是通过拼接而成的大矩阵乘法,得到包含所有词向量的QKV矩阵)

之后让q1和k2做点积,表示两个向量的相似度是多少,同理,和k3做点积,和自己做点积……

计算出点积后,分别和v向量相乘后再相加后得到a1,此时a1表示在第一个词的视角下,按照和他相似度大小,按权重把每个词的词向量都加到了一起,把所有上下文的信息都包含在了第一个词当中

2.1 Multi-head Attention 多头注意力机制
进一步优化:如果只经过一次计算,灵活性会大大降低。经过两个权重矩阵,计算两次,然后拼接起来。

多头注意力机制细节

计算公式

2.2 Q、K、V三个矩阵
Wq、Wk、Wv 是三个矩阵,其维度定义为 (d_model, d_model) = [64, 64]。所有值均为随机分配。这在神经网络中被称为线性层或可训练参数。可训练参数是模型在训练过程中学习并自我更新的值。
为了获得我们的 Q、K、V 值,我们在输入嵌入矩阵 X 和三个矩阵Wq、Wk、Wv中的每一个之间进行矩阵乘法 (再次,它们的初始值是随机分配的)。
- Q = X*Wq
- K = X*Wk
- V = X*Wv
在自注意力中,QKV矩阵是相等的
2.3 残差连接和层归一化
残差连接(有时也称为跳过连接)是一种让原始输入X绕过一个或多个层的连接。
作用很简单:缓解梯度消失和梯度爆炸
这只是原始输入X与多头注意力层输出的简单相加。由于它们的形状相同,所以加起来很简单。
残差连接之后,流程进入层归一化。LayerNorm 是一种对网络中每层输出进行归一化的技术。具体方法是减去该层输出的平均值,再除以标准差。该技术用于防止某一层的输出过大或过小,避免导致网络不稳定。
2.4 前馈网络
一旦我们有了标准化的注意力权重(概率分数),它将通过位置前馈网络进行处理。
前馈网络(FFN)由两个线性层组成,中间有一个 ReLU 激活函数。我们来看看 Python 代码是如何实现的:
以ChatGPT 对上述代码的解释:
- output = nn.Linear(d_model, d_model * 4)(output):这将对输入数据应用线性变换,即 y = xA^T + b。输入和输出的大小分别为 d_model 和 d_model * 4。此变换增加了输入数据的维度。
- output = nn.ReLU()(output):这会逐个元素地应用整流线性单元 (ReLU) 函数。它用作激活函数,为模型引入非线性,使其能够学习更复杂的模式。
- output = nn.Linear(d_model * 4, d_model)(output):这会应用另一个线性变换,将维度降回 d_model。这种“先扩张后收缩”的模式在神经网络中很常见。
我们可以这样理解:这个前馈网络就是一个标准的神经网络模块,它的输入和输出都是注意力分数。它的目的是将注意力分数的维度从 64 扩展到 256,使信息更加细粒度,使模型能够学习更复杂的知识结构。之后,它再将维度压缩回 64,以便后续计算。
3.代码实现
3.1安装依赖
3.2 设置超参数
超参数是模型的外部配置,无法在训练期间从数据中学习。它们在训练过程开始之前设置,在控制训练算法的行为和训练模型的性能方面起着至关重要的作用。
3.3 准备数据集
3.4标记化
3.5词嵌入
3.6位置编码
生成位置信息嵌入表
添加位置信息
输出结果
3.7Transformer模块
1)准备QKV
2)重塑QKV
3)计算QK^T注意力
4)Mask
笔者学习时并未理解这一层的作用,后看李沐老师讲经典论文《Attention is all you need》中解释道,mask实际上的作用是遮挡t时刻后的数据,以保证训练和预测的时候,行为是一致的。
在注意力机制当中,会计算出全局的权重。但是在计算输出的时候,需要用mask遮挡,不要用t时刻以后的数据
5)SoftMax
6)计算V注意力
7)连接并输出
获得多头注意力模式
8)残差连接和层归一化
9)前馈网络
10)添加最后的残差连接和层归一化
欢迎您在底部评论区留言,一起交流~
- 作者:于淼
- 链接:https://yumiao1.com/article/23269159-6c5f-804a-a226-e486f3f02814
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。