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

上海城乡住房建设部网站开发公司宣传语

上海城乡住房建设部网站,开发公司宣传语,怎么查看自己网站有没有被百度收录,怎么自己免费创建网站专栏#xff1a;神经网络复现目录 注意力机制 注意力机制#xff08;Attention Mechanism#xff09;是一种人工智能技术#xff0c;它可以让神经网络在处理序列数据时#xff0c;专注于关键信息的部分#xff0c;同时忽略不重要的部分。在自然语言处理、计算机视觉、语…专栏神经网络复现目录 注意力机制 注意力机制Attention Mechanism是一种人工智能技术它可以让神经网络在处理序列数据时专注于关键信息的部分同时忽略不重要的部分。在自然语言处理、计算机视觉、语音识别等领域注意力机制已经得到了广泛的应用。 注意力机制的主要思想是在对序列数据进行处理时通过给不同位置的输入信号分配不同的权重使得模型更加关注重要的输入。例如在处理一句话时注意力机制可以根据每个单词的重要性来调整模型对每个单词的注意力。这种技术可以提高模型的性能尤其是在处理长序列数据时。 在深度学习模型中注意力机制通常是通过添加额外的网络层实现的这些层可以学习到如何计算权重并将这些权重应用于输入信号。常见的注意力机制包括自注意力机制self-attention、多头注意力机制multi-head attention等。 总之注意力机制是一种非常有用的技术它可以帮助神经网络更好地处理序列数据提高模型的性能。 文章目录注意力机制多头注意力数学逻辑实现多头注意力 多头注意力Multi-Head Attention是注意力机制的一种扩展形式可以在处理序列数据时更有效地提取信息。 在标准的注意力机制中我们计算一个加权的上下文向量来表示输入序列的信息。而在多头注意力中我们使用多组注意力权重每组权重可以学习到不同的语义信息并且每组权重都会产生一个上下文向量。最后这些上下文向量会被拼接起来再通过一个线性变换得到最终的输出。 多头注意力是Transformer模型中的一个重要组成部分被广泛用于各种自然语言处理任务如机器翻译、文本分类等。 数学逻辑 在实现多头注意力之前让我们用数学语言将这个模型形式化地描述出来。 给定查询q∈Rdqq\in R^{d_q}q∈Rdq​、 键k∈Rdkk\in R^{d_k}k∈Rdk​和值v∈Rdvv\in R^{d_v}v∈Rdv​ 每个注意力头的计算方法为 hif(Wi(q)q,Wi(k)k,Wi(v)v)∈Rpvh_if(W_i^{(q)}q,W_i^{(k)}k,W_i^{(v)}v)\in R^{pv}hi​f(Wi(q)​q,Wi(k)​k,Wi(v)​v)∈Rpv 其中可学习的参数包括 Wi(q)W_i^{(q)}Wi(q)​、 Wi(k)W_i^{(k)}Wi(k)​和 Wi(v)W_i^{(v)}Wi(v)​ 以及代表注意力汇聚的函数fff。 fff可以是加性注意力和缩放点积注意力。 多头注意力的输出需要经过另一个线性转换 它对应着hhh个头连结后的结果因此其可学习参数是 WoW_oWo​ 实现 在实现过程中通常选择缩放点积注意力作为每一个注意力头。 为了避免计算代价和参数代价的大幅增长 我们设定pqpkpvpp/hp_qp_kp_vp_p/hpq​pk​pv​pp​/h。 值得注意的是如果将查询、键和值的线性变换的输出数量设置为pqhpkhpvhppp_qhp_khp_vhp_ppq​hpk​hpv​hpp​ 则可以并行计算hhh个头。 在下面的实现中是通过参数pop_opo​num_hiddens指定的。 #save class MultiHeadAttention(nn.Module):多头注意力def __init__(self, key_size, query_size, value_size, num_hiddens,num_heads, dropout, biasFalse, **kwargs):super(MultiHeadAttention, self).__init__(**kwargs)self.num_heads num_headsself.attention d2l.DotProductAttention(dropout)self.W_q nn.Linear(query_size, num_hiddens, biasbias)self.W_k nn.Linear(key_size, num_hiddens, biasbias)self.W_v nn.Linear(value_size, num_hiddens, biasbias)self.W_o nn.Linear(num_hiddens, num_hiddens, biasbias)def forward(self, queries, keys, values, valid_lens):# querieskeysvalues的形状:# (batch_size查询或者“键值”对的个数num_hiddens)# valid_lens 的形状:# (batch_size)或(batch_size查询的个数)# 经过变换后输出的querieskeysvalues 的形状:# (batch_size*num_heads查询或者“键值”对的个数# num_hiddens/num_heads)queries transpose_qkv(self.W_q(queries), self.num_heads)keys transpose_qkv(self.W_k(keys), self.num_heads)values transpose_qkv(self.W_v(values), self.num_heads)if valid_lens is not None:# 在轴0将第一项标量或者矢量复制num_heads次# 然后如此复制第二项然后诸如此类。valid_lens torch.repeat_interleave(valid_lens, repeatsself.num_heads, dim0)# output的形状:(batch_size*num_heads查询的个数# num_hiddens/num_heads)output self.attention(queries, keys, values, valid_lens)# output_concat的形状:(batch_size查询的个数num_hiddens)output_concat transpose_output(output, self.num_heads)return self.W_o(output_concat)为了能够使多个头并行计算 上面的MultiHeadAttention类将使用下面定义的两个转置函数。 具体来说transpose_output函数反转了transpose_qkv函数的操作。 #save def transpose_qkv(X, num_heads):为了多注意力头的并行计算而变换形状# 输入X的形状:(batch_size查询或者“键值”对的个数num_hiddens)# 输出X的形状:(batch_size查询或者“键值”对的个数num_heads# num_hiddens/num_heads)X X.reshape(X.shape[0], X.shape[1], num_heads, -1)# 输出X的形状:(batch_sizenum_heads查询或者“键值”对的个数,# num_hiddens/num_heads)X X.permute(0, 2, 1, 3)# 最终输出的形状:(batch_size*num_heads,查询或者“键值”对的个数,# num_hiddens/num_heads)return X.reshape(-1, X.shape[2], X.shape[3])#save def transpose_output(X, num_heads):逆转transpose_qkv函数的操作X X.reshape(-1, num_heads, X.shape[1], X.shape[2])X X.permute(0, 2, 1, 3)return X.reshape(X.shape[0], X.shape[1], -1)代码解释 这段代码实现了多头注意力机制其中 MultiHeadAttention 类实现了多头注意力的前向传播 transpose_qkv 函数将输入的 queries, keys, values 通过线性变换并按照 num_heads 进行分组最终输出变换后的 queries, keys, values在前向传播中使用这些变换后的 queries, keys, values 来计算注意力权重。在 transpose_qkv 函数的实现中首先将 queries, keys, values 转换成形状为 (batch_size, queries/keys/values_num, num_hiddens) 的张量然后根据 num_heads 将最后一维进行分组变换成形状为 (batch_size, num_heads, queries/keys/values_num, num_hiddens/num_heads) 的张量最后将第一维和第二维进行交换输出形状为 (batch_size*num_heads, queries/keys/values_num, num_hiddens/num_heads) 的张量。transpose_output 函数实现了对 MultiHeadAttention 的输出进行逆转换的操作。 这么做的原因是因为多头注意力机制可以将输入张量进行 num_heads 个独立的注意力计算将计算结果在最后一维拼接起来作为输出这样可以提高模型的并行性加快计算速度。同时通过变换形状将 num_heads 独立处理也可以增强模型对不同位置和特征的表征能力。 具体来说这段代码实现的是一个MultiHeadAttention类其中定义了一个forward方法。这个方法接收一个查询序列queries一个键序列keys一个值序列values和一个有效长度序列valid_lens作为输入然后输出一个加权聚合的结果。 MultiHeadAttention类的初始化方法中我们定义了几个线性层以及注意力计算函数然后用这些组件来定义一个多头注意力层。该层包括将输入queries、keys和values通过三个线性层进行变换以便将它们的形状变为(batch_size * num_heads查询或者“键值”对的个数num_hiddens/num_heads)其中num_heads表示注意力头的数量。然后我们通过调用transpose_qkv函数对这些变换后的输入进行一次变换以便在注意力计算函数中实现多头并行计算。最后我们通过调用transpose_output函数将输出重构成(batch_size查询的个数num_hiddens)并通过一个线性层对其进行变换输出最终结果。 transpose_qkv函数将输入的queries、keys和values通过reshape和permute操作进行变换以便多头并行计算。具体来说它将输入变换为(batch_size查询或者“键值”对的个数num_headsnum_hiddens/num_heads)的形状然后将第2和第3个轴进行交换。最后它将输出变换为(batch_size * num_heads, 查询或者“键值”对的个数, num_hiddens/num_heads)的形状。 transpose_output函数将多头并行计算得到的输出通过reshape和permute操作逆转回原来的形状具体来说它将输出变换为(batch_size查询的个数num_heads, num_hiddens/num_heads)的形状然后将第2和第3个轴进行交换最终将输出变换为(batch_size查询的个数num_hiddens)的形状。 这里似乎所有的单头都是同一些参数这样不会导致每个单头的输出都是一样的吗 这里的确有点难懂, 这里其实是把所有注意力头里面的参数拼起来, 变成了一个大的全连接层
http://www.w-s-a.com/news/588012/

相关文章:

  • 兰州网站建设论坛四川建设网官网登录
  • 在线作图免费网站湖南批量出品机
  • 深圳做网站公司有哪些地方妇联加强网站平台建设
  • vps建设网站别人访问不了网页链接生成器
  • 网站建设一般要多少钱电商平台取名字大全
  • 怎么做网站封面上的图网站开发语言 微信接口
  • 免费观看网站建设优化安徽
  • 上海电商网站开发公司做婚恋网站的翻译好吗
  • 以网站建设为开题报告大数据技术就业前景
  • dw做网站字体 别人电脑显示青岛活动策划公司
  • 网站成立时间查询墨猴seo排名公司
  • 技术支持 随州网站建设苏州企业网站建设定制
  • 美食网站开发目的与意义网站开发环境选择
  • 青岛西海岸新区城市建设局网站开发板在null不可用
  • 企业信息管理系统免费seo优化个人博客
  • 做任务的设计网站泰州哪里做网站
  • 什么网站可以做设计赚钱吗南京十大软件公司排名
  • 网站开发时间进度北京有哪些著名网站
  • 深圳比较好的设计网站公司自己的网站到期域名如何续费
  • 温州做网站哪儿新云网站模版
  • 网站开发 视频存在哪检察院前期网站建设
  • 备案中的网站信息怎么填如何做分享赚钱的网站
  • 网站行程表怎么做注册公司费用要多少
  • 常见电子商务网站基本模式南山网站公司定
  • 网站搭建代码网站里面送礼物要钱怎么做代码
  • 大学英文网站建设举措wordpress 学院 模板
  • 爱 做 网站吗php网站作业模版
  • wordpress代码乱吗台州做网站seo的
  • 做ptt网站wordpress中文企业网站
  • 深圳雨棚制作深圳 网站优化公司排名