转换器+自注意力模型(1)

从零开始构建一个大语言模型-第三章第二节 3.1 长序列建模的问题3.3 用自注意力关注输入的不同部分3.4 用可训练的权重实现自注意力3.5 用因果注意力隐藏未来的词3.6 将单头注意力扩展到多头注意力。 阅读详情

其实我有的时候就在想,大模型都已经这么成熟了,那还要人做什么
最近我老师给我们发了一篇文章,是关于自注意力机制和转换器模型的,我在github上找了个项目

1从.ipynb文件中读取python代码

import json

# 读取 .ipynb 文件
with open('your_notebook.ipynb', 'r') as f:
    notebook = json.load(f)

# 提取代码单元格
code_cells = []
for cell in notebook['cells']:
    if cell['cell_type'] == 'code':
        code_cells.append(''.join(cell['source']))

# 将提取的代码保存到一个 Python 文件
with open('extracted_code.py', 'w') as f:
    for code in code_cells:
        f.write(code + '\n')

我刚才还纳闷这个notebook文件是什么,我又输入了一个print(notebook),结果发现它就是把tansformer这个文件的内容提取到notebook里了,这个.ipynb文件是分为两种单元格的,一种是代码单元格,一种是文本单元格。这个就是筛选出来代码单元格,然后把里面的source部分,也就是代码部分提取出来,然后再保存在extracted_code.py文件里面。

2

import torch
import torch.nn as nn


class SelfAttention(nn.Module):
    def __init__(self, embed_size, heads):
        super(SelfAttention, self).__init__()
        self.embed_size = embed_size
        self.heads = heads
        self.head_dim = embed_size // heads

        assert (
            self.head_dim * heads == embed_size
        ), "Embedding size needs to be divisible by heads"

        self.values = nn.Linear(embed_size, embed_size)
        self.keys = nn.Linear(embed_size, embed_size)
        self.queries = nn.Linear(embed_size, embed_size)
        self.fc_out = nn.Linear(embed_size, embed_size)

    def forward(self, values, keys, query, mask):
        # Get number of training examples
        N = query.shape[0]

        value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]

        values = self.values(values)  # (N, value_len, embed_size)
        keys = self.keys(keys)  # (N, key_len, embed_size)
        queries = self.queries(query)  # (N, query_len, embed_size)

        # Split the embedding into self.heads different pieces
        values = values.reshape(N, value_len, self.heads, self.head_dim)
        keys = keys.reshape(N, key_len, self.heads, self.head_dim)
        queries = queries.reshape(N, query_len, self.heads, self.head_dim)

        # Einsum does matrix mult. for query*keys for each training example
        # with every other training example, don't be confused by einsum
        # it's just how I like doing matrix multiplication & bmm

        energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])
        # queries shape: (N, query_len, heads, heads_dim),
        # keys shape: (N, key_len, heads, heads_dim)
        # energy: (N, heads, query_len, key_len)

        # Mask padded indices so their weights become 0
        if mask is not None:
            energy = energy.masked_fill(mask == 0, float("-1e20"))

        # Normalize energy values similarly to seq2seq + attention
        # so that they sum to 1. Also divide by scaling factor for
        # better stability
        attention = torch.softmax(energy / (self.embed_size ** (1 / 2)), dim=3)
        # attention shape: (N, heads, query_len, key_len)

        out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(
            N, query_len, self.heads * self.head_dim
        )
        # attention shape: (N, heads, query_len, key_len)
        # values shape: (N, value_len, heads, heads_dim)
        # out after matrix multiply: (N, query_len, heads, head_dim), then
        # we reshape and flatten the last two dimensions.

        out = self.fc_out(out)
        # Linear layer doesn't modify the shape, final shape will be
        # (N, query_len, embed_size)

        return out


class TransformerBlock(nn.Module):
    def __init__(self, embed_size, heads, dropout, forward_expansion):
        super(TransformerBlock, self).__init__()
        self.attention = SelfAttention(embed_size, heads)
        self.norm1 = nn.LayerNorm(embed_size)
        self.norm2 = nn.LayerNorm(embed_size)

        self.feed_forward = nn.Sequential(
            nn.Linear(embed_size, forward_expansion * embed_size),
            nn.ReLU(),
            nn.Linear(forward_expansion * embed_size, embed_size),
        )

        self.dropout = nn.Dropout(dropout)

    def forward(self, value, key, query, mask):
        attention = self.attention(value, key, query, mask)

        # Add skip connection, run through normalization and finally dropout
        x = self.dropout(self.norm1(attention + query))
        forward = self.feed_forward(x)
        out = self.dropout(self.norm2(forward + x))
        return out


class Encoder(nn.Module):
    def __init__(
        self,
        src_vocab_size,
        embed_size,
        num_layers,
        heads,
        device,
        forward_expansion,
        dropout,
        max_length,
    ):

        super(Encoder, self).__init__()
        self.embed_size = embed_size
        self.device = device
        self.word_embedding = nn.Embedding(src_vocab_size, embed_size)
        self.position_embedding = nn.Embedding(max_length, embed_size)

        self.layers = nn.ModuleList(
            [
                TransformerBlock(
                    embed_size,
                    heads,
                    dropout=dropout,
                    forward_expansion=forward_expansion,
                )
                for _ in range(num_layers)
            ]
        )

        self.dropout = nn.Dropout(dropout)

    def forward(self, x, mask):
        N, seq_length = x.shape
        positions = torch.arange(0, seq_length).expand(N, seq_length).to(self.device)
        out = self.dropout(
            (self.word_embedding(x) + self.position_embedding(positions))
        )

        # In the Encoder the query, key, value are all the same, it's in the
        # decoder this will change. This might look a bit odd in this case.
        for layer in self.layers:
            out = layer(out, out, out, mask)

        return out


class DecoderBlock(nn.Module):
    def __init__(self, embed_size, heads, forward_expansion, dropout, device):
        super(DecoderBlock, self).__init__()
        self.norm = nn.LayerNorm(embed_size)
        self.attention = SelfAttention(embed_size, heads=heads)
        self.transformer_block = TransformerBlock(
            embed_size, heads, dropout, forward_expansion
        )
        self.dropout = nn.Dropout(dropout)

    def forward(self, x, value, key, src_mask, trg_mask):
        attention = self.attention(x, x, x, trg_mask)
        query = self.dropout(self.norm(attention + x))
        out = self.transformer_block(value, key, query, src_mask)
        return out


class Decoder(nn.Module):
    def __init__(
        self,
        trg_vocab_size,
        embed_size,
        num_layers,
        heads,
        forward_expansion,
        dropout,
        device,
        max_length,
    ):
        super(Decoder, self).__init__()
        self.device = device
        self.word_embedding = nn.Embedding(trg_vocab_size, embed_size)
        self.position_embedding = nn.Embedding(max_length, embed_size)

        self.layers = nn.ModuleList(
            [
                DecoderBlock(embed_size, heads, forward_expansion, dropout, device)
                for _ in range(num_layers)
            ]
        )
        self.fc_out = nn.Linear(embed_size, trg_vocab_size)
        self.dropout = nn.Dropout(dropout)

    def forward(self, x, enc_out, src_mask, trg_mask):
        N, seq_length = x.shape
        positions = torch.arange(0, seq_length).expand(N, seq_length).to(self.device)
        x = self.dropout((self.word_embedding(x) + self.position_embedding(positions)))

        for layer in self.layers:
            x = layer(x, enc_out, enc_out, src_mask, trg_mask)

        out = self.fc_out(x)

        return out


class Transformer(nn.Module):
    def __init__(
        self,
        src_vocab_size,
        trg_vocab_size,
        src_pad_idx,
        trg_pad_idx,
        embed_size=512,
        num_layers=6,
        forward_expansion=4,
        heads=8,
        dropout=0,
        device="cpu",
        max_length=100,
    ):

        super(Transformer, self).__init__()

        self.encoder = Encoder(
            src_vocab_size,
            embed_size,
            num_layers,
            heads,
            device,
            forward_expansion,
            dropout,
            max_length,
        )

        self.decoder = Decoder(
            trg_vocab_size,
            embed_size,
            num_layers,
            heads,
            forward_expansion,
            dropout,
            device,
            max_length,
        )

        self.src_pad_idx = src_pad_idx
        self.trg_pad_idx = trg_pad_idx
        self.device = device

    def make_src_mask(self, src):
        src_mask = (src != self.src_pad_idx).unsqueeze(1).unsqueeze(2)
        # (N, 1, 1, src_len)
        return src_mask.to(self.device)

    def make_trg_mask(self, trg):
        N, trg_len = trg.shape
        trg_mask = torch.tril(torch.ones((trg_len, trg_len))).expand(
            N, 1, trg_len, trg_len
        )

        return trg_mask.to(self.device)

    def forward(self, src, trg):
        src_mask = self.make_src_mask(src)
        trg_mask = self.make_trg_mask(trg)
        enc_src = self.encoder(src, src_mask)
        out = self.decoder(trg, enc_src, src_mask, trg_mask)
        return out


if __name__ == "__main__":
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    print(device)

    x = torch.tensor([[1, 5, 6, 4, 3, 9, 5, 2, 0], [1, 8, 7, 3, 4, 5, 6, 7, 2]]).to(
        device
    )
    trg = torch.tensor([[1, 7, 4, 3, 5, 9, 2, 0], [1, 5, 6, 2, 4, 7, 6, 2]]).to(device)

    src_pad_idx = 0
    trg_pad_idx = 0
    src_vocab_size = 10
    trg_vocab_size = 10
    model = Transformer(src_vocab_size, trg_vocab_size, src_pad_idx, trg_pad_idx, device=device).to(
        device
    )
    out = model(x, trg[:, :-1])
    print(out.shape)

YoloV8改进策略:主干网络改进|SHViT高效视觉变换器(独家原创) SHViT是一种高效视觉变换器,通过优化设计和减少冗余,实现了低延迟和高精度的视觉任务处理。它采用大跨度patchify stem和单头注意力模块,避免了空间冗余和注意力头冗余,提高了计算效率和准确性。SHViT结合全局和局部信息,进一步提升性能,适用于资源受限设备。实验表明,SHViT在速度和准确率上均优于其他模型,如MobileViTv2,尤其在实时性要求高的应用中表现突出。SHViT模型关注宏观架构和微观多头自注意力(MHSA)的优化。 阅读详情

相关推荐

【第37篇】EdgeViTs: 在移动设备上使用Vision Transformers 的轻量级 CNN

目标检测有两种主流:自顶向下和自底向上。最先进的方法大多属于 第一类。在本文中,我们证明了自下而上的方法与自上而下的方法一样具有竞争力,并且具有更高的召回率。我们的方法名为 CenterNet,将每个对象检测为三个关键点(左上角和右下角以及中心关键点)。我们首先通过一些设计的线索对角进行分组,并通过中心关键点进一步确认对象。角关键点使该方法能够检测各种尺度和形状的对象,中心关键点避免了大量假阳性提议带来的混乱。我们的方法是一种无锚检测器,因为它不需要定义明确的锚框。

m0_47867638的博客 663

在视觉转换器中,每个阶段你只需要更少的注意力

摘要 视觉转换器(Vision Transformers,ViTs)的出现标志着计算机视觉领域的一次重大范式转变。ViTs通过自注意力模块捕获图像的全局信息,这些模块在图像块化的标记之间进行点积计算。虽然自注意力模块使ViTs能够捕获长距离依赖关系,但其计算复杂度与标记数量呈二次方增长,这严重阻碍了ViTs的实际应用。此外,深层ViTs中的自注意力机制也容易受到注意力饱和问题的影响。因此,我们反对在每一层中计算注意力分数的必要性,并提出了少注意力视觉转换器(Less-Attention Vision Tra

AI浩 1394

如何将转换器应用于时序模型

在机器学习的广阔环境中,变压器作为建筑奇迹屹立不倒,以其复杂的设计和捕获复杂关系的能力重塑了我们处理和理解大量数据的方式。

gongdiwudu的专栏 5597

自注意力机制

在进行图像与卷积的学习后,我们知道一张图片可以由RGB三通道的矩阵表示,即图片天然可以由数字表示。那么进入到自然语言处理领域,我们该怎样用数据表示文字并将其输入到模型呢?

efilU的博客 1100

LLM大模型在语言翻译领域的突破

1.背景介绍 语言翻译是人类交流的重要桥梁,它能够让不同语言的人们更好地理解和沟通。传统的语言翻译方法主要包括规则基础设施、统计机器翻译和神经机器翻译。随着大规模预训练语言模型(LLM)的迅猛发展,这些模型在语言翻译任务中取得了显著的突破,为语言翻译领域带来了新的机遇和挑战。 在本文中,我们将深入探讨LLM大模型在语言翻译领域的突破,包括

AI天才研究院 1230

基于Suno AI的转换器文本到音频模型项目文件.zip

人工智能的语音识别技术能够通过分析语音信号,将其转化为文本信息。这一技术的核心在于通过算法对声音的频率、时域和能量等特征进行提取,并利用机器学习模型进行识别。相对的,语音合成技术则是将文本信息转化为语音输出。它依赖于自然语言处理技术和数字信号处理技术,来确保合成的语音在音色、语速、情感等方面尽可能地接近自然人声。这两项技术虽然看似独立,但在实际应用中往往被结合使用,如智能助手在理解用户指令之后,通过语音合成技术给予反馈。

weixin_35753291的博客 1003

全局上下文视觉转换器(Global Context Vision Transformers)

我们提出了全局上下文视觉转换器(GC ViT),这是一种新颖的架构,旨在提高计算机视觉中的参数和计算利用率。我们的方法利用全局上下文自注意力模块与标准的局部自注意力相结合,以有效且高效的方式对长程和短程空间交互进行建模,而无需执行昂贵的操作,如计算注意力掩码或移动局部窗口。此外,我们还解决了ViT中归纳偏差缺失的问题,并提出在我们的架构中利用修改后的融合倒置残差块。我们提出的GC ViT在图像分类、目标检测和语义分割任务中均取得了最先进的结果。

AI浩 1401

【KDD2024】ShapeFormer:用于多元时间序列分类的Shapelet Transformer

多元时间序列分类(MTSC)因其在现实世界中的广泛应用而吸引了大量研究关注。最近,Transformer在MTSC中取得了先进的性能。然而,

m0_52597077的博客 4747

动手学深度学习 - 注意力机制和转换器 - 11.8 视觉转换器(Vision Transformer)

视觉Transformer(ViT)将Transformer架构引入计算机视觉领域,通过图像分块(PatchEmbedding)将图片转换为类似NLP的token序列,配合位置编码和分类标记(<cls>)处理。ViT的核心优势在于全局建模能力,特别适合大规模数据场景,但小数据集表现弱于传统CNN。企业应用中,Google、NVIDIA等公司利用ViT处理医疗影像、商品识别等高精度任务。模型包含多头注意力、预归一化等模块,训练需强正则化。ViT的部署面临计算量大等挑战,可通过MobileViT、量

tang7mj的博客 1032

Redhawk-SC输入件配置中的5个常见错误及解决方法

本文针对Redhawk-SC功耗与可靠性签核工具,深入剖析了输入件配置中工艺文件错配、DEF文件路径、时序文件格式、电源网络模型及宏模型处理这5个最常见且棘手的错误。文章提供了资深工程师验证过的实战解决方案与检查清单,旨在帮助用户规避风险,提升配置效率与分析准确性,确保芯片签核流程的顺利进行。

earth的博客 233

程序员的自我修养

一个好的程序员的自我修养需要从不同角度出发,工作能力是一个方面,对自身的定位和了解也是一个方面,程序员的工作能力修养包括需求理解、功能设计、沟通确认、代码规范、成果验证、代码重构优化等,通过自我剖析来对自身进行定位并了解自身的优缺点,如去除劣根性、端正意识形态与态度、提升自己的核心竞争力等。 自我剖析 一个成功的人,必须要先了解自己,只有了解自己是什么样的人,了解自身有哪些优缺点,了解自己更合适做什么工作,知道自己做什么才能发挥出自身的优势,这样才能使自己在工作中发光发热,在职业生涯的道路上走的更远。

数通畅联 1681

(CVPR-2022)视觉转换器与变形注意力

Transformer最近在各种视觉任务中表现出了卓越的表现。大的,有时甚至是全局的感受野赋予Transformer模型比CNN模型具有更高的表示能力。然而,单纯扩大感受野也会引起一些问题。一方面,使用密集注意力(例如在ViT中)会导致过多的内存和计算成本,并且特征可能会受到超出感兴趣区域的无关部分的影响。另一方面,在PVT或Swin Transformer中采用的稀疏注意力是数据不可知的,可能会限制对长期关系建模的能力。

顾道长生的科研笔记 1639

ENVI入门系列教程---一、数据预处理---1.1基本操作--5.x以后的界面(新界面)

every blog every motto: You never know how strong you really are until being strong is the only choice you have。 0. 前言 本系列教程旨在系统学习并梳理ENVI。说来惭愧,作为一名GISer,对ENVI这类软件还不能熟练掌握,这也是本系列教程的初衷。种一棵树最好的时间是十年以前,其次是...

胡侃有料的博客 1万+

AI 时代:探索大语言模型与核心技术

通过探索超大模型、大语言模型、GPT、ChatGPT 以及支撑 AI 发展的诸多关键技术,我们可以看出,AI 模型不仅具备强大的数据处理能力,还能在不同任务之间灵活迁移所学知识,为各类应用场景提供智能化解决方案。随着技术的不断进步,未来 AI 将变得更加高效、智能,并广泛融入日常生活,为人类创造更多可能性。

HuaweiLab_Peach的博客 1843

热力学仿真软件:Fluent_(8).材料属性设置

在 Fluent 中,材料属性主要包括密度、比热容、导热系数、黏度等物理性质。这些属性在不同的仿真场景中有着不同的作用,例如在流体仿真中,密度和黏度是必不可少的;在传热仿真中,导热系数和比热容是主要考虑的因素。如果所需的材料不在材料库中,或者需要对现有材料进行修改,用户可以自定义材料属性。在主菜单中选择Materials。点击打开材料编辑器。在材料编辑器中,点击Create按钮,输入新的材料名称。选择材料类型(如FluidSolid等)。在属性栏中填写所需的材料属性。

kkchenjj的博客 1495

threejs中使用Reflector实现出倒影效果,并实现背景透明的效果(Reflector镜面背景透明, 倒影弱化)

在项目中遇到要实现倒影效果,threejs给我们提供了Reflector,可以轻松完成镜面效果,实现倒影。但背景不透明;并且反射出的倒影太亮了;网上没搜到解决方案, 自己修改了下源码实现了想要的效果,做个记录...

weixin_40856652的博客 5723

自注意力的秘密.

跟着别人学转换器 参考地址 1,超参数文件 2,源汇词汇文件,预处理,就是词汇+次数的统计文件 3,加载数据,批量化数据文件,词与id建立一一对应关系.(一批一批的处理数据) 4,(实现编码器和解码器的)模型文件(重点) 5,训练代码(模型,损失函数) 6,评估. 1,超参数:批大小,学习速率,最大词长度,最小词数,隐藏节点数(或许就是神经单元数吧),块数(加解码块数) 4,模型. 1,先归一化,...

个人进步之路 1023

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

self-attention自注意力机制实现自然语言处理

One-hot Encoding独热编码,将每个汉字编码成向量,每个汉字所在位置的值设为1,其他设为0,但是总共有两万多个汉字,这样来看每个向量的维度太长,而且也体现不出相近的字的关系,如下图所示。One-hot Encoding+全连接网络,让模型自己学习汉字之间的关系,并输出我们想要的维度。

weixin_63872630的博客 1183

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

李哥深度学习笔记05-自注意力机制

那对于那些不肖子孙,我们可以采用LSTM方法,对其进行上锁,不让你进入模型,对于上图的例子,我们就可以在我和赛罕塔拉中间所有的内容都进行上锁。这里会体现出一个问题:即若一段话你需要的词距离太远,那每个字都需要传家宝的话,极容易出现不肖子孙(即记忆单元里面存储了错误的信息)去改变模型的输入 ,这样模型的输出也会改变,每次模型输入一个字的时候,会一起输入由上一个字传下来的。b1是由a1--a4由他们和各自的注意力相乘和相加得到的,b2,b3同理。自注意力机制是一个特征转换器,我们假设每个字都是768维的向量。

m0_51185615的博客 222

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大语言模型生成式AI学习笔记——1.1.4 大语言模型及生成式AI项目生命周期简介——​​​​​​​转换器出现之前的文本生成,转换器架构

这里的直觉是,每个自注意力头将学习语言的不同方面。你现在可以看到你如何关联在嵌入空间中彼此靠近的单词,并且如何计算单词之间的角度距离,这给了模型数学理解语言的能力。不仅仅是像你在这里看到的,将注意力放在每个单词和它的邻近单词之间,而是放在句子中的其他所有单词上。重要的是,一旦你选择了一个用于训练模型的tokenizer,当你生成文本时,你必须使用相同的tokenizer。它可以有效地扩展以使用多核GPU,可以并行处理输入数据,利用更大的训练数据集,并且至关重要的是,它能够学会关注其处理的单词的含义。

预见未来to50的专栏 750

SHViT:具有内存高效宏设计的单头视觉Transformer

链接:https://arxiv.org/pdf/2401.16456.pdf近年来,高效的视觉转换器在资源受限的设备上表现出色,延迟较低。传统上,它们在宏观层面使用 4×4 的补丁嵌入和 4 阶段结构,同时在微观层面使用具有多头配置的复杂注意力。本文旨在以内存高效的方式解决所有设计层面的计算冗余问题。我们发现,使用较大步长的 patchify stem 不仅减少了内存访问成本,还通过利用早期阶段中具有减少空间冗余的令牌表示来实现竞争性性能。

AI浩 3594

Self-attention——自注意力机制和bert

自注意力机制是Transformer的核心。这篇文章学习以下内容:1.怎么用数据表示文字2.怎么得到序列数据中上下文的关系信息3.可以并行的自注意力机制4.BERT。

2302_76269103的博客 641

通过直方图转换器恢复恶劣天气条件下的图像

计算机视觉领域对恢复受雨、雾和雪等恶劣天气条件影响的图像越来越感兴趣。这些天气条件会显著降低视觉质量,影响下游任务的性能,如目标检测[3,60]和深度估计[16,18]。因此,在恶劣天气下图像的恢复是一个至关重要的问题,为了视觉美学和安全。早期的研究利用天气相关的先验来模拟退化的统计特征,并去除不利天气[1,2,22,23,35,76,83,95,99]。

m0_59899305的博客 1780
上一篇: 孤独症项目(2)
下一篇: 孤独症(5)
人生无根蒂,飘如陌上尘
博客等级 码龄9年 224粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值