- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
CNN 的的卷积核窗口大小有限,每次只能看比较短的部分序列,但是它的多通道机制被认为可以去识别多模式,transformer 论文参考这个机制,在 attention 的机制进一步引出了 Muti-Head Attention,来模拟卷积层的多输出通道效果.
Self-attention 在 transformer 论文之前已经有人提出,但 transformer 是第一个只依赖自注意力机制(self-attnetion)来实现 encoder-decoder 架构的模型.
(直到 GPT 出来之前)大多数有竞争力的神经序列转换模型都是采用编码器-解码器结构,transformer 模型也不例外.
编码器将输入的符号表示序列 (\(x_1,x_2,…,x_n\)) 映射为一个连续表示序列 (\(z_1,z_2,…, z_n\))。得到编码器输出序列 \(z\) 后,解码器逐个元素的生成符号的输出序列 (\(y_1,y_2…,y_m\))。解码器输出是自回归的,将当前轮的输出和输入拼接,作为下一轮的输入.
Transformer 的基本组件是: point-wise、self-attention、add & norm、feed forward、linear、softmax.
为了方便残差连接,模型中的所有子层 Sub Layer 以及嵌入层 Embedding Layer 都生成维度为 \(d_{model} = 512\) 的输出向量.
NLP/Transformer 模型的输入是三维向量,batch、句子序列长度 \(n\)、单词映射为 embedding vector 都分别表示为一个维度.
Batch norm 和 layer norm 的区别一句话总结就是 bn 是切特征,ln 是切样本.
BN
: 对于每个特征维度,计算它在整个批次中的均值和标准差,然后对该特征进行归一化。LN
: 对每个样本单独计算其所有特征的均值和标准差,然后在该样本内进行归一化。Layer Norm 层的计算可视化如下图所示
Decoder 同样由 \(N = 6\) 个相同的层组成。Decoder 的 attention 是带掩码的,确保位置 \(i\) 的预测只能依赖于小于 \(i\) 的已知输出.
标准自注意力的数学表达式如下:
1,首先,注意力函数可以描述为将一个查询(query)和一组键-值对(key-value pairs)映射到一个输出 output,\(q\)、\(k\)、\(v\) 都是向量。输出都是对 value 进行加权求和得到的,每个 value 对应的权重 weight 是通过 \(q\) 和 \(k\) 之间的相似度计算得到.
2,将 q 和 k 的内积作为相似度(Dot-Product),然后除以向量的长度 \(\sqrt{d_k}\)(Scaled),结果再应用 softmax 函数,就会得到 \(n\) 个非负且相加求和等于 \(1\) 的权重向量,最后将权重应用于 value,就得到了最终输出 output.
余弦相似度常用来比较两个向量的相似度(距离),伪代码如下:
CosineSimilarity = sum(x[i]*y[i])/(sqrt(sum(x[i]*x[i]))*sqrt(sum(y[i]*y[i])))。
实际中,为了方便计算,会同时对一组查询(queries)计算注意力函数,将 q、k、v 都是构建成矩阵 \(Q\)、\(K\)、\(V\)( 维度相等),涉及到两个矩阵乘法.
作者提到当向量维度变大的时候,softmax 函数会造成梯度消失问题,所以设置了一个 softmax 的 temperature 来缓解这个问题。这里 temperature 被设置为了 \(\sqrt{d_k}\).
作者提出的注意力机制算法跟之前的 Dot-Product Attention 相比就是单纯多了 Scaled(除以 \(\sqrt{d_k}\)).
另外 decoder 模块的 attention 多了一个 Mask,实际是第 \(t\) 时刻的 \(q\) 只能看前面阶段的对应的 \((k, v)\) 对,计算当中表现就是对于 \(q_t\) 和 \(k_t\) 及其之后的那些权重值都替换成一个极大的负数,这样经过 softmax 后(做指数 \(e^{w_t}\)),对应位置的 \(v\) 就变成了 0.
Scaled Dot-Product Attention 是不带任何参数的! 。
与其做单个的注意力函数,不如将 \(Q\)、\(K\)、\(V\) 投影到一个低维度、投影 \(h\) 次,然后再做 \(h\) 次的自注意力函数,并将这 \(h\) 个函数的输出拼接在一起,最后再次进行线性投影回来.
\(Q\)、\(K\) 的线性(映射)层的权重维度是 \([d_\text{model}, d_k]\),\(V\) 的线性(映射)层的权重维度是 \([d_{model}, d_v]\),输出线性(映射)层权重维度是 \([h*d_v, d_{model}]\).
作用:多头注意力机制可以注意到不同子空间的信息,捕捉到更加丰富的特征信息,实现类似卷积核的多通道机制的效果.
原理:
作用:
Self-Attention
(自注意力):对于每个位置上的 token,Self-Attention 将其与序列中的所有其他位置进行关联,从而使模型能捕捉到句子内部的语义关系。Encoder-Decoder Attention
(编码器-解码器注意力):允许解码器在生成下一个词时参考编码器的输出。这种机制实现了输入和输出序列之间的联系,是实现翻译等任务的关键所在。Masked Self-Attention
(掩码自注意力):过掩码机制屏蔽掉序列中未来位置的 tokens,从而确保模型预测生成的每个 token 仅依赖于当前生成位置之前的 tokens。从 nlp 角度理解 Attention + MLP: Attention 负责从全局的角度把整个序列的信息聚合起来(捕捉上下文信息 + 信息聚合),然后用 MLP 做语义的转换.
Embedding 层的作用学习一个长为 \(d_{model}\) 的向量来表示 token,编码器和解码器的输入都需要 embedding 层,两个嵌入层和 softmax 之前的线性变换之间共享相同的权重矩阵重(维度都是一样的),并且将权重值乘以 \(\sqrt{d_{model}}\).
学习 embedding 时,可能会把每个向量的 \(\text{L2\ norm}\) 学得相对较小(维度越大权重值越小),乘以 \(\sqrt{d_{model}}\) 后放大,使得和 PE 相加时在 scale 上匹配.
L2 归一化(L2 Norm)是一种将向量缩放到单位长度的操作,使得向量的模为1。对于一个给定向量 \(\mathbf{v}\) ,L2 归一化后的向量 \(\mathbf{\hat{v}}\),计算公式如下:
Attention 层的输出本身是不具备时序信息的,因为其本质是 value 向量的一个加权和,而权重是 query 和 key 的距离,跟序列信息无关。把输入 tokens 位置打乱,attention 的输出向量的所有元素的值大小不会变化,只有元素位置的变化,这显然不符合直觉.
而 Position encoding 层的作用是使得生成的 embedding vectors 值跟位置相关(加入时序信息),更符合人类文字的意义(文字的位置打乱,相应语义肯定会变化)。它的做法是将位置信息编码为向量,并将这些向量加到输入的嵌入向量中。Positional Encoding 通常通过以下公式计算:
比较了四种不同的层: self-attention、rnn、cnn、self-attention (restricted),分别比较了计算复杂度FLOPs、顺序操作(并行度)、最大路径长度.
最后此篇关于transformer论文解读的文章就讲到这里了,如果你想了解更多关于transformer论文解读的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一段这样的代码。我发现 myResults = writer.getBuffer().toString(); 对某些用例返回 EMPTY STRING,但对其他用例则不返回。 我查看了服务器,但在
如何使用 javascript 通过 id 更改元素中的 -webkit-transform 、-moz-transform 、-o-transform 和 -ms-transform css? 这段
我正在使用 javax.xml.transform.Transformer.transform() 通过 xsl 样式表将一个 xml 转换为另一个 xml。我想以编程方式设置第一级 child 的排
为了使 seaborn.pairplot() 正常工作,在 jupyter notebook 中执行了以下步骤。 /usr/local/lib/python2.7/site-packages/matp
假设这个输入 XML 编写这些代码行: StreamSource source = new StreamSource(new StringReader(/* the above XML*/));
如何在 spring 框架中配置 java.xml.transform.Transformer ?我需要转换器的实例来通过 xslt 将 xml 转换为文本。因此,配置的转换器应该了解 xslt 样式
我一直在核心数据中使用可转换属性,将图像和颜色等复杂对象转换为原始数据。我拿了this ... The idea behind transformable attributes is that you
我正在尝试打开 XML 文件,添加一些更改,然后保存到其他 XML 文件结果。我正在使用标准 javax.xml.parsers.* 和 javax.xml.transform* 类。 但在保存的文档
Transformer(变换方法)对输入源的大小有限制吗? 我正在尝试转换一个相当长的 (18M) XML,但收到一个奇怪的错误 "The element type "HR" must be term
我正在尝试解析一个非常简单的示例: 100 我使用的样式表如下: 这在 libxs
来自文档 for from_pretrained ,我知道我不必每次都下载预训练的向量,我可以使用以下语法保存它们并从磁盘加载: - a path to a `directory` contain
默认缓存目录磁盘容量不足,我需要更改默认缓存目录的配置。 最佳答案 您可以在每次加载模型时指定缓存目录 .from_pretrained通过设置参数cache_dir .您可以通过导出环境变量 TRA
有一个函数,例如: CATransform3DGetAffineTransform Returns the affine transform represented by 't'. If 't' ca
我有一个包含 WCF 设置的配置文件: “add”元素只有一个 baseAddress 属性,所以我不能使用 Match 定位器。一种方法如何像我的示例中那样转换多个元素? 最
在收到下面链接中描述的错误后,我已将实体属性的 Transfomer 设置为 NSSecureUnarchiveFromData(之前为 nil)。 CoreData crash error Xcod
当我写Document时使用 Transformer 的 transform() 方法转换为 XML,生成的 XML 文档的格式很好 - 所有元素都写在单独的行上并缩进。除了第一个元素与定义写在同一行
我不明白 StreamResult 实例会发生什么。我看到 Transformer 对象接收 source 和 streamResult: transformer.transform(sour
从下面的代码片段我应该得出结论,std::transform 比 boost::transform 更受欢迎,因为前者使用更少的初始化和析构函数可能更有效比后者? #include #include
transform() 可以将函数应用到序列的元素上,并将这个函数返回的值保存到另一个序列中,它返回的迭代器指向输出序列所保存的最后一个元素的下一个位置。 这个算法有一个版本和 for_each()
我是 react-native 的新手。在项目上将 react-native 从 0.48.3 升级到 0.62.2 后,运行“react-native run-ios”命令时出现错误:“index.
我是一名优秀的程序员,十分优秀!