个人备案的公司网站,网页制作软件是什么,中国多少个省份31个省,塘厦镇做网站《深度学习实战》第4集#xff1a;Transformer 架构与自然语言处理#xff08;NLP#xff09;
在自然语言处理#xff08;NLP#xff09;领域#xff0c;Transformer 架构的出现彻底改变了传统的序列建模方法。它不仅成为现代 NLP 的核心#xff0c;还推动了诸如 BERT、…《深度学习实战》第4集Transformer 架构与自然语言处理NLP
在自然语言处理NLP领域Transformer 架构的出现彻底改变了传统的序列建模方法。它不仅成为现代 NLP 的核心还推动了诸如 BERT、GPT 等预训练模型的发展。本集将带你深入了解 Transformer 的工作原理并通过实战项目微调 BERT 模型完成情感分析任务。 1. 自注意力机制与多头注意力
1.1 自注意力机制Self-Attention
自注意力机制是 Transformer 的核心组件它允许模型在处理输入序列时关注不同位置的相关性。以下是其工作原理
输入嵌入 输入序列被转换为词向量表示。 计算注意力权重 通过查询Query、键Key和值Value矩阵计算注意力分数。注意力分数公式 加权求和 根据注意力分数对值进行加权求和得到上下文相关的表示。 1.2 多头注意力Multi-Head Attention
为了捕捉不同子空间中的特征Transformer 使用多头注意力机制。每个“头”独立计算注意力然后将结果拼接并线性变换。 2. Transformer 的编码器-解码器结构
Transformer 由编码器Encoder和解码器Decoder两部分组成
2.1 编码器Encoder
编码器由多个相同的层堆叠而成每层包含 多头自注意力层捕捉输入序列的全局依赖关系。前馈神经网络FFN进一步提取特征。残差连接与层归一化稳定训练过程。
2.2 解码器Decoder
解码器同样由多层组成但额外增加了 掩码多头注意力Masked Multi-Head Attention防止未来信息泄露。编码器-解码器注意力层结合编码器输出生成目标序列。 好的为了让你更好地理解 自注意力机制Self-Attention 和 多头注意力Multi-Head Attention 的底层结构和原理我会用一个生活中的例子来类比并逐步拆解它们的工作方式。 3. 自注意力机制一场“会议讨论”的比喻
想象一下你正在参加一场公司会议会议的主题是“如何提高产品销量”。会议室里有几位同事每个人都有自己的观点。你需要综合大家的意见得出一个全面的结论。
3.1 每个人的观点
假设会议室里的每个人代表输入序列中的一个单词。每个人的观点比如市场分析、用户体验、技术改进等就是这个单词的嵌入向量Embedding Vector。
3.2 问题来了如何听取所有人的意见
在会议中你会根据每个人的发言内容判断他们的观点对你当前思考的重要性。这就像自注意力机制的核心思想计算每个单词对当前单词的相关性。
具体步骤 准备材料生成 Query、Key 和 Value 每个人会准备三份材料 Query提问你想问的问题比如“你的建议对我有什么帮助”Key关键词每个人的核心观点比如“市场分析”或“用户体验”。Value具体内容每个人的具体建议比如“我们需要增加广告预算”。 这些材料通过线性变换矩阵乘法从原始观点嵌入向量生成。 打分计算注意力分数 你拿着自己的 Query去和每个人提供的 Key 对比看看谁的观点和你的问题最相关。相关性通过点积计算结果越大表示越相关。计算公式 [ \text{Attention Score} \frac{\text{Query} \cdot \text{Key}}{\sqrt{d_k}} ] 这里的 (\sqrt{d_k}) 是为了防止分数过大保持数值稳定。 加权求和整合信息 根据每个人的得分计算权重通过 softmax 归一化。然后根据权重对每个人的 Value 进行加权求和得到最终的结论。 3.3 总结自注意力机制的作用
自注意力机制的核心是让每个单词都能“看到”整个句子中的其他单词并根据它们的相关性调整自己的表示。这样模型可以捕捉到全局的上下文信息。 4. 多头注意力多个“视角”的讨论
回到刚才的会议场景假设你不仅关心“如何提高产品销量”还想知道“哪些用户群体最重要”、“竞争对手有哪些策略”等多个问题。这时你可以邀请几个专家小组分别从不同角度分析问题。
4.1 多个“专家小组”
每个专家小组相当于一个多头注意力的一个“头”。每个小组会独立地进行讨论生成自己的结论。
4.2 如何整合多个小组的意见
每个小组的讨论结果即每个头的输出会被拼接在一起。然后通过一个线性变换矩阵乘法将这些结果融合成一个最终的结论。 4.3 多头注意力的好处
不同的“头”可以关注输入的不同部分。例如 一个头可能专注于语法关系主语和谓语的联系。另一个头可能关注语义关系情感或主题。 通过多头注意力模型可以从多个角度提取特征从而更全面地理解输入。 图解会议讨论与注意力机制的对应关系
会议讨论注意力机制每个人的观点输入序列中的单词嵌入向量提问Query查询向量Query Vector关键词Key键向量Key Vector具体内容Value值向量Value Vector打分并加权求和注意力分数计算 加权求和多个专家小组分别讨论多头注意力的多个“头” 一个具体的例子翻译句子
假设我们要翻译一句话“The cat sat on the mat.”猫坐在垫子上。
自注意力机制的作用
当处理单词“cat”时自注意力机制会让它“看到”整个句子。它会发现“sat”和“mat”与自己高度相关因为它们描述了猫的动作和位置。
多头注意力的作用
一个头可能专注于语法关系“cat”是主语“sat”是谓语。另一个头可能专注于语义关系“cat”和“mat”之间存在空间关系。最终这些信息被整合起来帮助模型生成更准确的翻译。 关于自注意力机制和多头注意力的总结
自注意力机制就像你在会议上听取每个人的意见计算出谁的观点最重要并据此做出决策。多头注意力就像你邀请多个专家小组从不同角度分析问题最后整合所有意见。
通过这种机制Transformer 模型能够高效地捕捉输入序列中的全局依赖关系从而在自然语言处理任务中表现出色。 5. BERT、GPT 等预训练模型的原理与应用
5.1 BERTBidirectional Encoder Representations from Transformers
特点 双向编码同时考虑上下文信息。预训练任务 Masked Language ModelMLM预测被遮挡的单词。Next Sentence PredictionNSP判断句子对是否连续。 应用场景 文本分类、命名实体识别、问答系统等。
5.2 GPTGenerative Pre-trained Transformer
特点 单向解码从左到右生成文本。基于自回归语言模型。 应用场景 文本生成、对话系统、代码补全等。 6. 实战项目使用 Hugging Face Transformers 微调 BERT 模型
我们将使用 Hugging Face 的 transformers 库微调 BERT 模型完成情感分析任务。
6.1 数据准备
下载 SST-2数据集链接如下SST-2下载链接
import pandas as pd
from sklearn.model_selection import train_test_split
import os
from transformers import BertTokenizer, BertForSequenceClassification
import torch# 设置代理如果需要
# os.environ[HTTP_PROXY] http://your_proxy:port
# os.environ[HTTPS_PROXY] http://your_proxy:port# 设置离线模式使用本地文件
# 定义文件路径根据你的实际路径修改
train_file SST-2/SST-2/train.tsv
dev_file SST-2/SST-2/dev.tsv6.2 数据预处理
from transformers import BertTokenizer
# 使用 Pandas 读取 TSV 文件
try:train_data pd.read_csv(train_file, sep\t)test_data pd.read_csv(dev_file, sep\t)print(成功加载本地数据集)print(train_data.head())
except Exception as e:print(f加载本地数据集失败: {e})print(请确保数据文件路径正确)# 尝试加载本地分词器或使用备选方案
try:# 尝试从本地缓存加载cache_dir ./models_cacheos.makedirs(cache_dir, exist_okTrue)# 使用本地缓存目录tokenizer BertTokenizer.from_pretrained(bert-base-uncased, cache_dircache_dir,local_files_onlyFalse, # 允许在线下载use_fastTrue)print(成功加载分词器)
except OSError as e:print(f无法加载BERT分词器: {e})print(尝试使用备选方案...)# 备选方案使用简单的分词方法from sklearn.feature_extraction.text import CountVectorizervectorizer CountVectorizer(max_features10000)print(已切换到简单分词器 (CountVectorizer))# 定义预处理函数
def preprocess_data(data):sentences data[sentence].tolist()labels data[label].tolist()try:# 如果BERT分词器加载成功if tokenizer in locals():# 对句子进行分词和编码encodings tokenizer(sentences,truncationTrue,paddingmax_length,max_length128,return_tensorspt)return encodings, labels, True # 返回True表示使用BERTelse:# 使用备选分词方法# 注意这里只对训练数据进行fit_transformif vectorizer_fitted not in globals():global vectorizer_fittedvectorizer_fitted Truefeatures vectorizer.fit_transform(sentences)else:# 对于测试数据只进行transformfeatures vectorizer.transform(sentences)return features, labels, False # 返回False表示使用备选方案except Exception as e:print(f预处理数据时出错: {e})return None, labels, False# 预处理训练集和测试集
if train_data in locals() and test_data in locals():print(开始预处理数据...)train_features, train_labels, using_bert preprocess_data(train_data)test_features, test_labels, _ preprocess_data(test_data)print(数据预处理完成)
6.3 模型定义与训练
import torch
from torch.utils.data import Dataset
import numpy as np
from sklearn.linear_model import LogisticRegressionclass SSTDataset(Dataset):def __init__(self, encodings, labels):self.encodings encodingsself.labels labelsself.is_bert_encoding isinstance(encodings, dict)def __len__(self):if self.is_bert_encoding:return len(self.labels)else:return self.encodings.shape[0]def __getitem__(self, idx):if self.is_bert_encoding:item {key: val[idx] for key, val in self.encodings.items()}item[labels] torch.tensor(self.labels[idx])return itemelse:# 对于非BERT编码返回稀疏向量的密集表示和标签features torch.tensor(self.encodings[idx].toarray()[0], dtypetorch.float)label torch.tensor(self.labels[idx])return {features: features, labels: label}# 创建数据集实例
train_dataset SSTDataset(train_features, train_labels)
test_dataset SSTDataset(test_features, test_labels)# 根据使用的分词器选择不同的模型训练方法
if using_bert:from transformers import BertForSequenceClassification, Trainer, TrainingArguments# 加载预训练的 BERT 模型用于二分类任务model BertForSequenceClassification.from_pretrained(bert-base-uncased, num_labels2)# 定义训练参数training_args TrainingArguments(output_dir./results, # 输出目录evaluation_strategyepoch, # 每个 epoch 后评估模型per_device_train_batch_size16, # 训练时的批量大小per_device_eval_batch_size16, # 验证时的批量大小num_train_epochs3, # 训练轮数weight_decay0.01, # 权重衰减logging_dir./logs, # 日志目录logging_steps10 # 每 10 步记录一次日志)# 定义 Trainertrainer Trainer(modelmodel,argstraining_args,train_datasettrain_dataset,eval_datasettest_dataset)# 开始训练trainer.train()6.4 测试模型 # 测试单句预测test_sentence This movie was absolutely fantastic!inputs tokenizer(test_sentence, return_tensorspt, truncationTrue, paddingTrue, max_length128)outputs model(**inputs)prediction outputs.logits.argmax(dim-1).item()# 输出结果print(情感分析结果:, 积极 if prediction 1 else 消极)
else:print(使用备选方案 (LogisticRegression) 进行训练...)# 将稀疏矩阵转换为numpy数组进行训练X_train train_features.toarray()X_test test_features.toarray()# 使用逻辑回归作为备选模型clf LogisticRegression(max_iter1000)clf.fit(X_train, train_labels)# 评估模型accuracy clf.score(X_test, test_labels)print(f测试集准确率: {accuracy:.4f})# 测试单句预测test_sentence This movie was absolutely fantastic!# 使用已经训练好的vectorizer进行转换test_features vectorizer.transform([test_sentence])prediction clf.predict(test_features)[0]# 输出结果print(情感分析结果:, 积极 if prediction 1 else 消极)
程序运行结果
2025-02-27 23:52:05.928189: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable TF_ENABLE_ONEDNN_OPTS0.
2025-02-27 23:52:07.648400: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable TF_ENABLE_ONEDNN_OPTS0.
成功加载本地数据集sentence label
0 hide new secretions from the parental units 0
1 contains no wit , only labored gags 0
2 that loves its characters and communicates som... 1
3 remains utterly satisfied to remain the same t... 0
4 on the worst revenge-of-the-nerds clichés the ... 0
无法加载BERT分词器: (MaxRetryError(HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /bert-base-uncased/resolve/main/tokenizer_config.json (Caused by ProxyError(Unable to connect to proxy, FileNotFoundError(2, No such file or directory)))), (Request ID: 3fff21e5-ab5a-4c4c-8695-70d49bb4ebdf))
尝试使用备选方案...
已切换到简单分词器 (CountVectorizer)
开始预处理数据...
数据预处理完成
使用备选方案 (LogisticRegression) 进行训练...
测试集准确率: 0.8131
情感分析结果: 积极7. 前沿关联超大规模语言模型的能力与挑战
7.1 超大规模模型
GPT-4 和 PaLM 等模型拥有数千亿参数能够生成高质量的文本、代码甚至图像描述。能力 上下文理解、多语言支持、零样本学习。 挑战 计算资源需求高。模型可解释性差。潜在的偏见与伦理问题。
7.2 未来方向
更高效的训练方法如稀疏激活、知识蒸馏。提升模型的可控性与安全性。 总结
Transformer 架构以其强大的自注意力机制和灵活的编码器-解码器结构成为 NLP 领域的基石。通过实战项目我们学会了如何使用 Hugging Face 的工具微调 BERT 模型。同时我们也探讨了超大规模语言模型的潜力与挑战。
希望这篇博客能帮助你更好地理解 Transformer 的原理与应用如果需要进一步扩展或优化请随时告诉我