首页
/ PyTorch自然语言处理实战:第3章 监督学习训练与情感分类案例解析

PyTorch自然语言处理实战:第3章 监督学习训练与情感分类案例解析

2025-06-02 07:14:55作者:薛曦旖Francesca

本文基于《NLP with PyTorch》第3章内容,深入讲解监督学习在自然语言处理中的应用。我们将从基础概念出发,逐步构建完整的文本分类模型,并通过两个典型案例帮助读者掌握核心技能。

一、监督学习基础概念

监督学习是机器学习中最常见的范式之一,其核心思想是利用已标注的训练数据来构建预测模型。在NLP领域,监督学习广泛应用于文本分类、情感分析、命名实体识别等任务。

本章重点介绍以下关键组件:

  1. 模型架构(如感知机)
  2. 激活函数(Sigmoid、ReLU等)
  3. 损失函数(交叉熵、MSE等)
  4. 优化算法(如Adam)

二、感知机模型与激活函数详解

感知机是最简单的神经网络模型,本章提供了PyTorch实现示例:

import torch
import torch.nn as nn

class Perceptron(nn.Module):
    def __init__(self, input_dim):
        super(Perceptron, self).__init__()
        self.fc = nn.Linear(input_dim, 1)
    
    def forward(self, x):
        return torch.sigmoid(self.fc(x))

常用激活函数实现

  1. Sigmoid函数:将输出压缩到(0,1)区间
def sigmoid_activation(z):
    return 1/(1+torch.exp(-z))
  1. ReLU函数:解决梯度消失问题
def relu_activation(z):
    return torch.max(z, torch.zeros_like(z))
  1. Softmax函数:多分类任务常用
def softmax(z):
    return torch.exp(z)/torch.sum(torch.exp(z), dim=1)

三、损失函数对比与应用场景

  1. 均方误差(MSE):适用于回归任务
mse_loss = nn.MSELoss()
  1. 交叉熵损失:分类任务首选
ce_loss = nn.CrossEntropyLoss()
  1. 二元交叉熵:二分类专用
bce_loss = nn.BCELoss()

四、实战案例1:合成数据二分类

我们首先生成一个简单的二维合成数据集,演示感知机如何学习决策边界:

  1. 数据生成:使用sklearn的make_classification
  2. 模型训练:设置学习率、迭代次数等超参数
  3. 结果可视化:绘制决策边界和分类效果

这个案例帮助读者直观理解模型如何从数据中学习规律。

五、实战案例2:Yelp评论情感分析

本案例完整展示NLP项目流程:

1. 数据预处理

# 示例数据清洗代码
def clean_text(text):
    text = text.lower()
    text = re.sub(r"i'm", "i am", text)
    text = re.sub(r"\r", "", text)
    return text

提供"精简版"和"完整版"两种数据集方案,适应不同硬件环境。

2. 构建词汇表(Vocabulary)

class Vocabulary:
    def __init__(self):
        self.token2idx = {}
        self.idx2token = {}
        
    def add_token(self, token):
        if token not in self.token2idx:
            idx = len(self.token2idx)
            self.token2idx[token] = idx
            self.idx2token[idx] = token

3. 文本向量化(Vectorizer)

将文本转换为模型可处理的数值向量:

class Vectorizer:
    def __init__(self, vocabulary):
        self.vocabulary = vocabulary
        
    def vectorize(self, text):
        one_hot = torch.zeros(len(self.vocabulary))
        for token in text.split():
            if token in self.vocabulary.token2idx:
                one_hot[self.vocabulary.token2idx[token]] = 1
        return one_hot

4. 模型训练与评估

完整训练流程包括:

  1. 数据加载器准备
  2. 模型初始化
  3. 损失函数和优化器设置
  4. 训练循环
  5. 验证集评估
# 训练循环示例
for epoch in range(num_epochs):
    for batch in train_loader:
        optimizer.zero_grad()
        outputs = model(batch['features'])
        loss = criterion(outputs, batch['label'])
        loss.backward()
        optimizer.step()

5. 结果分析与模型解释

分析模型学到的权重,识别对分类结果影响最大的词汇:

# 获取最重要的特征
def get_important_features(model, vocabulary, n=10):
    weights = model.fc.weight.data.numpy().flatten()
    indices = np.argsort(weights)[-n:]
    return [(vocabulary.idx2token[i], weights[i]) for i in indices]

六、关键知识点总结

  1. 数据流水线构建:从原始文本到模型输入的完整转换流程
  2. 模型设计原则:根据任务复杂度选择合适的网络结构
  3. 超参数调优:学习率、批量大小等对训练的影响
  4. 评估指标选择:准确率、F1值等在不同场景下的应用

通过本章学习,读者将掌握使用PyTorch构建NLP模型的核心方法,并能够独立完成从数据准备到模型部署的完整流程。后续章节将在此基础上引入更复杂的神经网络结构。

登录后查看全文
热门项目推荐

项目优选

收起
openHiTLS-examplesopenHiTLS-examples
本仓将为广大高校开发者提供开源实践和创新开发平台,收集和展示openHiTLS示例代码及创新应用,欢迎大家投稿,让全世界看到您的精巧密码实现设计,也让更多人通过您的优秀成果,理解、喜爱上密码技术。
C
53
468
kernelkernel
deepin linux kernel
C
22
5
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
349
381
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
7
0
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
133
186
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
878
517
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
336
1.1 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
180
264
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
612
60
note-gennote-gen
一款跨平台的 Markdown AI 笔记软件,致力于使用 AI 建立记录和写作的桥梁。
TSX
83
4