



卷积神经网络(CNN)和循环神经网络(RNN)是深度学习中经典的神经网络架构,在图像与序列数据处理方面各具优势,在应用中也有各自的局限性。本节将分析CNN与RNN在自然语言任务中的应用,揭示它们在深度建模中的局限性。
CNN在自然语言处理任务中常用于提取局部特征,其卷积核能够在序列上滑动,捕捉相邻词或字符的依赖关系。CNN最经典的应用领域就是图像识别,如图1-4所示。
图1-4 一种经典的CNN架构(应用于手写数字识别中)
然而,CNN在序列数据处理中的局限性在于其感受野的限制,难以有效捕捉长距离的依赖关系。因此,CNN更多适用于短文本分类、情感分析等任务,在复杂的长文本和依赖关系建模上表现有限。
以下代码将实现一个适用于文本分类任务的简单CNN模型,通过卷积和池化层提取特征,随后利用全连接层完成分类。代码中还将展示如何在自然语言处理任务中应用卷积和池化操作。
代码说明如下:
(1)定义TextCNN类,通过嵌入层对词进行嵌入,并为文本序列增加一个通道维度。卷积层采用多种卷积核大小,以提取不同长度的局部特征。
(2)使用多个卷积层和max_pool1d最大池化层,分别提取各个卷积核的特征,池化后通过torch.cat将输出拼接为完整的特征向量。
(3)将拼接的特征向量输入全连接层进行分类预测,模型通过Dropout层来防止过拟合。
代码运行结果如下:
此输出显示了32个样本的二分类得分,其中每行表示一个样本的分类结果。
RNN是处理序列数据的经典架构,通过隐藏层将前一个时刻的输出传递到下一个时刻,从而捕捉序列中的上下文信息。RNN适合用于时间序列预测、语言建模等任务。然而,标准RNN在长序列建模上存在梯度消失或爆炸的问题,导致模型难以捕捉远距离的依赖信息。为此,引入了改进结构,如长短期记忆网络(LSTM)和门控循环单元(GRU),通过添加门控机制来控制信息的流动,从而部分解决了长距离依赖的建模问题。
以下代码将展示LSTM在长序列建模中的应用,实现一个文本分类任务,并展示LSTM如何通过门控机制处理长序列输入。
代码说明如下:
(1)TextLSTM类的初始化中定义了嵌入层和两层堆叠的LSTM层,LSTM的隐藏层大小为hidden_size,使用batch_first=True确保输入和输出的批量维度在第一个维度。
(2)在forward方法中,将输入数据转换为词嵌入,通过LSTM层处理后取出最后一个时间步的输出,作为整体序列的表示向量并传入全连接层,从而完成分类任务。
(3)在代码末尾初始化了模型和随机输入数据,并生成模型的输出。
代码运行结果如下:
此输出显示了32个样本的二分类得分,反映了LSTM在序列数据上提取的特征。