Lazy loaded image
🗒️Transformer的理解,参考《Attention is all you need》
字数 3335阅读时长 9 分钟
2025-7-16
2025-7-19
type
status
date
slug
summary
tags
category
icon
password
comments
😀
Transformer的相关理解
 
神经网络的本质是给线性函数套上激活函数,然后不断地组合
Transformer出现之前,RNN没办法理解上下文的长语境

Transformer的结构

notion image

Transformer的输入是什么

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

1.Tokenization

1.1tokenization的作用

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

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
notion image
使用subword划分符合英文词群,能够充分表达意思
notion image
三个主要的方法:WordPiece,Unigram,Byte-Pair Encoding
总结:
notion image
典型模型
notion image

1.3四种常用的Subword Tokenizers

1)Byte-Pair Encoding(BPE)
主要包含两部分:词频统计词表合并
notion image
BPE合并的次数是超参数,需要设定合并到一定的次数后停止合并
notion image
2)WordPiece
notion image
notion image
notion image
 
3)Unigram
notion image
notion image
notion image
notion image
notion image
计算很耗时
4)SentencePiece
notion image
例子
notion image
各个方法的优劣
notion image

1.4tokenization的计算方法

将文字放入模型中训练的时候,实际上训练的并不是文字,而是数字。建立一个向量词典,把每个可能出现的数字和一个个独立的数字对应上
notion image
每个token的维度为768维(64*12)

2.Attention 注意力机制

给每个词一个位置编码,表示词出现在句子中的位置信息,此时的问题是,每个词还没有其他词的上下文信息
notion image
用WQ矩阵和q向量相乘(WQ矩阵是可以通过训练过程学习的一组权重值)WK,WV矩阵同理
notion image
notion image
 
notion image
对应其他词向量也重复操作,得到自己对应的QKV向量
注(实际运算中是通过拼接而成的大矩阵乘法,得到包含所有词向量的QKV矩阵)
notion image
之后让q1和k2做点积,表示两个向量的相似度是多少,同理,和k3做点积,和自己做点积……
notion image
计算出点积后,分别和v向量相乘后再相加后得到a1,此时a1表示在第一个词的视角下,按照和他相似度大小,按权重把每个词的词向量都加到了一起,把所有上下文的信息都包含在了第一个词当中
notion image

2.1 Multi-head Attention 多头注意力机制

进一步优化:如果只经过一次计算,灵活性会大大降低。经过两个权重矩阵,计算两次,然后拼接起来。
notion image
多头注意力机制细节
notion image
计算公式
notion image

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 对上述代码的解释:
  1. output = nn.Linear(d_model, d_model * 4)(output):这将对输入数据应用线性变换,即 y = xA^T + b。输入和输出的大小分别为 d_model 和 d_model * 4。此变换增加了输入数据的维度。
  1. output = nn.ReLU()(output):这会逐个元素地应用整流线性单元 (ReLU) 函数。它用作激活函数,为模型引入非线性,使其能够学习更复杂的模式。
  1. 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)添加最后的残差连接和层归一化
 
💡
欢迎您在底部评论区留言,一起交流~
 
上一篇
读论文的一些碎碎念
下一篇
如何读一篇论文

评论
Loading...