深度学习用于文本和序列(使用Keras)

本博文是阅读《Python深度学习》(Deep Learning with Python)第六章《深度学习用于文本和序列》后做的总结。本文不包括代码、不包括公式,主要记录本章的重要结论和一些注意点。具体代码实现请参考原书。


本章包括以下内容:

  • 将文本数据预处理为有用的数据表示
  • 使用循环神经网络
  • 使用一维卷积神经网络处理序列

6.1 处理文本数据

文本向量化(vectorize)
分词(tokenization)

6.1.1 单词和字符的one-hot 编码

可以使用 numpy 或 string 模块自己实现单词或字符的 one-hot 编码。

也可以通过from keras.preprocessing.text import Tokenizer命令使用Keras内置的Tokenizer来实现。

除此之外,还可以使用散列技巧(hashing trick)实现 one-hot 编码,不过要特别注意散列冲突 (hash collision)的问题,即两个不同的单词可能具有相同的散列值,导致模型无法区分它们所对应的单词。可以让散列空间的维度远大于需要散列的唯一标记的个数,这样可以减小散列冲突的可能性。

6.1.2 使用词嵌入

词嵌入又称为词向量,主要有 one-hot vector 和 Dense Vector 两类。

获取词向量的方法主要有两种:

  • 在完成主任务(比如文档分类或情感预测)的同时学习词向量
  • 预训练词嵌入,在其他机器学习任务上预计算好词向量

当目标任务的数据较少时,我们可以考虑使用预训练词嵌入,这主要是考虑到词向量之间有一些通用的特性,从而在其他任务上学习到的词向量也可以使用到当前任务上。但是如果数据充足,还是要尽量使用主任务数据训练出的词向量,因为这样得到的词向量更适合于当前任务。

想获得预训练的词向量可以使用 Word2Vec 或 GloVe。

6.2 理解循环神经网络

这一节不采用书上给出的纲目来总结。可以参考李宏毅老师的视频:
李宏毅2020机器学习 - RNN(Part 1)
主要介绍了 SimpleRnn 和 LSTM 两种 Rnn 的 variation,简单说,SimpleRnn 具有简单的记忆能力,而 LSTM 对记忆单元的信号进出以及遗忘机制有更丰富的实现。对于这两种Rnn,LSTM的计算量较 SimpleRnn 大,但表示能力更强,SimpleRnn则与之相反,有一个折中的方案就是 GRU。

如果我们按照书上那样,在 IMDB 数据集上施加一个 Rnn,会发现效果并不好太多,因为 IMDB 任务只需要分出积极和消极,实际上更多地与词频相关,而 Rnn 更适合于更多依赖序列关系的任务。

6.3 循环神经网络的高级用法

  • 循环 dropout(recurrent dropout)。这是一种特殊的内置方法,在循环层中使用 dropout来降低过拟合。
  • 堆叠循环层(stacking recurrent layers)。这会提高网络的表示能力(代价是更高的计算负荷)。
  • 双向循环层(bidirectional recurrent layer)。将相同的信息以不同的方式呈现给循环网络,可以提高精度并缓解遗忘问题。

6.3.1 ~ 6.3.5 耶拿天气数据分析

这是一个事件序列分析的任务,前五节主要大致包括:

  1. 导入数据
  2. 数据预处理
  3. 基于尝试的baseline
  4. 基于机器学习的方法
  5. Rnn基准

6.3.6 使用循环dropout 来降低过拟合

  1. 循环 dropout 指的是在 Rnn 中使用 dropout ,在使用Keras中注意设置 RNN 参数时 dropoutrecurrent_dropout 都要进行设置(具体原理没有细讲,待深究)。
  2. 循环层堆叠会造成很大的架构。同时要注意,这是一个超参数设置问题,应当知道层数不要无脑增大,因为增大到一定程度就会加剧过拟合
  3. 双向RNN在 NLP 中有很好的应用,它增加了一次对序列的逆序读取,这样可能会读取到正序观察时没有看到的特征,在语言类任务中这是很重要的。但是需要注意,在一些顺序不能颠倒的任务中使用这种方法并不能改进结果,譬如温度预测,逆序读一遍并没有太大帮助。举例来说,2021年8月的温度情况与2015年至2020年8月的温度情况的关联程度要远远大于它和1985年至1990年8月的温度情况的关联程度,这样会导致逆序读取学习不到有用的特征。
    深度学习用于文本和序列(使用Keras)_第1张图片

6.4 用卷积神经网络处理序列

处理序列时,使用CNN可以活得很好的效果,因为CNN对具有平移不变性的对象可以学习局部特征。这使得他可以学到一些语法结构(单词层面CNN)和构词法(字符层面CNN)。

在处理图像时,我们往往使用2维CNN,处理序列时我们往往使用1维的。
深度学习用于文本和序列(使用Keras)_第2张图片

在IMDB任务中,如果使用CNN代替LSTM,可以得到几乎相同的结果,这表明在单词级的情感分类任务上,一维卷积神经网络可以替代循环网络,并且速度更快、计算代价更低。

不过CNN毕竟对顺序是不敏感的,在处理长序列时显得捉襟见肘。这时,一个重要的方法就是同时使用CNN和LSTM。这样,我们先通过CNN将长序列分割为短序列,之后使用LSTM处理短序列,虽然较使用深层LSTM来说表示能力可能下降,但是速度会快很多。
深度学习用于文本和序列(使用Keras)_第3张图片

本章总结

在本章学到了以下技术,它们广泛应用于序列数据(从文本到时间序列)组成的数据集。

  • 如何对文本分词。
  • 什么是词嵌入,如何使用词嵌入。
  • 什么是循环网络,如何使用循环网络。
  • 如何堆叠 RNN层和使用双向RNN,以构建更加强大的序列处理模型。
  • 如何使用一维卷积神经网络来处理序列。
  • 如何结合一维卷积神经网络和 RNN来处理长序列。
  • 可以用 RNN 进行时间序列回归(“预测未来”)、时间序列分类、时间序列异常检测和序列标记(比如找出句子中的人名或日期)。
  • 同样,还可以将一维卷积神经网络用于机器翻译(序列到序列的卷积模型,比如
    SliceNet)、文档分类和拼写校正。
  • 如果序列数据的整体顺序很重要,那么最好使用循环网络来处理。****时间序列通常都是这样,最近的数据可能比久远的数据包含更多的信息量
  • 如果整体顺序没有意义,那么一维卷积神经网络可以实现同样好的效果,而且计算代价更小。文本数据通常都是这样,在句首发现关键词和在句尾发现关键词一样都很有意义。

你可能感兴趣的:(神经网络,深度学习)