字节对编码 (Byte-Pair Encoding, BPE) 最初是作为一种压缩文本的算法开发的,后来被 OpenAI 用于预训练 GPT 模型时的分词 (tokenization) 过程。现在,许多 Transformer 模型都在使用它,包括 GPT、GPT-2、RoBERTa、BART 和 DeBERTa 。
WordPiece,从名字好理解,它是一种子词粒度的 tokenize 算法 subword tokenization algorithm,很多著名的 Transformers 模型,比如 BERT / DistilBERT / Electra 都使用了它。
它的原理非常接近 BPE,不同之处在于它做合并时,并不是直接找最高频的组合,而是找能够最大化训练数据似然的 merge 。
与 BPE 或者 WordPiece 不同,Unigram 的算法思想是从一个巨大的词汇表出发,再逐渐删除 trim down 其中的词汇,直到 size 满足预定义。
初始的词汇表可以采用所有预分词器分出来的词,再加上所有高频的子串。每次从词汇表中删除词汇的原则是使预定义的损失最小。
SentencePiece 则是基于 无监督学习
的,用的是一种称为 Masked Language Modeling (MLM) 的算法。MLM 的基本思想是:将文本中的部分词语或符号进行遮蔽,然后让模型预测被遮蔽的词语或符号,通过这种方式,模型可以学习文本的语义和结构。
顾名思义,它是把一个句子看作一个整体,再拆成片段,而没有保留天然的词语的概念。一般地,它把空格 space 也当作一种特殊字符来处理,再用 BPE 或者 Unigram 算法来构造词汇表。
Word embedding 是自然语言处理(NLP)中用于将单词转换为数值向量表示的技术。存在多种不同的word embedding 模型,以下是一些常见的模型:
-
Word2Vec:由 Google 开发,包括 CBOW(Continuous Bag of Words)和 Skip-Gram 两种模型。
-
GloVe (Global Vectors for Word Representation):利用全局词-词共现统计数据来学习词向量。
-
FastText:由 Facebook 开发,与 Word2Vec 类似,但将单词表示为字符 n-gram 的向量。
-
BERT (Bidirectional Encoder Representations from Transformers):由 Google 开发,使用 Transformer 架构来学习深层的双向表示。
-
ELMo (Embeddings from Language Models):由华盛顿大学开发,使用深度双向语言模型来生成词向量。
-
ULMFiT (Unsupervised Language Model Pre-training for Text Classification and Representation):由 Salesforce 研究团队开发,用于文本分类和表示学习。
-
Flair:一个基于 PyTorch 的 NLP 库,它提供了基于字符的词嵌入,并且可以与 Word2Vec、GloVe 等其他嵌入组合。
-
Sent2Vec:由 Andrew M. Dai 和 Christopher Manning 提出,用于生成句子和短语的嵌入。
-
T-SNE (t-distributed Stochastic Neighbor Embedding):虽然不是专门的 word embedding 模型,但T-SNE常用于可视化高维数据,包括词向量。
-
Siamese Networks:用于学习单词或句子对的相似性,可以用于生成 word embedding 。
-
Meta-Embeddings:结合多种不同的 word embedding 技术来提高性能。
-
Contextual Embeddings:基于特定上下文生成单词的嵌入,如 BERT、GPT(Generative Pre-trained Transformer)等。
这些模型各有优势和特点,适用于不同的 NLP 任务和场景。随着 NLP 领域的发展,新的 word embedding 模型也在不断地被提出和改进。
评估一个 word embedding 模型的质量通常涉及以下几个方面:
-
语义相似度(Semantic Similarity):
- 相似度评分:使用像 WordSim-353 或 MEN 这样的语义相似度数据集,这些数据集提供了人工标注的词对及其相似度评分。模型需要预测这些词对的相似度,然后与人工评分进行比较。
- 余弦相似度:计算词向量之间的余弦相似度,并与人工评分进行相关性分析。
-
类比任务(Analogy Task):
- 词类比:评估模型是否能够捕捉到类似“国王:王后”这样的词之间的关系。这通常通过解决类比问题(如:man is to woman as king is to ?)来完成。
-
上下文准确性(Contextual Accuracy):
- 上下文词替换:在一个句子中替换一个词,并使用模型预测最可能的替换词。这可以通过像 COCOA 这样的数据集来评估。
-
零样本学习(Zero-Shot Learning):
- 类别识别:评估模型是否能够识别不同类别的图像,这通常通过检查模型是否能够将单词正确地分类到预定义的类别中来完成。
-
迁移学习(Transfer Learning):
- 下游任务性能:在一个或多个NLP任务(如文本分类、情感分析、问答系统等)上使用预训练的词向量,并评估这些任务的性能。如果预训练的词向量能够提高这些任务的性能,那么可以认为词向量的质量较高。
-
定性分析(Qualitative Analysis):
- 最近邻查询:检查一个词的最近邻词是否在语义上相关,这可以提供模型性能的直观感受。
-
定量分析(Quantitative Analysis):
- 标准化测试集:使用标准化的测试集来评估模型的性能,这些测试集通常包含了多种类型的任务。
-
计算效率(Computational Efficiency):
- 训练和推理时间:评估模型训练和推理的时间复杂度,对于大规模应用来说,计算效率是一个重要的考量因素。
-
可扩展性(Scalability):
- 处理大规模数据集:评估模型在大规模数据集上的表现,以及是否能够有效地扩展到更大的词汇表和数据集。
-
鲁棒性(Robustness):
- 对抗性测试:评估模型对于对抗性样本(如拼写错误、同义词替换等)的鲁棒性。
-
多语言和跨领域评估(Cross-lingual and Cross-domain Evaluation):
- 跨语言和跨领域性能:评估模型在不同语言和不同领域数据上的性能。
通过综合这些评估方法,可以全面地了解 word embedding 模型的质量和适用性。通常,没有单一的评估标准能够涵盖所有方面,因此实践中会根据具体应用场景和需求选择合适的评估方法。
在大语言模型的推理速度上,INT8 和 FP16 的比较结果表明,INT8 量化通常会比 FP16 量化更快。以下是详细的解释:
-
INT8 量化:INT8 量化是将模型的权重和激活值从浮点数转换为 8 位整数的过程。这种量化显著减少了存储和计算的需求,因为 INT8 使用 8 位表示一个数,其数据量和计算量相比 FP32 大大减少,因此能够进一步提升模型的推理速度和效率。此外,计算平台针对 INT8 数据计算有高效的指令支持,如 NVIDIA 的 DP4A 指令,可以获得理论上最大 4 倍的性能提升。
-
FP16 量化:FP16 格式,即 16 位浮点数(float16),相比于32位浮点数(float32),内存占用减少了一半,这在大规模深度学习应用中具有显著优势。FP16 格式允许在相同的 GPU 内存限制下加载更大规模的模型或处理更多数据。随着现代 GPU 硬件对 FP16 操作的支持不断增强,使用 FP16 格式还可能带来计算速度的提升。
-
性能对比:在实际应用中,INT8 量化由于其更小的数据宽度,减少了显存占用,降低了通讯带宽要求,提高 GPU 内存读写的吞吐效率。在相同的硬件条件下,支持 INT8 的 Tensor Core 可以在相同时间内进行更多次的浮点运算,加快训练和推理的速度。与 FP16 相比,INT8 量化在保持较高计算效率的同时,能够在大多数应用中提供足够的精度,尤其是在大模型的推理中,INT8 量化通常会比 FP16 量化更快。
综上所述,INT8 量化在大语言模型的推理速度上通常比 FP16 量化更快,这是因为 INT8 量化减少了数据量和计算量,同时现代硬件对 INT8 计算的支持也带来了额外的性能提升。
TensorFloat-32(简称 TF32)是 NVIDIA 在其 Ampere 架构 GPU 中推出的一种新的数学模式,专门用于处理 AI 和某些高性能计算(HPC)应用中的核心张量操作(也称为矩阵数学)。
格式和精度:TF32 格式采用 10 位小数尾数(mantissa)和 8 位指数(exponent),小数尾数和 FP16 格式相同,来提升 TF32 格式的运算速度,FP32 格式的小数尾数有 23 位。
数值范围:TF32 具有与 FP32 相同的动态范围,这意味着它不会比 FP32 更容易发生下溢或上溢。
性能提升:在 NVIDIA A100 GPU 上,使用 TF32 进行张量运算(如矩阵乘法)可以比在 Volta GPU 上使用 FP32 提供高达 10 倍的速度提升。
自动启用:在 Ampere 架构的 GPU 上,默认启用了 TF32 来进行计算加速,但并不是每一个矩阵及卷积计算都会使用 TF32 。
估算大语言模型所需要的显存大小,可以通过以下几个步骤和方法来进行:
- 模型参数:模型中的参数数量,例如一个 7B(7 billion)模型有 70 亿个参数。
- 数据类型:模型参数的数据类型,如单精度浮点数(FP32,4字节)或半精度浮点数(FP16,2字节)。
一个简化的估算公式是:
其中:
-
$(M)$ 是用千兆字节 (GB) 表示的 GPU 内存。 -
$(P)$ 是模型中的参数数量。 -
$(4B)$ 是 4 字节,即每个参数使用的字节数。 -
$(Q)$ 是加载模型时应使用的位数,例如 16 位(FP16)、8位(INT8)或4位(INT4)。 -
$(1.2)$ 表示在 GPU 内存中加载额外内容的 20% 开销。
- 优化器参数:某些优化器(如 AdamW)可能需要额外的显存来存储状态信息。
- 梯度:训练过程中需要存储梯度,通常与模型参数量相当。
- 中间计算:前向传播和反向传播过程中的中间计算结果,如激活值、损失值等。
- 临时缓冲区:计算过程中可能需要的临时缓冲区。
- HuggingFace的Model Memory Calculator:这是一个在线工具,可以直接输入 HuggingFace 上托管的模型地址,估算模型运行所需要的显存大小,包括推理和使用 Adam 进行训练的显存估计。
- 显存计算器 - 大模型显存需求分析工具 | LlamaFactory:这个工具支持输入模型参数和配置,自动计算推理和训练时的显存需求。
- 监听显卡显存使用:使用工具如
nvidia-smi
监控显存使用情况,确保模型运行时不会超出显存限制。
通过上述方法,可以较为准确地估算出运行大语言模型所需的显存大小,从而为模型部署和训练提供硬件资源上的参考。
要找到适用于训练大语言模型的中文数据集,可以访问 Hugging Face 的数据集库(https://huggingface.co/datasets),在那里搜索"Chinese"来找到相关的中文数据集。
以下是一些可能用到的中文数据集:
- Chinese WikiText: 中文维基百科的文本数据。
- Chinese Literature: 中文文学作品数据集。
- Chinese News 2019: 2019 年的中文新闻数据集。
- LCQMC: 一个用于问题匹配的中文数据集。
使用这些数据集前,请确保遵守相应的许可协议和版权规定。
以上答案来自 ChatGLM
在Hugging Face上,有许多中文训练数据集可以用于大语言模型的训练。以下是一些推荐的数据集及其特点:
-
moka-ai/m3e-base
- 描述:此模型通过千万级(2200万+)的中文句对数据集进行训练,支持中英双语的同质文本相似度计算和异质文本检索等功能。
- 链接:moka-ai/m3e-base
-
Cosmopedia 数据集
- 描述:Cosmopedia 数据集包含超过三百万的课文、博客、故事、帖子以及 WikiHow 文章等等数据,常被用来进行与训练。其中有超过 3000 万个文件、250 亿个词元,是迄今为止最大的开放合成数据集。
- 说明:Cosmopedia 数据集被一个叫 SmolLM 系列小模型使用。
- 链接:SmolLM 模型以及 Cosmopedia 数据集 | Cosmopedia 数据集介绍
这些数据集涵盖了多种任务和领域,您可以根据具体需求选择合适的数据集进行大语言模型的训练。如果您需要进一步的帮助或具体的使用指南,可以参考 Hugging Face 的快速入门指南和相关文档。
以上答案来自 ChatGLM - AI搜索
在 Hugging Face 上,有几个推荐的中文大语言模型训练数据集,这些数据集被用于评估和提升中文大语言模型的性能:
-
ARC (25-shot):包含 7,787 个科学考试问题,要求模型在 25 个示例后进行推理,用于评估模型的多步推理能力,已翻译为中文。
-
HellaSwag (10-shot):用于评估常识推理的挑战性数据集,已翻译为中文。
-
TruthfulQA (0-shot):包含 817 个问题,覆盖 38 个类别,旨在衡量语言模型在生成答案时是否真实,以及它们是否倾向于复制人类的虚假信息,已翻译为中文。
-
Winogrande (5-shot):大规模对抗性高难度 Winograd 基准,用于常识推理,要求模型在5个示例后进行推理,已翻译为中文。
-
GSM8k (5-shot):包含 8,000 个问题的小学数学数据集,用于衡量模型解决多步骤数学推理问题的能力,已翻译为中文。
-
C-SEM_v2 (5-shot):针对中文模型的综合语义评估基准,侧重于通过多样化和具有挑战性的任务评估词汇和句子层面的语义理解。
-
CMMLU (5-shot):专为中文模型设计的基准,用于评估文本模型在 67 个不同任务中的多任务准确性,涵盖数学、中国文学、计算机科学、法律等学科。
这些数据集不仅全面,而且深入,能够全方位地评估语言模型的性能。开发者和研究人员可以利用这些数据集来训练和优化中文大语言模型。
以上答案来自 KimiChat
HaggingFace 上的中文训练集:
-
/opencsg/chinese-fineweb-edu-v2
OpenCSG 社区 的 chinese-fineweb-edu-v2 数据集:
Chinese Fineweb Edu v2 是 Chinese Fineweb Edu 的全新升级版,专为教育领域的自然语言处理(NLP)任务设计和优化的高质量中文预训练数据集。该数据集在前一版本的基础上进行了大规模的改进和扩展,致力于为研究人员和开发者提供更加多样化、广泛适用的教育类语料资源。Fineweb Edu v2 训练数据增加到 100 万条,涵盖了多种类型的文本,如书籍、新闻、博客,以及 25% 的英文数据,新增了 Industry2、CCI3、michao、wanjuan1.0、wudao 和 ChineseWebText 等高质量数据集。数据量达到 188M 条数据 ,约 420B tokens ,还优化了数据的筛选方式和打分模型,以确保其在教育领域的有效性和实用性。
下载:https://huggingface.co/datasets/opencsg/chinese-fineweb-edu-v2
-
/BAAI/CCI3-HQ
为了解决中国人缺乏高质量安全数据集的问题,我们于 2023 年 11 月 29 日开源了 CCI(中国企业互联网)数据集。在此基础上,我们继续扩展数据源,采用更严格的数据清理方法,完成 CCI 3.0 数据集的构建。该数据集由来自可信来源的高质量、可靠的互联网数据组成。然后通过更严格的过滤,发布的 CCI 3.0 HQ 语料库大小约为 500 GB。
2024/09/20:更新至 CCI 3.0 HQ
-
/THUDM/LongWriter-6k
LongWriter-6k 数据集包含 6000 个 SFT 数据,超长输出长度为 2k-32k 单词(英语和中文)。这些数据可以支持训练 LLM,将其最大输出窗口大小扩展到 10000+ 个单词。
-
/Skywork/SkyPile-150B
SkyPile-150B 是一个全面的、大规模的中文数据集,专为大型语言模型的预训练而设计。它来源于一系列可公开访问的中国互联网网页。采用了严格的过滤、广泛的重复数据删除和彻底的敏感数据过滤来确保其质量。此外,我们还使用了 fastText 和 BERT 等高级工具来过滤低质量的数据。
SkyPile-150B 数据集的可公开访问部分包含约 2.33 亿个独立网页,每个网页平均包含 1000 多个汉字。总的来说,该数据集包括大约 1500 亿个令牌和 620GB 的纯文本数据。
-
/MBZUAI/Bactrian-X
Bactrain-X 数据集是包含了 52 种语言的 340 万条 instruction-response pairs (指令相应对) 的集合,这些 instruction-response pairs 是通过使用 Google Translate API 将 67K 条英语指令(alpaca-52k + dolly-15k)翻译成 51 种语言而获得的。然后将翻译后的指令馈送到 ChatGPT(gpt-3.5-turbo)以获得其自然响应,从而得到 52 种语言的 3.4M 个指令-响应对(52 种语言 x 67k 个实例 = 3.4M 个实例)。
Git 仓库:[https://github.com/mbzuai-nlp/Bactrian-X(https://github.com/mbzuai-nlp/Bactrian-X)]
-
/LooksJuicy/ruozhiba
弱智吧精选问题数据来自 github 提供的 疑问句,调用 GPT-4 获取答案,并过滤掉明显拒答的回复。包含大约 1500 行的问答。
-
/shibing624/alpaca-zh
本数据集是参考 Alpaca 方法基于 GPT4 得到的 self-instruct 数据,约 5 万条。
-
/shibing624/CSC
中文拼写纠错数据集,共 27 万条,是通过原始 SIGHAN13、14、15 年数据集和 Wang271k 数据集合并整理后得到,json 格式,带错误字符位置信息。
- test.json 和 dev.json 为 SIGHAN 数据集, 包括 SIGHAN13 14 15,来自 官方 csc.html ,文件大小:339kb,4千条。
- train.json 为 Wang271k 数据集,包括 Wang271k ,来自 Automatic-Corpus-Generation dimmywang 提供 ,文件大小:93MB,27万条。
以上答案为 本人 自己总结。
ggml 是一个用 C 和 C++ 编写、专注于 Transformer 架构模型推理的机器学习库。该项目完全开源,处于活跃的开发阶段,开发社区也在不断壮大。ggml 和 PyTorch、TensorFlow 等机器学习库比较相似,但由于目前处于开发的早期阶段,一些底层设计仍在不断改进中。
相比于 llama.cpp 和 whisper.cpp 等项目,ggml 也在一直不断广泛普及。为了实现端侧大语言模型推理,包括 ollama、jan、LM Studio 等很多项目内部都使用了 ggml。
相比于其它库,ggml 有以下优势:
- 最小化实现: 核心库独立,仅包含 5 个文件。如果你想加入 GPU 支持,你可以自行加入相关实现,这不是必选的。
- 编译简单: 你不需要花哨的编译工具,如果不需要 GPU,单纯 GGC 或 Clang 就可以完成编译。
- 轻量化: 编译好的二进制文件还不到 1MB,和 PyTorch (需要几百 MB) 对比实在是够小了。
- 兼容性好: 支持各类硬件,包括 x86_64、ARM、Apple Silicon、CUDA 等等。
- 支持张量的量化: 张量可以被量化,以此节省内存,有些时候甚至还提升了性能。
- 内存使用高效到了极致: 存储张量和执行计算的开销是最小化的。
Word2Vec 是 Google 的 Tomas Mikolov 等人于 2013 年提出的一种用于生成词嵌入(word embeddings)的模型。它从大量文本语料中以无监督方式学习语义,能够将文本中的单词转换为词向量,这些向量能够捕捉单词之间的语义关系,被广泛地应用于自然语言处理中。
Word2Vec 模型的核心思想是通过词语的上下文信息来学习词语的向量表示。主要有两种架构:CBOW 模型(Continuous Bag of Words,连续词袋模型)和 Skip-Gram 模型(跳字模型)。
通过训练一个神经网络模型,使得:
-
CBOW 模型:给定一个词语的上下文时,能够预测该词语本身。
- 输入层:将上下文单词通过词嵌入层转换为向量。
- 隐藏层:将上下文单词向量求和或取平均。
- 输出层:通过 softmax 层预测目标单词的概率分布。
-
Skip-gram 模型:给定一个词语时,能够预测其上下文。
- 输入层:将目标单词通过词嵌入层转换为向量。
- 隐藏层:目标单词的向量保持不变。
- 输出层:通过 softmax 层预测每个上下文单词的概率分布。
Word2Vec 的训练模型本质上是只具有一个隐含层的神经元网络。它的输入是采用 One-Hot 编码的词汇表向量,它的输出也是 One-Hot 编码的词汇表向量。
一般神经网络语言模型在预测的时候,输出的是预测目标词的概率,也就是说我每一次预测都要基于全部的数据集进行计算,这无疑会带来很大的时间开销。不同于其他神经网络,Word2Vec 提出两种加快训练速度的方式,一种是 Hierarchical softmax ,另一种是 Negative Sampling 。
训练过程
无论是 CBOW 还是 Skip-Gram 模型,训练过程都涉及到优化一个目标函数,这个函数通常是负采样的 softmax 损失函数。训练的目标是最小化预测误差,即最小化模型输出的概率分布和真实单词出现的概率分布之间的差异。
词嵌入向量
训练完成后,每个单词都会被映射到一个高维空间中的向量。这些向量捕捉了单词之间的语义和句法关系,例如 “国王” 和 “王后” 的向量之间的距离会比 “国王” 和 “椅子” 的向量之间的距离更近。
优势
- 效率:Word2Vec 训练速度快,适合大规模数据集。
- 灵活性:可以用于多种 NLP 任务,如文本分类、情感分析等。
- 泛化能力:能够捕捉单词之间的复杂关系。
Word2Vec 是自然语言处理领域的一个重要里程碑,为后续的词嵌入技术如 GloVe 和 BERT 等奠定了基础。
-
LLMs Tokenizer
-
LLMs Word Embeddings
-
1111111