Day07-RNN层(循环网络层)
一、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是一个向量,该向量经过全连接层后输出得到最终预测结果Ypred,Ypred中每个元素代表当前时刻生成词汇表中某个词的得分(或概率,通过激活函数如softmax)。词汇表有多少个词,Ypred就有多少个元素值,最大元素值对应的词就是当前时刻预测生成的词。
神经元工作机制总结:
1、接收输入:每个RNN神经元接收来自输入数据xt和前一时刻的隐藏状态ht-1。
2、更新隐藏状态:神经元通过一个加权和(由权重矩阵和偏置项组成)更新当前时刻的隐藏状态ht,该隐藏状态包含了来自过去的记忆以及当前输入的信息。
3、输出计算:基于当前隐藏状态ht,神经元生成当前时刻的输出yt,该输出可以用于任务的最终预测。
文本生成示例:
二、PyTorch RNN层的使用
1、API介绍
2、输入数据和输出结果
将RNN实例化就可以将数据送入其中进行处理,处理的方式如下所示:
3、输入数据:输入主要包括词嵌入的x 、初始的隐藏层h0
(1)x的表示形式为[seq_len, batch, input_size],即[句子的长度,batch的大小,词向量的维度]
(2)h0的表示形式为[num_layers, batch, hidden_size],即[隐藏层的层数,batch的大,隐藏层h的维数]
4、输出结果:主要包括输出结果output,最后一层的hn
(1)output的表示形式与输入x类似,为[seq_len, batch, hidden_size],即[句子的长度,batch的大小,输出向量的维度]
(2)hn的表示形式与输入h0一样,为[num_layers, batch, hidden_size],即[隐藏层的层数,batch的大,隐藏层h的维度]
