Python记忆组合透明度语言模型

2024-06-13 19:52

本文主要是介绍Python记忆组合透明度语言模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🎯要点

🎯浏览器语言推理识别神经网络 | 🎯不同语言秽语训练识别数据集 | 🎯交互式语言处理解释 Transformer 语言模型 | 🎯可视化Transformer 语言模型 | 🎯语言模型生成优质歌词 | 🎯模型不确定性和鲁棒性深度学习估计基准 | 🎯文本生成神经网络诗歌生成 | 🎯模型透明度 | 🎯验证揭示前馈Transformer 语言模型记忆组合 | 🎯可视化语言模型注意力 | 🎯Transformer语言模型文本解释器和视觉解释器 | 🎯分布式训练和推理模型 | 🎯知识获取模型 | 🎯信息提取模型 | 🎯文本生成模型 | 🎯语音图像视频模型

🍇Python注意力

注意力机制描述了神经网络中最近出现的一组新层,在过去几年中引起了广泛关注,尤其是在序列任务中。文献中对“注意力”有很多不同的定义,但我们在这里使用的定义如下:注意力机制描述了(序列)元素的加权平均值,其权重根据输入查询和元素的键动态计算。那么这到底是什么意思呢?目标是对多个元素的特征取平均值。但是,我们不希望对每个元素赋予相同的权重,而是希望根据它们的实际值赋予它们权重。换句话说,我们希望动态地决定我们更希望“关注”哪些输入。

💦缩放点积注意力

自注意力背后的核心概念是缩放点积注意力。我们的目标是建立一种注意力机制,序列中的任何元素都可以关注任何其他元素,同时仍能高效计算。点积注意力将一组查询 Q ∈ R T × d k Q \in R ^{T \times d_k} QRT×dk、键 K ∈ R T × d k K \in R ^{T \times d_k} KRT×dk 和值 V ∈ R T × d v V \in R ^{T \times d_v} VRT×dv 作为输入,其中 T T T 是序列长度, d k d_k dk d v d_v dv 分别是查询/键和值的隐藏维度。为了简单起见,我们现在忽略批量维度。从元素 i i i j j j的注意力值基于查询 Q i Q_i Qi和键 K j K_j Kj的相似度,使用点积作为相似度度量。在数学中,我们计算点积注意力如下:
注意力  ( Q , K , V ) = softmax ⁡ ( Q K T d k ) V \text { 注意力 }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V  注意力 (Q,K,V)=softmax(dk QKT)V
其中 Q、K、V 是查询、键和值向量的串联。

矩阵乘法 Q K T Q K^T QKT 对每个可能的查询和键对执行点积,产生形状为 T × T T \times T T×T 的矩阵。每行代表特定元素 i i i​ 相对于序列中所有其他元素的注意力 logits。对此,我们应用 softmax 并与值向量相乘以获得加权平均值(权重由注意力决定)。这种注意力机制的另一个视角提供了如下所示的计算图。

我们尚未讨论的一方面是缩放因子 1 / d k 1 / \sqrt{d_k} 1/dk 。这个比例因子对于在初始化后保持注意力值的适当方差至关重要。请记住,我们初始化层的目的是使整个模型具有相等的方差,因此 Q Q Q K K K 的方差也可能接近 1 。然而,对方差为 σ 2 \sigma^2 σ2 的两个向量执行点积会产生方差为 d k d_k dk 倍的标量:
q i ∼ N ( 0 , σ 2 ) , k i ∼ N ( 0 , σ 2 ) → Var ⁡ ( ∑ i = 1 d k q i ⋅ k i ) = σ 4 ⋅ d k q_i \sim N \left(0, \sigma^2\right), k_i \sim N \left(0, \sigma^2\right) \rightarrow \operatorname{Var}\left(\sum_{i=1}^{d_k} q_i \cdot k_i\right)=\sigma^4 \cdot d_k qiN(0,σ2),kiN(0,σ2)Var(i=1dkqiki)=σ4dk
如果我们不将方差缩小到 ∼ σ 2 \sim \sigma^2 σ2,则 logits 上的 softmax 对于一个随机元素将饱和为 1,对于所有其他元素则饱和为 0。通过 softmax 的梯度将接近于零,因此我们无法正确地学习参数。请注意, σ 2 \sigma^2 σ2 的额外因子,即用 σ 4 \sigma^4 σ4 而不是 σ 2 \sigma^2 σ2,通常不是问题,因为我们保持原始方差 σ 2 \sigma^2 σ2 接近无论如何,到1。

上图中的块 Mask (opt.) 表示对注意力矩阵中的特定条目进行可选屏蔽。例如,如果我们将具有不同长度的多个序列堆叠成一个批次,就会使用此功能。为了仍然受益于 PyTorch 中的并行化,我们将句子填充到相同的长度,并在计算注意力值时屏蔽填充标记。这通常是通过将相应的注意力逻辑设置为非常低的值来实现的。

在讨论了缩放点积注意力块的细节之后,我们可以在下面编写一个函数,在给定查询、键和值三元组的情况下计算输出特征:

def scaled_dot_product(q, k, v, mask=None):d_k = q.size()[-1]attn_logits = torch.matmul(q, k.transpose(-2, -1))attn_logits = attn_logits / math.sqrt(d_k)if mask is not None:attn_logits = attn_logits.masked_fill(mask == 0, -9e15)attention = F.softmax(attn_logits, dim=-1)values = torch.matmul(attention, v)return values, attention

请注意,上面的代码支持序列长度前面的任何附加维度,因此我们也可以将其用于批处理。但是,为了更好地理解,让我们生成一些随机查询、键和值向量,并计算注意力输出:

seq_len, d_k = 3, 2
pl.seed_everything(42)
q = torch.randn(seq_len, d_k)
k = torch.randn(seq_len, d_k)
v = torch.randn(seq_len, d_k)
values, attention = scaled_dot_product(q, k, v)
print("Q\n", q)
print("K\n", k)
print("V\n", v)
print("Values\n", values)
print("Attention\n", attention)
Qtensor([[ 0.3367,  0.1288],[ 0.2345,  0.2303],[-1.1229, -0.1863]])
Ktensor([[ 2.2082, -0.6380],[ 0.4617,  0.2674],[ 0.5349,  0.8094]])
Vtensor([[ 1.1103, -1.6898],[-0.9890,  0.9580],[ 1.3221,  0.8172]])
Valuestensor([[ 0.5698, -0.1520],[ 0.5379, -0.0265],[ 0.2246,  0.5556]])
Attentiontensor([[0.4028, 0.2886, 0.3086],[0.3538, 0.3069, 0.3393],[0.1303, 0.4630, 0.4067]])

💦多头注意力

缩放点积注意力允许网络参与序列。然而,序列元素通常需要关注多个不同方面,并且单个加权平均值并不是一个好的选择。这就是为什么我们将注意力机制扩展到多个头,即相同特征上的多个不同的查询键值三元组。具体来说,给定一个查询、键和值矩阵,我们将它们转换为 h h h 子查询、子键和子值,并独立地通过缩放的点积注意力。然后,我们连接头部并将它们与最终的权重矩阵组合起来。从数学上来说,我们可以将此操作表示为:
多头  ( Q , K , V ) = Concat ⁡ ( head  1 , … , head  h ) W O 其中 head  i = Attention  ( Q W i Q , K W i K , V W i V ) \begin{aligned} \text { 多头 }(Q, K, V) & =\operatorname{Concat}\left(\text { head }_1, \ldots, \text { head }_h\right) W^O \\ \text { 其中 head }_i & =\text { Attention }\left(Q W_i^Q, K W_i^K, V W_i^V\right) \end{aligned}  多头 (Q,K,V) 其中 head i=Concat( head 1,, head h)WO= Attention (QWiQ,KWiK,VWiV)
在没有任意查询、键和值向量作为输入的情况下,我们如何在神经网络中应用多头注意力层?查看批量大小, T T T 序列长度, d model  d_{\text {model }} dmodel  X X X 的隐藏维度)。连续的权重矩阵 W Q 、 W K W^Q、W^K WQWK W V W^V WV 可以将 X X X​ 转换为表示输入的查询、键和值的相应特征向量。使用这种方法,我们可以实现下面的多头注意力模块。

def expand_mask(mask):assert mask.ndim >= 2, "Mask must be at least 2-dimensional with seq_length x seq_length"if mask.ndim == 3:mask = mask.unsqueeze(1)while mask.ndim < 4:mask = mask.unsqueeze(0)return mask
class MultiheadAttention(nn.Module):def __init__(self, input_dim, embed_dim, num_heads):super().__init__()assert embed_dim % num_heads == 0, "Embedding dimension must be 0 modulo number of heads."self.embed_dim = embed_dimself.num_heads = num_headsself.head_dim = embed_dim // num_headsself.qkv_proj = nn.Linear(input_dim, 3*embed_dim)self.o_proj = nn.Linear(embed_dim, embed_dim)self._reset_parameters()def _reset_parameters(self):nn.init.xavier_uniform_(self.qkv_proj.weight)self.qkv_proj.bias.data.fill_(0)nn.init.xavier_uniform_(self.o_proj.weight)self.o_proj.bias.data.fill_(0)def forward(self, x, mask=None, return_attention=False):batch_size, seq_length, _ = x.size()if mask is not None:mask = expand_mask(mask)qkv = self.qkv_proj(x)qkv = qkv.reshape(batch_size, seq_length, self.num_heads, 3*self.head_dim)qkv = qkv.permute(0, 2, 1, 3) # [Batch, Head, SeqLen, Dims]q, k, v = qkv.chunk(3, dim=-1)values, attention = scaled_dot_product(q, k, v, mask=mask)values = values.permute(0, 2, 1, 3) # [Batch, SeqLen, Head, Dims]values = values.reshape(batch_size, seq_length, self.embed_dim)o = self.o_proj(values)if return_attention:return o, attentionelse:return o

👉参阅一:计算思维

👉参阅二:亚图跨际

这篇关于Python记忆组合透明度语言模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058271

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型: