RIPGeo代码理解(三)layers.py(注意力机制的代码)-LMLPHP

代码链接:RIPGeo代码实现

├── lib # 包含模型(model)实现文件
    │        |── layers.py # 注意力机制的代码。
    │        |── model.py # TrustGeo的核心源代码。
    │        |── sublayers.py # layer.py的支持文件。
    │        |── utils.py # 辅助函数。

一、导入模块

import torch.nn as nn
import torch
from .sublayers import MultiHeadAttention, PositionwiseFeedForward
import numpy as np
import torch.functional as F

这段代码是一个自定义的神经网络模块,其中使用了 PyTorch 库。

1、import torch.nn as nn:导入 PyTorch 中的神经网络模块,这是定义神经网络层和模型的基本库。

2、import torch:导入 PyTorch 库,用于张量(tensor)操作和其他深度学习功能。

3、from .sublayers import MultiHeadAttention, PositionwiseFeedForward:从当前目录下的 sublayers 模块导入 MultiHeadAttentionPositionwiseFeedForward。这表明在当前文件所在目录下存在一个名为 sublayers.py 的文件,其中定义了这两个子层(sublayers)。

4、import numpy as np:导入 NumPy 库,通常用于数值计算和数组操作。在这里可能是为了使用一些与数组相关的功能。

5、import torch.functional as F:导入 PyTorch 的 functional 模块,并将其命名为 F。这个模块包含了一些与神经网络操作相关的函数,如激活函数等。

二、SimpleAttention1类定义(NN模型)

class SimpleAttention1(nn.Module):
    ''' Just follow GraphGeo '''

    def __init__(self, temperature, attn_dropout=0.1, d_q_in=32, d_q_out=32, d_k_in=32, d_k_out=32, d_v_in=32,
                 d_v_out=32, dropout=0.1, drop_last_layer=False):
        super().__init__()
        self.temperature = temperature
        self.dropout = nn.Dropout(attn_dropout)
        self.q_w = nn.Linear(d_q_in, d_q_out)
        self.k_w = nn.Linear(d_k_in, d_k_out)
        self.v_w = nn.Linear(d_v_in, d_v_out)
        self.drop_last_layer = drop_last_layer

    def forward(self, q, k, v):
        q = self.q_w(q)
        k = self.k_w(k)
        v = self.v_w(v)
       
        att_score = (q / self.temperature) @ k.transpose(0, 1)
        att_weight = torch.softmax(att_score, dim=-1)
        output = att_weight @ v
       
        return output, att_weight

这是一个简单的注意力机制模块,用于计算注意力分数并将其应用于值(value)向量

分为几个部分展开描述:

(一)__init__()

def __init__(self, temperature, attn_dropout=0.1, d_q_in=32, d_q_out=32, d_k_in=32, d_k_out=32, d_v_in=32,
                 d_v_out=32, dropout=0.1, drop_last_layer=False):
        super().__init__()
        self.temperature = temperature
        self.dropout = nn.Dropout(attn_dropout)
        self.q_w = nn.Linear(d_q_in, d_q_out)
        self.k_w = nn.Linear(d_k_in, d_k_out)
        self.v_w = nn.Linear(d_v_in, d_v_out)
        self.drop_last_layer = drop_last_layer

初始化函数,用于定义模块的结构。

1、def __init__(self, temperature, attn_dropout=0.1, d_q_in=32, d_q_out=32, d_k_in=32, d_k_out=32, d_v_in=32,d_v_out=32, dropout=0.1, drop_last_layer=False):这是初始化方法的签名,它接受一系列参数,用于配置自注意力模块。这些参数包括温度(temperature)、注意力层的 dropout(attn_dropout)、输入和输出维度的设置(d_q_ind_q_outd_k_ind_k_outd_v_ind_v_out),以及是否在最后一层使用 dropout(dropout)等。

2、super().__init__():调用父类(nn.Module)的初始化方法,确保正确地初始化该模块。

3、self.temperature = temperature:将传入的温度参数保存为类成员变量,用于调整注意力分布的尖锐度。

4、self.dropout = nn.Dropout(attn_dropout):创建一个 dropout 层,用于在自注意力中进行随机失活。

5、self.q_w = nn.Linear(d_q_in, d_q_out):创建一个线性层,用于将输入的查询(query)向量进行线性变换,从 d_q_in 维映射到 d_q_out 维。

6、self.k_w = nn.Linear(d_k_in, d_k_out):创建一个线性层,用于将输入的键(key)向量进行线性变换,从 d_k_in 维映射到 d_k_out 维。

7、self.k_v = nn.Linear(d_v_in, d_v_out):创建一个线性层,用于将输入的值(value)向量进行线性变换,从 d_v_in 维映射到 d_v_out 维。

(二)forward()

def forward(self, q, k, v):
    q = self.q_w(q)
    k = self.k_w(k)
    v = self.v_w(v)
    att_score = (q / self.temperature) @ k.transpose(0, 1)
    att_weight = torch.softmax(att_score, dim=-1)
    output = att_weight @ v
    return output, att_weight

这段代码实现了一个简单的自注意力机制,其中q(查询)、k(键)和v(值)分别通过线性变换(矩阵乘法)得到新的表示。这是自注意力机制的基本组成部分,其整体功能是通过计算注意力分数(att_score),生成加权和的输出(output)。整体上,这个前向函数实现了自注意力机制的计算,用于将输入序列中的每个元素与其他元素进行交互,并生成加权和的输出。这是 Transformer 网络中的关键组件。

1、q = self.q_w(q):通过线性变换(全连接层)对查询 q 进行变换。self.q_w 是查询的权重矩阵。

2、k = self.k_w(k):通过线性变换对键 k 进行变换。self.k_w 是键的权重矩阵。

3、v = self.v_w(v):通过线性变换对值 v 进行变换。self.v_w 是值的权重矩阵。

4、att_score = (q / self.temperature) @ k.transpose(0, 1):计算注意力分数。首先,将查询 q 除以 self.temperature(温度参数,用于

03-22 02:04