思考和练习
请思考下面的问题。
Attention
- 你怎么理解Attention?
Attention(注意力机制)是一种在处理序列数据时的机制。序列中的每一部分(在NLP中为token,在CV中为patch)能“全局”地“关注”到自己以及自己以外的其他部分。基于query (Q)和key (K)间的关系,计算权重矩阵,从而对不同部分的value (V)进行加权求和以更好地表示该部分。
- 乘性Attention和加性Attention有什么不同?
计算注意力权重的方式不同。乘性Attention通过计算query和key的点积然后除以scaled factor来计算注意力权重,而加性Attention通过计算query和key的点积然后加上一个偏置项来计算注意力权重。
- Self-Attention为什么采用 Dot-Product Attention?
Dot-Product Attention通过计算query和key的点积然后除以scaled factor来得到注意力权重,这种方法简单且高效,能够使得模型在处理每一个元素时能够关注到序列中的其他元素,从而更好地进行序列处理任务。
- Self-Attention中的Scaled因子有什么作用?必须是
sqrt(d_k)
吗?
Scaled factor的作用主要是为了使得注意力权重能够在不同的scale下进行计算,防止在计算过程中出现梯度消失或爆炸的问题。在Dot-Product Attention中,scaled factor通常是hidden dimension的平方根,即scaled factor = sqrt(d_k)。(以前好像看到过相关的公式推导(具体地址忘了),证明sort(d_k)解决了梯度消失和爆炸的问题)
- Multi-Head Self-Attention,Multi越多越好吗,为什么?
No, Multi-Head Self-Attention中的Multi-Head指的是将注意力机制分成多个头,每个头计算注意力权重时使用不同的权重矩阵,最后将各个头的注意力权重进行 concatenate。Multi-Head Self-Attention能够使得模型能够关注到序列中的不同特征,提高模型的性能。但是,Multi-Head Self-Attention中的头数(num_heads)并不是越多越好,头数过多可能会导致计算复杂度增加,从而影响模型的性能。在设计模型架构时,需要根据具体任务和数据集来选择合适的头数。
- Multi-Head Self-Attention,固定
hidden_dim
,你认为增加head_dim
(需要缩小num_heads
)和减少head_dim
会对结果有什么影响?
如果固定hidden_dim,增加head_dim意味着每个头处理的特征维度减小,而减少head_dim意味着每个头处理的特征维度增大。在某些情况下,增加head_dim可能会提高模型的性能,因为它可以使得模型能够关注到序列中的更细粒度的特征。然而,如果head_dim过大,可能会导致模型过拟合,从而影响模型的性能。因此,在设计模型架构时,需要根据具体任务和数据集来选择合适的head_dim。
- 为什么我们一般需要对 Attention weights 应用Dropout?哪些地方一般需要Dropout?Dropout在推理时是怎么执行的?你怎么理解Dropout?
- Self-Attention的qkv初始化时,bias怎么设置,为什么?
偏置项通常设置为一个较小的正数,如0.1,使模型在训练过程中能够更快地收敛。
- 你还知道哪些变种的Attention?它们针对Vanilla实现做了哪些优化和改进?
除了Vanilla Attention以外,还有一些变种的Attention,如:
1. Scaled Dot-Product Attention:在计算注意力权重时,将query和key的点积除以scaled factor,从而使得注意力权重能够在不同的scale下进行计算。
2. Additive Attention:计算query和key的点积然后加上一个偏置项,从而得到注意力权重。
3. Location-Based Attention:引入一个位置编码,使得模型能够更好地关注到序列中的特定位置的元素。
这些变种相对Vanilla Attention的改进是:
1. Scaled Dot-Product Attention:解决了在计算注意力权重时可能出现的梯度消失或爆炸问题。
2. Additive Attention:同样解决了可能出现的梯度消失或爆炸问题,同时提高了模型的性能。
3. Location-Based Attention:解决了在处理序列数据时,模型无法很好地处理序列中的位置信息的问题。
- 你认为Attention的缺点和不足是什么?
1. 计算复杂度较高:Attention机制在计算注意力权重时需要进行复杂的矩阵运算,这可能会导致计算复杂度较高,从而影响模型的性能。
2. 可能过拟合:如果Attention机制的参数过多,可能会导致模型过拟合,从而影响模型的性能。
3. 无法处理序列中各部分的顺序问题:Attention机制主要关注的是序列中的每一个部分(token/patch)间的关系,而无法处理它们间的顺序问题。
- 你怎么理解Deep Learning的Deep?现在代码里只有一个Attention,多叠加几个效果会好吗?
Deep Learning的Deep是指在模型中包含多层神经网络,通过多层神经网络对数据进行抽象和特征提取,从而提高模型的性能。在代码中叠加多个Attention,可以使得模型能够更好地关注到序列中的不同特征,提高模型的性能。但是,如果Attention层数过多,可能会导致模型过拟合,从而影响模型的性能。因此,在设计模型架构时,需要根据具体任务和数据集来选择合适的Attention层数。
- DeepLearning中Deep和Wide分别有什么作用,设计模型架构时应怎么考虑?
在DeepLearning中,Deep和Wide分别指深度学习和广度学习。深度学习主要关注模型在特征空间中的抽象能力,而广度学习主要关注模型在特征空间中的覆盖范围。在设计模型架构时,需要根据具体任务和数据集来选择合适的模型结构,从而达到更好的性能。
LLM
- 你怎么理解Tokenize?你知道几种Tokenize方式,它们有什么区别?
- 你觉得一个理想的Tokenizer模型应该具备哪些特点?
- Tokenizer中有一些特殊Token,比如开始和结束标记,你觉得它们的作用是什么?我们为什么不能通过模型自动学习到开始和结束标记?
- 为什么LLM都是Decoder-Only的?
- RMSNorm的作用是什么,和LayerNorm有什么不同?为什么不用LayerNorm?
- LLM中的残差连接体现在哪里?为什么用残差连接?
- PreNormalization和PostNormalization会对模型有什么影响?为什么现在LLM都用PreNormalization?
- FFN为什么先扩大后缩小,它们的作用分别是什么?
- 为什么LLM需要位置编码?你了解几种位置编码方案?
- 为什么RoPE能从众多位置编码中脱颖而出?它主要做了哪些改进?
- 如果让你设计一种位置编码方案,你会考虑哪些因素?
- 请你将《LLM部分》中的一些设计(如RMSNorm)加入到《Self-Attention部分》的模型设计中,看看能否提升效果?