为什么LLM(大模型)使用的是左填充

参考:Why current LLM uses left padding? | Trace Logits

transformer - While fine-tuning a decoder only LLM like LLaMA on chat dataset, what kind of padding should one use? - Artificial Intelligence Stack Exchange

https://github.com/huggingface/transformers/issues/14521

首先先说结论,为什么这样用?

1、因为在生成模型中(causal language model (like GPT series, LLaMA)),大多数都是这样实现的,所以需要对齐。

2、在生成的过程中,生成算法总是用最后一个token的logits去预测下一个token,如果使用右填充,使用的是pad的logits对下一个token采样,这可能会导致生成结果出现错误。

比如:输入,我喜欢苹果[pad] [pad] 。

期望预测和生成的内容:我喜欢吃苹果,因为它很好吃。

右填充模型输出:我喜欢吃苹果[pad] [pad],因为它很好吃。

左填充模型输出:[pad][pad]我喜欢吃苹果,因为它很好吃。

[pad] 卡在文本中间,这会造成模型生成的结果可能会很差。

也有人生成模型FAIR LLaMA2使用了右填充,但是实现起来相对复杂:

def generate(...)
  ...
	pad_id = self.tokenizer.pad_id
	tokens = torch.full((bsz, total_len), pad_id, dtype=torch.long, device="cuda")
  # right-padding
	for k, t in enumerate(prompt_tokens):
      tokens[k, : len(t)] = torch.tensor(t, dtype=torch.long, device="cuda")
  ...
  # only partial of the prompt are fed
      logits = self.model.forward(tokens[:, prev_pos:cur_pos], prev_pos)
  ...
      next_token = torch.argmax(logits[:, -1], dim=-1)
  ...
      next_token = next_token.reshape(-1)
  # only replace token if prompt has already been generated
      next_token = torch.where(
          input_text_mask[:, cur_pos], tokens[:, cur_pos], next_token
  )
  # so that only padded position are replaced with newly generated tokens
      tokens[:, cur_pos] = next_token

首先,为什么需要填充?

因为神经网络的输入一般是一个矩阵,利用矩阵运算可以大大的加快训练速度,如果句子的长度不一,就会造成输入的一个batch不是一个矩阵,就需要0填充。

如何对一个token进行采样?

确切的答案是:这取决于你使用的生成函数

然而,在大多数实现中,您必须向左填充。

以下是一个GPT2的实现:

def sample_sequence(model, length, start_token=None, batch_size=None, context=None, temperature=1, top_k=0, device='cuda', sample=True, enc=None):
    if start_token is None:
				 # if start_token is None, use context
        assert context is not None, 'Specify exactly one of start_token and context!'
        context = torch.tensor(context, device=device, dtype=torch.long).unsqueeze(
            0).repeat(batch_size, 1)
    else:
				 # if start_token isn't None, use start_token as the beginning of each sentences
        assert context is None, 'Specify exactly one of start_token and context!'
        context = torch.full((batch_size, 1), start_token,
                             device=device, dtype=torch.long)
    prev = context
    output = context
    # past is KV-cache
    past = None
    with torch.no_grad():
        for i in trange(length):  # generate `length` tokens for all sentences
            logits, past = model(prev, past=past)

            # logits.shape=[batch, text, vocab_szie], in Causal model, the logits of the last token in each sentence is used to predict next token, so pick `-1` here
            logits = logits[:, -1, :] / temperature
            logits = top_k_logits(logits, k=top_k)
            log_probs = F.softmax(logits, dim=-1)
            if sample:
                prev = torch.multinomial(log_probs, num_samples=1)
            else:
                _, prev = torch.topk(log_probs, k=1, dim=-1)

            # concatenate the sampled tokens to the original sentences, 
            # e.g. output = [I have] and sampled `an`
            # output = [I have an]
            output = torch.cat((output, prev), dim=1)

    return output

注意 logits = logits[:,-1,:]这一行,如果使用右填充,则会得到,我有一个苹果。[pad],[pad]。。。

然而,算法总是选择最后一个 token 的 logits 来预测下一个 token,如果我们在右侧进行填充,则模型实际上是使用 [pad] 的 logits 来预测下一个 token 。尽管使用注意力掩码,为具有 [pad] 标记的位置分配了注意力分数,但只要算法使用[pad]开始采样,该torch.multinomial函数就会使用错误的 logits,从而导致不正确的预测下一个token。您可以在这里看到类似的问题。

<think>好的,我需要解释“LLM大模型是什么意思”。首先,要明确LLM的定义,也就是Large Language Model,即大规模语言模型。接下来,要说明它的基本原理,比如基于深度学习和神经网络,特别是Transformer架构。然后,要提到训练数据,比如海量的文本数据,以及训练目标,即预测下一个词或填充缺失部分。 接下来,需要介绍LLM的核心特点。比如参数量大,像GPT-3有1750亿参数;还有泛化能力强,能够处理多种任务;另外是涌现能力,比如未经专门训练也能完成复杂任务。 然后,应用场景部分需要列举几个常见的例子,比如智能对话、文本生成、翻译、代码编写等。同时,也要提到当前的代表模型,如GPT系列、BERT、PaLM等,并说明它们的影响,比如推动自然语言处理的发展。 可能还需要提到LLM的挑战,比如算力需求大、数据偏见、理解逻辑和常识的不足,以及伦理问题。这部分能帮助全面展示LLM的优缺点。 在组织语言时,要确保结构清晰,分点说明,但不需要用Markdown格式。要注意使用中文口语化的表达,避免过于学术化的术语,让用户容易理解。同时,按照系统级指令,数学表达式要用$...$,但这里可能不太涉及,所以重点在正确使用格式。最后,检查是否符合所有要求,确保LaTeX语法正确,如果有数学例子的话,但当前问题可能不需要,所以可能不用。保持回答自然,逐步展开,帮助用户逐步理解LLM的概念。</think>LLM大模型的全称是**大规模语言模型**(Large Language Model),是当前人工智能领域最受关注的技术之一。下面逐步解释它的核心概念和特点: --- ### 1. **基本定义** - **LLM** = **大型**(参数量极大) + **语言模型**(基于统计学规律理解和生成文本)。 - 它通过深度学习技术(如Transformer架构)训练,能够处理自然语言任务,例如回答问题、写文章、翻译等。 --- ### 2. **核心原理** - **训练数据**:使用海量文本(如书籍、网页、论文)进行训练,学习词语、句子的关联规律。 - **训练目标**:通过预测“下一个词”(如输入“今天天气___”,预测“晴朗”)或填充文本缺失部分,逐步掌握语言模式。 - **数学模型**:基于概率分布,例如计算$P(w_{t+1} | w_1, w_2, ..., w_t)$,即根据前文预测下一个词的概率。 --- ### 3. **关键特点** - **参数量大**:模型包含数百亿甚至万亿参数(如GPT-3有1750亿参数),能捕捉复杂语言规律。 - **泛化能力强**:无需针对特定任务专门训练,通过“提示”(Prompt)即可适应多种场景(如写诗、编程、数学推理)。 - **涌现能力**:当模型规模足够大时,会“涌现”出小模型不具备的能力,例如逻辑推理、跨语言理解。 --- ### 4. **典型应用** - **智能对话**:如ChatGPT、文心一言等聊天机器人。 - **文本生成**:自动写文章、故事、广告文案。 - **代码生成**:根据描述生成代码(如GitHub Copilot)。 - **知识问答**:回答复杂问题,例如“量子力学的基本原理是什么?” - **翻译与摘要**:跨语言翻译或长文本精简。 --- ### 5. **代表模型** - **GPT系列**(OpenAI):如GPT-3、GPT-4,主打生成能力。 - **BERT**(Google):擅长理解语义,用于搜索和分类。 - **PaLM**(Google)、**LLaMA**(Meta):参数量更大,多任务性能更强。 --- ### 6. **挑战与局限** - **算力需求高**:训练需要数千张GPU,成本高昂。 - **数据偏见**:可能反映训练数据中的错误或偏见。 - **逻辑与常识不足**:可能生成“看似合理但错误”的内容。 - **伦理风险**:滥用可能导致虚假信息、隐私泄露等问题。 --- ### 总结 LLM大模型人工智能在自然语言处理领域的里程碑,它通过模拟人类语言规律,实现了与机器的“类人交互”。尽管仍有局限,但它正在重塑内容创作、教育、科研等多个领域。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值