第十六章 使用RNN和注意力机制进行自然语言处理

文章目录

  • 第十六章 使用RNN和注意力机制进行自然语言处理
  • 前言
  • 一、思维导图
  • 二、主要内容
    • 1、使用字符RNN生成莎士比亚文本
    • 2、情感分析
    • 3、神经机器翻译的编码器-解码器网络
    • 4、注意力机制
    • 5、最近语言模型的创新
  • 三、课后练习
  • 四、总结

前言

在整个人工智能领域,自然语言处理是一个很热门并且有着非常广泛应用领域的技术。最早在1950年图灵就已经提出了自然语言处理的雏形,不过那个时候还是采用硬编码的方式来对应一些人与人之间的基础交流。随着时代的发展技术的变革,如今的我们已经可以使用循环神经网络来处理一些人类的文字信息,并且能够完成一些翻译、情感分析、自动写作等一些需要人们进行大量的统计分析或者是学习才能完成的事情。


一、思维导图

二、主要内容

1、使用字符RNN生成莎士比亚文本

  1. 创建训练数据集
    在前面及提到了,我们在处理字符的训练数据时需要把文本转换位数字或者时词嵌入来完成将文本信息送入到模型中,由于我们这一次的任务是完成字符级的莎士比亚文本预测,字符的数量并不多,所以我们可以将字符信息转换为整数。我们可以使用自定义层的方式来完成文本的预处理,不过还有更加简单的方法使用Keras的Tokenizer来完成数据的预处理。

  2. 拆分顺序数据集
    拆分数据集是一件繁琐并且很困难的事情。我们需要根据自己的实际需求,可以从时间的维度,某一段时间到某一段时间方法拆分数据集,也可以使用正常的百分比分割的方式来拆分数据集甚至我们可以从一些独特的维度来拆分数据集。
    我们对数据集拆分完成之后并不是直接将数百万个字符设置为一个很长的序列传送到神经网络。而是需要把一个很长的序列拆分为多个窗口。拆封的方式也很简单,使用windows()方法,然后根据自己的实际需求对数据进行转换。

  3. 创建、训练并使用Char-RNN模型
    模型的创建、编译与训练都与正常的RNN没有什么区别,唯一不同的地方就是这个神经网络的输出层神经元的数量应该为字符数量并且激活函数使用softmax,因为需要输出每一个字符的概率。

  4. 有状态RNN
    前文提到的所有都是无状态RNN,这里提到的有状态RNN是指RNN训练完一个批次之后保留这一个状态并让这个状态作用下一个批次。当我们使用这一个方法的时候,就需要保证我们的数据是有序并且批次与批次之间是在正确的位置上中断的。

2、情感分析

  1. 简介
    情感分析的主要思路根据一个有序的文本序列经过神经网络的预测,得出一个文本内容的归纳向量,判断文章内容是正向情感还是反向情感。
  2. 数据预处理
    在情感分析中,整个预处理环节最重要的就是对文本的分词、组词与编码。目前已经有很多成熟的策略能够提供我们完成文本的预处理,我们只需根据自己的实际需求选择合适的策略即可。文中我们需要将所有网络评论中的单词进行编码,然后再创建一个词汇表,文中的每一个单词使用词汇表中ID表示。编码我们可以使用Counter()来完成,比词汇表使用KeyValueTensorInitializer()来创建,创建完成之后就是同样的分为不同的窗口然后对数据进行转化。
  3. 模型创建与训练
    模型的创建与上文提到的字符RNN类似,只是在第一个循环层之前添加了一个词嵌入层,输入的参数就时单词库的大小与词嵌入的大小。编译与训练都与正常的模型相同,差别只有损失函数和一些需要自定义选择的参数。
  4. 掩码屏蔽
    我们在对文本进行预处理的时候会添加一个有着特殊意义的掩码在文本当中,但是在实际的预测中我们会希望模型更加关注文本内容本身而忽略掉这些掩码,我们可以通过修改模型的结构将模型的第一层改为使用用keras.layers.Masking就可以做到掩码屏蔽。
  5. 重用预训练层
    我们在平常的应用中完成一个模型并不是需要从无到有的生成一个模型,我们完全可以站在巨人的肩膀上重用一些别人已经完成预训练的组件,情感分析也不例外,我们只需要根据自己的需求修改输出层或者都不需要修改,如果我们有条件的还可以解冻预训练层,做一些简单的调优。

3、神经机器翻译的编码器-解码器网络

  1. 简单的机器翻译模型
    当我们面对需要将一种语言的句子翻译为另一种语言的句子时,就需要用到编码器与解码器,编码器负责把不定长度的字符句子编码为固定长度的编码送入解码器,然后由解码器将固定长度的编码解码为另一个语言中不固定长度的句子。
    在实际的工作状态下,文本内容首选需要经过编码,然后经过词嵌入层才能将返回的词嵌入馈送到编码器和解码器。在每个时间步长编码器会为词汇表中每一个单词输出一个分数然后由softmax将这些分数转换为概率输出,以此类推翻译整个句子。
    当我们面对的时一个词汇量非常大的文本,那么就不能让解码器输出一个高维的向量,因为需要非常大的计算量,我们可以考虑之查看一部分单词。
    TensorFlow Addons中由很多序列到序列的工具,可以提供我们很轻松的构建一个生产环境的编码器与解码器。

  2. 双向RNN
    在常规的RNN中,在每个时间步长每个神经元的输出只会查看之前当前与过去的输入,而不会查看未来,这种方式在处理时间序列的时候非常有用,但是在处理NLP任务时,我们会发现我们时常需要了解未来的输入。所以科学家们就提出了双向RNN的概念,分别从文本的两端开始读取单词,然后在每个时间步长上将两个输入结合。

  3. 集束搜索
    我们在翻译的过程中,通常会出现翻译的结果不正确但是又没有很致命的错误的问题。为了解决这个问题提出了集束搜索的概念,它会使得模型在每个时间不长上同时跟踪多个比较有可能的句子,然后再后面的时间步长中不断尝试他们的扩展,然后继续保留多个句子,指导最后输出。其中保留的句子数量成为集束宽度。

4、注意力机制

  1. 简介
    注意力机制的中心思想就是允许模型在每个时间步长中不关注一部分单词,将大部分精力放在句子中的重点上。并且后续的发展中科学家们还在这个思想的宗旨上,提出了很多种不同方式的注意力机制。

  2. 视觉注意力
    视觉注意力是注意力机制中一个很常见的应用,在每个时间步长上将模型的注意力放在图像的某一个部分上。
    注意力机制还使得模型做出的判断有可解释性,并且当模型的在做出一个错误的判断时,我们可以根据模型所关注的部分找出错误的原因,对模型进行修改。

  3. Transformer架构
    2017年谷歌的研究团队创建了Transformer架构,这个架构中没有卷积层、循环层只有注意力机制和一些其他的组件。

5、最近语言模型的创新

近几年语言模型的创新在最好的子单词分词化,从LSTM转换为Transformers,并使用自监督学习来预训练通用语言模型,然后通过很少的架构更改来进行微调。

三、课后练习

1. 使用有状态RNN与无状态RNN有什么优缺点
无状态RNN只能识别长度小于或等于在其上训练的RNN的窗口大小的模式。相反,有状态RNN可以识别长期模式。但是,实现有状态RNN很困难,尤其是要正确准备数据集。而且有状态RNN并非总是能更好地工作,部分原因是连续的批量数据不是独立的且不均匀分布(IID)。梯度下降不适合非IID数据集。

2. 人们为什么使用编码解码RNN而不是简单序列对序列RNN进行自动翻译?
通常,如果逐词翻译一个句子,结果将很糟糕。例如,法语句子“Je vous en prie”的意思是“不客气”,但是如果一次翻译一个单词,就会得到“我你在祈祷”。最好先阅读整个句子然后再翻译。普通序列到序列RNN在读取第一个单词后将立即开始翻译句子,而编码器-解码器RNN将首先读取整个句子然后进行翻译。就是说,你可以想象一个普通的序列到序列RNN,当不确定接下来要说什么时,它将输出静音(就像人工翻译在直播节目时做的一样)。

3. 如何处理可变长度的输入序列?可变长度的输出序列呢?
可变长度的输入序列可以通过填充较短的序列来处理,使一批量中的所有序列具有相同的长度,及使用掩码来确保RNN忽略填充令牌。为了获得更好的性能,你可能还想创建包含相似大小序列的批量。大小不一的张量可以容纳可变长度的序列,而tf.keras可能最终会支持它们,这将大大简化对可变长度输入序列的处理(在撰写本文时,情况尚不如此)。对于可变长度输出序列,如果预先知道输出序列的长度(例如,如果你知道它与输入序列相同),则只需配置损失函数,这样就可以在序列末尾忽略令牌。类似地,使用模型的代码应在序列结束之后忽略令牌。但是通常提前不知道输出序列的长度,因此解决方案是训练模型,以使其在每个序列的末尾输出序列结束令牌。

4. 什么是集束搜索,为什么要使用它?你可以使用哪种工具来实现它?
集束搜索是一种用于提高训练的编码器-解码器模型的性能的技术,例如在神经机器翻译系统中。该算法会跟踪k个最有前途的输出情感的简短列表(例如,前三个),并在每个解码器步骤中尝试扩展一个单词。然后它只保留k个最有可能的句子。参数k称为集束宽度:它越大,将使用的CPU和RAM越多,但系统也越精确。与其在每个步骤上都贪婪地选择最可能的下一个单词来扩展单个句子,该技术允许系统同时探索几个有希望的句子。而且,这种技术手段很适合并行化。你可以使用TensorFlow插件轻松实现集束搜索。

5. 什么是注意力机制?它有什么帮助?
注意力机制是最初在编码器-解码器模块中使用的一种技术,它使解码器可以更直接地访问输入序列,从而使其能够处理更长的输入序列。在每个解码器时间步长,当前的解码器状态和编码器的全部输出由对齐模型处理,该对齐模型输出每个输入时间步长的对齐分数。该分数指示输入的哪一部分与当前解码器时间步长最相关。然后,将编码器输出的加权总和(通过其对齐分数加权)输入到解码器,该解码器将生成下一个解码器状态和该时间步长的输出。使用注意力机制的主要好处是,编码器-解码器模型可以成功处理更长的输入序列。另一个好处是,对齐分数使模型更易于调试和解释:例如,如果模型出错,则可以查看它关注的输入部分,这可以帮助诊断问题。注意机制也是MultiHead Attention层中Transformer架构的核心。

6. Transformer架构中最重要的层是什么?目的是什么?
.Transformer架构中最重要的层是Multi-Head Attention层(原始Transformer架构包含18个层,其中包括6个Masked Multi-HeadAttention层)。它是语言模型(如BERT和GPT-2)的核心。其目的是使模型能够识别出哪些单词彼此最对齐,然后使用这些上下文线索来改善每个单词的表示。

7. 你何时需要使用采样softmax?
当有很多类(例如,数千个)时,在训练分类模型时会使用采样的softmax。它基于模型为正确类别预测的对数和不正确单词样本的预测对数,计算交叉熵损失的近似值。相较于计算所有logit的softmax,然后估计交叉熵损失,这大大提高了训练速度。训练后可以正常使用模型,使用常规softmax函数根据所有逻辑计算所有类别概率。

四、总结

本章选中RNN在实际应用中的一个部分自然语言处理进行展开,讲解了RNN中处理文字序列时的作用与使用方法。文章内容总结一下就是:

  1. 我们可以使用RNN对文字信息进行字符级的处理,可以达到像人一样的一个字符一个字符的书写完成一篇文章。还可以像人一样判断一段文字信息的内容是否属于负面消息。还可以将一种语言的文字翻译为另一种语言文字。
  2. 以上的所有应用都有一个很困难的问题,那就是文本的预处理,需要将文字信息转化为数字、或者是创建一个词嵌入、词汇表。这些工作都是一个繁琐并且很容易出问题的环节,幸好经过很多年的发展众多科学家们已为我们提供了很多用于预处理的方法。
  3. 我们在完成一个模型的时候,并不需要完整的从无到有,而是可以选择一些别人已经预训练好的模块加入到自己的模型当中,如果有条件的还可以解冻模型进行微调。

对文章有任何疑惑或者想要和博主一起学机器学习一起进步的朋友们可以添加 群号:666980220。需要机器学习实战电子版或是思维导图的也可以联系我。祝你好运!

项目地址: github

边境的悍匪—机器学习实战:第十六章使用RNN和注意力机制进行自然语言处理相关推荐

  1. 吴恩达《机器学习》第十六章:推荐系统

    文章目录 十六.推荐系统 16.1 问题形式化 16.2 基于内容的推荐系统 16.3 协同过滤 16.4 协同过滤算法 16.5 向量化实现 16.6 均值归一化 十六.推荐系统 最重要的机器学习应 ...

  2. R语言实战-第十六章 聚类分析

    第16章 聚类分析 本章需要的包 library(flexclust) library(rattle) library(cluster) library(NbClust) library(fMulti ...

  3. 【正点原子FPGA连载】第十六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  4. 李弘毅机器学习笔记:第十六章—无监督学习

    李弘毅机器学习笔记:第十六章-无监督学习 1-of-N Encoding 词嵌入 基于计数的词嵌入 基于预测的词嵌入 具体步骤 共享参数 训练 Various Architectures 多语言嵌入 ...

  5. 机器学习实战(十)——利用K-均值聚类算法对未标注数据分组

    机器学习实战(十)--利用K-均值聚类算法对未标注数据分组 聚类是一种无监督的学习,即对于训练数据来说并没有已知标签,我们是根据样本之间的相似程度将其划分为多个类. 一.K-均值聚类算法 K-均值算法 ...

  6. Vue实战篇十六:导航菜单

    系列文章目录 Vue基础篇一:编写第一个Vue程序 Vue基础篇二:Vue组件的核心概念 Vue基础篇三:Vue的计算属性与侦听器 Vue基础篇四:Vue的生命周期(秒杀案例实战) Vue基础篇五:V ...

  7. 第十六章 推荐系统-机器学习老师板书-斯坦福吴恩达教授

    第十六章 推荐系统 16.1 问题规划 16.2 基于内容的推荐系统 16.3 协同过滤 16.4 协同过滤算法 16.5 向量化:低秩矩阵分解 16.6 实现细节:均值规范化 16.1 问题规划 1 ...

  8. 机器学习入门-西瓜书总结笔记第十六章

    西瓜书第十六章-强化学习 一.任务与奖赏 二.K-摇臂赌博机 1.探索与利用 2. ϵ \epsilon ϵ-贪心 3.Softmax 三.有模型学习 1.策略评估 2.策略改进 3.策略迭代与值迭代 ...

  9. 强化学习(RLAI)读书笔记第十六章Applications and Case Studies(不含alphago)

    强化学习(RLAI)读书笔记第十六章Applications and Case Studies(不含alphago) 16.1 TD-Gammon 16.2 Samuel's Checkers Pla ...

  10. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

最新文章

  1. python类不支持多继承_Java和C#等不允许多继承类,但是Python是可以的
  2. 微信支付本地服务器端,微信支付接口,服务器端处理(新版)
  3. python在审计中的应用-【干货】Python自动化审计及实现
  4. 使用spark ml pipeline进行机器学习
  5. 悟懂MapReduce,不纠结!
  6. 电脑任务栏跑到右边去了_电脑没有声音怎么解决 电脑没有声音解决方法【详解】...
  7. android 百度地图开发 怎么减小包的大小,最新的百度地图Android开发包中,如何隐藏右下角的放大缩小控件...
  8. 8bit黑白图像的灰度值范围是_窗宽窗位对基于互信息的医学图像
  9. 深浅拷贝的应用-copy、mutableCopy
  10. html简单网页代码 案例_HTML+CSS静态网页练习案例(转动的八卦图)
  11. jQuery mobile 开发问题记录
  12. 金士顿DT100G3(16G) U盘修复
  13. 文件服务器和nas区别,nas和ftp服务器的区别
  14. GIF、SVG、PNG、图片格式转换
  15. 获取微信聊天窗口的小程序入口参数
  16. 数学符号对应的英文读音
  17. CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法...
  18. VM定位模块之BLOB分析
  19. ubuntu12.04 飞鸽传书安装
  20. Ftp下载文件超时处理

热门文章

  1. STM32F103_study48_The punctual atoms(STM32 Serial communication experiment )
  2. 5G/NR LTE: 物理层抽象 PHY abstraction - SLS LLS 系统级仿真和链路级仿真
  3. java记忆翻牌_html5记忆翻牌游戏
  4. php输入为空,ecshop搜索框内容为空提示用户输入内容
  5. 怎样用计算机制作思维导图,思维导图怎样画?分享电脑绘制思维导图方法
  6. 转载:手机银行技术讨论3
  7. 学生信息管理系统(PHP)
  8. 云计算时代运维的出路在哪?
  9. FLV合并开源代码flvmerge分析
  10. 3D沙盒游戏开发日志4——网格寻路系统