日记:心态上要扛不住了,虽然也许会是未来一百天最健康的一天。
我不是非得赢,就像一个士兵,可以站着死,可现在我连这样的机会都看不到。
Q:文本输入模型所要经历的步骤?
原始文本:"Hello World" │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Step 1: 文本预处理 │ │ - 清洗(去除特殊字符、统一大小写) │ │ - 分词(Tokenization) │ │ → ["Hello", "World"] │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Step 2: 词元转ID(Token → ID) │ │ - 查词表(Vocabulary) │ │ → [15496, 2159] (假设词表中Hello=15496, World=2159) │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Step 3: 添加特殊标记(Special Tokens) │ │ - BERT: [CLS] + tokens + [SEP] │ │ - GPT: [BOS] + tokens + [EOS] │ │ → [CLS, 15496, 2159, SEP] │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Step 4: 生成嵌入(Embedding) │ │ - Token Embedding(词义) │ │ - Position Embedding(位置信息) │ │ - Segment Embedding(句子区分,BERT用) │ │ → 向量矩阵 [4 × 768] │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Step 5: Transformer编码 │ │ - 多层Self-Attention + FFN │ │ - LayerNorm + Residual │ │ → 上下文感知的向量 [4 × 768] │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ Step 6: 输出层(根据任务不同) │ │ - 分类任务:取[CLS] → 全连接 → Softmax │ │ - 生成任务:逐词预测下一个token │ │ - 序列标注:每个token → 分类器 │ └─────────────────────────────────────────────────────────────┘
| 方式 | 例子 | 优缺点 |
|---|---|---|
| Word-level | "unbelievable" → "unbelievable" | 词表太大(英语50万+),OOM问题 |
| Character-level | "unbelievable" → "u","n","b","e",... | 序列太长,语义丢失 |
| Subword-level | "unbelievable" → "un","believe","able" | 最佳平衡,主流方案 |
A:"以BERT或GPT为例,从原始文本到模型输出大约经过6个步骤。
第一步是预处理,包括清洗、统一大小写、去除多余空格。
第二步是分词,将文本切分成token。现在主流用子词分词(如BPE、WordPiece),平衡词表大小和OOM问题。
第三步是转ID,查词表把token映射成整数ID。
第四步是加特殊标记,BERT要加CLS和SEP,GPT要加BOS和EOS。
第五步是生成嵌入,把ID转成向量,通常包括三部分:Token Embedding(语义) + Position Embedding(位置) + Segment Embedding(句子区分)。
第六步是Transformer编码,经过多层Self-Attention和FFN,得到上下文感知的向量表示。
最后根据任务输出:分类任务取CLS接分类器,生成任务逐词预测下一个token。"
Q:CNN的权重共享是什么?
A:"权重共享是CNN区别于全连接网络的核心机制。
1. 定义:指的是一个卷积核在输入特征图上滑动遍历时,其参数始终保持不变。
2. 动机:为了解决全连接网络参数量爆炸的问题。对于图像数据,一个特征(如边缘)在图片任何位置都可能出现且意义相同,没必要在每个位置都单独学习一套参数。
3. 效果:
-
参数压缩:参数量从 O(n2)O(n2) 降到 O(k2)O(k2),即使输入图片很大,参数量也只由卷积核尺寸决定。
-
平移不变性:模型识别物体的能力不受其位置影响。
-
稀疏连接:每个输出节点只与局部输入相连,符合图像局部相关性。
4. 注意 :权重共享指的是空间维度 上的共享;在通道维度上,不同卷积核(输出通道)的参数是独立学习的。"
"我举个例子说明权重共享和独享的区别。
一张 1000×1000 的图,拉平后是 106 维向量。
如果接一个全连接层,输出也是 10 维,
那权重矩阵就是 106×106,一共 1012 个参数。
这里每一个参数只被用了一次 ,所以是 独享。
而卷积层用一个 3×3 的卷积核(9 个参数),
滑过整张图的所有位置。
同一个参数被重复使用了上万次 ,
同时因为不拉平图片,空间结构也保留下来了。
这就是 权重共享 的字面含义和实际价值。"
Q:介绍一下ResNet?
神经网络的性能理论上会随层数增加而提升,但实际上,网络过深会导致退化问题------不是过拟合,而是训练误差不降反升。
ResNet,即残差网络,是深度学习领域的一个重要里程碑,它通过引入残差学习解决了深层网络中的退化问题。ResNet的核心思想是让网络层学习到的映射更接近于恒等映射,从而使得网络即使在层数非常深的情况下也能有效地训练。
ResNet的关键概念
-
退化问题:随着网络层数的增加,理论上网络的性能应该更好,但实际上会出现性能饱和甚至下降的现象,这不是由过拟合引起的,而是网络深度增加时,准确度出现饱和,甚至是下降。
-
残差学习:ResNet的设计思想是每个附加层都应该更容易地包含原始函数作为其元素之一。在ResNet中,每个残差块的目标是学习一个残差函数,即目标映射与输入的差值。
-
恒等映射:ResNet中的恒等映射指的是输入通过跨层的直接连接传递,而不经过任何权重层的变换。这样的设计使得网络在增加深度的同时,能够保持性能不下降。
ResNet的结构
ResNet的结构包括多个残差块,每个残差块包含两个或三个卷积层。在残差块中,输入可以通过跨层的直接连接快速前向传播,这种设计使得即使在网络非常深的情况下,梯度也能有效地传播。
-
残差块:残差块是ResNet的基本构建单元,它允许输入通过一个快捷连接直接传递,从而避免了深层网络中梯度消失的问题。
-
Bottleneck结构:对于更深的网络,如ResNet-50及以上,使用了Bottleneck结构,它通过1x1卷积层来降低和恢复维度,减少了参数数量和计算量。
ResNet的优势
-
解决退化问题:ResNet通过残差学习解决了深层网络中的退化问题,使得网络可以通过增加更多的层来提升性能。
-
易于优化:相比于传统的深层网络结构,ResNet更容易优化,因为残差块使得网络可以通过学习残差函数来逼近目标函数。
-
广泛应用:ResNet的设计对后续的深层神经网络设计产生了深远影响,成为了许多视觉识别任务的基础网络结构。
ResNet的实现
在PyTorch中,ResNet可以通过定义残差块和堆叠多个残差块来实现。例如,ResNet-34和ResNet-152可以通过不同的残差块配置来构建。ResNet的实现通常包括卷积层、批量规范化层、ReLU激活层和全连接层。在训练过程中,可以使用预训练的模型参数来验证模型的性能。
总结
ResNet通过引入残差学习和恒等映射的概念,成功地训练了深度超过100层的网络,解决了深层网络中的退化问题,并在多个视觉识别任务中取得了突破性的性能。ResNet的设计思想和结构对后续的深度学习模型设计产生了深远的影响。
A:ResNet 的核心创新是残差学习。
作者发现网络过深时,不是过拟合,而是优化变难------让非线性层逼近恒等映射很难。
于是他们把学习目标从 H(x)改成 F(x)=H(x)−x,输出是 F(x)+x。其中 x 通过 shortcut 直接加过去。
这样一来:如果最优就是 x,网络只需要把 F(x) 学成 0,很简单;反向传播时,梯度可以走 shortcut 直通,不经过任何非线性,解决了深层梯度问题
具体实现上,维度匹配时用恒等连接,维度不匹配时用 1×1 卷积做投影。
Q:介绍一下Transformer?
Step 1:生成 Q、K、V
Q = X · W_Q # Query:我要问什么
K = X · W_K # Key:我有什么标签
V = X · W_V # Value:我实际的内容
Step 2:计算注意力分数
Step 3:多头注意力
你现在需要记住的 4 句话(面试够用)
-
Transformer 是一种序列模型,所有词同时输入
-
核心机制是 Self-Attention:让每个词看所有词
-
Self-Attention 本身无顺序感,需要加位置编码
-
多头注意力 = 多种关系同时学习
A:"Transformer 是一种处理"序列数据"的神经网络结构,核心是"注意力机制"。
它的核心是 Self-Attention:对每个词,计算它与序列中所有词的相关性,然后加权求和得到新表示。这样一步就能看到整个序列,路径长度是 O(1),而且可以并行计算。
为了解决顺序问题,Transformer 加入了位置编码 。为了支持深层网络,每一层都有残差连接和 LayerNorm。
Transformer 有两个变体:Encoder-only (BERT,适合理解任务)和 Decoder-only(GPT,适合生成任务)。
相比 RNN,它解决了长距离遗忘和无法并行的问题;相比 CNN,它拥有全局感受野。现在的大模型几乎都是基于 Transformer 的 Decoder-only 架构。"
Q:介绍一下RNN?
RNN 的全称是 Recurrent Neural Network(循环神经网络) ,是一类专门处理序列数据 (如文本、语音、时间序列)的神经网络模型。与传统前馈神经网络不同,RNN 通过循环连接 将前一时刻的隐藏状态传递到当前时刻,从而具备"记忆"能力,可以捕捉序列中的时序依赖关系。
在数学上,RNN 在时间步 t 的计算公式为:
其中 f 和 g 常用 tanh 或 softmax 作为激活函数。
|-------------|---------------|
| xt | 当前时刻的输入 |
| ht−1 | 上一时刻的记忆(隐藏状态) |
| ht | 当前时刻的更新后记忆 |
| Wxh,Whh,Why | 可学习的权重矩阵 |
主要特点
-
参数共享:所有时间步使用同一组权重,减少参数量。
-
可处理变长序列:适用于自然语言、语音、时间序列预测等任务。
-
缺点:存在梯度消失/爆炸问题,难以捕捉长期依赖。
改进结构
-
LSTM(Long Short-Term Memory):引入输入门、遗忘门、输出门和记忆单元,有效缓解长期依赖问题。
-
GRU(Gated Recurrent Unit):简化版LSTM,参数更少,训练更快。
-
双向RNN:同时利用过去和未来的上下文信息,常用于NLP和语音识别。
A:"RNN 是一种处理序列数据的网络结构,核心是隐藏状态 htht,它会保留之前的信息,并传递给下一步。
RNN 的优势是天然适合变长序列,能捕捉时间依赖。但问题是长期依赖会衰减(梯度消失),并且无法并行计算,因为必须一步一步走。
为了解决长期依赖,后来有了 LSTM 和 GRU。为了解决并行问题,后来有了 Transformer。"