跳转到主要内容

详解 RNN 文本分类模型的架构

demi 提交于

<font size="3"><strong>典型 RNN 模型</strong></font>

下图是典型的 RNN 模型,X 是输入,对文本经过嵌入层嵌入处理,再进入 RNN,RNN 的后面是全连接层,输出各个类别的概率。
<center><img width="600" src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

下面来描述一次数据从输入到输出的完整过程:

在自然语言处理中,不管是中文还是英文,首先第一步的任务是如何将文本数据数值化。对于中文,可以先建立词汇表,给词汇表中的没歌词建立唯一的 id 标识(数字),这样每段文本都可以用一串数字 id 来表示,然后就能进行词嵌入操作,英文的处理方法也类似。

对文本预处理时,由于每条文本的长度不一,需要给输入统一规定长度(seq_length),超过的截断,不足的填充。假设有 N​ 段文本(text),统一长度后就变成了 [N, 1, seq_length]​大小的矩阵,矩阵的每一行代表一段文本,大小为​[1, seq_length]​。

通常,传统的做法是将 one-hot 编码,但是劣势是矩阵会很稀疏,并且上下文之间的语义关系非常模糊,难以捕捉。现在一般的做法是将文本词向量化,将每个词(字)“嵌入”为大小为 [1, embedding_size] 大小的向量矩阵。到了这一步,输入基本就确定下来了,它是大小为 [seq_length, embedding_size] 大小的矩阵。

接下来是训练,训练中可以一条一条给 RNN“喂” 数据,当有一条数据进来,等待它的是 seq_length 个 cell,LSTM 的输出整个过程如下:
<center><img width="600" src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

但是这样的训练太慢了,并且优化的参数也难以顾及到全局的信息,通常是批次训练,一次喂给模型 batch_size 条数据。

<font size="3"><strong>批次训练全过程详解</strong></font>

原帖地址:<a href="https://github.com/">understanding-pytorch-batching-lstm/Understanding Pytorch Batching.ipynb at master · ngarneau/understanding-pytorch-batching-lstm</a>

<strong>1. one-hot 编码</strong>

<center><img src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

<strong>2. 零填充</strong>

<center><img src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

<strong>3. 批量输入</strong>

将每一个 batch 设置为 4

<center><img src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

<strong>4. 词嵌入(word embedding)</strong>

矩阵中的每一行代表一个字母的向量

<center><img width="600" src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

<strong>5. Packed Embeddings</strong>

<center><img width="600" src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

注意,这里将词向量矩阵打包过了一次,因为我们并不需要零填充后的词向量。在这种情况下,batch_sizes 为 [4, 4, 4, 3, 2, 1],即第一步到第三步每次会给 LSTM 喂 4 个字母,到第四步,San 已经用光了,所以给 LSTM 的只有 3 个字母,以此类推,到最后只有 1 个字母 v。

<strong>6. LSTM out</strong>

数据进入 RNN 之后输出的结果

<center><img width="600" src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

<strong>7. padded LSTM out</strong>

填充 LSTM 的输出

<center><img width="600" src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

<strong>8. reshape output</strong>

<center><img width="600" src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

<strong>9. maxpooling</strong>

最大池化

<center><img src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

<strong>10. predict</strong>

<center><img src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201812/blog/19…; alt="详解 RNN 文本分类模型的架构"></center>

本文作者: 李彬
原文链接: https://www.libinx.com/2018/RNN-structure-in-text-classification/
来源:Thinking Realm