如何有效构建适合llm(大语言模型)预训练的数据集?

问题描述 投票:0回答:1

我想从头开始预训练我自己的 llm,所以首先我尝试构建数据集。 经过多次网络搜索和研究,我从huggingface的公开课程中得到了一些想法:

from transformers import DataCollatorForLanguageModeling

tokenizer.pad_token = tokenizer.eos_token
data_collator = DataCollatorForLanguageModeling(tokenizer, mlm=False)

解决方案是这样的: 例如,您有一个句子标记为 [a, b, c, d, e, f],并且模型上下文窗口长度=3, 然后:

  1. 将整个句子分成两部分:[a, b, c] 和 [d, e, f],
  2. 输入是[a,b,c],对应的标签只是输入的克隆,也是[a,b,c]。但它有一个特别强调的
    ⚠️ Shifting the inputs and labels to align them happens inside the model, so the data collator just copies the inputs to create the labels.
    因此,在 lib 内部,它将标签从 [a, b, c] 转换为 [b, c, padding]。 最后我们得到两个样本:
[a, b, c] -> [b, c, pad]
[d, e, f] -> [e, f, pad]

但在我看来,[a, b, c] 的正确标签应该是 [b, c, d],而不是将整个句子切成长度等于窗口大小的片段,使用 a 会更有意义上下文长度的滑动窗口从一端到另一端。 这样,我们就可以得到这些样本了:

[a, b, c] -> [b, c, d]
[b, c, d] -> [c, d, e]
[c, d, e] -> [d, e, f]

样品数量和质量均得到提升。

那么哪个是正确的方法呢?我被这个想法困惑了好几个月,如果您有这方面的实践经验,请给我一些建议,谢谢!

dataset huggingface pre-trained-model llm
1个回答
0
投票

在我看来,块标签的填充为模型设置了停止生成的信号。这就是为什么有些人将 padding 令牌设置为 eos 令牌的原因。 如果数据整理器按照您提供的方式生成,那么模型将继续生成而不会停止。 我在预训练没有eos token的模型时遇到了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.