写点什么

用于多文本分类的孪生和双 BERT

  • 2020-05-28
  • 本文字数:1844 字

    阅读完需:约 6 分钟

用于多文本分类的孪生和双BERT

本文最初发表在 Medium 博客,经原作者 Marco Cerliani 授权,InfoQ 中文站翻译并分享。


本文介绍了在模型中插入 Transformer 的不同方法。


人们对自然语言处理的不断研究催生了各种预训练模型的发展。在各种任务(如文本分类、无监督的主题建模和问题解答等)的最新结果方面,通常都有越来越多的改进,这是一个典型的现象。


最大的发现之一是在神经网络架构中采用了注意力机制(attention mechanics)。这种技术是所有称为 Transformer 的网络的基础。它们应用注意力机制来提取关于给定单词上下文的信息,然后将其编码到学习向量中。


作为数据科学家,我们可以产生并使用许多 Transformer 架构来对我们的任务进行预测或微调。在本文中,我们尽情享受经典的 BERT,但同样的推理也可以应用到其他所有的 Transformer 架构中。我们的研究范围是在双(dual)架构和孪生(siamese)架构中使用 BERT,而不是将其作为多文本输入分类的单一特征提取器。

数据

我们从 Kaggle 收集了一个数据集:News Category Dataset(新闻分类数据),它包含了 2012 年到 2018 年从 HuffPost 获得的大约 20 万条新闻标题。我们的范围是根据两种不同的文本来源对新闻文章进行分类:标题和简短描述。总共有 40 多条不同类型的新闻。为简单起见,并考虑到我们工作流的计算时间,因此我们只使用了 8 个类的子组。


我们不应用任何种类的预处理清晰;我们要让 BERT 来“完成所有的魔法”。我们的工作框架是 TensorFlow 和强大的 Huggingface Transformer 库。更详细地说,我们利用“裸”BERT 模型 Transformer,它输出原始的隐藏状态,而且上面没有任何特定头。它可以像 TensorFlow 模型子类一样访问,并且可以很容易地将其引入我们的网络架构中进行微调。

单 BERT

作为第一个竞争者,我们引入了一个单 BERT 架构。它只接受一个文本输入,这是我们两个文本源连接的结果。这就是常态:任何模型都可以接受连接特性的输入。对于 Transformer 来说,将输入与特殊特征符(special tokens)相结合提升了这一过程。


BERT 需要特定格式的输入数据:有特殊的特征符来标记句子/文本源的开头([CLS] [SEP])。同时,标记化涉及到将输入文本分割成词汇库中可用的特征符列表。词汇表外的单词用 WordPiece 技术进行处理;其中一个单词被逐步拆分成属于词汇表的子词。这一过程可以通过 Huggingface 预训练的词法分析器(Tokenizer)轻松完成,我们只需注意做好 padding 即可。


我们以每个文本源的三个矩阵(token、mask、sequence id)结束。它们作为 Transformer 的输入。在单 BERT 的情况下,我们只有一个矩阵元祖。这是因为我们同时将两个文本序列传递给词法分析器,这两个文本序列会自动连接起来(用 [SEP] 标记)。


我们的模型架构非常简单:将上面构建的矩阵直接馈入 Transformer。最后,通过平均池操作减少了 Transformer 的最终隐藏状态。概率分数是由最后致密层计算出来的。



在我们的测试数据上,我们的单 BERT 达到了 83% 的准确率。性能报告请见下面的混淆矩阵中。


双 BERT

我们的第二个架构可以定义为双 BERT,因为它使用了两个不同的 Transformer。它们有相同的组成,但使用了不同的输入进行训练。第一个 Transformer 接收新闻标题,而另一个接受简短文本描述。输入被编码为始终产生两个矩阵(token、mask 和 sequence id),每个输入都有一个。对于这两个数据源,我们的 Transformer 的最终隐藏状态都是通过平均池来减少的。它们链接在一起,并通过一个完全连接层。



通过这些设置,双 BERT 测试数据上可以在达到 84% 的准确率。


孪生 BERT

我们的最后一种模型是一种孪生式架构。它可以这样定义,因为两个不同的数据源在同一个可训练的 Transformer 架构中同时传递。输入矩阵与双 BERT 的情况相同。对于两个数据源,我们的 Transformer 的最终隐藏状态是通过平均操作进行池化的。所得到的的结果,在一个完全连接层中传递,该层将它们进行组合并产生概率分数。



在我们的测试数据上,孪生式架构达到了 82% 的准确率。


总结

在本文中,我们应用 BERT 架构进行了多类分类任务。我们这个实验的附加价值在于,它以各种方式使用 Transformer 来处理多个输入源。我们从一个源中的所有输入的经典连接开始,然后在输入模型时保持文本输入的分离。提出的双 BERT 和孪生变体能够获得良好的性能。因此,它们可以被认为是经典单 Transformer 架构的良好替代方案。

参考资料


作者介绍:


Marco Cerliani,Lutech 统计学家、黑客和数据科学家。


原文链接


https://sourl.cn/qy6Diz


2020-05-28 15:052348

评论

发布
暂无评论
发现更多内容

【Spring Boot 7】RabbitMQ基础知识总结,Java学习笔记在互联网上火了

Java 程序员 后端

【新】虚拟机深层系列,java底层实现原理

Java 程序员 后端

【源码分析设计模式 10】SpringMVC中的建造者模式,mybatis技术原理pdf

Java 程序员 后端

【Java知识点详解 10】为何要配置环境变量,rabbitmq的消息持久化原理

Java 程序员 后端

【MyBatis 1】SQL注入,Java技术功底不够如何去面试

Java 程序员 后端

【ShardingSphere 技术专题】,qt图形界面编程入门课后答案

Java 程序员 后端

【Spring Boot 4】如何优雅的使用 Mybatis,linux内核深度解析

Java 程序员 后端

【Spring Cloud 8】熔断与限流Sentinel,java常见面试题

Java 程序员 后端

【Spring5,贼厉害

Java 程序员 后端

【Spring Boot 16】常用注解介绍及使用,内含福利

Java 程序员 后端

【数据结构与算法 12】二分查找,java大数据分析技术栈

Java 程序员 后端

【MyBatis 2】MyBatis-Plus,java多线程常见面试题

Java 程序员 后端

【备战秋招】30道Spring IOC经典面试题,kafka消息中间件原理

Java 程序员 后端

【实习之T100开发】Genero FGL (TIPTOP4GL) 学习笔记,2021金九银十

Java 程序员 后端

【Linux 4】定时任务调度与进程服务管理,java编译器下载教程

Java 程序员 后端

【Spring 持久层】Spring 事务开发,nginx原理及应用

Java 程序员 后端

【并发编程】深入了解volatile(1),linux操作系统教程海南师范大学

Java 程序员 后端

【并发编程】深入了解volatile,nginx负载均衡架构

Java 程序员 后端

【数据库实验】,springboot视频教程迅雷

Java 程序员 后端

【PyQt5】designer 页面点击按钮跳转页面,华为面试笔试题java

Java 程序员 后端

【Spring Boot 26】分别在SpringBoot和Vue中解决跨域问题

Java 程序员 后端

【Spring Boot 7】RabbitMQ基础知识总结(1),java开发面试宝典

Java 程序员 后端

【牛客】从青铜到王者01,java基础入门第二版第二章答案

Java 程序员 后端

【Spring AOP】静态代理设计模式,大牛带你直击优秀开源框架灵魂

Java 程序员 后端

【Spring 工厂】反转控制与依赖注入,成功收获美团,小米offer

Java 程序员 后端

【全栈最全Java框架总结】SSH,java线程池面试问题

Java 程序员 后端

【Java知识点详解 10】为何要配置环境变量(1),java从入门到精通第五版电子书百度云

Java 程序员 后端

【Spring Boot 15】启动类原理解析,mysql主从复制原理面试

Java 程序员 后端

50道Linux基础命令题目及其解答 | Linux命令

Regan Yue

Linux 10月月更

【数据结构与算法 9】谁发明的八皇后,mysql教程视频百度云

Java 程序员 后端

【深度思考】JDK8中日期类型该如何使用,java面试题百度网盘

Java 程序员 后端

用于多文本分类的孪生和双BERT_AI&大模型_Marco Cerliani_InfoQ精选文章