模型 算法 知识点


import torch
import torch.nn as nn
import torch.nn.functional as F

class MultiHeadSelfAttention(nn.Module):
    def __init__(self, embed_size, heads):
        super(MultiHeadSelfAttention, self).__init__()
        self.embed_size = embed_size
        self.heads = heads
        self.head_dim = embed_size // heads

        assert (
            self.head_dim * heads == embed_size
        ), "Embedding size needs to be divisible by heads"

        self.values = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.keys = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.queries = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.fc_out = nn.Linear(heads * self.head_dim, embed_size)

    def forward(self, values, keys, queries):
        N = queries.shape[0]
        value_len, key_len, query_len = values.shape[1], keys.shape[1], queries.shape[1]

        # Split the embedding into self.heads different pieces
        values = values.reshape(N, value_len, self.heads, self.head_dim)
        keys = keys.reshape(N, key_len, self.heads, self.head_dim)
        queries = queries.reshape(N, query_len, self.heads, self.head_dim)

        values = self.values(values)
        keys = self.keys(keys)
        queries = self.queries(queries)

        # Attention mechanism
        #attention = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])
        attention = torch.matmul(queries, keys.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.head_dim, dtype=torch.float32))

        attention = F.softmax(attention / (self.embed_size ** (1 / 2)), dim=3)

        out = torch.matmul(attention, values).reshape(N, query_len, self.heads * self.head_dim)
        # out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(
            N, query_len, self.heads * self.head_dim
        )

        out = self.fc_out(out)

        return out

class TransformerBlock(nn.Module):
    def __init__(self, embed_size, heads, dropout, forward_expansion):
        super(TransformerBlock, self).__init__()
        self.attention = MultiHeadSelfAttention(embed_size, heads)
        self.norm1 = nn.LayerNorm(embed_size)
        self.norm2 = nn.LayerNorm(embed_size)

        self.feed_forward = nn.Sequential(
            nn.Linear(embed_size, forward_expansion * embed_size),
            nn.ReLU(),
            nn.Linear(forward_expansion * embed_size, embed_size),
        )

        self.dropout = nn.Dropout(dropout)

    def forward(self, value, key, query):
        attention = self.attention(value, key, query)
        x = self.dropout(self.norm1(attention + query))
        forward = self.feed_forward(x)
        out = self.dropout(self.norm2(forward + x))
        return out

class Encoder(nn.Module):
    def __init__(
        self,
        embed_size,
        num_layers,
        heads,
        device,
        forward_expansion,
        dropout,
    ):

        super(Encoder, self).__init__()
        self.embed_size = embed_size
        self.device = device
        self.layers = nn.ModuleList(
            [
                TransformerBlock(
                    embed_size,
                    heads,
                    dropout=dropout,
                    forward_expansion=forward_expansion,
                )
                for _ in range(num_layers)
            ]
        )

        self.dropout = nn.Dropout(dropout)

    def forward(self, x):
        out = self.dropout(x)

        for layer in self.layers:
            out = layer(out, out, out)

        return out

# Hyperparameters
embed_size = 512
num_layers = 6
heads = 8
device = "cuda" if torch.cuda.is_available() else "cpu"
forward_expansion = 4
dropout = 0.1

# Example
encoder = Encoder(embed_size, num_layers, heads, device, forward_expansion, dropout).to(device)

  




4 训练过程为什么需要 Mask 机制?

两个原因。 1. 屏蔽未来信息,防止未来帧参与训练。 2. 处理不同长度的序列,在批处理时对较短的序列进行填充(padding),并确保这些填充不会影响到模型的输出。

5 mask机制如何实现?

  1. 屏蔽未来信息的 Mask:在自注意力层中,通过构造一个上三角矩阵(对于解码器),其中上三角部分(包括对角线,取决于具体实现)被设置为非常大的负数,这样在通过 softmax 层时,这些位置的权重接近于0,从而在计算加权和时不考虑未来的词。
  2. Padding Mask:将填充位置的值设置为一个大的负数,使得经过 softmax 层后,这些位置的权重接近于0。

6 Transformer 中的Positional Encoding有什么作用?

保证attention机制考虑序列的顺序,否则无法区分不同的位置的相同的输入。

7 Transformer 如何处理长距离依赖问题?

Transformer 通过自注意力机制直接计算序列中任意两个位置之间的依赖关系,从而有效地解决了长距离依赖问题。

8 Layer Normalization的作用是什么?

Layer Normalization有助于稳定深层网络的训练,通过对输入的每一层进行标准化处理(使输出均值为0,方差为1),可以加速训练过程并提高模型的稳定性。它通常在自注意力和前馈网络的输出上应用。

9 能否用Batch Normalizatioin?

在 Transformer 架构中,层归一化(Layer Normalization,简称 LayerNorm)是首选的归一化方法,主要用于模型内部的每一层之后。理论上,层归一化可以被批归一化(Batch Normalization,简称 BatchNorm)替换,但是这两种归一化技术在应用上有着本质的不同,这些差异导致了在 Transformer 中通常优先选择层归一化而不是批归一化。

层归一化(Layer Normalization)

  • 层归一化是对每个样本的所有特征执行归一化操作,独立于其他样本。这意味着,无论批次大小如何,LayerNorm 的行为都是一致的。
  • 在处理序列数据和自注意力机制时,LayerNorm 更加有效,因为它能够适应不同长度的输入,这在自然语言处理任务中尤为重要。
  • LayerNorm 直接在每个样本的维度上工作,使得它在序列长度变化的情况下更为稳定。

批归一化(Batch Normalization)

  • 批归一化是在一个小批量的维度上进行归一化,这意味着它依赖于批次中所有样本的统计信息。因此,BatchNorm的行为会随着批次大小和内容的变化而变化,这在训练和推理时可能导致不一致的表现。
  • 在处理变长序列和自注意力结构时,BatchNorm可能不如 LayerNorm 高效,因为变长输入使得批次间的统计信息更加不稳定。
  • BatchNorm在训练时计算当前批次的均值和方差,在推理时使用整个训练集的移动平均统计信息。这种依赖于批次统计信息的特性使得 BatchNorm在小批量或在线学习场景中表现不佳。
 

  

1. 为什么用多头(Multi-Head)注意力:

- 多头注意力允许模型在不同的表示子空间中学习信息,这样可以让模型同时关注不同的信息维度。每个头学习到的信息可以独立地编码输入序列的不同方面,然后将这些信息综合起来,得到更丰富的表示。

2. 为什么要除以根号D:

- 将得分除以根号D(得分归一化)可以防止内积过大导致softmax函数梯度变得非常小,这有助于数值稳定性,使得学习过程更加稳定。此外,它还可以看作是一种缩放因子,帮助模型在不同维度上保持一致的性能。

3. RAG(检索增强生成)对于大模型来说,有什么好处?

- 提高生成质量:通过结合检索到的相关信息,RAG可以帮助大型语言模型生成更准确、更相关和更高质量的文本。

- 增强上下文关联性:检索到的信息可以为模型提供更多的上下文信息,使生成的文本更加符合上下文语境。

- 提高模型鲁棒性:通过结合检索到的信息,模型可以更好地处理不完整或噪声的输入,提高模型的鲁棒性。

- 减少训练数据需求:RAG可以通过检索相关信息来增强模型的知识,从而减少对大规模标注数据的依赖。

- 提高模型泛化能力:RAG可以帮助模型学习到更广泛的知识,提高模型的泛化能力,使其能够更好地适应不同的任务和领域。

4. 涌现能力是啥原因?

涌现能力(Emergent Ability)是指模型在训练过程中突然表现出的新的、之前未曾预料到的能力。这种现象通常发生在大型模型中,原因是大型模型具有更高的表示能力和更多的参数,可以更好地捕捉数据中的模式和关联。随着模型规模的增加,它们能够自动学习到更复杂、更抽象的概念和规律,从而展现出涌现能力。


5. prefix LM 和 causal LM、encoder-decoder 区别及各自有什么优缺点?

- prefix LM:通过在输入序列前添加可学习的任务相关前缀,引导模型生成适应特定任务的输出。优点是可以减少对预训练模型参数的修改,降低过拟合风险;缺点是可能受到前缀表示长度的限制,无法充分捕捉任务相关的信息。

- causal LM:根据之前生成的 token 预测下一个 token,可以生成连贯的文本。优点是可以生成灵活的文本,适应各种生成任务;缺点是无法访问未来的信息,可能生成不一致或有误的内容。

- encoder-decoder:由编码器和解码器组成,编码器将输入序列编码为固定长度的向量,解码器根据编码器的输出生成输出序列。优点是可以处理输入和输出序列不同长度的任务,如机器翻译;缺点是模型结构较为复杂,训练和推理计算量较大。

 

6. 模型幻觉是什么?业内解决方案是什么?

模型幻觉是指模型在生成文本时产生的不准确、无关或虚构的信息。这通常发生在模型在缺乏足够信息的情况下进行推理或生成时。业内的解决方案包括:

- 使用更多的数据和更高质量的训练数据来提高模型的泛化和准确性。

- 引入外部知识源,如知识库或事实检查工具,以提供额外的信息和支持。

- 强化模型的推理能力和逻辑推理,使其能够更好地处理复杂问题和避免幻觉。


9. 大模型的Tokenizer的实现方法及原理?

大模型的Tokenizer通常使用字节对编码(Byte-Pair Encoding,BPE)算法。BPE算法通过迭代地将最频繁出现的字节对合并成新的符号,来构建一个词汇表。在训练过程中,模型会学习这些符号的嵌入表示。Tokenizer将输入文本分割成符号序列,然后将其转换为模型可以处理的数字表示。这种方法可以有效地处理大量文本数据,并减少词汇表的规模。

 

10. ChatGLM3 的词表实现方法?

ChatGLM3使用了一种改进的词表实现方法。它首先使用字节对编码(BPE)算法构建一个基本的词表,然后在训练过程中通过不断更新词表来引入新的词汇。具体来说,ChatGLM3在训练过程中会根据输入数据动态地合并出现频率较高的字节对,从而形成新的词汇。这样可以有效地处理大量文本数据,并减少词汇表的规模。同时,ChatGLM3还使用了一种特殊的词表分割方法,将词表分为多个片段,并在训练过程中逐步更新这些片段,以提高模型的泛化能力和适应性。

 

11. GPT3、LLAMA、ChatGLM 的Layer Normalization 的区别是什么?各自的优缺点是什么?

- GPT3:采用了Post-Layer Normalization(后标准化)的结构,即先进行自注意力或前馈神经网络的计算,然后进行Layer Normalization。这种结构有助于稳定训练过程,提高模型性能。

- LLAMA:采用了Pre-Layer Normalization(前标准化)的结构,即先进行Layer Normalization,然后进行自注意力或前馈神经网络的计算。这种结构有助于提高模型的泛化能力和鲁棒性。

- ChatGLM:采用了Post-Layer Normalization的结构,类似于GPT3。这种结构可以提高模型的性能和稳定性。

 

13. Multi-query Attention 与 Grouped-query Attention 是否了解?区别是什么?

MHA多头注意力:h个Query、Key 和 Value 矩阵,每个头都各自有一份不同的Key、Query、Value矩阵。所有注意力头的 Key 和 Value 矩阵权重不共享

MQA多查询注意力:与MHA不同的是,MQA 让所有的头之间共享同一份 Key 和 Value 矩阵,每个头只单独保留了一份 Query 参数,从而大大减少 Key 和 Value 矩阵的参数量。

GQA分组查询注意力:GQA将查询头分成G组,每个组共享一个Key 和 Value 矩阵。GQA-G是指具有G组的grouped-query attention。GQA-1具有单个组,因此具有单个Key 和 Value,等效于MQA。而GQA-H具有与头数相等的组,等效于MHA

14. 多模态大模型是否有接触?落地案例?

多模态大模型是指可以处理和理解多种模态数据(如文本、图像、声音等)的模型。落地案例,例如:

- OpenAI的DALL-E和GPT-3:DALL-E是一个可以生成图像的模型,而GPT-3可以处理和理解文本。两者结合可以实现基于文本描述生成图像的功能。

- Google的Multimodal Transformer:这是一个可以同时处理文本和图像的模型,用于各种多模态任务,如图像字幕生成、视觉问答等。

1. llama 输入句子长度理论上可以无限长吗?

LLaMA(Large Language Model Adaptation)模型的输入句子长度受到硬件资源和模型设计的限制。理论上,如果硬件资源足够,模型可以处理非常长的输入句子。然而,实际上,由于内存和处理能力的限制,输入句子长度通常是有限制的。在实际应用中,开发者会根据具体需求和硬件配置来确定合适的输入句子长度。

 

2. 什么是 LLMs 复读机问题?

LLMs 复读机问题是指在某些情况下,大型语言模型在生成文本时会重复之前已经生成的内容,导致生成的文本缺乏多样性和创造性。

 

3. 为什么会出现 LLMs 复读机问题?

LLMs 复读机问题可能由多种因素引起,包括模型训练数据中的重复模式、模型在处理长序列时的注意力机制失效、或者模型在生成文本时对过去信息的过度依赖等。

 

4. 如何缓解 LLMs 复读机问题?

- 数据增强:通过增加训练数据的多样性和复杂性,减少重复模式的出现。

- 模型改进:改进模型的结构和注意力机制,使其更好地处理长序列和避免过度依赖过去信息。

- 生成策略:在生成文本时采用多样化的策略,如抽样生成或引入随机性,以增加生成文本的多样性。


14. 领域模型Continue PreTrain数据选取?

领域模型继续预训练(Continue Pre-Training)的数据选取应该基于领域内的文本特点和应用需求。通常,需要选取大量、高质量、多样化的领域文本数据。数据可以来自专业文献、行业报告、在线论坛、新闻文章等。数据选取时应该注意避免偏见和不平衡,确保数据能够全面地代表领域内的知识和语言使用。

 

15. 领域数据训练后,通用能力往往会有所下降,如何缓解模型遗忘通用能力?

- 多任务学习:在训练过程中同时包含领域内和通用的任务,使模型能够同时学习领域特定的和通用的知识。

- 控制微调强度:通过调整微调的学习率或训练轮数来控制模型对领域数据的适应程度。

- 定期回炉:在领域数据训练后,定期使用通用数据进行回炉训练,以保持模型的通用能力。

 

16. 领域模型Continue PreTrain ,如何让模型在预训练过程中就学习到更多的知识?

- 数据增强:使用数据增强技术如回译、掩码语言模型等来生成更多的训练样本。

- 知识注入:将领域特定的知识以文本、结构化数据或知识图谱的形式注入到预训练过程中。

- 多模态学习:如果适用,可以使用多模态数据(如文本和图像)进行预训练,以丰富模型的知识表示。

36. prompt tuning 和 prefix tuning 在微调上的区别是什么?

Prompt Tuning和Prefix Tuning都是参数高效的微调方法,它们通过在模型输入中添加特定的提示或前缀来引导模型生成适应特定任务的输出。区别在于:

- Prompt Tuning:在输入序列的末尾添加可学习的提示,提示可以是几个单词或短语,用于指导模型生成特定的输出。

- Prefix Tuning:在输入序列的开头添加可学习的连续前缀表示,前缀表示包含了任务特定的信息,用于引导模型生成适应特定任务的输出。


37. LLaMA-adapter 如何实现稳定训练?

LLaMA-adapter 是一种参数高效的微调方法,它通过在预训练模型的每个Transformer层中添加小型适配器模块来实现特定任务的适应。为了实现稳定训练,可以采取以下措施:

- 适配器初始化:使用预训练模型的参数作为适配器模块的初始化,以保持模型的稳定性。

- 适配器正则化:使用正则化技术,如权重衰减或dropout,来减少适配器模块的过拟合风险。

- 逐步学习:逐步调整适配器模块的参数,避免参数更新的幅度过大。

- 适配器优化:选择合适的优化器和训练策略,如使用较小的学习率、较长的训练周期等,以实现稳定的训练过程。

 

38. LoRA 原理与使用技巧有那些?

LoRA(Low-Rank Adaptation)是一种参数高效的微调方法,它通过引入低秩分解来减少需要更新的参数数量。LoRA的工作原理是将预训练模型的注意力矩阵或前馈网络矩阵分解为两个低秩矩阵的乘积,其中这两个低秩矩阵被视为可学习的任务特定参数。

使用LoRA的技巧包括:

- 适配器初始化:使用预训练模型的参数作为LoRA适配器模块的初始化,以保持模型的稳定性。

- 低秩分解:选择合适的低秩分解方法,如奇异值分解(SVD)或随机矩阵分解,以实现低秩分解。

- 逐步学习:逐步调整LoRA适配器模块的参数,避免参数更新的幅度过大。

- 适配器正则化:使用正则化技术,如权重衰减或dropout,来减少LoRA适配器模块的过拟合风险。

40. AdaLoRA 的思路是怎么样的?

AdaLoRA是一种自适应的LoRA方法,它可以根据任务的需求和模型的性能动态调整LoRA适配器模块的参数。AdaLoRA的思路是:

- 初始化LoRA适配器模块的参数,使用预训练模型的参数作为初始化。

- 在训练过程中,根据模型的性能和任务需求,动态调整LoRA适配器模块的参数。

- 通过调整LoRA适配器模块的参数,使模型能够更好地适应特定的任务需求。


42. P-tuning 讲一下?与 P-tuning v2 区别在哪里?优点与缺点?

P-tuning是一种参数高效的微调方法,它通过在模型输入中添加可学习的连续前缀来引导模型生成适应特定任务的输出。P-tuning v2是P-tuning的改进版本,它使用了更多的连续前缀表示来引导模型生成适应特定任务的输出。

P-tuning与P-tuning v2的区别在于:

- P-tuning:在输入序列的开头添加一个可学习的连续前缀,前缀的长度较短。

- P-tuning v2:在输入序列的开头添加多个可学习的连续前缀,前缀的长度较长。

P-tuning的优点是参数高效,计算资源需求较低,可以快速实现模型微调。P-tuning的缺点是可能受到前缀表示长度的限制,无法充分捕捉任务相关的信息。P-tuning v2通过使用更多的连续前缀,可以更充分地捕捉任务相关的信息,但可能需要更多的计算资源来更新多个前缀的参数。

43. 为什么SFT之后感觉LLM傻了?

SFT(Supervised Fine-Tuning)之后感觉LLM(Large Language Model)"傻了",可能是因为微调过程中出现了以下问题:

- 过拟合:模型可能过度适应训练数据,导致在新数据上的泛化能力下降。

- 数据质量:如果训练数据质量不高,模型可能学到了错误的模式或偏见。

- 微调强度:微调的强度可能不够,导致模型没有充分适应新的任务。在这种情况下,模型可能没有学习到足够的特定领域的知识,因此在执行相关任务时表现不佳。

44. 垂直领域数据训练后,通用能力往往会有所下降,如何缓解模型遗忘通用能力?

- 多任务学习:在训练过程中同时包含通用任务和领域特定任务,使模型能够同时学习通用和特定领域的知识。

- 控制微调强度:通过调整学习率、正则化参数等,控制模型对领域数据的适应程度。

- 定期回炉:在领域数据训练后,定期使用通用数据进行回炉训练,以保持模型的通用能力。

- 知识蒸馏:使用一个预训练的通用模型来指导领域模型,帮助模型保持通用知识。

53. 有哪些省内存的大语言模型训练/微调/推理方法?

- 模型剪枝:通过移除模型中的冗余结构和参数,减少模型的内存占用。

- 知识蒸馏:使用一个大型教师模型来指导一个小型学生模型,使学生模型能够学习到教师模型的知识,同时减少内存占用。

- 量化:将模型的权重和激活从浮点数转换为低精度整数,减少模型的内存占用和计算需求。

- 模型并行:将大型模型分割到多个设备上进行训练和推理,减少单个设备的内存需求。

- 数据并行:将训练数据分割到多个设备上,每个设备训练模型的一个副本,减少单个设备的内存需求。

- 动态批处理:根据可用内存动态调整批量大小,以适应内存限制。

54. 大模型(LLMs)评测有那些方法?如何衡量大模型的效果?

大模型(LLMs)的评测方法通常包括:

- 准确性:评估模型在特定任务上的预测准确性。

- 泛化能力:评估模型在未见过的数据上的表现。

- 计算效率:评估模型训练和推理的速度和资源需求。

- 安全性:评估模型在对抗性输入下的稳定性和鲁棒性。

- 多样性和创造性:评估模型生成文本的多样性和创造性。

- 人类评估:通过人工评估来衡量模型的性能,特别是在对话和生成任务中。

衡量大模型效果的方法包括:

- 自动评估指标:使用如BLEU、ROUGE、METEOR等自动评估指标来衡量模型的语言生成和理解能力。

- 任务特定的指标:使用任务特定的指标来衡量模型在特定任务上的性能,如准确率、F1分数等。

- 用户反馈:收集用户对模型生成内容的反馈,以评估模型的实际应用效果。

 

55. 如何解决三个阶段的训练(SFT->RM->PPO)过程较长,更新迭代较慢问题?

- 减少训练数据量:如果训练数据量过大,可以考虑减少数据量,以加快训练速度。

- 优化训练流程:优化训练流程,如使用更高效的训练算法、调整训练参数等,以加快训练速度。

- 并行训练:使用多GPU或多服务器并行训练模型,以加快训练速度。

- 提前停止:在训练过程中,如果模型性能不再提高,可以提前停止训练,以节省时间。

- 知识蒸馏:使用一个大型教师模型来指导一个小型学生模型,使学生模型能够快速学习到教师模型的知识。

 

56. 模型训练的数据集问题:一般数据集哪里找?

- 公开数据集:许多研究机构和组织会发布公开数据集,如IMDb、Wikipedia、Common Crawl等。

- 特定领域数据集:针对特定领域的数据集,如医疗、金融、法律等,通常需要从相关的专业文献、报告、论坛等渠道获取。

- 合成数据:通过自动化或半自动化方法生成数据,如文本合成、数据增强等。

- 用户生成数据:通过众包、调查、游戏等方式收集用户生成的数据。

- 商业数据:从商业公司或服务中获取数据,通常需要遵守相关的数据使用协议和隐私政策。

 

62. 是否了解上下文压缩方法?

上下文压缩是一种减少模型参数数量和计算复杂度的技术,同时尽量保持模型的性能。这种方法通常涉及:

- 模型剪枝:移除模型中的冗余结构和参数。

- 知识蒸馏:使用一个大型教师模型来指导一个小型学生模型,使学生模型能够学习到教师模型的知识。

- 权重共享:在模型中,将部分参数设置为共享,这些参数同时用于多个任务或领域。

- 低秩分解:将大型参数矩阵分解为多个小型矩阵,只更新其中的部分矩阵。

7. 如何让大模型输出合规化?

- 过滤不当内容:使用内容过滤器来识别和过滤掉不当的语言或敏感内容。

- 指导性提示:提供明确的提示,指导模型生成符合特定标准和偏好的输出。

- 后处理:对模型的输出进行后处理,例如使用语法检查器和修正工具来提高文本的质量。

- 强化学习:使用强化学习来训练模型,使其偏好生成符合特定标准的输出。

posted @ 2024-02-26 11:31  15375357604  阅读(132)  评论(0编辑  收藏  举报