【多模态学习】Q&A3:FFN的作用?Embedding生成方法的BERT和Word2Vec?非线性引入的作用?

Q&A

    • [在Transformer模型结构中出现的FFN,或者叫Feed Forward的部分到底是什么?](#在Transformer模型结构中出现的FFN,或者叫Feed Forward的部分到底是什么?)
      • [1. FFN 的结构:它长什么样?](#1. FFN 的结构:它长什么样?)
      • [2. FFN 的核心作用:它到底在做什么?](#2. FFN 的核心作用:它到底在做什么?)
        • [(1) 提供非线性变换能力](#(1) 提供非线性变换能力)
        • [(2) 对注意力信息进行提炼和加工](#(2) 对注意力信息进行提炼和加工)
        • [(3) 记忆事实性知识](#(3) 记忆事实性知识)
      • [3. 为什么FFN要对每个Token独立处理?](#3. 为什么FFN要对每个Token独立处理?)
      • [4. FFN的变体](#4. FFN的变体)
      • 总结:FFN的角色定位
    • 关于embedding生成,请解释下BERT和Word2Vec两种方法?
    • 为什么在模型中一定要引入非线性?
      • [1. 数学本质:没有非线性,深度就失去了意义](#1. 数学本质:没有非线性,深度就失去了意义)
      • [2. 现实世界的数据本质是非线性的](#2. 现实世界的数据本质是非线性的)
      • [3. 非线性激活函数的作用:赋予模型"扭曲空间"的能力](#3. 非线性激活函数的作用:赋予模型“扭曲空间”的能力)
      • 总结

在Transformer模型结构中出现的FFN,或者叫Feed Forward的部分到底是什么?

在Transformer中,FFN(Feed-Forward Network,前馈神经网络) 是一个至关重要却又常常被低估的组件。如果说Self-Attention的作用是混合信息 (让序列中的每个token都能关注到所有其他token),那么FFN的作用就是加工和提炼这些信息,可以把它理解为Transformer的"记忆和推理中心"。

1. FFN 的结构:它长什么样?

FFN是一个简单的两层全连接神经网络,夹在Self-Attention层之后。它对序列中的每一个token的表示向量进行独立且相同的处理

其数学公式为:
FFN ( x ) = max ⁡ ( 0 , x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \max(0, xW_1 + b_1)W_2 + b_2 FFN(x)=max(0,xW1+b1)W2+b2

或者更常见地写为:
FFN ( x ) = ReLU ( W 1 x + b 1 ) W 2 + b 2 \text{FFN}(x) = \text{ReLU}(W_1 x + b_1)W_2 + b_2 FFN(x)=ReLU(W1x+b1)W2+b2

其中:

  • x x x 是当前token经过Self-Attention层处理后的输出向量(维度为 d_model,例如1024)。
  • W 1 , b 1 W_1, b_1 W1,b1 是第一层的权重和偏置。它将向量从 d_model 维度映射到一个更高的维度 d_ff(例如4096)。这被称为"扩展层"。
  • ReLU \text{ReLU} ReLU 是激活函数,引入非线性。
  • W 2 , b 2 W_2, b_2 W2,b2 是第二层的权重和偏置。它将向量从高维 d_ff 映射回原来的 d_model 维度。这被称为"收缩层"。

简单来说,FFN就是一个"放大→处理→缩小"的过程。

2. FFN 的核心作用:它到底在做什么?

(1) 提供非线性变换能力
  • Self-Attention本质上是线性操作(加权求和)。如果没有FFN提供的非线性激活函数(如ReLU、GELU),整个Transformer堆叠再多层也只是一个巨大的线性模型,无法拟合复杂的语言函数。
  • 类比:就像在传统的CNN中,卷积层(关注空间关系)后面要接ReLU激活函数一样,FFN为Transformer提供了非线性。
(2) 对注意力信息进行提炼和加工
  • Self-Attention负责"广撒网",收集全局信息。但它收集来的信息是原始和混杂的。
  • FFN则像一个专家网络 ,负责对每个token身上所聚合的信息进行深度加工,从中提取更抽象、更有用的特征。
  • 一个生动的比喻
    • Self-Attention 就像是在一个会议上,每个人(token)都听取并汇总了所有人的意见。
    • FFN 就像是每个人回到自己的办公室,关起门来,独自消化和深度思考刚才听到的所有信息,形成自己更成熟、更深刻的新观点。
(3) 记忆事实性知识
  • 研究发现,Transformer的参数主要存储在FFN层 中(因为 d_ff 维度很大,W_1W_2 矩阵非常巨大)。
  • 许多事实性知识(如"法国的首都是巴黎")并非存储在Attention中,而是被编码在FFN的参数里。Attention更像是一个"路由器",负责根据上下文激活相关的FFN知识库。

3. 为什么FFN要对每个Token独立处理?

这是一个关键设计。FFN的"逐位(Pointwise)"操作意味着:

  • 处理 token A 的FFN和处理 token B 的FFN是完全一样的(参数共享)。
  • 它们之间没有任何直接的信息交互

这样设计的好处是:

  1. 计算高效:可以并行处理序列中的所有token,速度极快。
  2. 保持位置独立性:Self-Attention已经处理了token之间的关系,FFN无需再重复此工作。它只需要专注于如何更好地表示单个token。

4. FFN的变体

原始的ReLU激活函数现在已被证明在某些情况下会导致"神经元死亡"(输出恒为0)。因此,现代LLM(如GPT、LLaMA)普遍使用GELU(高斯误差线性单元)等更平滑的激活函数来替代ReLU。

公式变为:
FFN ( x ) = GELU ( x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \text{GELU}(xW_1 + b_1)W_2 + b_2 FFN(x)=GELU(xW1+b1)W2+b2

总结:FFN的角色定位

组件 角色 功能
Self-Attention 通信层 让序列中的所有token相互交流,整合全局上下文信息。
FFN 加工层 对每个token的已有信息进行非线性变换、深度提炼和知识存储。

你可以将Transformer的一个Block理解为:

  1. Attention:"大家好,我刚刚听了所有人的发言,这是我的总结。"
  2. Add & Norm:"好了,我把这个总结记下来,并规范化一下。"
  3. FFN:"现在,让我独自基于这个总结,进行一番深入的思考和创新,得出我的最终结论。"
  4. Add & Norm:"最终结论出炉,准备传递给下一层。"

正是这种"交流→思考→再交流→再思考"的交替过程,使得Transformer能够构建出极其强大和复杂的语言表示。

关于embedding生成,请解释下BERT和Word2Vec两种方法?

BERTWord2Vec 代表了自然语言处理(NLP)中词语表示的两个不同时代和不同层次的技术。

简单来说:

  • Word2Vec 提供的是静态的、上下文无关的词向量。一个词在任何句子中都只有一个固定的表示。
  • BERT 提供的是动态的、上下文相关的词表示。一个词在不同的句子中会有不同的表示。

下面我们进行详细的梳理和对比。

1. Word Vector (词向量) - 静态表示时代

代表模型:Word2Vec, GloVe, FastText

核心思想

通过在大规模语料上训练,将词汇表中的每个词映射成一个固定的、稠密的实数向量(例如300维)。这些向量的几何关系(如距离、方向)能够捕捉词语之间的语义和语法关系。

工作原理
  • "一个词的含义可以由它周围经常出现的词(上下文)来定义"(分布式假设)。
  • 通过预测上下文(Skip-gram)或由上下文预测中心词(CBOW)来学习词向量。
  • 一旦训练完成,每个词的向量就固定了。
优势
  1. 计算高效:向量是预先训练好的,使用起来非常简单快速,只需一个查找表。
  2. 可解释性 :能够捕捉到有趣的语言学规律,例如经典的 king - man + woman ≈ queen 的向量运算。
  3. 解决了One-Hot的"词汇鸿沟"问题:将词语映射到了有意义的低维空间,语义相似的词在向量空间中也相近。
致命劣势
  1. 上下文无关(Context-Independent) :这是最大的问题。无论语境如何,一个词只有一种表示。
    • 例如:"苹果"在"我吃了一个苹果"(水果)和"我买了一部苹果手机"(品牌)中的含义完全不同,但Word2Vec只会为"苹果"生成同一个向量。这无法解决一词多义问题。
  2. 无法处理未登录词(OOV):如果遇到训练时没见过的词,模型无法给出其向量表示(尽管FastText通过子词分解部分解决了此问题)。

2. BERT - 动态表示时代

代表模型:BERT, GPT, RoBERTa, XLNet

核心思想

BERT不再为每个词生成一个固定的向量。它是一个深度Transformer编码器 ,其输出是基于整个输入句子的上下文来为每个词生成独特的表示

工作原理
  1. 输入:BERT接收一个句子(或一对句子)作为输入。
  2. 编码:句子中的每个词(或子词)首先被转换成初始向量(包括词向量、位置向量和段落向量)。
  3. 深度上下文编码 :这些初始向量经过多层的Transformer编码器块。在每一层中,Self-Attention机制允许每个词直接与句子中的所有其他词进行交互,从而聚合全局信息。
  4. 输出 :最终,对于输入的每个词,BERT都会输出一个融合了整个句子上下文信息的深度向量表示
优势
  1. 上下文相关(Contextualized) :完美解决一词多义问题。
    • 在"我吃苹果"中,"苹果"的BERT向量会更接近于"水果"、"香蕉"等词的语义。
    • 在"苹果发布会"中,"苹果"的BERT向量会更接近于"品牌"、"科技"、"公司"等词的语义。
  2. 强大的特征提取能力:BERT的表示是在大规模语料上通过预测被掩盖的词(MLM)和下一句关系(NSP)任务预训练而来的,蕴含了丰富的语法、语义甚至常识知识。
  3. 即插即用:预训练好的BERT模型可以作为特征提取器,为各种下游任务(如文本分类、问答、情感分析)生成强大的词/句向量,通常只需稍加微调就能取得极佳效果。
劣势
  1. 计算成本高:无法预先计算好所有词的向量,必须将整个句子输入模型进行前向计算才能得到词表示,比查找Word2Vec向量慢得多。
  2. 结构复杂:模型参数量巨大(数亿甚至数十亿),需要大量的数据和计算资源进行训练。

核心对比表格

特性 Word2Vec BERT
表示性质 静态的、上下文无关的 动态的、上下文相关的
核心模型 浅层神经网络(CBOW/Skip-gram) 深度Transformer编码器
一词多义 无法解决 完美解决
计算方式 预计算,查找表 实时前向计算
计算效率 (快速查找) (需要完整计算)
输出 每个词一个固定向量 每个词在不同句子中有不同向量
典型任务 作为早期模型的输入特征 微调后用于各种下游SOTA任务
哲学 一个词一个向量 一个用法一个向量

一个生动的比喻

  • Word2Vec 像是给你一本静态的字典 。无论你问"苹果"在什么句子里,它都只会给你字典里那唯一的一条解释
  • BERT 像是一个语言专家 。你把这个专家请到现场,把整个句子"我吃苹果" 念给他听,然后问他:"在这个句子里,'苹果'是什么意思?"他会根据整个句子的语境,告诉你它最可能指的是水果 。如果你换一个句子"苹果发布会",他给出的解释又会是品牌

总结

  • Word Vector 是NLP早期发展的基石,它将词语从离散符号带入了向量空间,但其静态性是天花板。
  • BERT 及其代表的预训练语言模型 是NLP领域的革命。它通过动态上下文编码突破了静态词向量的限制,极大地提升了模型对语言的理解能力,成为了当今NLP几乎所有领域的主流技术。

因此,BERT不是简单的"升级版词向量",而是一种全新的、更强大的语言表示范式


示例代码

以下是BERT使用的示例代码:

python 复制代码
import torch
from transformers import BertTokenizer, BertModel

# 1. 加载预训练的 BERT 模型和分词器
model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

# 2. 输入文本
text = "Hello, how are you?"

# 3. 使用分词器处理文本(一步到位,推荐方式)
# 这一步自动完成了:分词 -> 添加[CLS][SEP] -> 转换ID -> 创建Tensor -> 添加批次维度
inputs = tokenizer(text, return_tensors="pt") # pt 代表 PyTorch

# 4. 获取 BERT 的编码结果
with torch.no_grad():
    outputs = model(**inputs) # 解包字典,将input_ids等参数传入模型
    embeddings = outputs.last_hidden_state

# 5. 打印嵌入表示的形状和内容
print(f"Embeddings shape: {embeddings.shape}") # 应该是 [1, 8, 768]
print(embeddings)

输出解释

运行修正后的代码,你会得到一个形状为 [1, 8, 768] 的Tensor。

  • 1: 批次大小(我们只输入了一个句子)。
  • 8: 序列长度(包括 [CLS]、Hello、,、how、are、you、?、[SEP])。
  • 768: BERT-base模型每个标记的嵌入向量维度。

这个 embeddings 张量就是输入文本的上下文感知的深度表示,可以用于后续任务,如文本分类、语义相似度计算等。

为什么在模型中一定要引入非线性?

这是一个非常核心的机器学习问题。在模型中引入非线性(Non-Linearity) 是深度学习能够成功的根本原因之一。如果没有非线性,无论你的模型有多深,它都等价于一个简单的线性模型,从而无法学习现实世界中的复杂模式和关系。我们可以从以下几个层面来理解为什么非线性如此至关重要:

1. 数学本质:没有非线性,深度就失去了意义

这是最根本的原因。

  • 线性变换的局限性 :一系列线性操作(矩阵乘法、向量加法)的组合,无论叠加多少层,最终都可以被另一个单一的线性变换所等价替代
    • 公式推导 :假设有两层线性变换:y = W2 * (W1 * x + b1) + b2。这可以简化为 y = (W2 * W1) * x + (W2 * b1 + b2)。令 W3 = W2 * W1b3 = W2 * b1 + b2,则 y = W3 * x + b3。看,一个两层的"深度"线性网络被压缩成了一个单层的线性模型。
  • 结论 :如果没有非线性激活函数,增加神经网络的深度不会带来任何表达能力的提升。你只是在用一个更复杂的方式做一个线性回归,这完全违背了使用深度网络的初衷。

2. 现实世界的数据本质是非线性的

我们需要模型来解决的问题,其背后的数据分布和关系绝大多数都不是简单的线性关系。

  • 简单例子(线性可分):判断一个水果是苹果还是橘子,如果只根据"直径"这一个特征,可能一条直线就能分开。
  • 复杂例子(非线性可分):判断一个动物是猫还是狗,特征包括体重、身高、耳朵形状、叫声频率等。这些特征与结果之间的关系错综复杂,无法用一个超平面完美分割。
  • 更复杂的例子
    • 图像识别:一张图片中的像素值与"猫"这个概念之间的关系是极度非线性的。
    • 自然语言:词汇的组合远不是加法关系。"不" + "好" = "不好",这种语义的转变就是非线性的。
  • 结论 :线性模型只能学习线性决策边界 (如图1)。而要学习非线性决策边界 (如图2),甚至是更复杂的流形结构,必须引入非线性变换

3. 非线性激活函数的作用:赋予模型"扭曲空间"的能力

非线性激活函数(如ReLU, Sigmoid, Tanh, GELU)是引入非线性的标准方法。它们的作用就像一系列的空间扭曲器

  1. 分阶段处理
    • 每一层线性变换负责旋转和拉伸输入数据所在的空间。
    • 紧随其后的非线性函数则负责弯曲和折叠这个空间。
  2. 逐层抽象
    • 通过多次"线性变换 + 非线性扭曲",深度网络可以一步步地将原始输入数据(如图像像素、文本词元)映射到越来越抽象的特征空间中。
    • 举例 :在图像识别中,早期层可能学习到边缘和角落,中间层学习到眼睛、鼻子等部件,最终层学习到整个面部的概念。这种从具体到抽象的层次结构是非线性变换逐层组合的结果

总结

方面 没有非线性 引入非线性
模型能力 只能是线性模型 通用函数逼近器(理论上可以近似任何复杂函数)
决策边界 只能是直线/超平面 可以是任意复杂的曲线/曲面
深度意义 深度无效,等效于单层 深度有效,可实现分层抽象和特征学习
现实应用 只能解决简单、线性可分的问题 能解决复杂问题(图像、语言、推理等)

一言以蔽之:引入非线性,是为了让模型能够摆脱线性关系的束缚,从而具备学习和表示现实世界中无处不在的复杂、非线性模式和关系的能力。它是深度学习模型拥有强大表达力的根源。

相关推荐
KFCcrazy45 小时前
嵌入式学习日记(39)51单片机
嵌入式硬件·学习·51单片机
MuMuMu#6 小时前
JAVA NIO学习笔记基础强化学习总结
java·学习·nio
lingggggaaaa6 小时前
小迪安全v2023学习笔记(七十九讲)—— 中间件安全&IIS&Apache&Tomcat&Nginx&CVE
笔记·学习·安全·web安全·网络安全·中间件·apache
我登哥MVP6 小时前
Java File 类学习笔记
java·笔记·学习
mysla7 小时前
嵌入式学习day44-硬件—ARM体系架构
学习
微露清风7 小时前
系统性学习数据结构-第三讲-栈和队列
java·数据结构·学习
77qqqiqi9 小时前
学习字符串
学习
滴滴滴嘟嘟嘟.9 小时前
Qt动画功能学习
开发语言·qt·学习
淮北4949 小时前
计算机网络学习(七、网络安全)
学习·计算机网络·web安全