文本分类任务算法演变(二)

文本分类任务算法演变

  • 1.深度学习-pipeline
    • 1.1fastText
    • 1.2LSTM
      • 1.2.1公式详解
      • 1.2.2可视化
    • 1.3TextCNN
    • 1.4Gated CNN
    • 1.5TextRCNN
    • 1.6Bert
      • 1.6.1取[cls] token对应的向量
      • 1.6.2将整句话的向量取max/average pooling
      • 1.6.3将Bert编码后的向量再输入LSTM或CNN
      • 1.6.4将Bert中间层的结果取出加入运算等
  • 2数据问题
    • 2.1数据稀疏问题
    • 2.2标签不均衡问题
  • 3.多标签分类问题

1.深度学习-pipeline

代码结构:

  1. config.py 输入模型配置参数,如学习率等
  2. loader.py 加载数据集,做预处理,为训练做准备
  3. model.py 定义神经网络模型结构
  4. evaluate.py 定义评价指标,每轮训练后做评测
  5. main.py 模型训练主流程

1.1fastText

示意图:
在这里插入图片描述
释义:

1.首先一个句子进来,我们将它拆分成一个个的字,每个字都有其对应的向量(假如是10个字;矩阵为: 10 * hidden_size
2.我们将矩阵进行Mean pooling就得到 1 * hidden_size
3.在经过一个线性层,加入我们需要分3类;则有:1 * hidden_size x hidden_size * 3 得到一个 1 * 3 的结果
上面就是这个算法的整个过程

问题: 上述的10个字的句子,经过pooling之后,就损失了句子语序信息,或者某些特殊词组合的含义?
解决办法: 我们就针对某些常见的组合,有一些特定的向量,而不是拆成字;比如:吃早饭了吗? 早饭是一个词,对应一个向量,其他的一个字一个向量,这样可以一定程度上保留语义、语序信息

1.2LSTM

释义: 使用RNN(LSTM、GRU)对文本进行编码,使用最后一个位置的输出向量进行分类;这里的LSTM和GRU都是RNN的一个变种。其中LSTM、GRU我们认为在相同的数据训练上,效果差不多,但都明显优于RNN。

方法:
LSTM通过将RNN的隐单元复杂化一定程度规避了梯度消失和信息遗忘的问题。

1.2.1公式详解

(一)
在这里插入图片描述
理解:

  1. 这个公式可以看作一个简化的RNN;ft * C(t-1) 相当于RNN中的前一个神经元计算的值。it * ^Ct就是当前序列计算的值,两个相加就是对下一步的输出。
  2. 在这里f即单词forget;简单来说,前面的计算的记忆内容,有一些并不重要,我们可以选择的遗忘,便于记录当前序列计算的特征。这个遗忘的参数就是ft
  3. i即单词input;当前序列呢,也有一些可能是没有价值的特征,避免影响后续,所以有个input参数,来计算出当前序列那些是有价值的,这个参数就是it
  4. 所以算法,相当于对上一步和当前步的计算结果都有考量。

(二)
在这里插入图片描述
理解:

  1. 首先上述公式 ()内 的内容,其实都是一个RNN,其中W表示序列中各个模块的权重参数h、x表示RNN中的上一步输出值、输入值x表示当前序列时间步的输入b就是bias偏置项。妥妥的标准RNN
  2. 在1的基础上,公式前面都过了一层激活层,分别是sigmoid、tanh
  3. ^Ct就是当前时间步的记忆

(三)
在这里插入图片描述
理解:

  1. ot,o就是单词OUT,即输出的意思,使用的激活函数是sigmoid;内部是一个传统的RNN算法,只是权重和咱们在前面步骤的不一样而已。
  2. ht是当前时间步真正的输出;这个输出是当前的记忆经过激活函数tanh后;再乘ot;即输出门的参数;意思即:当前时间步计算的记忆不应当作为输出,输出应该是有一个表达的转换的,这个转换的参数就叫输出门(ot)
  3. 在LSTM中输出包含两个,一个是ht,即输出值;Ct即记忆值;Ct相当于某个时间步的记忆,需要输出后,则需要加工,即得到ht

1.2.2可视化

在这里插入图片描述

  1. 左侧两个箭头输入,分别是Ct,ht
  2. 左侧下面的箭头分叉,从左往右依次为: ft、it、^Ct、ot

1.3TextCNN

释义: 利用一维卷积对文本进行编码,编码后的文本矩阵通过pooling转化为向量,用于分类。
注意: 在CV中我们的卷积核是正方形的,左右移动,上下移动;但是在NLP中,由于一个向量代表一个词,所以卷积是上下进行的类比理解: 就像是我们中文里,单独的字含义并不明确,有一些是四个字的成语、五个字的成语,或者是两个字的;这样就可以把他们的特征卷积提取出来。但是一般不会超过5个字,这个和语言的特性有关,毕竟在中文中,超5个字的词相对还是比较少的。

示意图:
在这里插入图片描述

1.4Gated CNN

Gated CNN简单来说是基于CNN的一种改进,用下面示意图表示:
在这里插入图片描述
相对于CNN来说,用了两个卷积,增加了可训练的参数量;
核心注意点:

1.新增的卷积,经过了一层激活函数Sigmoid,再与另外一个卷积结果相乘得到输出。
释义:我们知道Sigmoid激活函数是(0,1)的数,和我们前面说LSTM中的门机制一样。这是一种重要思想。

1.5TextRCNN

在这里插入图片描述
释义: 咱们深度学习模型就像搭积木一样;这里的TextRCNN同样是如此,将RNN和CNN相结合起来

  1. 上面图示中,首先输入进行embedding,通过一个RNN的LSTM得到输出。
  2. LSTM的输出不一定适合CNN的输入,所以就转换为对于的字符,再进行embedding
  3. 将embedding的内容再交给后续的TextCNN继续计算。

1.6Bert

Bert编码示意图:

在这里插入图片描述

对于Bert的编码结果,文本分类有多种的使用方式,虽然方式不同,但逻辑相同,都是取其某些层的编码结果,再进行分类而已。

1.6.1取[cls] token对应的向量

释义:
我们知道Bert会标注输入句子的首位,用首位的向量表示。在Bert网络结构,完成计算后,也会输出;在这里我们就取输出的[cls]对应向量,进行分类

  1. 以基础的Bert为例,取出的[cls]向量为:1 * 768
  2. 假如要分10类,则使用768 * 10的矩阵和[cls]向量相乘即
  3. 为什么用Bert的cls;是因为Bert本身在做上下句关系时,用的这个cls

1.6.2将整句话的向量取max/average pooling

释义:
我们把Bert会的输出的向量,整体取出来,过pooling层,进行分类。

  1. 以基础的Bert为例,输出向量为[cls]向量为:20 * 768
  2. 那我们将结果pooling后,得到 1* 768
  3. 假如要分10类,则使用768 * 10的矩阵与pooling后的向量相乘即
    4.这里pooling不会损失语义信息,因为输入token是经过bert网络计算过后的。

1.6.3将Bert编码后的向量再输入LSTM或CNN

释义: 就是字面意思,将Bert的输出,再接RNN、CNN网络,完成分类。

1.6.4将Bert中间层的结果取出加入运算等

释义: 上面的内容,我们都是取Bert最后一层的输出进行处理。

1.经过实验后发现,标准的Bert是12层,我们其中,第三层的结果,进行分类,也能取到较好的效果。
2.注意,实验的结果表示,如果需要分类的任务越复杂,则Bert的网络层数应该越深才行。

2数据问题

2.1数据稀疏问题

释义: 训练数据量小,模型在训练样本上能收敛,但预测准确率很低

解决方案:

1.标注更多的数据
2.尝试构造训练样本(数据增强)
3.更换模型(如使用预训练模型等)减少数据需求
4.增加规则弥补
5.调整阈值,用召回率换准确率
比如:3分类预测[0.3,0.4,0.3],就不采纳模型的预测结果,必须要达到0.6以上才采纳,那么预测的数据就变少了,但是准确率提升了,
6.重新定义类别(减少类别)

2.2标签不均衡问题

释义: 部分类别样本充裕,部分类别样本极少
在这里插入图片描述
解决办法:

  1. 解决数据稀疏的所有的方法依然适用
  2. 过采样 复制指定类别的样本,在采样中重复
  3. 降采样 减少多样本类别的采样,随机使用部分,多余的样本进行测试
  4. 调整样本权重 通过损失函数权重调整来体现,比如,教育的材料权重调整时,损失函数增大。

3.多标签分类问题

释义: 多标签 不同于 多分类;多标签是M选N;多分类是M选1。比如:一部电影即属于动作片,也属于科幻片,就是多标签分类问题。

多标签问题的转化

  1. 分解为多个独立的二分类问题
    举例: 比如有3个标签分类,就训练三个模型,每个模型都是二分类,判断材料是本模型和不是本模型;1/0

  2. 将多标签分类问题转换为多分类问题
    举例: 比如有动作电影、科幻电影、枪战片三类;把可能的搭配全部梳理出来

  1. 动作、科幻;2. 动作、枪战; 3. 科幻、枪战
  2. 动作 5. 枪战 6.科幻

这样的多标签分类,就变成了一个6分类的问题,但是这个方案,对于标签较少比较合适,如果标签过多,可以详细,分类将膨胀。

  1. 更换loss直接由模型进行多标签分类
    举例: 比如使用,BCELoss损失函数。
    理解: 比如我们正常的分类,输入是标记一个,即[1,0,0,0,0];但是多标签分类,可以标记多个:[1,0,1,0,1],即表示数据属于1、3、5类;通过BCELoss损失函数,可以进行计算和参数更新。

其示意图公式如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/404890.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python生成432Hz音频

使用 numpy 来生成信号, 使用 matplotlib 可视化信号, 使用 sounddevice 播放声音。 以下生成和播放 432 Hz 的正弦波信号: import numpy as np import sounddevice as sd import matplotlib.pyplot as plt# 生成单音函数 def generate_to…

gstreamer系列 -- 获取媒体信息

Basic tutorial 9: Media information gathering

windows下的redis7.0.11的下载

天,我找redis7.0.11的安装包就找了好久,终于给我找到了。市面上好多是linux版本的。 安装包:Release Redis 7.0.11 for Windows zkteco-home/redis-windows GitHub 解压之后是这样的。 然后你要测试能不能启动: 1、指定配置文…

C语言-部分字符串函数详解 1-4

C语言-部分字符串函数详解 1-4 前言1.strlen1.1基本用法1.2注意事项\0size_t 1.3模拟实现 2.strcpy2.1基本用法2.2注意事项**源字符串必须以 \0 结束****会将源字符串中的 \0拷贝到目标空间****目标空间必须可修改****目标空间必须能容纳下源字符串的内容** 2.3模拟实现 3.strn…

RabbitMQ的核心概念

RabbitMQ是一个消息中间件,也是一个生产者消费者模型,负责接收,存储和转发消息。 核心概念 Producer 生产者,是RabbitMQ Server的客户端,向RabbitMQ发送消息。 Consumer 消费者,是RabbitMQ Server的客…

使用亮数据爬虫工具解锁复杂爬虫场景

在当今数据驱动型时代,数据采集和分析能力算是个人和企业的核心竞争力。然而,手动采集数据耗时费力且效率低下,而且容易被网站封禁。 我之前使用过一个爬虫工具,亮数据(Bright Data) ,是一款低…

浅探空间智能

空间智能,这一概念在人工智能领域逐渐升温,部分归功于AI界的领军人物李飞飞博士所领导的创新项目。 Seeing is for doing and learning. 【精校】TED:李飞飞 | 空间智能让AI理解真实世界 2024.5 李飞飞在 X 上介绍称,「空间智能…

消防认证-火灾显示盘GB 17429-2011

一、消防认证 消防认证是指消防产品符合国家相关技术要求和标准,且通过了国家认证认可监督管理委员会审批,获得消防认证资质的认证机构颁发的证书,消防产品具有完好的防火功能,是住房和城乡建设领域验收的重要指标。 二、认证依据…

10结构型设计模式——桥接模式

一、桥接模式 桥接模式(Bridge Pattern)是结构型的设计模式之一。桥接模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实…

SystemUI下拉框新增音量控制条

Android产品下拉框一直只有亮度条没有音量控制条。 为了方便控制音量,普遍都是底部导航栏添加音量加减按钮,在Android10以后,大家普遍用上了手势导航,去掉底部导航栏。 目前需要再下拉框中可以直接控制音量。 文章目录 前言需求及…

day33

一、linux系统中的库 库在linux系统中是一个二进制文件,它是由XXX.c(不包含main函数)文件编译而来的,分为静态库和动态库。 库在系统中的内容是不可见的,是一个二进制乱码 当程序需要使用库中的相关函数时,…

安装docker 遇到异常Could not resolve host: mirrorlist.centos.org; 未知的错误

问题 安装docker 遇到异常 Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx86_64&repoos&infrastock error was 14: curl#6 - “Could not resolve host: mirrorlist.centos.org; 未知的错误” 1、安装Docker依赖包 yum install …

基于SpringBoot的论坛系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家,服务很多代码文档,百分百好评,战绩可查!!入职于互联网大厂,可以交流,共同进步。有保障的售后 代码参考数据库参…

Android 12系统源码_多屏幕(二)模拟辅助设备功能开关实现原理

前言 上一篇我们通过为Android系统开启模拟辅助设备功能开关,最终实现了将一个Activity显示到多个屏幕的效果。 本篇文章我们具体来分析一下当我们开启模拟辅助设备功能开关的时候,Android系统做了什么哪些操作。 一、模拟辅助设备功能开关应用位置 …

存储实验:华为异构存储在线接管与在线数据迁移(Smart Virtualization Smart Migration 特性)

目录 目的实验环境实验步骤参考文档1. 主机安装存储多路径2. v2存储创建Lun,映射给主机;主机分区格式化,写数据3. 将v2存储映射该成映射到v3存储上(v3存储和v2之间链路搭建,测通,远端设备)(Smar…

便利店(超市)管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家,服务很多代码文档,百分百好评,战绩可查!!入职于互联网大厂,可以交流,共同进步。有保障的售后 代码参考数据库参…

中国:“虚拟资产”交易被列为公认的洗钱方式之一!最高法院承认加密货币交易!

2024年8月19日,最高人民法院和最高人民检察院表示,根据他们对反洗钱法的新解释,“虚拟资产”交易现已被列为公认的洗钱方式之一。这是中国首次针对此类资产类别采取此类举措,说明为应对加密货币和其他虚拟资产日益增长的使用&…

IO进程线程8.20

1.使用fgets获取文件的行号 #include <myhead.h> int main(int argc, const char *argv[]) {FILE *fp fopen("./1.txt","r");if(fpNULL){perror("fp");return -1;}char buf[30];int count 0;while(fgets(buf,sizeof(buf),fp)){count;}p…

为IntelliJ IDEA安装插件

安装插件 插件是开发工具的扩展程序&#xff0c;通常由第三方提供&#xff0c;当安装了插件后&#xff0c;原开发工作的菜单、按钮等开发环境可能会发生变化&#xff0c;例如出现了新的菜单项&#xff0c;或出现了新的按钮&#xff0c;甚至一些全新的编码方式&#xff0c;通常…

双向链表复习(C语言版)

目录 链表分类&#xff1a; 双向链表初始化&#xff1a; 双向链表的插入&#xff1a; 双向链表的打印&#xff1a; 双向链表的删除&#xff1a; 双向链表的指定结点位置查找&#xff1a; 双向链表的在指定位置之后插入数据&#xff1a; 注意&#xff1a;通过上文的指定…