将迁移学习用于文本分类 《 Universal Language Model Fine-tuning for Text Classification》
本文发表于自然语言处理领域顶级会议 ACL 2018
原文链接
特别说明:笔记掺杂了本人大量的个人理解,以及口语化的语言,由于本人水平有限,极有可能曲解原文的意思,各位看官随意看看,切莫当真~
摘要
迁移学习在图像领域大放异彩,可是在NLP领域却用途寥寥,这是因为现有的NLP模型都与迁移学习不兼容,每次更新任务都需要重头开始训练模型,否则就会导致模型习得的语言特征灾难性地丢失。本文深知迁移学习才是NLP研究的新方向,故本文提出了一个新型的可以用于所有NLP任务的“超级模型”——ULMFiT !!!!!!! 经过严密实验,本文提出的ULMFiT模型吊打一切现有NLP分类模型,牛得一批!!!!!
模型介绍
假设我们有源任务TsTs,我们想把它迁移到任意一个目标任务TtTt上去,并且我们希望这种迁移效果尽可能的要好,最好我们只要针对源任务TsTs训练一次模型,然后一辈子就靠这个模型打天下,它能适用于全世界所有NLP任务,人们就一劳永逸啦,哈哈哈哈!
有了上述的宏伟理想,我们就要开始朝它努力了啊!
所以我们的模型必须要考虑到NLP任务的方方面面,这样才能打遍天下无敌手,所谓的“长文本语义依赖问题”,“各种粒度的语义分析”啊等等问题,都得考虑到,都是小菜一碟!
我们的模型分为两部分,其一就是一个语言模型。该模型是在一个大型的通用语料库上训练的,因为我们致力于做出一个通用的模型,所以我们的语料库大到你无法想象,反正就是超级大就对了,能够胜任NLP的所有任务! 等该模型训练好之后,我们再对其进行微调就可以让其去解决不同的特定领域的问题啦!哈哈哈!!
说了那么多,我们的模型是啥呢? 没错!当然是目前最先进的AWD-LSTM模型啦!(什么?不知道这模型是啥?百度啊?还指望我解释?!吔屎啦你!)
用通用的大到你无法想象的语料库训练完最先进的AWD-LSTM模型之后,我们接下来该做啥呢?没错!就是对该通用模型进行微调,然后让其适应于特定任务!那么该怎么微调呢? 我们有两个独门秘笈:
Discriminative fine-tuning(为了让秘笈看上去更神秘就不翻译了)
具体而言, 就是为我们的模型的每一层分配不同的学习率, 参数更新时, 各层按照各自的学习率进行更新. 此处作者提出了一个技巧, 先通过只调整最后一层的参数确定一个合适的学习率, 然后往前的每一层都使用后一层学习率的2.6分之一倍.
(我也不知道为啥这么做效果会变好,原文也没说,看来独门秘笈果然是高深莫测我也不知道为啥这么做效果会变好,原文也没说,看来独门秘笈果然是高深莫测)Slanted triangular learning rates(不翻译,理由同上)
具体而言,是一种新型的学习率更新方式,由于采用该方式学习率的变化图形会像一个“三角形”一样,所以该秘笈的名字里也带了“triangular”。如图所示:
其中横轴是模型的迭代次数,纵轴是学习率。具体公式如下:
其中TT是模型的迭代次数
cut_frac=学习率增长的迭代次数迭代的总次数cut_frac=学习率增长的迭代次数迭代的总次数(上图中为2001600=0.1252001600=0.125)
cutcut是学习率增长和下降的分界点(上图中为200)
ratioratio为学习率最大值和最小值的差值
ηmaxηmax为学习率的最大值
ηtηt为模型迭代到第t次时的学习率(注:这些公式的数值是我根据上图方便读者理解从图中用肉眼读出来的,与原文实验无关)。
使用独门秘笈调整完咱们的通用模型之后是不是就万事大吉了呢?当然没有这么简单,要知道,本文的模型,牛逼到你无法想象!
我们接下来要将通用模型应用到特定的分类任务上,那么我们还得针对特定任务对模型增加两个全连接层,这俩全连接层都进行了normalization和dropout,激活函数采用Relu。最后再将这俩层接一个softmax的输出层,输出各个类别的概率就OK啦!
最后注意! 咱们的整个流程中,只有最后的俩全连接层和输出层的参数是从零开始学习的!
还有一个问题,咱们的牛逼模型(AWD-LSTM)与最后俩全连接层咋连接呢?
考虑到文本分类问题中,每个句子内真正对分类有帮助的词语只有极少部分,所以我们必须充分的提取文本的信息才能达到比较好的效果,所以我们将牛逼模型(AWD-LSTM)的隐含层最终状态的输出hThT作为我们全连接层的输入,这样就够了吗?
当然不够!
小小的hThT当然不能充分提取出句子的所有信息,我们要对其进行充分的提取,所以我们将其进行各种pool操作,max_pool,mean_pool,一起上!怎么凶猛怎么操作!直到把GPU的显存全部塞满为止!最后将这些pool操作提取的向量和hThT一起给concat起来,就得到了我们全连接层的输入:
对最后全连接层的调参将极大的影响到我们的最终效果
因为如果调参过于狂野的话, 会导致我们牛逼模型(AWD-LSTM)习得的特征被灾难性地遗忘, 相当于前功尽弃。而如果我们过于调参过于细致的话, 算法的收敛速度又会大幅下降。这可咋办呢?别慌!我们还有秘笈!
Gradual unfreezing(不翻译,理由同上)
具体而言, 就是开始调参的时候,将除最后一层以外所有层的参数都给冻结 (就是设置参数不可更新), 然后再一步步向前一层解冻.
将迁移学习用于文本分类 《 Universal Language Model Fine-tuning for Text Classification》的更多相关文章
- 论文笔记 - Noisy Channel Language Model Prompting for Few-Shot Text Classification
Direct && Noise Channel 进一步把语言模型推理的模式分为了: 直推模式(Direct): 噪声通道模式(Noise channel). 直观来看: Direct ...
- 万字总结Keras深度学习中文文本分类
摘要:文章将详细讲解Keras实现经典的深度学习文本分类算法,包括LSTM.BiLSTM.BiLSTM+Attention和CNN.TextCNN. 本文分享自华为云社区<Keras深度学习中文 ...
- 用于文本分类的RNN-Attention网络
用于文本分类的RNN-Attention网络 https://blog.csdn.net/thriving_fcl/article/details/73381217 Attention机制在NLP上最 ...
- 深度学习之文本分类模型-前馈神经网络(Feed-Forward Neural Networks)
目录 DAN(Deep Average Network) Fasttext fasttext文本分类 fasttext的n-gram模型 Doc2vec DAN(Deep Average Networ ...
- 论文分享|《Universal Language Model Fine-tuning for Text Classificatio》
https://www.sohu.com/a/233269391_395209 本周我们要分享的论文是<Universal Language Model Fine-tuning for Text ...
- 用tensorflow迁移学习猫狗分类
笔者这几天在跟着莫烦学习TensorFlow,正好到迁移学习(至于什么是迁移学习,看这篇),莫烦老师做的是预测猫和老虎尺寸大小的学习.作为一个有为的学生,笔者当然不能再预测猫啊狗啊的大小啦,正好之前正 ...
- AI:深度学习用于文本处理
同本文一起发布的另外一篇文章中,提到了 BlueDot 公司,这个公司致力于利用人工智能保护全球人民免受传染病的侵害,在本次疫情还没有引起强烈关注时,就提前一周发出预警,一周的时间,多么宝贵! 他们的 ...
- 基于深度学习的文本分类案例:使用LSTM进行情绪分类
Sentiment classification using LSTM 在这个笔记本中,我们将使用LSTM架构在电影评论数据集上训练一个模型来预测评论的情绪.首先,让我们看看什么是LSTM? LSTM ...
- 2.keras实现-->深度学习用于文本和序列
1.将文本数据预处理为有用的数据表示 将文本分割成单词(token),并将每一个单词转换为一个向量 将文本分割成单字符(token),并将每一个字符转换为一个向量 提取单词或字符的n-gram(tok ...
随机推荐
- linux 安装nginx -查看 linux的环境变量
我发现在linux上面安装linux很简单 在CentOS release 6.5 上面先看一下操作系统的版本: lsb_release -a 直接执行 yum install nginx 系统自动的 ...
- 2018-2019-2 20165209 《网络对抗技术》Exp9: Web安全基础
2018-2019-2 20165209 <网络对抗技术>Exp9: Web安全基础 1 基础问题回答和实验内容 1.1基础问题回答 (1)SQL注入攻击原理,如何防御? 原理:SQL注入 ...
- [微信小程序]实现一个自定义遮罩层
正文: 先上效果图: 点击按钮Show显示遮罩层,再次点击屏幕任何地方隐藏遮罩层; <button bindtap="showview">Show</button ...
- 记一次被DDoS敲诈的历程 糖果LUA FreeBuf 今天 0x01 背景
记一次被DDoS敲诈的历程 糖果LUA FreeBuf 今天 0x01 背景
- Celery如何修复Python的GIL问题
小结: 1. Celery如何修复Python的GIL问题https://python.freelycode.com/contribution/detail/346 最近,我重读了Glyph写的Uny ...
- Pattern 和 Matcher
作用:应用这个 Pattern 和 Matcher 可以完成字符串获取功能 使用: // 获取模式器对象 Pattern p = Pattern.compile("a*b") ; ...
- flutter showDatePicker显示中文日期_Flutter时间控件显示中文
flutter showDatePicker showTimePicker显示中文日期 1.配置flutter_localizations依赖 找到pubspec.yaml配置flutter_loca ...
- SpringCloud学习成长之路七 高可用配置中心
上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将其集群化,从而达到高可用,架构图如 ...
- Java如何获取ResultSet结果中的每一列的数据类型
示例代码片段: ResultSet resultSet = statement.executeQuery(sql); ResultSetMetaData metaData = resultSet.ge ...
- Centos7安装gitlab11 学习笔记之基础概念、部署安装、权限管理、issue管理
一.基础介绍 1.简介 一个基于GIT的源码托管解决方案 基于rubyonrails开发 集成了nginx postgreSQL redis sidekiq等组件 2.安装要求 2g内存以上,有点占内 ...