突破Transformer!讲透 Attention 机制 !!

今儿和大家来聊聊Attention机制的原理~

Attention机制最早被提出用于自然语言处理中的序列模型,特别是在机器翻译任务中,它允许模型动态地聚焦于输入序列中的重要部分,从而使模型在生成输出时能更精确地捕捉上下文信息。Attention的主要目的是解决长序列中信息丢失和模型在处理长距离依赖时的难题。

👇 每一篇都是干货满满哦!~~~

咱们先从理论聊起~

Attention机制的核心思想是通过计算输入序列中每个位置的重要性(即Attention权重),根据权重加权输入,从而让模型能动态选择更加重要的输入部分作为输出的依据。这一机制本质上是对输入的加权求和。

Attention机制基本公式

给定一个输入序列 ,输出序列为 。为了得到某个时刻  的输出 ,Attention机制首先计算该时刻与输入序列每个元素之间的注意力权重(Attention Weights)。通常,Attention机制由以下三个步骤组成:

1. 计算Query、Key和Value

对于输入序列中的每个元素,我们会计算三个向量:

  • Query向量 :输出时刻  的查询向量,通常是输出序列中先前时刻的隐状态 。

  • Key向量 :每个输入序列元素  对应的键向量,通常通过某个线性变换获得。

  • Value向量 :每个输入序列元素  对应的值向量,表示这个位置的实际内容。

通常, 是通过线性变换从输入或输出序列的隐藏状态中获得的:

其中, 是需要学习的参数矩阵。

2. 计算Attention权重

Query和Key之间的相似度可以衡量输入序列中每个位置与输出时刻  的相关性,常见的相似度计算方法包括点积(Dot Product)加性模型(Additive Model)

最常用的公式是缩放点积(Scaled Dot-Product Attention)

这里  是Attention权重,表示输入序列中位置  对生成输出时刻  的贡献度。 是Key的维度,用来做缩放以避免随着维度增加内积值过大。

3. 加权求和值

有了Attention权重后,可以将它与Value向量进行加权求和,得到输出:

这意味着模型可以根据Attention权重从输入序列的不同位置提取重要信息。

Multi-Head Attention

在实际应用中,Attention机制通常会采用多头注意力机制(Multi-Head Attention),即将Query、Key和Value通过多个不同的线性投影进行独立的注意力计算,然后将结果拼接起来。这样做的目的是让模型从不同的角度关注序列的不同部分,增强了模型的表达能力。

Multi-Head Attention的公式如下:

每个head的计算方式为:

其中, 是每个头的线性变换矩阵, 是用于拼接后的输出线性变换矩阵。

完整案例

这里,咱们将Attention机制应用到时间序列的异常检测中。

1. 数据集生成

首先,我们创建一个虚拟的时间序列数据集,其中包含正常的数据以及异常的数据点。

接下来,我们会使用一个神经网络模型来检测这些异常点,并利用Attention机制来增强模型的表现。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 设置随机种子以确保结果可重复
np.random.seed(42)

# 生成时间序列数据
time = np.arange(0, 1000, 1)
normal_data = np.sin(0.02 * time) + np.random.normal(0, 0.1, len(time))
anomaly_data = normal_data.copy()

# 在随机位置插入异常值
anomaly_indices = np.random.choice(len(time), size=20, replace=False)
anomaly_data[anomaly_indices] += np.random.normal(5, 1, len(anomaly_indices))

# 数据存储为 DataFrame
df = pd.DataFrame({
    'time': time,
    'value': anomaly_data,
    'normal_value': normal_data
})

# 绘制生成的时间序列数据
plt.figure(figsize=(10, 6))
plt.plot(df['time'], df['normal_value'], label='Normal Data')
plt.plot(df['time'], df['value'], label='Data with Anomalies', color='red')
plt.scatter(df['time'][anomaly_indices], df['value'][anomaly_indices], color='blue', label='Anomalies', s=50)
plt.title('Generated Time Series with Anomalies')
plt.legend()
plt.show()

我们生成了一个包含正常波动和异常点的时间序列,并绘制了数据图。蓝色的散点表示插入的异常点,红色的曲线代表带有异常的数据。

2. 构建LSTM-Attention模型

接下来,我们使用带有Attention机制的LSTM模型来检测这些时间序列中的异常。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, Dataset

# 定义LSTM模型,加入Attention机制
class LSTMAttentionModel(nn.Module):
    def __init__(self, input_size, hidden_size, attention_size, num_layers):
        super(LSTMAttentionModel, self).__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.attention = nn.Linear(hidden_size, attention_size)
        self.attention_combine = nn.Linear(attention_size, 1)
        self.fc = nn.Linear(hidden_size, 1)
    
    def forward(self, x):
        # LSTM输出
        lstm_out, _ = self.lstm(x)
        
        # 计算Attention权重
        attention_weights = torch.tanh(self.attention(lstm_out))
        attention_weights = torch.softmax(self.attention_combine(attention_weights), dim=1)
        
        # 通过Attention加权LSTM输出
        attended_output = torch.sum(lstm_out * attention_weights, dim=1)
        
        # 通过全连接层预测
        output = self.fc(attended_output)
        return output

# 定义虚拟数据集
class TimeSeriesDataset(Dataset):
    def __init__(self, data, window_size):
        self.data = data
        self.window_size = window_size
    
    def __len__(self):
        return len(self.data) - self.window_size
    
    def __getitem__(self, idx):
        return (
            torch.FloatTensor(self.data[idx:idx + self.window_size]),
            torch.FloatTensor([self.data[idx + self.window_size]])
        )

# 超参数设置
input_size = 1
hidden_size = 64
attention_size = 32
num_layers = 1
window_size = 30
batch_size = 32
epochs = 50

# 处理数据
data = df['value'].values
dataset = TimeSeriesDataset(data, window_size)
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)

# 模型初始化
model = LSTMAttention

Model(input_size, hidden_size, attention_size, num_layers)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

这个模型的核心部分是LSTM与Attention的结合。LSTM处理时间序列中的依赖关系,而Attention机制动态计算序列中每个时间步的重要性。

3. 模型训练

接下来,我们训练模型并在虚拟数据上进行异常检测。

# 模型训练过程
for epoch in range(epochs):
    running_loss = 0.0
    for inputs, labels in dataloader:
        inputs = inputs.unsqueeze(-1)
        
        # 前向传播
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        
        # 反向传播与优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        running_loss += loss.item()
    
    print(f'Epoch {epoch+1}/{epochs}, Loss: {running_loss/len(dataloader)}')

# 用训练好的模型检测异常
model.eval()
predicted = []
for i in range(len(df) - window_size):
    input_data = torch.FloatTensor(df['value'][i:i + window_size].values).unsqueeze(0).unsqueeze(-1)
    with torch.no_grad():
        predicted.append(model(input_data).item())

# 结果可视化
df['predicted'] = np.nan
df.loc[window_size:, 'predicted'] = predicted

plt.figure(figsize=(10, 6))
plt.plot(df['time'], df['value'], label='Actual Data')
plt.plot(df['time'], df['predicted'], label='Predicted Data', color='green')
plt.title('Anomaly Detection Using LSTM-Attention Model')
plt.legend()
plt.show()

在这里,我们将训练好的模型用于整个数据集的预测,并将预测值与实际值进行比较。

4. 数据分析图形展示

接下来,我们通过不同的可视化图形来展示模型的表现。

1. 原始数据与预测数据对比图

这张图展示了原始数据与模型预测数据的对比,绿色线条为模型预测值。

2. 误差图(Error Plot)

绘制实际值与预测值的误差,可以直观展示哪些时间步出现了较大的误差,误差较大的地方可能存在异常。

# 计算误差
df['error'] = np.abs(df['value'] - df['predicted'])

plt.figure(figsize=(10, 6))
plt.plot(df['time'], df['error'], label='Prediction Error', color='purple')
plt.title('Prediction Error Over Time')
plt.legend()
plt.show()

3. 误差分布图

通过误差的分布图,我们可以判断模型的整体预测误差情况,直方图可以直观显示误差的分布是否呈现正态分布。

sns.histplot(df['error'].dropna(), kde=True, color='orange')
plt.title('Error Distribution')
plt.show()

4. 注意力权重可视化

Attention权重图可以展示模型在处理时间序列时关注的不同时间步的权重分布,从而解释模型的决策。

# 提取Attention权重并绘制热力图
def extract_attention_weights(model, data):
    with torch.no_grad():
        lstm_out, _ = model.lstm(data.unsqueeze(0).unsqueeze(-1))
        attention_weights = model.attention(lstm_out)
        attention_weights = torch.softmax(model.attention_combine(torch.tanh(attention_weights)), dim=1)
        return attention_weights.squeeze().numpy()

# 在某个样本上可视化Attention权重
sample_data = torch.FloatTensor(df['value'][:window_size].values)
attention_weights = extract_attention_weights(model, sample_data)

plt.figure(figsize=(10, 2))
sns.heatmap(attention_weights.reshape(1, -1), cmap='coolwarm', annot=True)
plt.title('Attention Weights for a Sample Sequence')
plt.show()

5. 模型优化与调参

在调参过程中,我们可以从以下几个方面进行优化:

1. 网络架构优化:增加LSTM层数或隐藏层维度,使模型能够更好地捕捉复杂的时间依赖。使用双向LSTM(Bi-LSTM),增强对过去和未来信息的捕捉。

2. 超参数调整:调整学习率、批量大小和Attention层的大小以控制模型的训练过程。增加dropout层,以防止过拟合。

3. 数据预处理:可以通过时间序列平滑、差分处理来减少数据中的噪声,增强模型性能。使用更复杂的异常生成方式,模拟更符合实际场景的异常点。

4. Loss函数优化:可以使用加权MSELoss,使模型更加注重异常点的检测。引入基于概率的损失函数,比如Negative Log-Likelihood Loss,用于增强模型的异常检测能力。

5. 模型集成:可以通过集成学习(例如不同模型的堆叠或加权平均),提高模型的鲁棒性和预测性能。

 

 如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。


👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。


1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值