通俗易懂的TextCNN

这篇具有很好参考价值的文章主要介绍了通俗易懂的TextCNN。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  了解TextCNN,看这一篇就够了。

一、TextCNN详解

1、TextCNN是什么

  我们之前提到CNN时,通常会认为属于CV领域,是用于解决计算机视觉方向问题的模型,但是在2014年,Yoon Kim针对CNN的输入层做了一些变形,提出了文本分类模型TextCNN。与传统图像的CNN网络相比,TextCNN 在网络结构上没有任何变化(甚至更加简单了),从图1可以看出TextCNN 其实只有一层卷积,一层max-pooling,最后将输出外接softmax来n分类。
通俗易懂的TextCNN

【图1:TextCNN网络结构】


  与图像当中CNN的网络相比,textCNN 最大的不同便是在输入数据的不同:图像是二维数据,图像的卷积核是从左到右,从上到下进行滑动来进行特征抽取。自然语言是一维数据,虽然经过word embedding生成了二维向量,但是对词向量做从左到右滑动来进行卷积没有意义。比如 “今天” 对应的向量[0, 0, 0, 0, 1],按窗口大小为 1* 2 从左到右滑动得到[0,0],[0,0],[0,0],[0, 1]这四个向量,对应的都是"今天"这个词汇,这种滑动没有帮助。

  TextCNN的成功,不是网络结构的成功,而是通过引入已经训练好的词向量来在多个数据集上达到了超越benchmark的表现,进一步证明了构造更好的embedding,是提升nlp各项任务的关键能力,后面会专门讲解目前流行的embedding算法。

2、TextCNN 的优势

  • TextCNN最大优势网络结构简单 ,在模型网络结构如此简单的情况下,通过引入已经训练好的词向量依旧有很不错的效果,在多项数据数据集上超越benchmark。
  • 网络结构简单导致参数数目少, 计算量少, 训练速度快,在单机单卡的v100机器上,训练165万数据, 迭代26万步,半个小时左右可以收敛。

3、TextCNN 的网络计算原理

  • 输入层(Embedding层)
    输入层的作用就是将输入文本切词后,通过词向量文件及词向量矩阵,将文本向量化,支持后续进行卷积池化等操作。具体来说,分为以下几步:
    • 文本切词
      通过jieba分词等工具,将输入文本切分为若干个词。例如“今天晚上吃什么呢”,分词后变为【“今天”, “晚上”, “”, “什么”, “”】。除了文本输入时,需要进行切词,接下来要介绍的词向量,在构建词向量文件时,也需要进行切词操作。
    • 词向量矩阵初始化
      先简要介绍下词向量文件词向量矩阵。词向量文件的表现形式,是以离线配置文件的形式存在的,通常是json文件,代码中加载后以dict形式存在,如{"的": 1, "是": 2, ……},词向量文件的作用是,在对输入文本进行切词后,需要获取每个词的向量表征,则先通过词向量文件获取词对应的索引,再通过索引在词向量矩阵中获取词的向量表征。这时再理解词向量矩阵,就简单多了,词向量矩阵的作用,是用于获取输入文本的向量表征,说的通俗点,就是用向量将文本表现出来,以用于模型中的数值计算(例如后续的卷积、池化等操作)。词向量矩阵的每一行,是某个词对应的向量,也就是说,我们通过词向量文件中的索引,可以在词向量矩阵中获取词的向量表征。再简单介绍下词向量矩阵及词向量文件生成的两种方式。
      • 随机初始化词向量矩阵:这种方式很容易理解,就是使用self.embedding = torch.nn.Embedding(vocab_size, embed_dim)命令直接随机生成个初始化的词向量矩阵,此时的向量值符合正态分布N(0,1),这里的vocab_size是指词向量矩阵能表征的词的个数,这个数值即是词向量文件中词的数量加1(加1的原因是,如果某个词在词向量文件中不存在,则获取不到索引,也就无法在词向量矩阵中获取对应的向量,这时我们默认这个词的索引为0,即将词向量的第一行作为这个词的向量表征。使用预训练的词向量文件时,这个方法同样适用),embed_dim是指表征每个词时,向量的维度(可自定义,如256)。对于随机初始化词向量矩阵的方式,词向量文件的生成方式一般是将当前所有的文本数据(包括训练数据、验证数据、测试数据)进行切词,再对所有词进行聚合统计,保留词的数量大于某个阈值(比如3)的词,并进行索引编号(编号从1开始,0作为上面提到的不在词向量文件中的其他词的索引),进而生成词向量文件。顺便提一句,词向量矩阵的初始化的方式也有很多种,比如Xavier、Kaiming初始化方法。
      • 使用预训练的词向量文件初始化词向量矩阵:本质上,词向量矩阵的作用是实现文本的向量表征,因此,如何用更合适的向量表示文本,逐渐成为了一个热门研究方向。预训练的词向量文件便是其中的一个研究成果,如通过word2vec、glove等预训练模型生成的词向量文件,通过大量的训练数据,来生成词的向量表征。以word2vec为例,训练后生成的词向量文件是以离线配置文件的形式存在,可通过gensim工具包进行加载,具体命令是wvmodel = gensim.models.KeyedVectors.load_word2vec_format(word2vec_file, binary=False, encoding='utf-8', unicode_errors='ignore'),加载后,可通过wvmodel.key_to_index获取词向量文件(要对词向量文件中的词索引进行重新编号,原索引从0开始,调整为从1开始,0作为不在词向量文件中的词的索引),通过wvmodel.get_vector("xxx")获取词向量文件中每个词对应的向量,将词向量文件中所有词对应的向量聚合在一起后(聚合的方式是,每个词的向量表征,按照词的索引,填充在词向量矩阵对应的位置),生成预训练词向量矩阵weight,再通过self.embedding = torch.nn.Embedding.from_pretrained(weight, freeze=False)完成词向量矩阵的初始化,参数freeze的作用,是指明训练时是否更新词向量矩阵的权重值,True为不更新,默认为True,等同于self.embedding.weight.requires_grad = False)。

          还有个细节需要介绍下,在获取到预训练的词向量文件后,由于预训练的词向量文件很大,因此在后续的训练过程中,可能会出现内存不足的错误,此时可对词向量文件及预训练词向量矩阵进行调整,具体来说,先对我们本身任务的所有文本数据进行切词统计,保留数量超过一定阈值的词,作为词向量文件(就是随机初始化词向量矩阵时,词向量文件的生成方法),再利用这个词向量文件,配合wvmodel.get_vector("xxx"),获取预训练词向量矩阵weight,最后进行后续的词向量矩阵初始化过程。这样操作之后,由于词向量文件中词的数量减少,词向量矩阵的行数减少,内存占用会随之减少很多。另外,生成词向量的预训练方法还有很多,参见【通俗易懂的词向量】。
    • 输入文本向量化
      经过上述两步,输入文本已经完成分词,且词向量矩阵也完成初始化,这时便可对输入文本进行向量化操作,总结下,会根据文本切词后,每个词在词向量文件中的索引,确定这个词在词向量矩阵中的位置,从而获取这个词的向量表征,最终组合出输入文本的向量表征,即输入文本对应的向量矩阵,这个矩阵的列数和词向量矩阵的列数一致,行数不固定了,依赖于文本切词后词的数量。
  • 卷积层
    卷积层与传统CV领域的卷积处理模块没有太大区别,这里我们着重介绍一些需要注意的细节。
    • 通道(channel):在传统CV领域,可以利用 (R, G, B) 作为不同channel,通道个数一般为3个。在使用TextCNN做分类时,通道个数一般是一个。其实也可以采用多channel输入,TextCNN的多channel通常是不同方式的embedding方式(比如 word2vec或glove),实践中也有利用静态词向量和fine-tunning词向量作为不同channel的做法。但是实验证明,单channel 的TextCNN 表现都要优于多channels的TextCNN,如图2所示。

      我们在这里也介绍一下四个model 的不同:
      a、CNN-rand(随机词向量)
      指定词向量的维度embedding_size后,文本分类模型对不同单词的向量作随机初始化, 后续有监督学习过程中,通过BP的方式更新输入层的各个词汇对应的词向量。
      b、CNN-static(静态词向量)
      使用预训练的词向量,即利用word2vec、fastText或者Glove等词向量工具,在开放领域数据上进行无监督的学习,获得词汇的具体词向量表示方式,拿来直接作为输入层的输入,并且在TextCNN模型训练过程中不再调整词向量, 这属于迁移学习在NLP领域的一种具体的应用。
      c、CNN-non-static(非静态词向量)
      预训练的词向量+ 动态调整 , 即拿word2vec训练好的词向量初始化, 训练过程中再对词向量进行微调。
      d、multiple channel(多通道)
      借鉴图像中的RGB三通道的思想, 这里也可以用 static 与 non-static 两种词向量初始化方式来搭建两个通道。
    • 卷积计算
      TextCNN的卷积计算和CV领域的卷积计算略有不同,主要体现在卷积核的形状大小上,TextCNN的卷积核大小,行数可自定义(如2、3、4等),列数要和词向量矩阵的列数相同,因为词向量矩阵的每一行表征一个词,只有两者列数相同,卷积核才能提取每一个词的完整信息。卷积核的列数少于词向量矩阵的列数,提取信息不完整,没意义。而传统CV的卷积核列数也可自定义。另外和传统CV一致,卷积核的个数也可自定义。

通俗易懂的TextCNN

【图2:TextCNN实验】
  • 池化层
    池化层也很容易理解,我们同样介绍一些细节。池化层的输入是卷积层的输出,卷积层输出的通道数m等于卷积核的数量,每个通道都是一列。池化的操作就是对这些输出通道进行池化计算,目前存在两种计算方式,平均池化最大值池化

    • 平均池化(average pooling):平均池化就是对每个通道的所有数值求均值,torch.nn.functional.avg_pool1d命令即可实现。
    • 最大池化(max pooling):最大池化就是对每个通道的所有数值求最大值,torch.nn.functional.max_pool1d命令即可实现。

  不管是平均池化还是最大池化,最终都会生成m个数值,将这m个数值拼接后,进入最后的全连接层。

  • 全连接层
    根据池化层的输出和分类类别数量,构建全连接层,再经过softmax,得到最终的分类结果,torch.nn.Linear(input_num, num_class)即可定义全连接层,其中input_num是池化层输出的维数,即mnum_class是分类任务的类别数量。

总结

  简简单单!!!文章来源地址https://www.toymoban.com/news/detail-455652.html

到了这里,关于通俗易懂的TextCNN的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Zookeeper选举机制(通俗易懂)

    SID: 服务器ID。用来唯一标识一台ZooKeeper集群中的机器,每台机器不能重复,和myid一致。 ZXID: 事务ID。ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻,集群中的每台机器的ZXID值不一定完全一致,这和 ZooKeeper服务器对于客户端“更新请求”的处理逻辑有关

    2024年01月22日
    浏览(33)
  • C 递归 详解(通俗易懂)

    目录 一、定义         1.概述         2.条件         3.比较 二、 如何理解递归?         1.函数调用其他函数示例 :          2.函数调用函数自身示例 :          3.函数调用自身的底层操作 :                  ①在主调函数调用被调函数之前——              

    2024年02月05日
    浏览(29)
  • 简述马尔可夫链【通俗易懂】

    马尔可夫链(Markov Chain)可以说是机器学习和人工智能的基石,在强化学习、自然语言处理、金融领域、天气预测、语音识别方面都有着极其广泛的应用 The future is independent of the past given the present 未来独立于过去,只基于当下。 这句人生哲理的话也代表了马尔科夫链的思想:

    2023年04月08日
    浏览(27)
  • Java反射(通俗易懂)

    目录 1、反射介绍 2、反射API 2.1 获取类对应的字节码的对象(三种) 2.2 常用方法 3、反射的应用 3.1 创建 : 测试物料类 3.2 获取类对象 3.3 获取成员变量 3.4 通过字节码对象获取类的成员方法 3.5 通过字节码对象获取类的构造方法 4、创建对象         Reflection(反射) 是 Java

    2024年02月03日
    浏览(33)
  • 通俗易懂声学基础

    声音是由振动产生的,当物体振动时,会引起周围空气的波动,导致空气粒子间的距离发生疏密的变化,从而引发空气压强的变化,这种变化会传到人的耳膜,再传到人的大脑,人就听到声音了。 物理上,声音有四个基本特性:音色、音强、音高、音长。其中音色为音段特征

    2023年04月24日
    浏览(37)
  • 【C++】继承(通俗易懂,超级详细)

      本篇文章会对c++中的继承进行讲解。其中讲解了 继承的概念及定义、基类和派生类对象赋值转换、继承中的作用域 、 派生类的默认成员函数 和 复杂的菱形继承及菱形虚拟继承等内容。 希望本篇文章会对你有所帮助。 文章目录 一、继承的概念及定义 1、1 继承的概念 1、

    2024年02月16日
    浏览(27)
  • 通俗易懂的GPT原理简介

            GPT是自然语言处理领域中最受欢迎的模型之一。GPT全称为Generative Pre-trained Transformer,是一种基于Transformer模型的预训练语言模型。在接下来的文章中,我们将详细介绍GPT的原理。         在了解GPT原理之前,需要了解以下一些基础知识: 1.自然语言处理:自然语言处

    2024年02月05日
    浏览(32)
  • 通俗易懂的子网划分(第八课)

    1 思考一下为什么要子网划分? 2 如何去子网划分? 3 学习这个技术的目的是啥? 4 什么是IP地址? 5 IP地址如何分类的依据是啥? 6 IP地址都组成? 7 IP地址的分类? 8 二进制到十进制的转化 十进制到二进制的转换 9 如何 计算192.168.1.1的网络ID?

    2024年02月10日
    浏览(35)
  • autoGPT搭建详细教程-通俗易懂

    Autogpt是基于GPT的自动文本生成工具,是OpenAI公司发布的一种自然语言处理技术。它采用了自动回归模型,能够根据输入的文本生成类似人类语言的连续文本输出。Autogpt模型使用了数亿个参数来学习语言模式和规律,具有出色的自然语言处理能力,可以应用于文本摘要、机器

    2024年02月08日
    浏览(27)
  • 通俗易懂web3.0

    大家好,我是清风。互联网连接了人与人,在过去的30年中,互联网技术不断进化、演化,向纵深发展,政治、经济、社交、生活、工作已经几乎离不开互联网。我们经历了WEB1.0,WEB2.0,以及现在的WEB3.0,我们都知道现在已经发展到了5G网络,而WEB也要向前发展,WEB3.0可以理解

    2024年02月11日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包