【论文+代码】1706.Transformer简易学习笔记

这篇具有很好参考价值的文章主要介绍了【论文+代码】1706.Transformer简易学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Transformer 论文: 1706.attention is all you need!
唐宇迪解读transformer:transformer2021年前,从NLP活到CV的过程
综述:2110.Transformers in Vision: A Survey
代码讲解1: Transformer 模型详解及代码实现 - 进击的程序猿 - 知乎
代码讲解2:: Transformer代码解读(Pytorch) - 神洛的文章 - 知乎
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

一、 结构概述

图1 原论文总框图

输入:词向量(embedding)
位置编码模块:给输入的词的在全局的位置信息
多头注意力层:它是有多个单层注意力层构成
正则化层:
masked-head attention
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

图2 attention的计算方式(向量表示方法)

核心公式为:
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

按比例缩放的点积注意力 (Scaled Dot-Product Attention)

该注意力属于点乘注意力机制,并在一般点乘注意力机制的基础上,加上了scaled。
scaled是指对注意力权重进行缩放,以确保数值的稳定性,
from : Scaled Dot-Product Attention解析 - 超级无敌螺旋风少女的文章 - 知乎
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

其他论文对其结构解读

2110.Transformers in Vision: A Survey

图2 自注意层如何使用在图像特征提取中

【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

图3:Transformer模型的架构概述

【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能
该模型最初是为语言翻译任务开发的,其中一种语言的输入序列需要转换成另一种语言的输出序列。
Transformer编码器(中间行)对输入语言序列进行操作,并在将其传递给编码器块之前将其转换为嵌入。Transformer解码器(下一行)操作先前用翻译语言生成的输出和中间分支的编码输入序列,以输出输出序列中的下一个单词。先前的输出序列(用作解码器的输入)是通过将输出语句向右移动一个位置并在开始时附加句子开始标记来获得的。这种移位避免了模型学习简单地将解码器输入复制到输出。训练模型的基本事实是输出语言序列(没有任何右移)附加一个句子结束标记。由多头注意(顶行)和前馈层组成的块在编码器和解码器中重复N次。

图6 视觉transformer的架构

【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

self-attention 代码实现

from: Transformer 模型详解及代码实现 - 进击的程序猿 - 知乎

单层attention的实现

输入序列单词的 Embedding Vector 经过线性变换(Linear 层)得到 Q、K、V 三个向量,并将它们作为 Self-Attention 层的输入。假设输入序列的长度为 seq_len,则 Q、K 和 V 的形状为(seq_len,d_k),其中,dk 表示每个词或向量的维度,也是 矩阵的列数。在论文中,输入给 Self-Attention 层的 Q、K、V 的向量维度是 64,
Embedding Vector 和 Encoder-Decoder 模块输入输出的维度都是 512。

【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

class ScaleDotProductAttention(nn.Module):
    def __init__(self, ):
        super(ScaleDotProductAttention, self).__init__()
        self.softmax = nn.Softmax(dim = -1)

    def forward(self, Q, K, V, mask=None):
        K_T = K.transpose(-1, -2) # 计算矩阵 K 的转置  
        d_k = Q.size(-1)
        # 1, 计算 Q, K^T 矩阵的点积,再除以 sqrt(d_k) 得到注意力分数矩阵
        scores = torch.matmul(Q, K_T) / math.sqrt(d_k)
        # 2, 如果有掩码,则将注意力分数矩阵中对应掩码位置的值设为负无穷大
        if mask is not None:
            scores = scores.masked_fill(mask == 0, -1e9)
        # 3, 对注意力分数矩阵按照最后一个维度进行 softmax 操作,得到注意力权重矩阵,值范围为 [0, 1]
        attn_weights = self.softmax(scores)
        # 4, 将注意力权重矩阵乘以 V,得到最终的输出矩阵
        output = torch.matmul(attn_weights, V)

        return output, attn_weights

# 创建 Q、K、V 三个张量
Q = torch.randn(5, 10, 64)  # (batch_size, sequence_length, d_k)
K = torch.randn(5, 10, 64)  # (batch_size, sequence_length, d_k)
V = torch.randn(5, 10, 64)  # (batch_size, sequence_length, d_k)

# 创建 ScaleDotProductAttention 层
attention = ScaleDotProductAttention()

# 将 Q、K、V 三个张量传递给 ScaleDotProductAttention 层进行计算
output, attn_weights = attention(Q, K, V)

# 打印输出矩阵和注意力权重矩阵的形状
print(f"ScaleDotProductAttention output shape: {output.shape}") # torch.Size([5, 10, 64])
print(f"attn_weights shape: {attn_weights.shape}") # torch.Size([5, 10, 10])

唐宇迪的self-attention的计算讲解

构建3个矩阵来查询,当前词和其他词的关系,特征向量表示
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

Q K V是由可训练的矩阵计算得到

【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

向量对应位点乘

【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

最终的输出结果 scale softmax

【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

整体计算流程总结

即 K Q 计算是加权权重值
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

多头注意力

相当于卷积里的多层
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能
多头表达多个特征
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能
具体的计算
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

多头注意力代码

from: Transformer 模型详解及代码实现 - 进击的程序猿 - 知乎

class MultiHeadAttention(nn.Module):
    """Multi-Head Attention Layer
    Args:
        d_model: Dimensions of the input embedding vector, equal to input and output dimensions of each head
        n_head: number of heads, which is also the number of parallel attention layers
    """
    def __init__(self, d_model, n_head):
        super(MultiHeadAttention, self).__init__()
        self.n_head = n_head
        self.attention = ScaleDotProductAttention()
        self.w_q = nn.Linear(d_model, d_model)  # Q 线性变换层
        self.w_k = nn.Linear(d_model, d_model)  # K 线性变换层
        self.w_v = nn.Linear(d_model, d_model)  # V 线性变换层
        self.fc = nn.Linear(d_model, d_model)   # 输出线性变换层

    def forward(self, q, k, v, mask=None):
        # 1. dot product with weight matrices
        q, k, v = self.w_q(q), self.w_k(k), self.w_v(v) # size is [batch_size, seq_len, d_model]
        # 2, split by number of heads(n_head) # size is [batch_size, n_head, seq_len, d_model//n_head]
        q, k, v = self.split(q), self.split(k), self.split(v)
        # 3, compute attention
        sa_output, attn_weights = self.attention(q, k, v, mask)
        # 4, concat attention and linear transformation
        concat_tensor = self.concat(sa_output)
        mha_output = self.fc(concat_tensor)

        return mha_output

    def split(self, tensor):
        """
        split tensor by number of head(n_head)

        :param tensor: [batch_size, seq_len, d_model]
        :return: [batch_size, n_head, seq_len, d_model//n_head], 输出矩阵是四维的,第二个维度是 head 维度

        # 将 Q、K、V 通过 reshape 函数拆分为 n_head 个头
        batch_size, seq_len, _ = q.shape
        q = q.reshape(batch_size, seq_len, n_head, d_model // n_head)
        k = k.reshape(batch_size, seq_len, n_head, d_model // n_head)
        v = v.reshape(batch_size, seq_len, n_head, d_model // n_head)
        """

        batch_size, seq_len, d_model = tensor.size()
        d_tensor = d_model // self.n_head
        split_tensor = tensor.view(batch_size, seq_len, self.n_head, d_tensor).transpose(1, 2)
        # it is similar with group convolution (split by number of heads)

        return split_tensor

    def concat(self, sa_output):
        """ merge multiple heads back together

        Args:
            sa_output: [batch_size, n_head, seq_len, d_tensor]
            return: [batch_size, seq_len, d_model]
        """
        batch_size, n_head, seq_len, d_tensor = sa_output.size()
        d_model = n_head * d_tensor
        concat_tensor = sa_output.transpose(1, 2).contiguous().view(batch_size, seq_len, d_model)

        return concat_tensor

位置编码

实际的特征向量=token的词向量+位置编码
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

位置编码的代码

from : Transformer代码解读(Pytorch) - 神洛的文章 - 知乎

词嵌入之后紧接着就是位置编码,位置编码用以区分不同词以及同词不同特征之间的关系。代码中需要注意:X_只是初始化的矩阵,并不是输入进来的;完成位置编码之后会加一个dropout。另外,位置编码是最后加上去的,因此输入输出形状不变。

代码

Tensor = torch.Tensor
def positional_encoding(X, num_features, dropout_p=0.1, max_len=512) -> Tensor:
    r'''
        给输入加入位置编码
    参数:
        - num_features: 输入进来的维度
        - dropout_p: dropout的概率,当其为非零时执行dropout
        - max_len: 句子的最大长度,默认512
    
    形状:
        - 输入: [batch_size, seq_length, num_features]
        - 输出: [batch_size, seq_length, num_features]

    例子:
        >>> X = torch.randn((2,4,10))
        >>> X = positional_encoding(X, 10)
        >>> print(X.shape)
        >>> torch.Size([2, 4, 10])
    '''

    dropout = nn.Dropout(dropout_p)
    P = torch.zeros((1,max_len,num_features))
    X_ = torch.arange(max_len,dtype=torch.float32).reshape(-1,1) / torch.pow(
        10000,
        torch.arange(0,num_features,2,dtype=torch.float32) /num_features)
    P[:,:,0::2] = torch.sin(X_)
    P[:,:,1::2] = torch.cos(X_)
    X = X + P[:,:X.shape[1],:].to(X.device)
    return dropout(X)

# 位置编码例子
X = torch.randn((2,4,10))
X = positional_encoding(X, 10)
print(X.shape)

编码器其他细节

【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能

解码器

整体架构汇总
【论文+代码】1706.Transformer简易学习笔记,论文解读,AI自然语言相关,计算机视觉相关,transformer,深度学习,人工智能
文章来源地址https://www.toymoban.com/news/detail-704891.html

到了这里,关于【论文+代码】1706.Transformer简易学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 经典神经网络论文超详细解读(六)——DenseNet学习笔记(翻译+精读+代码复现)

    上一篇我们介绍了ResNet:经典神经网络论文超详细解读(五)——ResNet(残差网络)学习笔记(翻译+精读+代码复现) ResNet通过短路连接,可以训练出更深的CNN模型,从而实现更高的准确度。今天我们要介绍的是 DenseNet(《Densely connected convolutional networks》) 模型,它的基本

    2024年02月03日
    浏览(62)
  • 经典神经网络论文超详细解读(八)——ResNeXt学习笔记(翻译+精读+代码复现)

    今天我们一起来学习何恺明大神的又一经典之作:  ResNeXt(《Aggregated Residual Transformations for Deep Neural Networks》) 。这个网络可以被解释为 VGG、ResNet 和 Inception 的结合体,它通过重复多个block(如在 VGG 中)块组成,每个block块聚合了多种转换(如 Inception),同时考虑到跨层

    2024年02月03日
    浏览(55)
  • 经典神经网络论文超详细解读(五)——ResNet(残差网络)学习笔记(翻译+精读+代码复现)

    《Deep Residual Learning for Image Recognition》这篇论文是何恺明等大佬写的,在深度学习领域相当经典,在2016CVPR获得best paper。今天就让我们一起来学习一下吧! 论文原文:https://arxiv.org/abs/1512.03385 前情回顾: 经典神经网络论文超详细解读(一)——AlexNet学习笔记(翻译+精读)

    2024年02月08日
    浏览(47)
  • 论文阅读笔记AI篇 —— Transformer模型理论+实战 (四)

    参考文章或视频链接 [1] 《论文阅读笔记AI篇 —— Transformer模型理论+实战 (一)》- CSDN [2] 《论文阅读笔记AI篇 —— Transformer模型理论+实战 (二)》- CSDN [3] 《论文阅读笔记AI篇 —— Transformer模型理论+实战 (三)》- CSDN 如果说钢铁侠中的 J.A.R.V.I.S. (贾维斯)是一个AGI通用人工智能的

    2024年01月24日
    浏览(44)
  • 论文阅读笔记AI篇 —— Transformer模型理论+实战 (一)

    资源地址 Attention is all you need.pdf(0积分) - CSDN Abstract 中强调 Transformer摒弃了循环和卷积网络结构 ,在English-to-German翻译任务中,BLEU得分为28.4, 在English-to-French的翻译任务中的BLEU得分为41.0,用8张GPU训练了3.5天,与各文献中的best models相比,这是非常小的训练成本。 Introductio

    2024年01月18日
    浏览(47)
  • 论文阅读笔记AI篇 —— Transformer模型理论+实战 (二)

    资源地址 Attention is all you need.pdf(0积分) - CSDN 图1——Transformer结构图 图2——Attention结构图 Background 中说,ByteNet和ConvS2S都使用了CNN结构作为基础模块去计算input和output之间的潜在联系,其中,关联来自两个任意输入或输出位置的信号所需的计算量,伴随着distance的增长而增长,

    2024年01月16日
    浏览(45)
  • 论文阅读笔记AI篇 —— Transformer模型理论+实战 (三)

    精读的过程要把每个细节都钻研透,不留有死角。各种维度参数已经在“理论+实战(二)”中说清楚了,若之后还有疑问我再补上。 三、参考文章或视频链接 [1] 【超强动画,一步一步深入浅出解释Transformer原理!】 3.1 参考文章或视频链接 [1] What’s the difference between Attent

    2024年01月23日
    浏览(49)
  • [论文阅读笔记18] DiffusionDet论文笔记与代码解读

    扩散模型近期在图像生成领域很火, 没想到很快就被用在了检测上. 打算对这篇论文做一个笔记. 论文地址: 论文 代码: 代码 首先介绍什么是扩散模型. 我们考虑生成任务, 即encoder-decoder形式的模型, encoder提取输入的抽象信息, 并尝试在decoder中恢复出来. 扩散模型就是这一类中的

    2023年04月08日
    浏览(67)
  • Transformer 论文学习笔记

    重新学习了一下,整理了一下笔记 论文 :《Attention Is All You Need》 代码 :http://nlp.seas.harvard.edu/annotated-transformer/ 地址 :https://arxiv.org/abs/1706.03762v5 翻译 :Transformer论文翻译 特点 : 提出一种不使用 RNN、CNN,仅使用注意力机制的新模型 Transformer; 只关注句内各 token 之间的关

    2024年02月14日
    浏览(43)
  • 详细理解(学习笔记) | DETR(整合了Transformer的目标检测框架) DETR入门解读以及Transformer的实操实现

    DETR ,全称 DEtection TRansformer,是Facebook提出的基于Transformer的端到端目标检测网络,发表于ECCV2020。 原文: 链接 源码: 链接 DETR 端到端目标检测网络模型,是第一个将 Transformer 成功整合为检测pipline中心构建块的目标检测框架模型。基于Transformers的端到端目标检测,没有NMS后

    2024年02月04日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包