吴恩达深度学习笔记(deeplearning.ai)之循环神经网络(RNN)

Posted szx_spark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了吴恩达深度学习笔记(deeplearning.ai)之循环神经网络(RNN)相关的知识,希望对你有一定的参考价值。

1. 导读

本节内容介绍如何使用RNN训练语言模型,计算一段文本存在的概率,并生成新的风格化文本序列。

2. 语言模型(Language model)

通过语言模型,我们可以计算某个特定句子出现的概率是多少,或者说该句子属于真实句子的概率是多少。正式点讲,一个序列模型模拟了任意特定单词序列的概率。

2.1 Language modelling with an RNN

  • RNN中\\(x^{<1>}\\)\\(a^{<0>}\\)初始化为零向量。
  • 通过softmax层进行预测,计算出第一个词可能是什么,其结果为\\(\\hat{y}^{<1>}\\)。这一步其实是通过softmax层计算词典里每一个词会是第一个词的概率,假设词典有n个词,那么\\(\\hat{y}^{<i>}\\)就是一个n维向量。
  • RNN进入下个时间戳,将激活值\\(a^{<1>}\\)传递到第二个时间戳,这一步要计算句子中第二个词会是什么,此时的输入值为\\(y^{<1>}\\)(注意区分,不是\\(\\hat{y}^{<1>}\\)),将当前训练句子中真实的第一个词作为输入,即\\(x^{<2>}=y^{<1>}\\)
  • 接下来同样经过softmax层得到n维向量\\(\\hat{y}^{<2>}\\),每一维度所对应的数值,是已知第一词为\\(x^{<2>}\\)时第二个词是该单词(每个维度对应唯一一个单词)的概率。
  • 以此类推,之后RNN中每个时间戳的输入都是上个时间戳的真实值\\(x^{<i>}=y^{<i-1>}\\),之后根据前\\((i-1)\\)个真实值\\(y^{<i>}\\)所包含的信息计算得到输出值\\(\\hat{y}^{<i>}\\),一个n维向量,n是词典的大小。

RNN训练语言模型时采用的损失函数是softmax的损失函数,即交叉熵损失函数,公式如下:

\\[L(\\hat{y}^{<t>},y^{<t>})=-\\sum_i y_i^{<t>}log \\hat{y}_i^{<t>} \\]

\\[L = \\sum_t L^{<t>}(\\hat{y}^{<t>},y^{<t>}) \\]

  • 第一个公式中\\(y\\)是真实的数据分布(one hot 向量),\\(\\hat{y}\\)是预测的数据分布,i代表一个训练batch中的每个训练数据。
  • 第二个公式将不同时刻的损失函数值累加,得到最终的损失函数。RNN在该公式的基础上进行反向传播。

2.2 计算句子概率

现在我们已经掌握了RNN训练语言模型的具体细节,那么当模型训练完成后,我们该如何应用此模型计算某一句子出现的概率?

  • 假设测试句子的长度为\\(T_x\\),将该序列作为输入,重复上述操作但不进行反向传播。最后模型可以输出\\(T_x\\)个向量\\(\\hat{y}^{<i>}\\),从中提取真实单词的概率值,执行累乘操作便得到了该句子的概率值。

3. 序列生成

使用RNN训练好一个语言模型,我们不光可以用它计算某一个句子出现的概率值,也可以用它完成序列生成的任务,生成风格化文本。

  • 比如用莎士比亚的作品集训练一个语言模型,之后用该模型生成一段莎士比亚风格的文本。

3.1 Sampling a sequence from a trained RNN

如前文所讲,一个序列模型模拟了任意特定单词序列的概率。我们所要做的就是,对这个概率分布进行采样,来生成一个新的单词序列
因此,我们需要在训练好的模型基础上进行采样处理。如图所示:

  • 首先我们对新句子序列中的第一个词进行采样,图中\\(a^{<0>}\\)\\(x^{<1>}\\)均初始化为零向量。在第一个时间戳中,将输出值通过softmax层得到的所有单词的概率,然后根据这个softmax的分布进行一次随机采样(使用np.random.choice()函数),得到新句子序列的第一个单词,而\\(\\hat{y}^{<1>}\\)就是该单词的one hot向量值。
  • 然后进入第二个时间戳,此时需要\\(\\hat{y}^{<1>}\\)作为输入(与前文训练语言模型的输入不同,前文以真实值\\(y^{<1>}\\)作为输入),无论在上一个时间戳中采样得到什么单词,都将其作为下一个时间戳的输入
  • 接下来重复同样的操作,对第二个时间戳的softmax输出进行采样,得到新句子的序列的第二个单词,并将该单词的one hot向量作为第三个时间戳的输入。
  • 以此类推,当生成EOS字符,或者时间戳增长到一定步数时,意味着语言模型已经生成了一个完整的句子。

在实现模型时,需要注意的有以下几点:

  • 引入采样的是为了保证每个单词都有产生的可能,如果每次只是选取softmax对应的最大值,那么有些单词会永远生成不到,而且生成的句子会极为相似。
  • 采样过程中可能会生成UNK字符,为了避免生成这种无意义字符,可以在每个时间戳中不断采样,直到得到一个非UNK字符才进入下一个时间戳。
  • 模型的初始输入\\(x^{<1>}\\),可以不用初始化为零向量,而是用某一个单词的one hot向量作为赋值,这样可以生成与该单词主题相关的句子。

3.2 Sequence generation

这里展示序列生成的部分成果。

左图是使用以新闻语料训练生成的句子,右图是以莎士比亚作品集训练生成的句子。

以上是关于吴恩达深度学习笔记(deeplearning.ai)之循环神经网络(RNN)的主要内容,如果未能解决你的问题,请参考以下文章

深层神经网络——吴恩达DeepLearning.ai深度学习笔记之神经网络和深度学习

吴恩达深度学习笔记(deeplearning.ai)之循环神经网络(RNN)

卷积神经网络——吴恩达DeepLearning.ai深度学习笔记之卷积神经网络

吴恩达深度学习笔记(deeplearning.ai)之循环神经网络(RNN)

吴恩达深度学习笔记(deeplearning.ai)之循环神经网络(RNN)

自然语言处理与词嵌入——吴恩达DeepLearning.ai深度学习笔记之序列模型