pytorch_模型_attention

本文深入解析Attention机制,通过Q(查询)、K(键)、V(值)的概念,阐述如何进行注意力权重计算。无论是标量还是向量形式,Attention都在寻找输入序列中的关键信息。以一句话为例,通过QKV的交互,确定关注点,如“放假”一词,并通过训练调整权重以匹配上下文。

1、讲解attention
在这里插入图片描述
QKV解读:

  • Q(query):查询,就是你发散的注意力
  • K(keys):所有事物
  • V(values):所有事物
    进一步解读:
    模型第一部分就是QK之间的操作:
    (1)注意力权重(QKV都是标量):
    (2)注意力分数(QKV都是向量或者矩阵):
    因为这时候QKV都是向量或者矩阵,但是为了能够顺利的乘到一起(矩阵乘法对于维度是有要求的–mn km就不能乘需要中间转化)就需要Wq、Wk这两个权重分数进行中间调节。

一句话:我是小明,我非常快乐,我快要放假了(假设我更关心放假这个词)
K,V都表示这句话中的所有词语。
Q表示我预测的关注点
K与Q做相关度分析
QKV都是标量情况下:W(Q-K)-》softmax分析出是每个词的概率-》乘以V就可以得到到底是哪个词了-》比如得到快乐-》不匹配更改W 重新进行训练
QKV都是向量或者矩阵情况下:W(Q*K)【矩阵点乘表示相似度】-》softmax分析出是每个词的概率-》乘以V就可以得到到底是哪个词了-》比如得到快乐-》不匹配更改W 重新进行训练

### 使用 PyTorch 实现 BERT-BiLSTM-CRF 的命名实体识别 (NER) 为了构建一个基于 PyTorch 的 BERT-BiLSTM-CRF 模型用于命名实体识别任务,可以按照以下方法设计模型结构并完成其实现。 #### 1. 模型架构概述 BERT 是一种预训练的语言表示模型,能够捕捉上下文中的语义信息;BiLSTM 能够进一步提取序列特征;而 CRF 则负责优化整个标签序列的一致性和准确性。三者结合可以在 NER 任务上取得较好的表现[^1]。 #### 2. 主要模块说明 - **BERT 层**: 提取输入文本的上下文嵌入向量。 - **BiLSTM 层**: 对 BERT 输出的词向量进行双向 LSTM 编码,增强对局部依赖性的建模能力。 - **CRF 层**: 结合全局约束条件解码最优标签路径。 #### 3. 代码实现 以下是完整的代码框架: ```python import torch from torch import nn from transformers import BertModel, BertTokenizer class BERT_BiLSTM_CRF(nn.Module): def __init__(self, bert_model_name, num_labels, lstm_hidden_dim, device='cpu'): super(BERT_BiLSTM_CRF, self).__init__() # 加载预训练的 BERT 模型 self.bert = BertModel.from_pretrained(bert_model_name).to(device) self.tokenizer = BertTokenizer.from_pretrained(bert_model_name) # 获取 BERT 隐藏层维度 self.lstm_input_dim = self.bert.config.hidden_size # 双向 LSTM 设置 self.lstm = nn.LSTM(self.lstm_input_dim, lstm_hidden_dim // 2, bidirectional=True, batch_first=True).to(device) # 将 LSTM 输出映射到标签空间 self.fc = nn.Linear(lstm_hidden_dim, num_labels).to(device) # 初始化 CRF 层 self.crf = CRF(num_tags=num_labels, batch_first=True).to(device) def forward(self, input_ids, attention_mask=None, labels=None): # 输入经过 BERT 得到隐藏状态 outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)[0] # 经过 BiLSTM 进一步编码 sequence_output, _ = self.lstm(outputs) # 映射到标签空间 emissions = self.fc(sequence_output) if labels is not None: loss = -self.crf(emissions, labels, mask=attention_mask.byte()) return loss else: predictions = self.crf.decode(emissions, mask=attention_mask.byte()) return predictions ``` #### 4. 关键组件解释 - **BERT Layer**: `BertModel` 和 `BertTokenizer` 来自 Hugging Face Transformers 库,提供了强大的中文/英文分词和上下文表征功能[^2]。 - **BiLSTM Layer**: 接收来自 BERT 的输出作为输入,并对其进行双向 LSTM 处理,从而捕获更复杂的序列模式. - **CRF Layer**: 使用第三方库如 `pytorch-crf` 或自行定义 CRF 类,确保最终预测结果满足全局一致性约束[^4]。 #### 5. 数据加载与训练流程 数据加载部分可参考如下模板: ```python dataset = Dataset() loader = torch.utils.data.DataLoader( dataset, batch_size=500, shuffle=True, collate_fn=collate_fn ) model = BERT_BiLSTM_CRF('bert-base-chinese', num_labels=len(label_map), lstm_hidden_dim=256, device=device).to(device) optimizer = torch.optim.Adam(model.parameters(), lr=LR) ``` 其中,`Dataset()` 和 `collate_fn` 函数需根据具体任务定制化实现。 #### 6. 总结 通过上述方式组合 BERT、BiLSTM 和 CRF,能够在复杂场景下有效提升命名实体识别的效果。此方案充分利用了各子模块的优势,在多个公开评测集合中表现出色[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值