Transformer
本文最后更新于61 天前,其中的信息可能已经过时,如有错误请留言

基于吴恩达的视频课程:  How Transformer LLMs Work – DeepLearning.AI

前期知识:
http://www.skyshin34.com/机器学习2-线性回归与感知机/
http://www.skyshin34.com/卷积神经网络/

下面几个章节将讲述语言以数字形式表示的演变过程:
词语言袋将单词表示为稀疏向量(数字数组)的算法,只是简单的记录单词的存在
然后是Word2vec,他的单词表示几个相邻单词的上下文中捕捉的单词的含义,最后是transformer

近期AI语言模型的发展历程

Non-Transformer Models(2017年前)
在Transformer出现之前,主流的语言模型主要基于循环神经网络(RNN)和卷积神经网络(CNN)

  • RNN/LSTM/GRU:通过循环结构处理序列数据,但存在长距离依赖问题(如梯度消失/爆炸),难以并行化训练
  • Word2Vec/GloVe:基于词嵌入的静态表示模型,无法捕捉上下文动态语义。
  • ELMo(2018):首次引入上下文感知的词向量,通过双向LSTM提取多层特征,但仍是RNN的变体

特点:模型规模较小,计算效率低,难以处理长文本

Transformer架构的诞生(2017)

关键论文:Vaswani等人提出《Attention Is All You Need》(2017),用自注意力机制(Self-Attention)替代循环结构

  • 核心优势:并行化计算、长距离依赖建模、可扩展性强

基于Transformer的三大主流架构

(1) Encoder-Only Models(双向编码器)

特点:专注于理解上下文,适合分类、问答等任务
代表模型:

  • BERT(2018):通过掩码语言建模(MLM)和下一句预测(NSP)预训练,首次实现双向上下文编码
  • RoBERTa(2019):优化BERT的预训练策略(如移除NSP、增大数据量)
  • DeBERTa(2020):引入解耦注意力机制,提升细粒度语义建模能力

(2) Decoder-Only Models(自回归生成模型)

特点:单向生成文本,适合文本生成(如对话、续写)
代表模型:

  • GPT系列(2018-2023):从GPT-1到GPT-4,逐步扩大参数规模(175B到数万亿),采用自回归预训练
  • PaLM(2022):谷歌的540B参数模型,专注于Few-shot和Zero-shot学习
  • LLaMA(2023):Meta开源的轻量级高效模型(7B-65B参数)

(3) Encoder-Decoder Models(序列到序列模型)

特点:结合编码器和解码器,适合需要双向理解和生成的任务(如翻译、摘要)
代表模型:

  • BART(2019):通过去噪自编码预训练,支持多种生成任务
  • T5(2020):统一所有NLP任务为“文本到文本”格式,使用多任务预训练
  • Flan-T5/Flan-UL2(2022):通过指令微调(Instruction Tuning)提升模型泛化能力

文本预处理

文本清洗:净化原始文本数据

文本清洗是预处理的第一步,根据具体任务需求去除文本中的噪声数据,提高后续处理的准确性。

分词Tokenization:将所有单词进行划分为单独的单词,每个单独的单词叫词元Token

  • 英文分词方法
    • 英文分词相对简单,主要基于空格和标点分割
  • 中文分词技术:
    • 中文没有明显的词边界,分词更为复杂。主要方法包括:
    • 基于词典的分词:最大匹配法、最短路径法
    • 基于统计的分词:HMM、CRF等序列标注方法
    • 基于深度学习的分词:BiLSTM-CRF、BERT等模型

文本表示(文本编码)

将非结构化的文本数据转化为计算机可以处理的数值形式

词袋模型(Bag of Words)

忽略词语顺序和语法,只关注词语是否出现

  • 构建词汇表Vocabulary,统计文档中出现词汇
  • 再将每一篇文档表示为与词汇表长度一致的高维向量,向量中的每个维度唯一对应词汇表中的一个词元,维度取值通常为该词元在文档中的出现次数,最终表示为一个高维稀疏向量


向量化Vector Representation:表示就是对每个单词在前面定义的单词表中频率的一个统计
以 My cat is cute 为例:

优缺点分析

  • 优点:
    • 实现简单,计算效率高
    • 适用于小规模数据集和简单任务
  • 缺点:
    • 把文本看作“单词的集合”,忽略词序和语义信息
    • 高维稀疏性问题
    • 无法处理同义词和多义词

词嵌入 Word Embedding(词向量表示方法

把每个词映射到实数向量

Word2Vec 如何学习单词间的语义关系:

通过Word2Vec 这类浅层深度学习模型进行训练;模型以句子内共现的词为正样本、随机词为负样本,通过不断拉近相关词的向量、推远不相关词的向量)

勘误:所以就是增加对应维度的值和减少对应维度的值,是吗

最终将每个离散的词元映射为包含语义信息的连续低维向量(词袋模型的维度由整个词汇表的词数量决定,因此呈现高维稀疏;而词嵌入的维度是人为预设的相关词元固定向量长度,与词汇表大小无关,因此是低维稠密)

每个单词被表示为一串高维数字(比如 1024 维),这些数字是模型通过复杂计算自动学到的 “语义特征”,语义相近的单词,它们的数字向量会彼此靠近;语义不同的单词,向量则相距较远

这些词向量所在高维空间叫潜空间,词向量之间的相关性可以通过余弦相似度和点积计算

上下文感知的表示(Transform结构中的一部分,在词嵌入之后)

BERT(Bidirectional Encoder Representations from Transformers)是 Google 提出的预训练语言模型。具体见“利用注意力机制对上下文进行编码和解码”部分

关键创新

  • Transformer 架构
  • 掩码语言模型(MLM)训练目标
  • 下一句预测(NSP)任务

总结

文本表示方法的发展经历了从简单统计到深度学习的演进:

  1. 传统方法:简单高效,适合小规模数据
  2. 词向量:捕捉语义关系,维度低
  3. 上下文感知模型:动态表示,效果最好但计算成本高

注意力机制

注意力机制(Attention Mechanism)是深度学习中的一种重要技术,它模仿了人类视觉和认知过程中的注意力分配方式。就像你在阅读时会不自觉地将注意力集中在关键词上一样,注意力机制让神经网络能够动态地关注输入数据中最相关的部分

  • 注意力机制的核心思想是:根据输入的不同部分对当前任务的重要性,动态分配不同的权重。这种权重分配不是固定的,而是根据上下文动态计算的
  • 注意力机制通常可以表示为:

\[ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]

其中:

  • Q(Query)、K(Key)、V(Value)是通过输入线性变换得到的矩阵。
    • Q (Query):当前需要计算输出的查询项
    • K (Key):用于与查询项匹配的键
    • V (Value):与键对应的实际值
  • d_k:键的维度,是缩放因子,防止点积过大导致梯度消失。

为什么需要注意力机制?

  1. 解决长距离依赖问题:传统RNN难以捕捉远距离词语间的关系
  2. 并行计算能力:相比RNN的顺序处理,注意力可以并行计算
  3. 可解释性:注意力权重可以直观展示模型关注的重点

自注意力机制(Self-Attention)

自注意力是注意力机制的一种特殊形式,它允许输入序列中的每个元素都与序列中的所有其他元素建立联系。

工作原理

  • 用这些权重对对应的值进行加权求和,得到输出
  • 对输入序列中的每个元素,计算其与所有元素的相似度得分
  • 使用softmax函数将这些得分转换为权重(0-1之间)

自注意力的优势

  1. 全局上下文感知:每个位置都能直接访问序列中所有位置的信息
  2. 位置无关性:不依赖序列顺序,适合处理各种结构化数据
  3. 高效计算:相比RNN的O(n)复杂度,自注意力可以并行计算

多头注意力(Multi-Head Attention)

多头注意力是自注意力的扩展,它将注意力机制并行执行多次,然后将结果拼接起来

结构组成

  1. 多个注意力头:通常使用8个或更多并行的注意力头
  2. 线性变换层:每个头有自己的Q、K、V变换矩阵
  3. 拼接和输出:将各头的输出拼接后通过线性层

多头注意力的优势

  1. 捕捉不同关系:每个头可以学习关注不同方面的关系
  2. 增强表达能力:比单头注意力有更强的特征提取能力
  3. 稳定训练:多个头的组合可以减少模型对特定模式的依赖

利用注意力机制对上下文进行编码和解码

前置知识:http://www.skyshin34.com/循环神经网络-rnn/

单词到向量的静态嵌入,无论上下文如何,单词bank生成的词嵌入是相同的,但是bank既可以指银行,也可以指河畔,其意义应该和上下文而变化。捕捉文本上下文对于执行一些语言任务比如翻译任务很重要

在 Transformer 出现之前,NLP 处理句子、上下文,唯一的主流方案就是循环神经网络

  • RNN/LSTM 是按顺序一个词一个词往后读
  • 它的思路:处理第 5 个词时,把前面 1-4 个词的信息 “藏” 在一个叫「隐藏状态」的向量里带过来
  • 目的:模拟 “记住上下文”

具体来说RNN 处理每个单词时,会 “记住” 前面单词的信息(通过 “额外输入前一步的计算结果”),把整句话的顺序、上下文都揉进最终的语义里,这是静态词嵌入,或者说传统神经网络做不到的

这些RNN用于两个任务,编码或表示句子输入,解码或生成句子输出。
例如下面ppt,将I love llamas 翻译成荷兰语。文本通过编码器传递,试图通过一个嵌入表示整个序列,解码器使用嵌入进而生成语言

每一步在这个架构中都是自回归Auto regressive的,它会将某一次的输入和输出都作为下一次的输入,直到整个输出生成。大多数模型都是自回归的,因此在每次生成时都会生成一个标记

进一步探讨,我们首先将 I love llamas,使用单词到向量创建嵌入作为输入,编码器一次处理整个序列并考虑嵌入的上下文;解码器负责生成语言,通过利用之前生成的上下文嵌入(context embedding)来生成最终的输出

然而,因为一个上下文嵌入就代表了整个输入,这使得处理更长的句子变得困难,单一的嵌入可能无法捕捉到长而复杂序列的全部上下文。

  • 短句子(比如 “I love llamas”):浓缩笔记能记下全部意思,没问题。
  • 长句子(比如 “我昨天在市中心新开的那家装修很有特色的咖啡馆里,和朋友一起喝了一杯口感醇厚的拿铁,还聊了很多关于旅行的趣事”):浓缩笔记只能记下大概(比如 “喝咖啡、聊旅行”),但细节(在哪家咖啡馆、咖啡口感、聊了什么趣事)会被漏掉

2014年,注意力的解决方案诞生,极大改进了原始架构。使用注意力能够关注输入序列中相关的部分,放大他们的信号,选择性的确定句子中那些单词最重要

注意力机制

注意力机制的核心思路特别简单:不把整句话硬塞进一个 “浓缩笔记”,而是让模型 “按需关注” 句子里的关键部分。就像你读一篇长文章时,不会逐字逐句平均用力,而是自动聚焦和当前问题相关的段落

比如翻译英文句子:“The cat, which is black, is sleeping on the mat.
模型翻译 “猫” 时,注意力会重点关注“cat” 和 “black”(因为要说明是 “黑色的猫”),弱化 “which is”“on the mat” 等次要信息;
模型翻译 “垫子” 时,注意力会重点关注“mat”,弱化其他部分

我们可以再次使用Word2Vec嵌入来表示输入,并将这些嵌入传给编码器,所有输入单词的隐藏状态都传递给解码器。某个单词的隐藏状态是一个内部因素,他是一个RNN隐藏层的状态,包含了关于先前单词的信息。解码器使用注意力机制生成了语言,输出往往会更好。因为现在使用了每个单词的嵌入查看整个序列而不是使用更小和更有限的上下文嵌入,所以在生成过程中模型会关注最相关的输入

总结:

1.首先无论你是用RNN还是transform,首先得讲每个词转化为一个词向量,这样计算机才能识别出来。
我们选择的转化方法通常是词嵌入,因为它相比词袋模型,编码维度相对较低,词之间能体现相关性,为后面的训练做了基础准备

2.有了词向量就可以输入到神经网络训练了,经典的全连接神经网络无法表达词与词之间的顺序。但理解词汇需要考虑上下文,比如bank可以银行也可以是河对面

3.因此采用循环神经网络RNN,通过中间加一个隐藏状态在词与词之间传递。

也会有图这样画

将矩阵展开来看的话:

  • 第一个词X1和权重矩阵Wxh相乘得到第一个词的隐藏状态H1,H1和权重矩阵相乘,得到第一个词的输出结果Y1
  • 第二个词X2和权重矩阵相乘,但注意要将第一个输入的隐藏状态加到输入向量里,同时权重矩阵Wxh中也加Whh

公式表示:可以看出和经典的神经网络相比就是多了前一时刻的隐藏状态

然而基于RNN训练的过程依旧有2个问题:

  • 无法捕捉长期依赖(RNN串行处理,一个词一个词往后走,靠记忆单元存上下文,长句子容易 “忘前面)
  • 无法并行运行,效率太低

研究者为了解决 RNN 记不住长句子的问题,发明了注意力机制,并且最先用在 RNN 上面

  • 思路:不让 RNN 只靠 “藏状态” 硬记而是让它在处理当前词时,回头去看一遍整个句子,给重要的词分配更高权重相当于给 RNN 配了一个 “重点标记器”

在 Transformer 出现之前,已经有大量工作:RNN / LSTM + Attention(如 Seq2Seq+Attention、Bahdanau Attention、Luong Attention),这些模型确实大幅缓解了标准 RNN 的长程依赖问题,但依旧无法根除,既然注意力机制已经能很好地捕捉上下文,那我们干脆把 RNN 全部扔掉,只用注意力机制搭建一个全新的模型

4.5 Transformers

原论文:https://arxiv.org/abs/1706.03762

Transformer 架构是一种基于自注意力机制(Self-Attention)的深度学习模型

  • Transformer 彻底改变了自然语言处理(NLP)领域,并成为现代大语言模型(如GPT、BERT等)的核心基础
  • Transformer 与循环神经网络(RNN)类似,旨在处理自然语言等顺序输入数据,适用于机器翻译、文本摘要等任务。然而,与 RNN 不同,Transformer 无需逐步处理序列,而是可以一次性并行处理整个输入

Transformer 架构图

左边为编码器,右边为解码器

transformer 由堆叠的编码器和解码器块组成,这些块都包含之前说的相同的注意力机制,通过堆叠这些快可以增强编码器和解码器的强度:

  • Encoder(编码器)层:负责“读懂输入句子”,将文本转化为蕴含上下文信息的词嵌
    • 自注意力机制通过分析同一序列内词语间的关联(例如“猫”与“垫子”的语义关系),帮助编码器捕捉这些语义,无需依赖其他外部序列
  • Decoder(解码器)层:负责“写出输出句子/下一个词”,并且会参考编码器读懂的结果(如果是翻译那种任务)

1. 输入处理(底部)

  • Embeddings/Projections(嵌入/投影层)
    • 作用:将输入的单词(或 token)转换成数字向量(比如 “猫” → [0.2, -0.5, 0.7…])。 
    • 类比:就像给每个单词分配一个独特的”身份证号码”,但更智能(包含语义信息)。

2. 编码器(左侧)

  • Multi-Headed Self-Attention(多头自注意力)
    • 作用:让模型同时关注输入中的所有单词,并计算它们之间的关系。 
    • 举例:在句子”猫追老鼠”中,模型会学习”猫”和”老鼠”的关联比”猫”和”追”更强。 
    • 关键:并行处理所有单词,不像RNN需要逐个计算。
  • Norm(层归一化)
    • 作用:稳定训练过程,防止数值过大或过小(类似”调音量”到合适范围)。 
  • Feed-Forward Network(前馈神经网络)
    • 作用:对每个单词的表示进行进一步加工(比如提取更复杂的特征)。 
    • 类比:像对”猫”的向量做一次深度解读,补充细节(比如”猫是哺乳动物”)。

3. 解码器(右侧)

  • Masked Multi-Headed Self-Attention(掩码多头自注意力)
    • 作用:训练时防止模型”作弊”(只能看到当前和之前的单词,不能看未来的)。 
    • 举例:生成”我爱__”时,模型只能基于”我””爱”预测下一个词,不能提前知道答案是”你”。 
  • Multi-Headed Cross-Attention(多头交叉注意力)
    • 作用:让解码器询问编码器:”关于输入,我应该重点关注什么?” 
    • 场景:翻译任务中,解码器生成英文时,会参考编码器处理的中文输入。
  • Norm 和 Feed-Forward Network
    • 与编码器类似,对解码器的表示进行归一化和深度处理。

4. 输出(顶部)

  • Linear(线性层)
    • 作用:将解码器的输出映射到词表(比如预测下一个词是”你”的概率最高)。 
    • 举例:输入”我爱”,模型输出”你”的概率可能是80%,”吃饭”的概率是10%…

我们从单词随机向量表示开始,使用注意力机制,嵌入和更新它们,这些更新的嵌入向量由于注意力机制而包含更多的上下文信息。然后他们被传递给一个前馈神经网络,最终创建上下文化的单词嵌入

解码器可以接受任何之前生成的单词并将其传给掩蔽自注意力,类似于编码器来处理这些嵌入,生成中间嵌入并将其传递给另一个带有注意力的编码器,再将输出送入前馈神经网络,最终生成序列中的下一个单词

掩蔽自注意力和自注意力相比,它移除了所有上三角值,相当于掩蔽了未来的位置。因此,任何一个标记只能关注在它之前的标记,这有助于在生成输出时防止信息泄露

原始Transformer需处理完整编码器-解码器结构(如翻译任务),而文本分类仅需编码器提取语义特征,直接使用全架构会引入冗余计算。后续改进模型(如BERT)通过移除解码器、添加[CLS]标记和微调机制适配分类任务

Bert是一种仅编码的架构,他专注于表示语言并生成上下文化的词嵌入,这些编码块与前面的子注意力块相同。它的输入包含一个额外的分类标记,它被用作整个表示的输入。我们经常使用这个CLS token 作为微调的输入嵌入,在分类等特定任务上微调模型来训练一个bert模型

训练过程中,可以使用一种称为掩码语言模型的技术。掩码语言模型(MLM)通过随机遮盖输入文本中的部分词汇,迫使模型根据上下文预测被遮盖的词,以此学习双向语义关系。典型应用如BERT,遮盖15%的词并优化预测,使模型能同时捕捉左右语境,提升语义理解能力。

训练通常分为两步,首先在大量数据上应用掩码语言模型,这被称为预训练;然后对预训练模型进行微调,以适应多种下游任务

假设将另一个输入序列和随机初始化的嵌入只传递给解码器,进行不断堆叠,最终通过掩码技术和神经网络输出单词预测,这种实现方式就是我们熟知的GPT-1

上述模型都有一个共同的特征–上下文长度。上下文长度指模型单次处理文本的最大范围(如GPT-4支持32k token)。长文本超出限制会被截断,影响连贯性;短则可能遗漏关键信息。模型通过注意力机制捕捉上下文关系,但过长会增加计算负担,需权衡效率与语义完整性。

随着参数的增加,大模型的能力也随之提升,我们称2023年为生成式AI的一年

神经网络不是越复杂越好,参考线性回归的正则化系数和CNN的pooling,都是为了防止过拟合的技巧,CNN是神经网络结构的一种,但他只能处理静态数据,比如图片。对于时间序列,文本,语音,视频等动态数据,就需要引入另一种神经网络结构了

Transformer 的核心思想

自注意力机制(Self-Attention)

Transformer 的核心思想是完全依赖注意力机制(无需循环或卷积结构)来捕捉输入序列中的全局依赖关系,从而实现高效的并行计算和更强的长距离依赖建模。

于是有了:

  • Transformer = 完全不用 RNN/CNN,全程靠多头自注意力 + 前馈网络
  • 它的优势:
    • 可以并行计算,速度快很多
    • 长距离依赖直接解决,因为每个词都能直接看到所有词
    • 效果远超 RNN + 注意力

再后来:

  • BERT、GPT 都是基于 Transformer 架构

那 transformer 它是。他只靠注意力机制是怎么记住之前的词的

Transformer 并不像循环神经网络那样,通过逐步传递隐藏状态来 “记住” 前面的词。

在词嵌入那一步,Transformer 会给每个词:

  • 加上一个专门表示位置的向量
  • 最终输入模型的是:词向量 + 位置向量

它的做法是:先通过位置编码为每个词添加顺序信息,再将整句所有词的向量一次性输入多头自注意力机制;在注意力层中,每个词都会与句子中所有其他词计算相关性并分配权重,通过加权融合直接获取全部上下文信息,而不需要依靠记忆链条来保存过去的内容。因此 Transformer 不需要 “记忆”,它始终能完整、直接地访问整个句子的所有词汇及其顺序,从而高效捕捉长距离依赖。

RNN 是按顺序走、边读边藏、慢慢记住前面的词;Transformer 根本不 “记”,它是每一步都能直接看到整个句子里的所有词,靠注意力权重 + 位置编码,同时搞定「上下文关联」和「顺序信息」

这就是为什么它能轻松处理长句子,不会像 RNN 那样忘事。

答案就是:位置编码(Positional Encoding)

这样一来:

  • 模型既能看到所有词的语义
  • 又能明确知道每个词在句子里的位置和先后顺序
  • 再配合自注意力,就能同时学到:
    • 谁和谁语义相关
    • 谁在谁前面
    • 谁修饰谁、谁指代谁
学习笔记如有侵权,请提醒我,我会马上删除
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇