TextCNN模型原理及理解

1.概要

TEXTCNN是由Yoon Kim在论文(2014 EMNLP) Convolutional Neural Networks for Sentence Classification中提出的,其主要思想是将不同长度的短文作为矩阵输入,使用多个不同size的filter去提取句子中的关键信息(类似于多窗口大小的ngram),并用于最终的分类。

2.网络结构

 

 

输入层:

文本矩阵。

对于文本中的词语可先构建大的词库集,用word2vec进行训练,获取得到每个词语的词向量,所有词向量拼接能够得到对应的文本矩阵。

注意点:

特征:这里用的是词向量表示方式

数据量较大:可以直接随机初始化embeddings,然后基于语料通过训练模型网络来对embeddings进行更新和学习。

数据量较小:可以利用外部语料来预训练(pre-train)词向量,然后输入到Embedding层,用预训练的词向量矩阵初始化embeddings。(通过设置weights=[embedding_matrix])。

(1)static(静态词向量)
使用预训练的词向量,即利用word2vec、fastText或者Glove等词向量工具,在开放领域数据上进行无监督的学习,获得词汇的具体词向量表示方式,拿来直接作为输入层的输入,并且在TextCNN模型训练过程中不再调整词向量, 这属于迁移学习在NLP领域的一种具体的应用。
(2)non-static(非静态词向量)

### BERT-TextCNN 模型介绍及原理 #### 一、背景概述 自然语言处理领域中,预训练模型如BERT已经取得了显著的成功。然而,在某些特定的任务上,结合传统卷积神经网络(CNN)的优势可以进一步提升性能。由此产生了将两者融合的想法——即BERT-TextCNN模型。 #### 二、BERT部分详解 BERT是一种多层双向Transformer编码器结构的预训练语言表示模型[^1]。它通过Masked Language Model(MLM) 和 Next Sentence Prediction(NSP)两种方式来进行自我监督学习,从而获得强大的上下文理解能力。这种特性使得BERT能够捕捉到输入序列内部复杂的依赖关系,并为下游任务提供高质量的语言表征向量作为初始输入。 #### 三、TextCNN组件解析 TextCNN采用了一维卷积核滑动窗口的方式读取句子中的字符或词语组合,不同大小的卷积核可以从文本片段里抽取出多种尺度下的局部语义信息[^3]。经过一系列卷积运算之后得到特征映射图;再经由最大池化操作保留最具有代表性的特征值构成固定长度的新向量表达形式。最后连接全连接层完成最终预测工作。 #### 四、集成机制说明 在构建BERT-TextCNN混合框架时,通常会先利用已有的BERT权重对给定文本进行编码转换成高维度稠密向量矩阵。接着以此为基础送入预先定义好的TextCNN模块继续加工处理。具体来说就是把每一个token对应的隐状态视为单通道图像数据供后续的一维卷积层分析挖掘潜在模式规律。整个过程既发挥了BERT擅长全局建模的优点又借助了TextCNN善于提取短程关联特性的长处,实现了优势互补的效果。 ```python import torch.nn as nn from transformers import BertModel, BertTokenizer class BERT_TextCNN(nn.Module): def __init__(self, bert_path, num_classes=2): super(BERT_TextCNN, self).__init__() # 加载bert模型 self.bert = BertModel.from_pretrained(bert_path) # 定义textcnn参数 filter_sizes = [2, 3, 4] num_filters = 100 self.convs = nn.ModuleList([nn.Conv2d(in_channels=1, out_channels=num_filters, kernel_size=(size, 768)) for size in filter_sizes]) self.fc = nn.Linear(len(filter_sizes)*num_filters, num_classes) def forward(self, input_ids, attention_mask=None): outputs = self.bert(input_ids=input_ids,attention_mask=attention_mask)[0].unsqueeze(1)# batch * 1 * seq_len * hidden_dim conv_outs = [] for conv in self.convs: relu = F.relu(conv(outputs)) pool = F.max_pool1d(relu.squeeze(-1), relu.size()[2]).squeeze() conv_outs.append(pool) cat = torch.cat(conv_outs,dim=-1) logit = self.fc(cat) return logit ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值