Attention
Attention(注意力机制)是一种在处理序列数据时的机制,它能够使得模型在处理每一个元素时能够“关注”到序列中的其他元素,并相应地调整自己的权重。在自然语言处理(NLP)中,注意力机制能够使得模型在处理每一个单词时能够关注到其他单词,从而更好地理解整个句子的含义。
乘性Attention和加性Attention的区别
乘性Attention和加性Attention的区别主要在于计算注意力权重的方式不同。乘性Attention通过计算query和key的点积然后除以scaled factor来计算注意力权重,而加性Attention通过计算query和key的点积然后加上一个偏置项来计算注意力权重。
Self-Attention采用Dot-Product Attention的原因
Self-Attention采用Dot-Product Attention是因为它在计算注意力权重时简单且高效,能够使得模型在处理每一个元素时能够关注到序列中的其他元素,从而更好地进行序列处理任务。
Scaled因子的作用
Scaled factor的作用主要是为了使得注意力权重能够在不同的scale下进行计算,防止在计算过程中出现梯度消失或爆炸的问题。在Dot-Product Attention中,scaled factor通常是隐藏dim(hidden dimension)的平方根,即scaled factor = sqrt(d_k)。
Multi-Head Self-Attention
Multi-Head Self-Attention中的Multi-Head指的是将注意力机制分成多个头,每个头计算注意力权重时使用不同的权重矩阵,最后将各个头的注意力权重进行 concatenate。Multi-Head Self-Attention能够使得模型能够关注到序列中的不同特征,提高模型的性能。但是,Multi-Head Self-Attention中的头数(num_heads)并不是越多越好,头数过多可能会导致计算复杂度增加,从而影响模型的性能。在设计模型架构时,需要根据具体任务和数据集来选择合适的头数。
增加或减少head_dim对结果的影响
如果固定hidden_dim,增加head_dim意味着每个头处理的特征维度减小,而减少head_dim意味着每个头处理的特征维度增大。在某些情况下,增加head_dim可能会提高模型的性能,因为它可以使得模型能够关注到序列中的更细粒度的特征。然而,如果head_dim过大,可能会导致模型过拟合,从而影响模型的性能。因此,在设计模型架构时,需要根据具体任务和数据集来选择合适的head_dim。
对Attention weights应用Dropout的原因
在训练过程中,对Attention weights应用Dropout可以使得模型在训练过程中随机“丢弃”一些注意力权重,从而使得模型更加健壮,防止过拟合。在推理时,Dropout不会被执行,因此不会对模型的性能产生影响。
Self-Attention中qkv的bias设置
在Self-Attention中,qkv(query、key、value)的初始化时,通常会设置一个偏置项,偏置项的作用主要是为了使得模型在训练过程中能够更快地收敛。偏置项的值通常设置为一个较小的正数,例如0.1。
Attention的变种
除了Vanilla Attention之外,还有一些变种的Attention,例如:
Scaled Dot-Product Attention:在计算注意力权重时,将query和key的点积除以scaled factor,从而使得注意力权重能够在不同的scale下进行计算。
Additive Attention:在计算注意力权重时,计算query和key的点积然后加上一个偏置项,从而得到注意力权重。
Location-Based Attention:在计算注意力权重时,引入一个位置编码,使得模型能够更好地关注到序列中的特定位置的元素。 这些变种主要是针对Vanilla Attention的一些缺点和不足进行优化和改进。
Attention的缺点和不足
Attention的缺点和不足主要包括计算复杂度较高,可能过拟合,以及无法处理序列数据中的顺序信息。
Deep Learning的Deep
Deep Learning的Deep是指在模型中包含多层神经网络,通过多层神经网络对数据进行抽象和特征提取,从而提高模型的性能。在代码中叠加多个Attention,可以使得模型能够更好地关注到序列中的不同特征,提高模型的性能。但是,如果Attention层数过多,可能会导致模型过拟合,从而影响模型的性能。因此,在设计模型架构时,需要根据具体任务和数据集来选择合适的Attention层数。
Deep和Wide的作用
在DeepLearning中,Deep和Wide分别指深度学习和广度学习。广度学习主要关注的是模型在特征空间中的覆盖范围,而深度学习主要关注的是模型在特征空间中的抽象能力。在设计模型架构时,需要根据具体任务和数据集来选择合适的模型结构,从而达到更好的性能。
Tokenize
Tokenize是指将文本分割成单词或字符片段的过程。常见的Tokenize方式包括基于规则的Tokenize,基于词典的Tokenize和基于模型的Tokenize。它们的区别主要在于分词的方式不同,基于规则的Tokenize根据预定义的规则进行分词,基于词典的Tokenize使用词典进行分词,而基于模型的Tokenize使用深度学习模型进行分词。
理想的Tokenizer模型的特点
一个理想的Tokenizer模型应该具备准确性,高效性,灵活性和可扩展性。它能够准确地分词,分词速度快,能够处理各种文本格式和语言,并且能够方便地扩展词典或调整分词规则。
特殊Token的作用
Tokenizer中的一些特殊Token,比如开始和结束标记,它们的作用主要是表示文本序列的上下文信息,从而提高模型的性能。我们不能通过模型自动学习到开始和结束标记,因为它们是预定义的,而不是从数据中学习到的。
LLM为什么是Decoder-Only的
LLM是Decoder-Only的,是因为在自然语言处理中,通常需要对输入序列进行编码,然后对编码进行解码以生成目标序列。在解码过程中,需要使用一个解码器(Decoder)来根据编码器(Encoder)的输出生成目标序列。由于解码器只需要根据编码器的输出进行生成,而不需要处理输入序列,因此可以实现