当前位置: 首页 > news >正文

一级a做爰片就在线手机看韩国网站某网站建设方案

一级a做爰片就在线手机看韩国网站,某网站建设方案,南京网络营销培训,福州牛蛙 网站建设1. 前言 神经网络不能直接处理自然语言文本#xff0c;文本数据处理的核心是做tokenization#xff0c;将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理#xff0c;OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair en…1. 前言 神经网络不能直接处理自然语言文本文本数据处理的核心是做tokenization将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair encoding)并构建训练大语言模型的Dataset及DataLoader。 2. Tokenization Tokenization的目标是将自然语言文本分割成一系列tokens。在英文自然语言处理领域最常用的tokenization方法是将英文文本分割成单词及标点符号。在中文自然语言处理领域往往会将一个字或一个标点符号作为一个token。 如下面的代码所示可以使用Python自带的正则表达式库re将英文文本分割成不同的单词及标点符号 import resentence Hello, world. This, is a test. tokens re.split(r([,.?_!()\]|\s), sentence) tokens [item for item in tokens if item.strip()] print(tokens)执行上面代码打印结果如下 [Hello, ,, world, ., This, ,, is, a, test, .]上面的tokenization示例代码删除掉了文本中的空格。在实际应用中也可以将空格视为一个单独的字符。删除空格可以显著减少分割文本产生的tokens数量减少内存消耗降低计算资源需求。但是在构建代码生成模型等应用场景中必须将文本中的空格视为一个单独的字符并编码成相应的token。 3. 将Token转换成数字ID 绝大部分处理自然语言文本的神经网络都包含Embedding层(embedding layer)torch.nn.Embedding。Embedding层存储了不同tokens对应的embedding向量输入一系列tokens对应的索引列表Embedding层输出相应tokens对应的embedding向量。 对自然语言文本做tokenization将文本分割成不同的tokens。Tokens不能直接输入神经网络的Embedding层需要将tokens转换成数字IDtoken ID。将tokens转换成数字ID首先要构造词汇表(vocabulary)。词汇表定义了不同tokens与数字索引的一一对应关系可以使用词汇表将分割自然语言文本产生的一系列tokens转换成数字ID列表也可以通过词汇表将数字ID列表还原成自然语言文本。 如下图所示构造词汇表需要对训练数据集中全部文本数据做tokenization获取所有不同的tokens并一一添加到字典(dict)中。字典的key为训练数据集中的不同tokens字典的value为相应token添加到字典中的顺序。 可以使用如下代码构造词汇表 diff_tokens sorted(set(tokens)) vocabulary {token: idx for idx, token in enumerate(diff_tokens)}for item in vocabulary.items():print(item)执行上面代码打印结果如下 (,, 0) (., 1) (Hello, 2) (This, 3) (a, 4) (is, 5) (test, 6) (world, 7)4. 常用的特殊Tokens 上述对训练数据集中全部文本数据做tokenization获取所有不同的tokens并构造将token映射成数字ID的词汇表的文本数据处理方法无法将训练数据集中不存在的token转换成数字ID。在自然语言处理项目实践中往往会在词汇表中增加一些特殊tokens以增强模型理解自然语言文本结构等信息的能力。常用的特殊tokens如下所示 |unk|(unknown)该token一般用于表示不在构建的词汇表中的单词或字符|endoftext|(end of text)该token一般用于分割两个不相关的文本。训练大语言模型的文本数据一般由许多文本拼接而成不同文本之间使用|endoftext|分隔使大语言模型可以理解训练数据的组织方式[BOS](beginning of sequence)该token通常位于一段文本的开头用于给模型提供输入文本的组织结构信息[EOS](end of sequence)该token通常位于一段文本的末尾用于拼接多个不相关的文本其作用与|endoftext|类似[PAD](padding)训练大语言模型每次会使用一个batch的训练样本构成一个张量(tensor)张量内所有训练样本token数量必须相同。如果batch中包含不同长度的训练样本一般会使用[PAD]将较短的训练样本填充至batch中最长训练样本长度 GPT-2系列大语言模型只在词汇表中增加了|endoftext|这个特殊token。其使用了一种被称为字节对编码(byte pair encoding)的tokenization方法该方法分割文本不会产生词汇表不包含的新token。 可以将上述tokenization方法封装成一个Tokenizer类其中encode函数用于将自然语言文本分割成一系列tokens并转换成数字ID列表。decode函数用于将数字ID列表还原成自然语言文本 class Tokenizer:def __init__(self, vocabulary):self.str_to_int vocabularyself.int_to_str list(vocabulary.keys())def encode(self, text):preprocessed re.split(r([,.?_!()\]|\s), text)preprocessed [item for item in preprocessed if item.strip()]preprocessed [item if item in self.str_to_int else |unk| for item in preprocessed]ids [self.str_to_int[s] for s in preprocessed]return idsdef decode(self, ids):text .join([self.int_to_str[i] for i in ids])text re.sub(r\s([,.?!()\]), r\1, text)return text可以使用如下代码实例化Tokenizer类对象并调用encode及decode函数打印示例文本对应的tokens及相应文本内容 vocabulary.update({|unk|: len(vocabulary), |endoftext|: len(vocabulary) 1}) text Hello world. |endoftext| This is a test dataset.tokenizer Tokenizer(vocabulary) print(tokenizer.encode(text)) print(tokenizer.decode(tokenizer.encode(text)))执行上面代码打印结果如下 [2, 7, 1, 9, 3, 5, 4, 6, 8, 1] Hello world. |endoftext| This is a test |unk|.5. 字节对编码(Byte Pair Encoding) 字节对编码(BPE)是大语言模型GPT-2、GPT-3以及ChatGPT使用的tokenization方法。BPE会将所有单个字符如ab等以及频繁出现的字符组合(subtoken)添加到词汇表中如字符d和e的组合de在许多英文单词中很常见因此会将de添加到词汇表中作为一个token。 如下图所示BPE可以将不在其词汇表中的单词分解成粒度更小的字符或字符组合因此OpenAI的GPT系列模型不用|unk|等特殊token来处理不在其词汇表中的单词。 OpenAI开源了其使用Rust语言实现的非常高效的BPE算法tiktoken库可以使用如下命令安装tiktoken !pip install tiktoken0.5.1使用tiktoken.encoding_for_model方法创建tokenizer对象加载大语言模型GPT-2所使用的词汇表并调用encode及decode函数测试BPE算法 import tiktokentokenizer tiktoken.encoding_for_model(gpt2) text Hello, do you like tea? |endoftext| In the sunlit terraces of someunknownPlace. integers tokenizer.encode(text, allowed_special{|endoftext|}) print(integers) strings tokenizer.decode(integers) print(strings)执行上面代码打印结果如下 [15496, 11, 466, 345, 588, 8887, 30, 220, 50256, 554, 262, 4252, 18250, 8812, 2114, 286, 617, 34680, 27271, 13] Hello, do you like tea? |endoftext| In the sunlit terraces of someunknownPlace.创建tokenizer对象并加载大语言模型GPT-3.5所使用的词汇表可以使用tokenizer tiktoken.encoding_for_model(gpt-3.5-turbo)方法。加载大语言模型GPT-4所使用的词汇表可以使用tokenizer tiktoken.encoding_for_model(gpt-4)。 查看tiktoken的内部源码可知大语言模型GPT-3.5及GPT-4所使用的词汇表完全相同。 6. 构建训练大语言模型的Dataset及DataLoader 6.1 大语言模型的训练样本 预训练大语言模型的数据集包含许多自然语言文档不同文档的内容使用|endoftext|拼接构成一个非常长的文本字符串使用上述BPE算法可以将该字符串转变成数字ID列表。 使用下一个token预测任务预训练大语言模型从数字ID列表中随机抽取一个长度为context_len的子列表输入大语言模型。大语言模型可以执行context_len次下一个token预测任务共预测输出context_len个tokens。 如下图所示假设context_len等于8则第一次下一个token预测任务大模型根据输入LLMs预测learn第二次根据输入LLMs learn预测to。依此类推第八次根据输入LLMs learn to predict one word at a预测time。 在实际训练大语言模型时会输入长度为context_len的数字ID列表每个数字对应一个token而不是输入一个字符串。 因此可以使用如下规则构建训练大语言模型的训练样本。每个训练样本包含一个input-target pair其中 input从训练数据集对应的数字ID列表中随机抽取的长度为context_len的子列表target将input子列表向后移一个token对应的子列表其中target中第 i i i个token ID为input中第 i − 1 i-1 i−1个token ID 理论上长度为 n n n的token ID列表对应的训练数据集最多可以构造出 n − context_len 1 n-\text{context\_len}1 n−context_len1个不同的训练样本。实际上会使用stride控制两个相邻训练样本之间的重叠tokens数量。如果 stride 1 \text{stride}1 stride1则两个相邻的训练样本存在个 context_len − 1 \text{context\_len}-1 context_len−1重叠的tokens第 i i i个训练样本的target即为第 i 1 i1 i1个训练样本的input。如果 stride context_len \text{stride}\text{context\_len} stridecontext_len则两个相邻训练样本之间不存在重叠的tokens。stride越小则可以构造出更多训练样本但是模型更容易过拟合。stride越大模型越不容易过拟合但是同一个训练数据集中构造的训练样本数会更少。 6.2 构建Dataset Pytorch提供的高效组织及加载训练数据的模块由Dataset及DataLoader类构成其中Dataset类用于定义如何加载每个训练样本DataLoader类用于随机打乱训练数据集并将训练数据集划分到不同的batch。 构建训练数据集对应的Dataset需要实现一个Dataset的子类并重写__init__构造方法__getitem__方法以及__len__方法。__init__方法用于初始化与访问训练数据相关的属性如文件路径、数据库连接器等等。如果训练数据集不是特别大可以在__init__方法中将整个训练数据集全部读取到内存中。如果训练数据集特别大无法一次全部加载进内存一般只会在__init__方法中初始化数据文件路径后续实际要用到相应数据时才会去读取。__getitem__中实现了根据索引返回相应训练样本的方法。在DataLoader类的实例化对象获取一个batch的训练样本时__getitem__方法会被调用batch_size次共传入batch_size个不同的索引返回batch_size个不同的训练样本构成一个训练大语言模型的batch。__len__方法定义了训练数据集的大小假设__len__方法返回训练数据集的大小为10则每次调用__getitem__方法传入的索引均为0-9之间包括0和9的整数。 综上所述可以使用如下代码构建训练大语言模型的Dataset import os import json import randomimport torch import tiktoken from torch.utils.data import Datasetclass LLMDataset(Dataset):def __init__(self, data_path, file_index_dir, vocabulary, special_token_id, context_len, stride):self.tokenizer tiktoken.encoding_for_model(vocabulary)self.special_token_id special_token_idself.context_len context_lenself.stride strideif not os.path.exists(file_index_dir):os.makedirs(file_index_dir, exist_okTrue)file_index_path os.path.join(file_index_dir, file_index.json)if not os.path.isfile(file_index_path):support_file_paths []for root, dirs, files in os.walk(data_path):for file in files:if file.endswith((.txt, .md)):file_path os.path.join(root, file)support_file_paths.append(file_path)random.shuffle(support_file_paths)file_indexes, total_tokens dict(), 0for file_path in support_file_paths:with open(file_path, rt, encodingutf-8) as f:file_token self.tokenizer.encode(f.read(), allowed_specialself.tokenizer.special_tokens_set)file_indexes[file_path] [total_tokens, total_tokens len(file_token)]total_tokens len(file_token) 1with open(file_index_path, wt, encodingutf-8) as f:json.dump(file_indexes, f, ensure_asciiFalse)with open(file_index_path, rt, encodingutf-8) as f:self.file_index json.load(f)max_token_index list(self.file_index.values())[-1][1]self.num_sample (max_token_index - context_len) // stride 1def __getitem__(self, index):index_files self._index_files(index)start_index index * self.stridestop_index start_index self.context_lensample []for file_path in index_files:index_range self.file_index[file_path]file_start, file_end 0, index_range[1] - index_range[0] 1if index_range[0] start_index index_range[1]:file_start start_index - index_range[0]if index_range[0] stop_index index_range[1]:file_end stop_index - index_range[0] 1with open(file_path, rt, encodingutf-8) as f:tokens self.tokenizer.encode(f.read(), allowed_specialself.tokenizer.special_tokens_set)tokens.append(self.special_token_id)sample.extend(tokens[file_start: file_end])return torch.tensor(sample[:-1]), torch.tensor(sample[1:])def __len__(self):return self.num_sampledef _index_files(self, index):index_files []start_file, stop_file None, Nonestart_index index * self.stridestop_index start_index self.context_lenfor file_path, index_range in self.file_index.items():if index_range[0] start_index index_range[1]:start_file file_pathif start_file is not None:index_files.append(file_path)if index_range[0] stop_index index_range[1]:stop_file file_pathif stop_file is not None:breakreturn index_filesLLMDataset类的__init__方法中通过self.tokenizer tiktoken.encoding_for_model(vocabulary)初始化了将文本转换为token ID的BPE tokenizer。遍历整个训练数据集中的.txt及.md文件初始化了一个key为文件路径value为文件中全部token的[起始索引, 终止索引]列表的字典self.file_index用于在__getitem__方法中根据索引找到相应训练样本所在文件。初始化了记录训练数据集中可构造训练样本总数的变量self.num_sample。 __getitem__方法调用self._index_files(index)函数返回index对应的训练样本所分布的文件路径。遍历文件路径列表index_files从各个文件中取出属于index对应训练样本部分的tokens并组合成训练样本sample。 上述训练大语言模型的LLMDataset并没有将训练数据一次全部加载进内存只在__init__方法中记录了训练数据文件并在调用__getitem__方法时根据index实时读取所需文件构造训练样本。这种方法可以不用将全部训练数据加载进内存但是需要耗费一定时间完成训练样本构造。 构建训练大语言模型的DataLoader时可以通过设置num_workers使数据读取与模型训练并行进行。只要LLMDataset中的训练数据构造效率不是特别慢一般不会影响模型训练效率。 如果训练大语言模型的计算服务器集群内存足够大到可以将整个训练数据集一次性全部加载进内存构建训练大语言模型的Dataset时可以在__init__方法中读取训练数据集中的全部.txt及.md文档将不同文档的内容使用|endoftext|拼接构成一个非常长的文本字符串并使用BPE tokenizer分别将该字符串转变成token ID列表存入计算服务器集群的内存。 虽然可以在构建训练大语言模型的DataLoader时通过设置num_workers使数据读取与模型训练并行进行一定程度上避免训练数据构造效率对模型训练的影响。但是在内存资源充足的情况下直接在__init__方法中将整个训练数据集全部加载进内存从而提升__getitem__方法中根据指定index构造训练数据的速度可以使模型训练的整体效率至少不比使用上面构建的Dataset差。具体代码如下所示 class LLMDataset(Dataset):def __init__(self, data_path, vocabulary, special_token_id, context_len, stride):self.context_len context_lenself.stride stridesupport_file_paths []for root, dirs, files in os.walk(data_path):for file in files:if file.endswith((.txt, .md)):file_path os.path.join(root, file)support_file_paths.append(file_path)random.shuffle(support_file_paths)self.tokens []tokenizer tiktoken.encoding_for_model(vocabulary)for file_path in support_file_paths:with open(file_path, rt, encodingutf-8) as f:file_token tokenizer.encode(f.read(), allowed_specialtokenizer.special_tokens_set)file_token.append(special_token_id)self.tokens.extend(file_token)self.num_sample (len(self.tokens) - context_len - 1) // stride 1def __getitem__(self, index):start_index index * self.stridex self.tokens[start_index: start_index self.context_len]y self.tokens[start_index 1: start_index self.context_len 1]return torch.tensor(x), torch.tensor(y)def __len__(self):return self.num_sample6.3 构建DataLoader 构建分batch读取训练数据的DataLoader只需要传入一个Dataset对象并实例化DataLoader类对象。可以使用如下代码构建训练大语言模型的DataLoader from torch.utils.data import DataLoaderbatch_size 16 random_seed 123torch.manual_seed(random_seed)dataset LLMDataset(data_pathsome_data_folder_path) train_loader DataLoader(datasetdataset,batch_sizebatch_size,shuffleTrue,num_workers4,drop_lastTrue )shuffle参数用于控制是否随机打乱训练数据集。如果shuffle设置为FalseDataLoader会依据索引从小到大的顺序依次生成不同batch的训练数据。如果shuffle设置为TrueDataLoader会随机打乱所有训练样本的索引并按照随机打乱后的索引顺序依次生成不同batch的训练数据。一般会将训练数据集对应DataLoader的shuffle参数设置为True确保不同batch的训练数据是独立同分布的。测试数据集对应DataLoader的shuffle参数一般会设置为False因为测试数据集中数据不被用于训练模型保存数据测试顺序信息有助于分析数据测试结果。 通过torch.manual_seed(random_seed)指定随机数种子可以使DataLoader在不同次训练流程中生成完全相同的训练样本索引随机排列但是一次训练流程的对训练数据集的不同次迭代中训练样本索引的随机排列会各不相同。设置随机数种子有助于神经网络训练结果复现但是不会使得在训练过程中陷入重复的更新周期。 假设训练数据集共包含5个不同的训练样本构建DataLoader时设置shuffle参数为True则在一次训练流程的前3次对训练数据集的遍历过程中访问训练数据的顺序可能如下不同随机数种子会产生不同的访问顺序 第一次遍历训练数据集的顺序[3, 4, 1, 0, 2]第二次遍历训练数据集的顺序[2, 1, 0, 3, 4]第三次遍历训练数据集的顺序[1, 4, 0, 3, 2] 保持随机数种子不变第二次执行训练代码在第二次训练流程中的前3次对训练数据集的遍历顺序必定与上面的遍历顺序相同。 如果在训练大语言模型时程序异常中断从保存的断点(checkpoint)处恢复训练环境需要特别注意随机数种子的设置与变更。如果从某个batch对应的checkpoint恢复训练环境只需要使用同一个随机数种子并跳过前 k k k个已经训练的batch即可。如果从某个epoch对应的checkpoint处继续训练模型需要变更随机数种子确保新的一轮训练遍历训练数据集的顺序与上一次遍历训练数据集的顺序不一致。在训练大语言模型时建议不同epoch使用不同的随机数种子并记录随机数种子的使用顺序。 batch_size是指训练大语言模型的一个batch中包含训练样本的数量。batch_size越小则训练大语言模型要求的显卡最大内存越小但是会导致计算出的更新大语言模型的梯度方差较大影响大语言模型训练时的收敛速度及模型最终效果。batch_size的设置可以参考OpenAI训练GPT系列大语言模型的论文或者设置成当前显卡内存资源允许的最大值。 在实际训练大语言模型时训练数据集中的训练样本数量一般不太可能恰好构成整数个batch最后一个batch很可能仅包含相对非常少的训练样本。在一个训练的epoch中使用包含训练样本数量非常少的batch作为最后一个batch会引入一次噪声较大的更新梯度影响训练大语言模型时的收敛效果。将drop_last设置为True会将每个epoch中的最后一个batch丢弃不参与模型参数更新。 num_workers参数用于控制数据并行加载及预处理。如下图所示在使用GPU训练大语言模型时CPU不仅要与GPU交互处理深度学习模型参数调度等任务还要加载及预处理训练数据。如果num_workers0系统将使用主进程加载数据数据处理与GPU任务调度时串行的GPU在CPU加载及预处理训练数据时处于空闲状态会明显降低模型训练速度及GPU利用率。如果num_workers大于0系统将启动多个工作进程并行加载及预处理训练数据使主进程专注于GPU资源及训练任务调度。num_workers必须根据系统计算资源及训练数据集情况来确定根据实践经验大部分情况下将num_workers设置为4可以比较高效地利用系统计算资源。 7. 结束语 本文详细讲解了文本数据处理的方法并构建了训练大语言模型的Dataset及DataLoader。请坐好站稳我们将要去深入了解大语言模型的神经网络架构了
http://www.hkea.cn/news/14427874/

相关文章:

  • 成都网站建设哪个好手机版网站设计案例
  • 阜宁住房和城乡建设局网站做水浒传有关的网站
  • 鸿扬家装网站建设两学一做考学网站
  • 天津网站开发培训学校哪个浏览器看黄页最快夸克浏览器
  • 网站建设公司那家好做网站主题
  • 小程序开发者免费网站建设优化
  • 深圳网站建设外包公司排名免费的网站域名查询565wcc
  • 做网站怎么做小图标网站开发与
  • 做我的狗在什么网站上看wordpress美食主题
  • 手机网站js电话悬浮新中式装修风格效果图
  • 菏泽网站建设 梧桐树网站建设与应用
  • 专注网站基础优化今天刚刚长沙
  • 网站建设推荐书籍广西医科大学网站建设
  • 网站的导入流量怎么做梅河口信息网
  • 网络安全企业十大seo公司
  • 公司网站建设合规吗为什么我的网站无法访问
  • 瀑布流分享网站源代码下载专业建设主考学校是什么意思
  • 上海学习网站建设天津网站制作建设
  • 中国最大的免费素材网站番号网站怎么做
  • 网站功能建设上海门户网站制
  • 网站开发和优化关系六安短视频优化费用
  • 昆明hph网站建设中国新闻社副社长
  • 静安西安网站建设网上做室内设计好的网站
  • 中国建设教育协会培训中心网站百度ocpc如何优化
  • 有主体新增网站海南省两学一做网站
  • 深圳网站建设及优化阿里云认证网站建设题库
  • 网站建设 软件 开源台州网站建设哪家便宜
  • 做展示网站要恋用什么程序软件工程最好的出路
  • 制作网站软件网站上海市建设干部学校网站
  • 甜品网站建设策划书wordpress jiathis