RNN 的语言模型 TensorFlow 实现   2018-10-02


上篇 PTB 数据集 batching 中我们介绍了如何对 PTB 数据集进行 连接、切割 成多个 batch,作为 NNLM 的输入。

本文将介绍如何采用 TensorFlow 实现 RNN-based NNLM。

1. Embedding 层

将 word 编号 转化为 word embedding 两大作用 :

No. function desc
1. 降低输入的维度 词向量的维度通常在 200 ~ 1000 之间, 大大减少 RNN 网络的参数数量 与 计算量
2. 增加语义信息 简单的单词编号是不包含任何语义信息的.

词向量维度: EMB_SIZE,词汇表大小: VOCAB_SIZE

所有单词的词向量可以放入一个大小为 (EMB_SIZE, VOCAB_SIZE) 的矩阵内

在读取词向量时,可以调用 tf.nn.embedding_lookup 方法。

用 tf.Variable 来表示词向量,这样就可以采用任意初始化的词向量,学习过程中也会优化词向量。

# 定义单词的词向量矩阵
embedding = tf.get_variable("embedding", [VOCAB_SIZE, EMB_SIZE])

# 将数据转化为词向量表示
inputs = tf.nn.embedding_lookup(embedding, input_data)

其中输入数据 input_data 的维度是 (batch_size * num_steps)

而输出的 input_embedding 的维度成为 (batch_size * num_steps * EMB_SIZE).

在本文中,我们输入数据维度是 ($20 \times 35$) ,EMB_SIZE = 300, 输入词向量维度时 ($20 \times 35 \times 300$) .

2. Softmax 层

Softmax层 的作用是将 RNN 的输出 转化为一个单词表中每个单词的输出概率,为此需要两个步骤:

2.1 第一步

使用一个线性映射将 RNN 的输出映射为一个维度与词汇表大小相同的向量,这一步的输出叫做 logits. 代码如下所示:

# 首先定义映射用到的参数
# HIDDEN_SIZE 是 RNN 的隐藏状态维度,VOCAB_SIZE 是词汇表大小
weight = tf.get_variable("weight", [HIDDEN_ZIZE, VOCAB_SIZE])
bias = tf.get_variable("bias", [VOCAB_SIZE])

# 计算线性映射
logits = tf.matmul(output, weight) + bias

其中 output 是 RNN 的输出,维度是 [batch_size * num_steps, HIDDEN_SIZE]

经过线性映射后,输出结果是 [batch_size * num_steps, VOCAB_SIZE].

Reference


分享到:


  如果您觉得这篇文章对您的学习很有帮助, 请您也分享它, 让它能再次帮助到更多的需要学习的人. 您的支持将鼓励我继续创作 !
本文基于署名4.0国际许可协议发布,转载请保留本文署名和文章链接。 如您有任何授权方面的协商,请邮件联系我。

Contents

  1. 1. Embedding 层
  2. 2. Softmax 层
    1. 2.1 第一步
  3. Reference