Python发票合同 | 解缠注意力语言模型

🎯要点

🎯语言学、儿童发展、数学、常识推理、生物学、物理学、社会偏见、软件开发基准评估语言模型 | 🎯解缠注意力模型 | 🎯语言模型行为测试 | 🎯知识图谱关联信息提取模型 | 🎯多标签和多模态数据点分类器 :Python/MATLAB/C++/C | 🎯生物医学语言推理模型 | 🎯商业文本语言模型 | 🎯倾听同理心长记忆个性对话模型 | 🎯混合密集和稀疏表征和多 GPU 训练和推理 | 🎯自定义语言序列建模 | 🎯基因组变异分析模型 | 🎯组蛋白基因表达预测模型 | 🎯蛋白质功能推断模型 | 🎯高质量图像合成模型

🎯语言模型可解释和可视化:Python记忆组合透明度语言模型

🍇Python机器翻译和摘要中序列到序列任务

序列到序列任务表示输入和输出是序列(不一定具有相同长度)的任务。该领域的热门任务包括机器翻译和摘要。为此,我们通常有一个 Transformer 编码器用于解释输入序列,以及一个解码器用于以自回归方式生成输出。然而,在这里,我们将回到一个更简单的示例任务并仅使用编码器。给定 0 到 M M M 之间的 N N N 数字序列,任务是反转输入序列。在 Numpy 表示法中,如果我们的输入是 x x x,则输出应该是 x [ : : − 1 ] x[::-1] x[::1]​。尽管这个任务听起来非常简单,但递归神经网络可能会遇到问题,因为该任务需要长期依赖。 Transformer 就是为了支持这种功能而构建的,因此,我们希望它能够表现良好。

首先,让我们在下面创建一个数据集类。

class ReverseDataset(data.Dataset):def __init__(self, num_categories, seq_len, size):super().__init__()self.num_categories = num_categoriesself.seq_len = seq_lenself.size = sizeself.data = torch.randint(self.num_categories, size=(self.size, self.seq_len))def __len__(self):return self.sizedef __getitem__(self, idx):inp_data = self.data[idx]labels = torch.flip(inp_data, dims=(0,))return inp_data, labels

我们创建 0 到 num_categories-1 之间任意数量的随机数字序列。标签只是在序列维度上翻转的张量。我们可以在下面创建相应的数据加载器。

dataset = partial(ReverseDataset, 10, 16)
train_loader = data.DataLoader(dataset(50000), batch_size=128, shuffle=True, drop_last=True, pin_memory=True)
val_loader   = data.DataLoader(dataset(1000), batch_size=128)
test_loader  = data.DataLoader(dataset(10000), batch_size=128)

让我们看一下数据集的任意样本:

inp_data, labels = train_loader.dataset[0]
print("Input data:", inp_data)
print("Labels:    ", labels)
Input data: tensor([9, 6, 2, 0, 6, 2, 7, 9, 7, 3, 3, 4, 3, 7, 0, 9])
Labels:     tensor([9, 0, 7, 3, 4, 3, 3, 7, 9, 7, 2, 6, 0, 2, 6, 9])

在训练期间,我们将输入序列传递给 Transformer 编码器,并预测每个输入标记的输出。我们使用标准交叉熵损失来执行此操作。每个数字都表示为一个独热向量。请记住,将类别表示为单个标量会极大地降低模型的表达能力,因为在我们的示例中和并不比和更紧密相关。独热向量的替代方法是使用学习到的嵌入向量,因为它由 PyTorch 模块 nn.Embedding 提供。但是,像我们的例子一样使用带有附加线性层的独热向量具有与嵌入层相同的效果(self.input_net 将独热向量映射到密集向量,其中权重矩阵的每一行代表特定类别的嵌入)。

为了实现动态训练,我们创建一个继承自 TransformerPredictor 的新类,并覆盖训练、验证和测试步骤函数。

class ReversePredictor(TransformerPredictor):def _calculate_loss(self, batch, mode="train"):inp_data, labels = batchinp_data = F.one_hot(inp_data, num_classes=self.hparams.num_classes).float()preds = self.forward(inp_data, add_positional_encoding=True)loss = F.cross_entropy(preds.view(-1,preds.size(-1)), labels.view(-1))acc = (preds.argmax(dim=-1) == labels).float().mean()self.log(f"{mode}_loss", loss)self.log(f"{mode}_acc", acc)return loss, accdef training_step(self, batch, batch_idx):loss, _ = self._calculate_loss(batch, mode="train")return lossdef validation_step(self, batch, batch_idx):_ = self._calculate_loss(batch, mode="val")def test_step(self, batch, batch_idx):_ = self._calculate_loss(batch, mode="test")

最后,我们可以创建一个类似于我们在 PyTorch Lightning 中看到的训练函数。我们创建一个 pl.Trainer 对象,运行几个时期,登录 TensorBoard,并根据验证保存我们的最佳模型。之后,我们在测试集上测试我们的模型。我们在这里传递给训练器的另一个参数是 gradient_clip_val。这会在采取优化器步骤之前剪切所有参数的梯度范数,并防止模型在例如尖锐损失表面处获得非常高的梯度时发散。对于 Transformers,梯度剪切可以帮助在前几次迭代期间以及之后进一步稳定训练。在普通的 PyTorch 中,您可以通过 torch.nn.utils.clip_grad_norm_(...) 应用梯度剪切。剪辑值通常在 0.5 到 10 之间,具体取决于您想要剪辑大梯度的程度。解释完这些之后,我们来实现训练功能:

def train_reverse(**kwargs):root_dir = os.path.join(CHECKPOINT_PATH, "ReverseTask")os.makedirs(root_dir, exist_ok=True)trainer = pl.Trainer(default_root_dir=root_dir,callbacks=[ModelCheckpoint(save_weights_only=True, mode="max", monitor="val_acc")],accelerator="gpu" if str(device).startswith("cuda") else "cpu",devices=1,max_epochs=10,gradient_clip_val=5)trainer.logger._default_hp_metric = None pretrained_filename = os.path.join(CHECKPOINT_PATH, "ReverseTask.ckpt")if os.path.isfile(pretrained_filename):print("Found pretrained model, loading...")model = ReversePredictor.load_from_checkpoint(pretrained_filename)else:model = ReversePredictor(max_iters=trainer.max_epochs*len(train_loader), **kwargs)trainer.fit(model, train_loader, val_loader)val_result = trainer.test(model, val_loader, verbose=False)test_result = trainer.test(model, test_loader, verbose=False)result = {"test_acc": test_result[0]["test_acc"], "val_acc": val_result[0]["test_acc"]}model = model.to(device)return model, result

最后,我们可以训练模型了。在这个设置中,我们将在多头注意力中使用单个编码器块和单个头。之所以选择这种方式,是因为任务比较简单,在这种情况下,注意力实际上可以被解释为预测的“解释”。

reverse_model, reverse_result = train_reverse(input_dim=train_loader.dataset.num_categories,model_dim=32,num_heads=1,num_classes=train_loader.dataset.num_categories,num_layers=1,dropout=0.0,lr=5e-4,warmup=50)
GPU available: True, used: True
TPU available: False, using: 0 TPU cores
LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0]

找到预训练模型,正在加载…

/home/anaconda3/envs/nlp1/lib/python3.7/site-packages/pytorch_lightning/utilities/distributed.py:45: UserWarning: The dataloader, test dataloader 0, does not have many workers which may be a bottleneck. Consider increasing the value of the `num_workers` argument` (try 16 which is the number of cpus on this machine) in the `DataLoader` init to improve performance.warnings.warn(*args, **kwargs)

PyTorch Lightning 关于 worker 数量的警告暂时可以忽略。由于数据集非常简单,并且 __getitem__ 的完成时间可以忽略不计,因此我们不需要子进程来为我们提供数据(事实上,更多的 worker 可能会减慢训练速度,因为进程之间存在通信开销)。

print(f"Val accuracy:  {(100.0 * reverse_result['val_acc']):4.2f}%")
print(f"Test accuracy: {(100.0 * reverse_result['test_acc']):4.2f}%")
Val accuracy:  100.00%
Test accuracy: 100.00%

正如我们所期望的,Transformer 可以正确地解决任务。然而,对于任意输入,多头注意力模块中的注意力看起来如何?让我们尝试在下面可视化它。

data_input, labels = next(iter(val_loader))
inp_data = F.one_hot(data_input, num_classes=reverse_model.hparams.num_classes).float()
inp_data = inp_data.to(device)
attention_maps = reverse_model.get_attention_maps(inp_data)

对象attention_maps是一个长度列表 𝑁 在哪里 𝑁 是层数。每个元素都是一个形状为 [Batch, Heads, SeqLen, SeqLen] 的张量,我们可以在下面验证。

attention_maps[0].shape
torch.Size([128, 1, 16, 16])

接下来,我们将编写一个绘图函数,该函数将序列、注意力图和一个索引作为输入,该索引指示我们想要可视化哪个批次元素的注意力图。我们将创建一个图,其中在行上有不同的层,而在列上显示不同的头部。请记住,softmax 已分别应用于每一行。

def plot_attention_maps(input_data, attn_maps, idx=0):if input_data is not None:input_data = input_data[idx].detach().cpu().numpy()else:input_data = np.arange(attn_maps[0][idx].shape[-1])attn_maps = [m[idx].detach().cpu().numpy() for m in attn_maps]num_heads = attn_maps[0].shape[0]num_layers = len(attn_maps)seq_len = input_data.shape[0]fig_size = 4 if num_heads == 1 else 3fig, ax = plt.subplots(num_layers, num_heads, figsize=(num_heads*fig_size, num_layers*fig_size))if num_layers == 1:ax = [ax]if num_heads == 1:ax = [[a] for a in ax]for row in range(num_layers):for column in range(num_heads):ax[row][column].imshow(attn_maps[row][column], origin='lower', vmin=0)ax[row][column].set_xticks(list(range(seq_len)))ax[row][column].set_xticklabels(input_data.tolist())ax[row][column].set_yticks(list(range(seq_len)))ax[row][column].set_yticklabels(input_data.tolist())ax[row][column].set_title(f"Layer {row+1}, Head {column+1}")fig.subplots_adjust(hspace=0.5)plt.show()

最后,我们可以绘制训练好的 Transformer 在反向任务上的注意力图:

plot_attention_maps(data_input, attention_maps, idx=0)

该模型已经学会了关注位于其自身翻转索引上的标记。因此,它实际上做了我们想要它做的事情。然而,我们看到它也会关注靠近翻转索引的值。这是因为模型不需要完美、严格的注意力来解决这个问题,但可以接受这种近似、嘈杂的注意力图。接近的索引是由位置编码的相似性引起的,这也是我们用位置编码所期望的。

👉参阅一:计算思维

👉参阅二:亚图跨际

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万字长文爆肝Spring(一)

Spring_day01 今日目标 掌握Spring相关概念完成IOC/DI的入门案例编写掌握IOC的相关配置与使用掌握DI的相关配置与使用 1,课程介绍 对于一门新技术,我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那对于Spring来说: 1.1 为什么要学? …

金融科技助力绿色金融:可持续发展新动力

随着全球气候变化和环境问题的日益严重,绿色金融作为推动环境保护和经济可持续发展的重要手段,已经受到越来越多的关注。而金融科技,作为科技与金融深度融合的产物,正以其独特的优势为绿色金融的发展注入新动力。本文将探讨金融科…

insert into select 迁移数据,可以嘛?

1 事情的起因 公司的交易量比较大,使用的数据库是mysql,每天的增量差不多在百万左右,公司并没有分库分表,所以想维持这个表的性能只能考虑做数据迁移。 同事李某接到了这个任务,于是他想出了这两个方案 先通过程序查…

Vue 路由:一级路由,嵌套路由

1、安装路由插件,因为用的是vue2 所以路由版本要和vue2对应上,所有有3 yarn add vue-router3 2、在main.js里引入 import VueRouter from vue-router Vue.use(VueRouter) 3、新建文件夹 router,创建index.js 4、引入路由插件,并且暴露出来这个路由 5、在…

在 JavaScript 中,如何给js对象增加新的属性和值

在 JavaScript 中,如何给js对象增加新的属性和值,可以使用点符号(.)和方括号符号([]),但是他们的用法有一些关键的区别,具体如下: 点符号. 点符号用来添加对象的属性&a…

基于机器学习的C-MAPSS涡扇发动机RUL预测

美国国家航空航天局的商用模块化航空推进仿真系统(CMAPSS)所模拟出的涡扇发动机性能退化数据进行实验验证,数据中包含有风扇、涡轮、压气机等组件参数。C-MAPSS中所包含的数据集可以模拟出从海平面到42千英尺的高度,从0到0.9马赫的…

一键实现电脑投屏到电视机,轻松享受更大画面

在数字化的今天,我们常常希望在更大的屏幕上分享电脑上的内容,观看视频、展示演示文稿,或者与家人一同欣赏照片。而实现电脑屏幕投射到电视机上,成为了许多人追求的方便而实用的功能。本文将为您详细介绍电脑投屏到电视机的方法&a…

汽车IVI中控开发入门及进阶(二十六):视频解码芯片ADV7180

前言: ADV7180芯片的功能框图如下: ADV7180自动检测并将兼容全球NTSC、PAL和SECAM标准的标准模拟基带电视信号转换为兼容8位ITU-R BT.656接口标准的4:2:2分量视频数据。简单的数字输出接口与各种MPEG编码器、编解码器、移动视频处理器以及Analog Devices数字视频编码器(如A…

跨平台看抖音、哔哩哔哩、虎牙、斗鱼啦,一个app即可完成

一、简介 1、一款免费、开源、无广告、跨平台的,可以观看抖音、哔哩哔哩、虎牙、斗鱼等平台的直播内容的软件。它简单好用,支持 Windows、MacOS、Linux、Android、iOS 等平台。 二、下载 1、文末有下载链接,apk手机可直接安装,不明白可以私聊我哈(麻烦咚咚咚,动动小手给个…

浮动与弹性的区别

弹性与浮动在Web页面布局中有着不同的概念和应用,以下是它们之间的主要区别: 定义与应用领域: 弹性:在物理学和机械学上,弹性描述的是物体在外力作用下发生形变,并在外力撤除后恢复原来大小和形状的性质。…

C++ 字符串处理3-实现starts_with和ends_with的字符串判断功能

1. 关键词2. C20及之后3. C20之前 3.1. strutil.h3.2. strutil.cpp3.3. 测试代码3.4. 运行结果3.5. 源码地址 1. 关键词 C 字符串处理 starts_with ends_with std::string 跨平台 2. C20及之后 C20标准开始,STL已经提供了starts_with和ends_with函数&#xff0…

Matrix->Matrix工具类获取Matrix的平移、缩放、错切数值

// 传入矩阵,获取矩阵数值 class MatrixValues(matrix: Matrix) {val scaleX: Floatval scaleY: Floatval transX: Floatval transY: Floatval skewX : Float val skewY : Floatinit {val fromValues FloatArray(9)matrix.getValues(fromValues)// 缩放数值scaleX …

【PythonGIS】基于Arcpy修改mxd版本

我们在使用ArcGIS时有时候保存或别人发过来的mxd工程文件会打不开,大概率是因为mxd保存的版本不一样,ArcGIS可以使用高版本打开低版本保存的mxd,反之则不行,所以今天给大家分享一下如何修改mxd版本。 原创作者:RS迷途小…

有什么好用的ai智能写作手机版?6个软件帮助你快速进行智能写作

有什么好用的ai智能写作手机版?6个软件帮助你快速进行智能写作 AI智能写作在现代社会中扮演着越来越重要的角色,许多人依赖这些工具来提高写作效率和质量。以下是六款不同类型的AI智能写作手机应用,它们可以帮助你快速进行智能写作&#xff…

十种排序方法

目录 1.冒泡排序(Bubble Sort)代码实现 2.选择排序(Selection Sort)代码实现 3.插入排序(Insertion Sort) 4.希尔排序(Shell Sort)代码实现 5.快速排序(Quick Sort&…

element 表格el-table的 :cell-style用法-表格固定行文字高亮

el-table的 :cell-style用法 实现表格固定行文字高亮效果 <el-tableref"table"borderstripe:data"list":height"height"highlight-current-row:cell-style"cellStyle"><el-table-columnprop"code"label"规则…

扩展学习|高校风险管理研究综述

文献来源&#xff1a;[1]高娟.高校风险管理研究综述[J].财会通讯&#xff1a;上, 2015(6):4.DOI:CNKI: SUN:CKTX.0.2015-16-012. 文章简介&#xff1a;基于对高校风险研究的梳理&#xff0c;纵观现有研究成果&#xff0c;高校风险管理研 究已逐步体现理论基础多学科化、研究流派…

iOS接入Flutter

在现有的iOS项目上接入Flutter&#xff0c;参考链接 第一步&#xff1a;创建flutter项目&#xff0c;即 创建 Flutter module flutter create --template module my_flutter第二步&#xff1a;创建framework&#xff0c;这里选择的是B方式&#xff0c;即 选项 B - 在 Xcode 中…

UnityWebRequest获取本地txt文件,其中中文乱码问题(踩坑记录)

Unity获取本地streamingassert下txt文件&#xff0c;遇到点问题&#xff0c;就是用UnityWebRequest下载一个txt文件的时候&#xff0c;原txt在资源管理器用notepad打开显示正常&#xff0c;但是Unity里调试&#xff0c;打印内容却是乱码&#xff0c; 在notepad 转存为utf-8&…

2024年【陕西省安全员C证】考试资料及陕西省安全员C证考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员C证考试资料根据新陕西省安全员C证考试大纲要求&#xff0c;安全生产模拟考试一点通将陕西省安全员C证模拟考试试题进行汇编&#xff0c;组成一套陕西省安全员C证全真模拟考试试题&#xff0c;学员可通过…