大部分的大模型(LLM)采用左填充的原因

大部分的大模型(LLM)采用左填充的原因

在微调大模型LLM 时,发现目前很多的大模型的tokenizer方式采用的都是left-padding 并是不像bert一样采用right-padding来处理token,据此研究了一下原因.如有不足,或者错误请多多指正.

之前 encoder-only 模型的填充一般是right-padding

在使用bert等encoder-only的模型时, 我们往往根据习惯使用右填充(right-padding) 来输入模型 ,例如

## 构造两个不等长的输入句子
input_text = [
    "I want to go to space",
    "I'm going to Greece for my holiday to see the beauty",
]
## 之前 encoder-only 模型一般都是右填充
bert_tokenizer= BertTokenizer.from_pretrained("./link_model/bert-base-uncased/")
bert = BertModel.from_pretrained("./link_model/bert-base-uncased/")
print(bert_tokenizer.padding_side)
## output : right 

## bert tokenzier 之后
tokens = bert_tokenizer(input_text,padding="longest",return_tensors="pt")
print(tokens.input_ids[0])
print(tokens.input_ids[1])
 '''
output: tensor([ 101, 1045, 2215, 2000, 2175, 2000, 2686,  102,    0,    0,    0,    0,
           0,    0,    0])
        tensor([ 101, 1045, 1005, 1049, 2183, 2000, 5483, 2005, 2026, 6209, 2000, 2156,
            1996, 5053,  102])
'''

## 最终输入模型获得输出的embedding

bert(input_ids= tokens["input_ids"], attention_mask=tokens["attention_mask"],return_dict=False)

我们使用encoder-only模型的主要目的是获取每个词的嵌入表示,并且,cls可能会有额外的作用, 因此选用right-padding 是非常合理的

only-decoder 的LLM采用left padding的原因

首先我们看一个例子

## 加载模型
llama_tokenzier = LlamaTokenizer.from_pretrained("./link_model/llama2-7b-hf/")
llama_model = LlamaForCausalLM.from_pretrained("./link_model/llama2-7b-hf/",trust_remote_code= True)
llama_tokenzier.pad_token = llama_tokenzier.eos_token
print(llama_tokenzier.padding_side)
## output : right

## 使用llama tokenzier进行token 化
tokens = llama_tokenzier(input_text,padding="longest",return_tensors="pt")
print(tokens.input_ids[0])
print(tokens.input_ids[1])
'''
output:
        tensor([   1,  306,  864,  304,  748,  304, 2913,    2,    2,    2,    2,    2,
           2,    2,    2])
        tensor([    1,   306, 29915, 29885,  2675,   304, 25549,   363,   590,  8753,
             22394,   304,  1074,   278, 15409])
'''
## 使用模型进行输入
output = llama_model.generate(pad_token_id=llama_tokenzier.pad_token_id, **tokens)
res_text = llama_tokenzier.batch_decode(output)
res_text
'''
output:
    ['<s> I want to go to space</s></s></s></s></s></s></s></s><s>nobody wants to go',
     "<s>I'm going to Greece for my holiday to see the beauty of the country and to"]
'''
## 并且我们得到的一个警告
'''
warnings.warn(
A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.
'''

我们观察模型输入的内容, 如果不对模型输入的特殊token进行忽略,即采用这种方式来进行输入内容:

res_text = llama_tokenzier.batch_decode(output,skip_special_tokens=True)

我们获得的内容中会掺杂很多padding的token在一个完整的句子中如 :

'<s> I want to go to space</s></s>``</s></s>``</s></s>``</s></s>``<s>nobody wants to go',

直观上来看,它打断了句子连续的语义.


如果采用left-padding看看会发生什么

llama_tokenzier = LlamaTokenizer.from_pretrained("./link_model/llama2-7b-hf/",padding_side = "left")
llama_tokenzier.pad_token = llama_tokenzier.eos_token
print(llama_tokenzier.padding_side)
## output :left
tokens = llama_tokenzier(input_text,padding="longest",return_tensors="pt")
print(tokens.input_ids[0])
print(tokens.input_ids[1])
'''
output:

tensor([   2,    2,    2,    2,    2,    2,    2,    2,    1,  306,  864,  304,
         748,  304, 2913])
tensor([    1,   306, 29915, 29885,  2675,   304, 25549,   363,   590,  8753,
        22394,   304,  1074,   278, 15409])
'''

output = llama_model.generate(pad_token_id=llama_tokenzier.pad_token_id, **tokens)
res_text = llama_tokenzier.batch_decode(output)
res_text
'''
output:

['</s></s></s></s></s></s></s></s><s>I want to go to space. I want to go',
 "<s>I'm going to Greece for my holiday to see the beauty of the country and to"]
'''

可以看到 left-padding的输出内容是完整且连续的,中间没有特殊的字符来打断语义,并且 padding的token也分布在模型的两侧,处理特殊的token也会更加方便.
并且,模型在调用generate()时,也不会再有警告了.

总结:

  1. encoder-only模型主要采用right-padding的原因是,填充右侧的方式很直观,并且我们有时需要获得每个句子的首个token(cls),左侧不对齐不好操作
  2. decoder-only模型采用 left-padding的原因是, 模型的输入是对模型输入的延续(模型的输出中会带着输入,并在输入后边补充输出),如果采用right-padding,会导致大量的[pad]token夹在模型的输入和输入之间,不利于处理结果.并且模型的输出句子的语义也被pad打乱了,输入并不直观.此外,decoder-only的模型并不需要cls等开头的token来做额外的处理,right-padding在decoder-only的模型中没有任何优势.
  3. decoder-only的模型也可以使用right-padding方式,如果设置 skip_special_tokens=True 也应该会获得正确的输入,但是不建议使用.

https://github.com/DuTim/NLP_work_and_interview/blob/main/13_0_llm_padding_side.ipynb

ref:

https://github.com/huggingface/transformers/issues/18388#issuecomment-1204369688

<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大模型人工智能自然语言处理领域的里程碑,它通过模拟人类语言规律,实现了与机器的“类人交互”。尽管仍有局限,但它正在重塑内容创作、教育、科研等多个领域。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值