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

网站建设和编程的区别快速制作效果图软件

网站建设和编程的区别,快速制作效果图软件,青海建设厅网站首页,免费域名申请方法#x1f468;‍#x1f393;作者简介#xff1a;一位即将上大四#xff0c;正专攻机器学习的保研er #x1f30c;上期文章#xff1a;机器学习深度学习——transformer#xff08;机器翻译的再实现#xff09; #x1f4da;订阅专栏#xff1a;机器学习‍作者简介一位即将上大四正专攻机器学习的保研er 上期文章机器学习深度学习——transformer机器翻译的再实现 订阅专栏机器学习深度学习 希望文章对你们有所帮助 BERT来自transformer的双向编码器表示 引入从上下文无关到上下文敏感从特定于任务到不可知任务BERT把两个最好的结合起来输入表示预训练任务遮蔽语言模型下一句预测 整合代码小结 引入 我们首先理解一下相关的一些概念首先我们知道在自然语言系统中词是意义的基本单元那么顾名思义词向量是用于表示单词意义的向量并且还可以被认为是单词的特征向量或表示。将单词映射到实向量的技术称为词嵌入也就是word2vec词嵌入已经逐渐成为了自然语言处理的基础知识。 词嵌入word2vec的模型有多种如跳元模型、连续词袋模型等词嵌入还可以有全局向量的词嵌入GloVe。具体的相关概念不细讲了以后如果总结的时候再讲。 词嵌入在预训练之后输出可以被认为是一个矩阵其中每一行都是一个预定义词表中词的向量。事实上这些词嵌入模型都是与上下文无关的。 从上下文无关到上下文敏感 上面所说的词嵌入word2vec以及全局向量的词嵌入GloVe都将相同的预训练向量分配给同一个词而不考虑词的上下文如果有的话。形式上任何词元x的上下文无关表示是f(x)其仅仅是将x作为其输入。但是考虑到自然语言中词的多意性以及语义的复杂性上下文无关的表示明显有局限在不同的语境和上下文中一个词元的意思可能是不一样的。 这推动了“上下文敏感”词表示的发展其中词的表征取决于它们的上下文。因此词元x的上下文敏感表示是函数f(x,c(x))其取决于x及其上下文c(x)。流行的上下文敏感包括了ELMoEmbeddings from Language Models来自语言模型的嵌入。 通过将整个序列作为输入ELMo是为输入序列中的每个单词分配一个表示的函数。添加ELMo改进了六种自然语言处理任务的技术水平情感分析、自然语言推断、语义角色标注、共指消解、命名实体识别和问答。 从特定于任务到不可知任务 尽管ELMo显著改进了各种自然语言处理任务的解决方案但每个解决方案仍然依赖于一个特定于任务的架构。然而为每一个自然语言处理任务设计一个特定的架构实际上并不是一件容易的事。GPT模型为上下文的敏感表示设计了通用的任务无关模型。 然而由于语言模型的自回归特性GPT只能向前看从左到右。在“i went to the bank to deposit cash”我去银行存现金和“i went to the bank to sit down”我去河岸边坐下的上下文中由于“bank”对其左边的上下文敏感GPT将返回“bank”的相同表示尽管它有不同的含义。 BERT把两个最好的结合起来 ELMo对上下文进行双向编码但使用特定于任务的架构而GPT是任务无关的但是从左到右编码上下文。BERT结合了这两个方面的优点。它对上下文进行双向编码并且对于大多数的自然语言处理任务只需要最少的架构改变。通过使用预训练的transformer编码器BERT能够基于其双向上下文表示任何词元。在下游任务的监督学习过程中BERT在两个方面与GPT相似。首先BERT表示将被输入到一个添加的输出层中根据任务的性质对模型架构进行最小的更改例如预测每个词元与预测整个序列。其次对预训练Transformer编码器的所有参数进行微调而额外的输出层将从头开始训练。 下面将深入了解BERT的训练前准备在后续的NLP应用中将说明针对下游任务应用的BERT微调。 import torch from torch import nn from d2l import torch as d2l输入表示 在自然语言处理中有些任务如情感分析以单个文本作为输入而有些任务如自然语言推断以一对文本序列作为输入。BERT输入序列明确地表示单个文本和文本对。当输入为单个文本时BERT输入序列是特殊类别词元“cls”、文本序列的标记、以及特殊分隔词元“sep”的连结。当输入为文本对时BERT输入序列是“cls”、第一个文本序列的标记、“sep”、第二个文本序列标记、以及“sep”的连结。BERT输入序列可以包括一个文本序列或两个文本序列可以与其他类型的序列区分开来其他类型的只是一个文本序列。 为了区分文本对根据输入序列学到的片段嵌入 e A 和 e B e_A和e_B eA​和eB​ 分别被添加到第一序列和第二序列的词元嵌入中。对于单文本输入仅使用 e A e_A eA​ 下面的get_tokens_and_segments将一个句子或两个句子作为输入然后返回BERT输入序列的标记及其相应的片段索引 #save def get_tokens_and_segments(tokens_a, tokens_bNone):获取输入序列的词元及其片段索引tokens [cls] tokens_a [sep]# 0和1分别标记片段A和Bsegments [0] * (len(tokens_a) 2)if tokens_b is not None:tokens tokens_b [sep]segments [1] * (len(tokens_b) 1)return tokens, segments在Transformer编码器中常见是位置嵌入被加入到输入序列的每个位置。然而与原始的Transformer编码器不同BERT使用可学习的位置嵌入。下图表明BERT输入序列的嵌入是词元嵌入、片段嵌入和位置嵌入的和。 下面的BERTEncoder类似于之前的TransformerEncoder类与其不同的是BERTEncoder使用片段嵌入和可学习的位置嵌入。 #save class BERTEncoder(nn.Module):BERT编码器def __init__(self, vocab_size, num_hiddens, norm_shape, ffn_num_input,ffn_num_hiddens, num_heads, num_layers, dropout,max_len1000, key_size768, query_size768, value_size768,**kwargs):super(BERTEncoder, self).__init__(**kwargs)self.token_embedding nn.Embedding(vocab_size, num_hiddens)self.segment_embedding nn.Embedding(2, num_hiddens)self.blks nn.Sequential()for i in range(num_layers):self.blks.add_module(f{i}, d2l.EncoderBlock(key_size, query_size, value_size, num_hiddens, norm_shape,ffn_num_input, ffn_num_hiddens, num_heads, dropout, True))# 在BERT中位置嵌入是可学习的因此我们创建一个足够长的位置嵌入参数self.pos_embedding nn.Parameter(torch.randn(1, max_len,num_hiddens))def forward(self, tokens, segments, valid_lens):# 在以下代码段中X的形状保持不变批量大小最大序列长度num_hiddensX self.token_embedding(tokens) self.segment_embedding(segments)X X self.pos_embedding.data[:, :X.shape[1], :]for blk in self.blks:X blk(X, valid_lens)return X假设词表大小为10000为了演示BERTEncoder的前向推断让我们创建一个实例并初始化它的参数。 vocab_size, num_hiddens, ffn_num_hiddens, num_heads 10000, 768, 1024, 4 norm_shape, ffn_num_input, num_layers, dropout [768], 768, 2, 0.2 encoder BERTEncoder(vocab_size, num_hiddens, norm_shape, ffn_num_input,ffn_num_hiddens, num_heads, num_layers, dropout)我们将tokens定义为长度为8的2个输入序列其中每个词元是词表的索引。使用输入tokens的BERTEncoder的前向推断返回编码结果其中每个词元由向量表示其长度由超参数num_hiddens定义。此超参数通常称为Transformer编码器的隐藏大小隐藏单元数。 tokens torch.randint(0, vocab_size, (2, 8)) segments torch.tensor([[0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 1]]) encoded_X encoder(tokens, segments, None) print(encoded_X.shape)运行结果 torch.Size([2, 8, 768]) 预训练任务 BERTEncoder的前向推断给出了输入文本的每个词元和插入的特殊标记“cls”及“seq”的BERT表示。接下来我们将使用这些表示来计算预训练BERT的损失函数。预训练包括以下两个任务掩蔽语言模型和下一句预测。 遮蔽语言模型 之前所说的语言模型都是只使用左侧的上下文预测词元右侧的会忽略不看。也就是说通过左侧的话去预测后面的词。 为了双向编码上下文以表示每个词元BERT随机掩蔽词元并使用来自双向上下文的词元以自监督的方式预测掩蔽词元。此任务称为掩蔽语言模型。相当于BERT从之前语言模型的预测词元变为了现在的完形填空。 在这个预训练任务中将随机选择15%的词元作为预测的掩蔽词元。要预测一个掩蔽词元而不使用标签作弊一个简单的方法是总是用一个特殊的“mask”替换输入序列中的词元。 然而人造特殊词元“mask”不会出现在微调中。为了避免预训练和微调之间的这种不匹配如果为预测而屏蔽词元例如在“my dog is cute”中选择掩蔽和预测“cute”则在输入中将其替换为 1、80%变为特殊“mask”词元“my dog is mask” 2、10%为随机词元“my dog is cat” 3、10%为不变的标签词元“my dog is cute” 在15%的时间中有10%的时间插入了随机词元。这种偶然的噪声鼓励BERT在其双向上下文编码中不那么偏向于掩蔽词元尤其是当标签词元保持不变时。至于为什么是这样15%80%这类数据是怎么得出的BERT的原作者只在论文中写自己是实验过且发现这样的效果很不错。 我们实现了下面的MaskLM类来预测BERT预训练的掩蔽语言模型任务中的掩蔽标记。预测使用单隐藏层的多层感知机self.mlp。在前向推断中它需要两个输入BERTEncoder的编码结果和用于预测的词元位置。输出是这些位置的预测结果。 #save class MaskLM(nn.Module):BERT的掩蔽语言模型任务def __init__(self, vocab_size, num_hiddens, num_inputs768, **kwargs):super(MaskLM, self).__init__(**kwargs)self.mlp nn.Sequential(nn.Linear(num_inputs, num_hiddens),nn.ReLU(),nn.LayerNorm(num_hiddens),nn.Linear(num_hiddens, vocab_size))def forward(self, X, pred_positions):num_pred_positions pred_positions.shape[1]pred_positions pred_positions.reshape(-1)batch_size X.shape[0]batch_idx torch.arange(0, batch_size)# 假设batch_size2num_pred_positions3# 那么batch_idx是np.array[0,0,0,1,1,1]batch_idx torch.repeat_interleave(batch_idx, num_pred_positions)masked_X X[batch_idx, pred_positions]masked_X masked_X.reshape((batch_size, num_pred_positions, -1))mlm_Y_hat self.mlp(masked_X)return mlm_Y_hat为了演示MaskLM的前向推断我们创建了其实例mlm并对其进行了初始化。回想一下来自BERTEncoder的正向推断encoded_X表示2个BERT输入序列。我们将mlm_positions定义为在encoded_X的任一输入序列中预测的3个指示。mlm的前向推断返回encoded_X的所有掩蔽位置mlm_positions处的预测结果mlm_Y_hat。对于每个预测结果的大小等于词表的大小。 mlm MaskLM(vocab_size, num_hiddens) mlm_positions torch.tensor([[1, 5, 2], [6, 1, 5]]) mlm_Y_hat mlm(encoded_X, mlm_positions) print(mlm_Y_hat.shape)输出结果 torch.Size([2, 3, 10000]) 通过掩码下的预测词元mlm_Y的真实标签mlm_Y_hat我们可以计算在BERT预训练中的遮蔽语言模型任务的交叉熵损失。 mlm_Y torch.tensor([[7, 8, 9], [10, 20, 30]]) loss nn.CrossEntropyLoss(reductionnone) mlm_l loss(mlm_Y_hat.reshape((-1, vocab_size)), mlm_Y.reshape(-1)) print(mlm_l.shape)运行结果 torch.Size([6]) 下一句预测 尽管掩蔽语言建模能够编码双向上下文来表示单词但它不能显式地建模文本对之间的逻辑关系。为了帮助理解两个文本序列之间的关系BERT在预训练中考虑了一个二元分类任务——下一句预测。 在为预训练生成句子对时有一半的时间它们确实是标签为“真”的连续句子在另一半的时间里第二个句子是从语料库中随机抽取的标记为“假”。 下面的NextSentencePred类使用单隐藏层的多层感知机来预测第二个句子是否是BERT输入序列中第一个句子的下一个句子。由于Transformer编码器中的自注意力特殊词元“cls”的BERT表示已经对输入的两个句子进行了编码。因此多层感知机分类器的输出层self.output以X作为输入其中X是多层感知机隐藏层的输出而MLP隐藏层的输入是编码后的“cls”词元。 #save class NextSentencePred(nn.Module):BERT的下一句预测任务def __init__(self, num_inputs, **kwargs):super(NextSentencePred, self).__init__(**kwargs)self.output nn.Linear(num_inputs, 2)def forward(self, X):# X的形状(batchsize,num_hiddens)return self.output(X)我们可以看到NextSentencePred实例的前向推断返回每个BERT输入序列的二分类预测。 encoded_X torch.flatten(encoded_X, start_dim1) # NSP的输入形状:(batchsizenum_hiddens) nsp NextSentencePred(encoded_X.shape[-1]) nsp_Y_hat nsp(encoded_X) print(nsp_Y_hat.shape)运行结果 torch.Size([2, 2]) 也可以计算两个二元分类的交叉熵损失 nsp_y torch.tensor([0, 1]) nsp_l loss(nsp_Y_hat, nsp_y) print(nsp_l.shape)输出结果 torch.Size([2]) 上述两个预训练任务中的所有标签都可以从预训练语料库中获得原始BERT已经在很大的文本语料库里面训练过了。 整合代码 在预训练BERT时最终的损失函数是掩蔽语言模型损失函数和下一句预测损失函数的线性组合。现在我们可以通过实例化三个类BERTEncoder、MaskLM和NextSentencePred来定义BERTModel类。前向推断返回编码后的BERT表示encoded_X、掩蔽语言模型预测mlm_Y_hat和下一句预测nsp_Y_hat。 #save class BERTModel(nn.Module):BERT模型def __init__(self, vocab_size, num_hiddens, norm_shape, ffn_num_input,ffn_num_hiddens, num_heads, num_layers, dropout,max_len1000, key_size768, query_size768, value_size768,hid_in_features768, mlm_in_features768,nsp_in_features768):super(BERTModel, self).__init__()self.encoder BERTEncoder(vocab_size, num_hiddens, norm_shape,ffn_num_input, ffn_num_hiddens, num_heads, num_layers,dropout, max_lenmax_len, key_sizekey_size,query_sizequery_size, value_sizevalue_size)self.hidden nn.Sequential(nn.Linear(hid_in_features, num_hiddens),nn.Tanh())self.mlm MaskLM(vocab_size, num_hiddens, mlm_in_features)self.nsp NextSentencePred(nsp_in_features)def forward(self, tokens, segments, valid_lensNone,pred_positionsNone):encoded_X self.encoder(tokens, segments, valid_lens)if pred_positions is not None:mlm_Y_hat self.mlm(encoded_X, pred_positions)else:mlm_Y_hat None# 用于下一句预测的多层感知机分类器的隐藏层0是“cls”标记的索引nsp_Y_hat self.nsp(self.hidden(encoded_X[:, 0, :]))return encoded_X, mlm_Y_hat, nsp_Y_hat小结 1、word2vec和GloVe等词嵌入模型与上下文无关。它们将相同的预训练向量赋给同一个词而不考虑词的上下文如果有的话。它们很难处理好自然语言中的一词多义或复杂语义。 2、对于上下文敏感的词表示如ELMo和GPT词的表示依赖于它们的上下文。 3、ELMo对上下文进行双向编码但使用特定于任务的架构然而为每个自然语言处理任务设计一个特定的体系架构实际上并不容易而GPT是任务无关的但是从左到右编码上下文。 4、BERT结合了这两个方面的优点它对上下文进行双向编码并且需要对大量自然语言处理任务进行最小的架构更改。 5、BERT输入序列的嵌入是词元嵌入、片段嵌入和位置嵌入的和。 6、预训练包括两个任务掩蔽语言模型和下一句预测。前者能够编码双向上下文来表示单词而后者则显式地建模文本对之间的逻辑关系。
http://www.zqtcl.cn/news/88029/

相关文章:

  • 什么网站做网页好秦皇岛工程建设信息网站
  • 北京网站营销seo方案WordPress点击logo返回首页
  • 百度不收录什么网站自定义wordpress评论列表
  • 启东建设网站网站开发过程 文档
  • 网站建设投标评分标准郑州网约车租赁公司
  • 网站找什么公司做ppt免费下载雷锋网站
  • 网站备案时要不要关闭wordpress 锚点定位
  • 学校网站建设平台微商的自己做网站叫什么
  • 外贸网站建设团队wordpress投稿插件 汉化
  • 凡科网可以自己做网站吗巩义网站建设与制作
  • 软件介绍网站模板手机特效视频制作软件免费
  • 广州外贸营销型网站专业网站制作公司招聘
  • 交流建筑的网站怎样做推广营销
  • 建设网站的实验报告网站开发用什么软件开发
  • 电商平台定制东莞市seo网络推广平台
  • 做网站和推广找哪家好网站导航的建设模板
  • 青岛建站方案有专业做网站的
  • 网站如何在百度刷排名网络广告的特点包括
  • 网站报价方案wordpress 修订版本号
  • 建设网站需要什么条件做的好的地方网站
  • 免费网站制作软件平台seo网站营销公司
  • 网站开发流程的8个步骤做营销型网站 推广的好处
  • 安徽seo网站南宁工程造价建设信息网站
  • html5网站框架中山市网站建设公司
  • 烟台建设局网站网站底部浮动
  • 江苏恒健建设集团有限公司网站怎样建设一个卡盟网站
  • 做网站的表情包做网站链接容易吗
  • 网站加密传输怎么做网站做竞价优化
  • 做网站要多少钱联系方式WordPress设置腾讯企业邮箱
  • 网站费用清单网站建设行业好做吗