一、RNN网络原理文本数据是具有序列特性的例如: 我爱你, 这串文本就是具有序列关系的爱 需要在 我 之后你 需要在 爱 之后, 如果颠倒了顺序那么可能就会表达不同的意思。为了表示出数据的序列关系需要使用循环神经网络(Recurrent Nearal Networks, RNN) 来对数据进行建模RNN 是一个作用于处理带有序列特点的样本数据。RNN 计算过程是什么样的呢h 表示隐藏状态, 保存了序列数据中的历史信息并将这些信息传递给下一个时间步从而允许RNN处理和预测序列数据中的元素。每一次的输入包含两个值: 上一个时间步的隐藏状态、当前状态的输入值x。每一次的输出也会包含两个值当前时间步的隐藏状态、当前时间步的预测结果y。隐藏状态作用1、记忆功能隐藏状态就像RNN的记忆它能够在不同的时间步之间传递信息。当一个新的输入进入网络时当前的隐藏状态会结合这个新输入来生成新的隐藏状态。2、上下文理解由于隐藏状态携带了过去的信息它可以用于理解和生成与上下文相关的输出。这对于语言模型、机器翻译等任务尤其重要。3、连接不同时间步隐藏状态通过网络内部的循环连接将各个时间步连接起来使得网络可以处理变长的序列数据。上面一共画了 3 个神经元, 但是实际上只有一个神经元我爱你 三个字是重复输入到同一个神经元中。我们举个例子来理解上图的工作过程假设我们要实现文本生成也就是输入 我爱 这两个字来预测出 你其如下图所示将上图展开成不同时间步的形式如下图所示首先初始化出第一个隐藏状态h0一般都是全0的一个向量然后将 我 进行词嵌入转换为向量的表示形式送入到第一个时间步然后输出隐藏状态 h1然后将 h1 和 爱 输入到第二个时间步得到隐藏状态 h2, 将 h2 送入到全连接网络得到 你 的预测概率。RNN神经元内部是如何计算的呢计算隐藏状态每个时间步的隐藏状态h_t是根据当前输入x_t和前一时刻的隐藏状态h_{t-1}计算的。上述公式中:1、Wih 表示输入数据的权重2、bih 表示输入数据的偏置3、Whh 表示输入隐藏状态的权重4、bhh 表示输入隐藏状态的偏置5、ht-1 表示输入隐藏状态6、ht 表示输出隐藏状态最后对输出的结果使用 tanh 激活函数进行计算得到该神经元你的输出隐藏状态。计算当前时刻的输出网络的输出yt是当前时刻的隐藏状态经过一个线性变换得到的。词汇表映射输出yt是一个向量该向量经过全连接层后输出得到最终预测结果YpredYpred中每个元素代表当前时刻生成词汇表中某个词的得分或概率通过激活函数如softmax。词汇表有多少个词Ypred就有多少个元素值最大元素值对应的词就是当前时刻预测生成的词。神经元工作机制总结1、接收输入每个RNN神经元接收来自输入数据xt和前一时刻的隐藏状态ht-1。2、更新隐藏状态神经元通过一个加权和由权重矩阵和偏置项组成更新当前时刻的隐藏状态ht该隐藏状态包含了来自过去的记忆以及当前输入的信息。3、输出计算基于当前隐藏状态ht神经元生成当前时刻的输出yt该输出可以用于任务的最终预测。文本生成示例二、PyTorch RNN层的使用1、API介绍2、输入数据和输出结果将RNN实例化就可以将数据送入其中进行处理处理的方式如下所示3、输入数据:输入主要包括词嵌入的x 、初始的隐藏层h01x的表示形式为[seq_len, batch, input_size]即[句子的长度batch的大小词向量的维度]2h0的表示形式为[num_layers, batch, hidden_size]即[隐藏层的层数batch的大隐藏层h的维数]4、输出结果主要包括输出结果output,最后一层的hn1output的表示形式与输入x类似为[seq_len, batch, hidden_size]即[句子的长度batch的大小输出向量的维度]2hn的表示形式与输入h0一样为[num_layers, batch, hidden_size]即[隐藏层的层数batch的大隐藏层h的维度]