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

手机网站做指向php网站建设制作服务

手机网站做指向,php网站建设制作服务,小型企业网站系统,h5 网站开发流程本文介绍带训练参数的self-attention,即在transformer中使用的self-attention。 首先引入三个可训练的参数矩阵Wq, Wk, Wv,这三个矩阵用来将词向量投射(project)到query, key, value三个向量上。下面我们再定义几个变量: import torch inpu…

本文介绍带训练参数的self-attention,即在transformer中使用的self-attention。

首先引入三个可训练的参数矩阵Wq, Wk, Wv,这三个矩阵用来将词向量投射(project)到query, key, value三个向量上。下面我们再定义几个变量:

import torch
inputs = torch.tensor(
[[0.43, 0.15, 0.89], # Your (x^1)
[0.55, 0.87, 0.66], # journey (x^2)
[0.57, 0.85, 0.64], # starts (x^3)
[0.22, 0.58, 0.33], # with (x^4)
[0.77, 0.25, 0.10], # one (x^5)
[0.05, 0.80, 0.55]] # step (x^6)
)x_2 = inputs[1] # second input element
d_in = inputs.shape[1] # the input embedding size, d=3
d_out = 2 # the output embedding size, d=2

d_in是输入维度,d_out是输出维度,在transformer模型中d_in和d_out通常是相同的,但是为了更好地理解其中的计算过程,这里我们选择不同的d_in=3和d_out=2。

下面我们初始化三个参数矩阵:

torch.manual_seed(123)W_query = torch.nn.Parameter(torch.rand(d_in, d_out), requires_grad=False)
W_key   = torch.nn.Parameter(torch.rand(d_in, d_out), requires_grad=False)
W_value = torch.nn.Parameter(torch.rand(d_in, d_out), requires_grad=False)

这里为了介绍方便,我们设置requires_grad=False, 如果是训练的话,我们要设置requires_grad=True

下面我们计算第二个单词的query, key, value:

# @ 是矩阵乘法
query_2 = x_2 @ W_query
key_2 = x_2 @ W_key
value_2 = x_2 @ W_value
print(query_2)
# tensor([0.4306, 1.4551])

可以看到,经过参数矩阵project之后,query, key, value的维度已经转变成2。

下面我们通过计算第二个单词的上下文向量来介绍整个过程。

keys_2 = keys[1] # Python starts index at 0
attn_score_22 = query_2.dot(keys_2)
print(attn_score_22)
# tensor(1.8524)attn_scores_2 = query_2 @ keys.T # All attention scores for given query
print(attn_scores_2)
# tensor([1.2705, 1.8524, 1.8111, 1.0795, 0.5577, 1.5440])d_k = keys.shape[1]
attn_weights_2 = torch.softmax(attn_scores_2 / d_k**0.5, dim=-1)
print(attn_weights_2)
# tensor([0.1500, 0.2264, 0.2199, 0.1311, 0.0906, 0.1820])context_vec_2 = attn_weights_2 @ values
print(context_vec_2)
# tensor([0.3061, 0.8210])

self-attention又叫做scaled-dot product attention,正是因为在求attention weight的时候对attention score做了除以向量维度的平方根来做缩放(scale)。

为什么要除以向量维度的平方根?

除以向量维度的平方根主要是避免太小的梯度以提升训练性能。对于像GPT这样的大型LLM模型,它的向量维度通常会超过上千,那么向量和向量之间的点乘结果就会非常大。而我们知道,对于Softmax函数,如果输入值很大或者很小的话,它是非常平缓的,非常平缓也就意味着梯度很小以至于接近于0。这就导致训练中的反向传播时,会出现非常小的梯度,从而引发梯度消失问题,极大地降低了模型学习的速度,引发训练停滞。下面是Softmax的函数图像:
在这里插入图片描述

怎么理解query, key, value?

query, key, value是借用数据库信息提取领域的概念。query用来搜索信息,key用来存储信息,value用来提取信息。
query:类似于数据库中的查找。它代表着当前模型关心的单词。query用来探测输入序列中的其他单词,去决定当前单词和其他单词的相关性。
key:类似于数据库中的索引。attention机制中,每个单词都有自己的key,这些key用来和query匹配。
value:类似于数据库中key-value对中的值。它代表着输入序列中单词的实际内容或者单词的实际表示。当query探测发现和某些key最相关,它就会提取跟这些key关联的value。

下面实现一个self-attention类:

import torch.nn as nnclass SelfAttention_v1(nn.Module):def __init__(self, d_in, d_out):super().__init__()self.W_query = nn.Parameter(torch.rand(d_in, d_out))self.W_key   = nn.Parameter(torch.rand(d_in, d_out))self.W_value = nn.Parameter(torch.rand(d_in, d_out))def forward(self, x):keys = x @ self.W_keyqueries = x @ self.W_queryvalues = x @ self.W_valueattn_scores = queries @ keys.T # omegaattn_weights = torch.softmax(attn_scores / keys.shape[-1]**0.5, dim=-1)context_vec = attn_weights @ valuesreturn context_vectorch.manual_seed(123)
sa_v1 = SelfAttention_v1(d_in, d_out)
print(sa_v1(inputs))# 输出:
# tensor([[0.2996, 0.8053],
#        [0.3061, 0.8210],
#        [0.3058, 0.8203],
#        [0.2948, 0.7939],
#        [0.2927, 0.7891],
#        [0.2990, 0.8040]], grad_fn=<MmBackward0>)

可以看到,输出结果的第二行和上面单独计算第二个单词的上下文向量是一致的。
我们可以使用nn.Linear来改进上面的self-attention类。相比于手动实现nn.Parameter(torch.rand(...))nn.Linear会优化权重的初始化,因此会使模型训练更稳定有效。

class SelfAttention_v2(nn.Module):def __init__(self, d_in, d_out, qkv_bias=False):super().__init__()self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias)self.W_key   = nn.Linear(d_in, d_out, bias=qkv_bias)self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias)def forward(self, x):keys = self.W_key(x)queries = self.W_query(x)values = self.W_value(x)attn_scores = queries @ keys.Tattn_weights = torch.softmax(attn_scores / keys.shape[-1]**0.5, dim=-1)context_vec = attn_weights @ valuesreturn context_vectorch.manual_seed(789)
sa_v2 = SelfAttention_v2(d_in, d_out)
print(sa_v2(inputs))# 输出:
# tensor([[-0.0739,  0.0713],
#        [-0.0748,  0.0703],
#        [-0.0749,  0.0702],
#        [-0.0760,  0.0685],
#        [-0.0763,  0.0679],
#        [-0.0754,  0.0693]], grad_fn=<MmBackward0>)

由于SelfAttention_v1SelfAttention_v2使用了不同的权重初始化方法,因此它们的输出结果是不一样的。



参考资料:
《Build a Large Language Model from Scratch》


文章转载自:

http://xDeNSQmK.sLfmp.cn
http://a4Qw7NGs.sLfmp.cn
http://0v9Q1A0m.sLfmp.cn
http://QE4kIVYk.sLfmp.cn
http://YJiYes2Q.sLfmp.cn
http://QWYa0qxJ.sLfmp.cn
http://I9Rz1PZC.sLfmp.cn
http://6lY3KIko.sLfmp.cn
http://EG5Bx0iG.sLfmp.cn
http://6q1aCu99.sLfmp.cn
http://8JCUyHsF.sLfmp.cn
http://hlLWWvXU.sLfmp.cn
http://wLcbcEJz.sLfmp.cn
http://iIYEGntN.sLfmp.cn
http://0emqqnId.sLfmp.cn
http://xVl8OV7I.sLfmp.cn
http://x84s8bj5.sLfmp.cn
http://ksFJ79Lf.sLfmp.cn
http://C9wZrYgV.sLfmp.cn
http://ZeKHKKby.sLfmp.cn
http://SaqPWadL.sLfmp.cn
http://k5CcMfA2.sLfmp.cn
http://rWASgo58.sLfmp.cn
http://n34QFeZw.sLfmp.cn
http://ktkp0dv5.sLfmp.cn
http://LroSH2iM.sLfmp.cn
http://9u0DjHEJ.sLfmp.cn
http://sSNGhqDs.sLfmp.cn
http://2lO0tBzE.sLfmp.cn
http://DCAoUESS.sLfmp.cn
http://www.dtcms.com/wzjs/700178.html

相关文章:

  • 网站首页面设计代码网站的制
  • 邯郸企业建站行政法规
  • 网站备案是备案域名还是空间深圳头条新闻
  • 什么网站可以做外贸怎么做一个公司的网站
  • 公司做网站的费用怎么入账企业邮箱登录入口126
  • 如何做公司网站制作西安网站设设
  • 国内做服装的网站有哪些国内永久免费的crm
  • 邯郸老区建设网站如何分析竞争对手的网站
  • 高端品牌网站设计企业网站建设项目建设全过程有哪些阶段
  • 网站做优化和推广哪个好免费域名网站黄
  • 小米官网网站建设公司建一个网站多少费用
  • 网站建设设计师我的网站突然打不开了
  • 青岛商媒做网站怎么样网站做反向代理对百度收录有影响吗
  • 网站服务器无法访问电子商务网站开发教程课后习题
  • 建设网站网页打不开WordPress抓取豆瓣
  • 广州网站的建设软件开发入门
  • 无忧网站建设报价什么是黄页
  • 网站建设维护合同合肥网站代运营公司有哪些
  • 用seo对网站做分析山东网站制作
  • 郑州网站开发yipinpai山东网站建设SEO优化制作设计公司
  • 有什么网站可以做设计兼职在线制作图片加闪光字
  • dedecms网站管理系统国外vps私人
  • 一个做特卖的网站做婚礼策划的网站
  • 广州天河建站公司广西建设执业资格注册中心官网
  • 备案域名购买完过户简单吗郑州网站seo公司
  • 手机建立网站多少钱北京网站优化排名
  • 网站建设的书 豆瓣中国能建电子商务平台
  • 自助建站网站建设设计公司中英文网站制作
  • 食品网站建设案例可以直接玩游戏的网址
  • wordpress畅言搜索引擎优化指的是