继续之前的文本分类系列

【NLP傻瓜式教程】手把手带你CNN文本分类(附代码)

【NLP傻瓜式教程】手把手带你RNN文本分类(附代码)

【NLP傻瓜式教程】手把手带你fastText文本分类(附代码)

今天来看看网红Attention的效果,来自ACL的论文Hierarchical Attention Networks for Document Classification

论文概述

近年来,在NLP领域,好像最流行的就是RNN、LSTM、GRU、Attention等及其变体的组合框架。这篇论文里作者就对文本的结构进行分析,使用了双向GRU的结构,并且对Attention进行调整:考虑了word层面的attention和sentence层面的attention,分别对单词在句子中和句子在文档中的重要性进行了建模。仔细一想确实是挺合理的,一篇文档就是由无数句子构成的,而一个句子又是由无数单词构成的,充分考虑了文档的内部结构。

上图就是论文中文本分类模型的整体框架,可以看出主要分为四个部分:

  • word encoder  (BiGRU layer)

  • word attention (Attention layer)

  • sentence encoder  (BiGRU layer)

  • sentence attention (Attention layer)

首先回顾一下GRU的原理:

GRU是RNN的一个变种,使用门机制来记录当前序列的状态。在GRU中有两种类型的门(gate):reset gate和update gate。这两个门一起控制来决定当前状态有多少信息要更新。

reset gate是用于决定多少过去的信息被用于生成候选状态,如果Rt为0,表明忘记之前的所有状态:



















































根据reset gate的分数可以计算出候选状态:

update gate是用来决定有多少过去的信息被保留,以及多少新信息被加进来:

最后,隐藏层状态的计算公式,有update gate、候选状态和之前的状态共同决定:




















































接着来回顾一下Attention原理:

好啦,下面具体来看看论文里的模型:

1、word encoder layer

首先,将每个句子中的单词做embedding转换成词向量,然后,输入到双向GRU网络中,结合上下文的信息,获得该单词对应的隐藏状态输出





































2、word attention layer

attention机制的目的就是要把一个句子中,对句子表达最重要的单词找出来,赋予一个更大的比重。

首先将word encoder那一步的输出得到的










输入到一个单层的感知机中得到结果










作为其隐含表示

接着为了衡量单词的重要性,定义了一个随机初始化的单词层面上下文向量











,计算其与句子中每个单词的相似度,然后经过一个softmax操作获得了一个归一化的attention权重矩阵










,代表句子i中第t个单词的权重:

于是,句子的向量Si就可以看做是句子中单词的向量的加权求和。这里的单词层面上下文向量是随机初始化并且可以在训练的过程中学习得到的,我们可以把它看成是一种query的高级表示:“句子中哪些词含有比较重要的信息?”
































3、sentence encoder

通过上述步骤我们得到了每个句子的向量表示,然后可以用相似的方法得到文档向量































4、sentence attention

和词级别的attention类似,作者提出了一个句子级别的上下文向量,来衡量一个句子在整篇文本的重要性。

5、softmax

上面的v向量就是我们得到的最后文档表示,然后输入一个全连接的softmax层进行分类就ok了。

6、模型效果

代码实现

定义模型

class HAN(object):def __init__(self, max_sentence_num, max_sentence_length, num_classes, vocab_size,embedding_size, learning_rate, decay_steps, decay_rate,hidden_size, l2_lambda, grad_clip, is_training=False,initializer=tf.random_normal_initializer(stddev=0.1)):self.vocab_size = vocab_sizeself.max_sentence_num = max_sentence_numself.max_sentence_length = max_sentence_lengthself.num_classes = num_classesself.embedding_size = embedding_sizeself.hidden_size = hidden_sizeself.learning_rate = learning_rateself.decay_rate = decay_rateself.decay_steps = decay_stepsself.l2_lambda = l2_lambdaself.grad_clip = grad_clipself.initializer = initializerself.global_step = tf.Variable(0, trainable=False, name='global_step')# placeholderself.input_x = tf.placeholder(tf.int32, [None, max_sentence_num, max_sentence_length], name='input_x')self.input_y = tf.placeholder(tf.int32, [None, num_classes], name='input_y')self.dropout_keep_prob = tf.placeholder(tf.float32, name='dropout_keep_prob')if not is_training:returnword_embedding = self.word2vec()sen_vec = self.sen2vec(word_embedding)doc_vec = self.doc2vec(sen_vec)self.logits = self.inference(doc_vec)self.loss_val = self.loss(self.input_y, self.logits)self.train_op = self.train()self.prediction = tf.argmax(self.logits, axis=1, name='prediction')self.pred_min = tf.reduce_min(self.prediction)self.pred_max = tf.reduce_max(self.prediction)self.pred_cnt = tf.bincount(tf.cast(self.prediction, dtype=tf.int32))self.label_cnt = tf.bincount(tf.cast(tf.argmax(self.input_y, axis=1), dtype=tf.int32))self.accuracy = self.accuracy(self.logits, self.input_y)

手机浏览代码不太舒服,完整代码就不贴了,老规矩后台自取吧~

「完整代码可以在公众号后台回复"HAN"获取。」

END -

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习在线手册深度学习在线手册AI基础下载(pdf更新到25集)本站QQ群1003271085,加入本站微信群请回复“加群”获取一折本站知识星球优惠券,请回复“知识星球”喜欢文章,点个在看

【NLP傻瓜式教程】手把手带你HAN文本分类(附代码)相关推荐

  1. 【NLP傻瓜式教程】手把手带你RCNN文本分类(附代码)

    继续之前的文本分类系列 [NLP傻瓜式教程]手把手带你CNN文本分类(附代码) [NLP傻瓜式教程]手把手带你RNN文本分类(附代码) [NLP傻瓜式教程]手把手带你fastText文本分类(附代码) ...

  2. 【NLP傻瓜式教程】手把手带你fastText文本分类(附代码)

    写在前面 已经发布: [NLP傻瓜式教程]手把手带你CNN文本分类(附代码) [NLP傻瓜式教程]手把手带你RNN文本分类(附代码) 继续NLP傻瓜式教程系列,今天的教程是基于FAIR的Bag of ...

  3. 【NLP保姆级教程】手把手带你RNN文本分类(附代码)

    写在前面 这是NLP保姆级教程的第二篇----基于RNN的文本分类实现(Text RNN) 参考的的论文是来自2016年复旦大学IJCAI上的发表的关于循环神经网络在多任务文本分类上的应用:Recur ...

  4. 【NLP傻瓜式教程】手把手带你RNN文本分类(附代码)

    文章来源于NewBeeNLP,作者kaiyuan 写在前面 这是NLP傻瓜式教程的第二篇----基于RNN的文本分类实现(Text RNN) 参考的的论文是来自2016年复旦大学IJCAI上的发表的关 ...

  5. 【NLP傻瓜式教程】手把手带你CNN文本分类(附代码)

    文章来源于NewBeeNLP,作者kaiyuan 写在前面 本文是对经典论文<Convolutional Neural Networks for Sentence Classification[ ...

  6. 【NLP】保姆级教程:手把手带你CNN文本分类(附代码)

    分享一篇老文章,文本分类的原理和代码详解,非常适合NLP入门! 写在前面 本文是对经典论文<Convolutional Neural Networks for Sentence Classifi ...

  7. 【NLP保姆级教程】手把手带你CNN文本分类(附代码)

    分享一篇老文章,文本分类的原理和代码详解,非常适合NLP入门! 写在前面 本文是对经典论文<Convolutional Neural Networks for Sentence Classifi ...

  8. 支付宝支付 第二集:傻瓜式教程->获取支付的RSA公钥和私钥

    支付宝支付 第二集:傻瓜式教程->获取支付的RSA公钥和私钥 一.步骤 点击文档 点击网页&移动应用 点击配置密钥 点击Web在线加密 先点击生成,再点击保存 返回沙箱的控制台,先点击沙 ...

  9. Windows 7 部署 Android 开发环境傻瓜式教程(Eclipse+ADT)

    我把该教程做成了一个PDF,网速慢的朋友可以在这里下载 http://files.cnblogs.com/vengen/AndroidSetup.zip 准备文件: WIN7 的安装方法与 XP 的安 ...

最新文章

  1. Gentoo 安装日记 19 (安装系统日志和cron守护进程)
  2. Java设计模式之行为型:策略模式
  3. 利用CSS让元素垂直居中的两种实现方法
  4. java 二维数组奇数金字塔_二维数组:奇数阶魔方 | 新思维:C语言程序设计
  5. python中内置的集成开发工具_python应用(3):启用集成开发工具pycharm
  6. k8s核心技术-Controller(DaemonSet)_部署守护进程---K8S_Google工作笔记0034
  7. iOS UITableView设置UITableViewStyleGrouped模式下section间多余间距的处理
  8. 计算机在网络通信方面的应用,分析计算机技术在通信中的应用
  9. 怎么安装Nginx的监控模块
  10. Spring Boot使用jasypt处理加密问题
  11. 分享图片+文字到微信朋友圈
  12. Journal of Electronic Imaging 投稿分享
  13. 2345 php笔试题,2345浏览器笔试题
  14. linux可变剪切分析,SUPPA2进行可变剪切定量
  15. Cannot change network to bridged: There are no un-bridged host network adapters解决方法
  16. Kubernetes基础:Deployments从beta版本到v1的变化对应方法
  17. vue页面导出pdf文档并上传pdf格式给后台
  18. win2008r2用户账户控制什么意思_UX名词解读“用户体验度量”到底是什么意思?/ZOE的笔记...
  19. 数据结构—线性表顺序存储插入和删除操作
  20. uniapp使用高德的离线地图

热门文章

  1. 关于选择博客网站的一点看法
  2. 数据库 分库 分表 分区
  3. UI(UGUI)框架(一)---------概述与保存/读取面板类型与路径
  4. 20170728xlVBA改转置一例
  5. css中padding和magin的区别
  6. WebNumericEdit
  7. 流行病学与生物统计学: 临床研究导论 Epidemiology and Biostatistics: An Introduction to Clinical Research
  8. 新手小白零基础搭建个人博客(二)Hexo搭建
  9. tcc读写文本txt文件
  10. 我为什么鼓励工程师写blog