RNN-GRU
Published:
RNN用于处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。RNN之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关。
RNN重要特点:每一步的参数共享
首先给出RNN数学模型
这也是最重要的,每一个当前层的参数和上一个层的参数有关,这就实现了实现当前输入结果与之前的计算挂钩的目的。
这里分开来看就是这样的
GRU 引入了门机制
The Gated Recurrent Unit (GRU) addresses these limitations by introducing gate mechanisms that control the flow of information, allowing the network to focus on relevant long-term dependencies while forgetting irrelevant details. Its update equations are as follows:
Update Gate:
\[z_t = \sigma(W_zx_t + U_zh_{t-1} + b_z)\]Determines how much of the previous hidden state $ h_{t-1} $ should be carried forward to the current hidden state $ h_t $.
Reset Gate:
\[r_t = \sigma(W_rx_t + U_rh_{t-1} + b_r)\]Controls how much of the previous state information should be forgotten when calculating the candidate hidden state ( \tilde{h}_t ).
Candidate Hidden State:
\[\tilde{h}_t = \tanh(W_hx_t + U_h(r_t \odot h_{t-1}) + b_h)\]A preliminary hidden state, modulated by the reset gate.
Final Hidden State:
\[h_t = z_t \odot \tilde{h}_t + (1 - z_t) \odot h_{t-1}\]Combines the candidate hidden state and the previous hidden state using the update gate.
4. Key Differences
| Feature | Vanilla RNN | GRU | |————————–|—————————————–|——————————————| | Architecture | Single hidden state, no gates | Hidden state with update and reset gates | | Gradient Handling | Prone to vanishing/exploding gradients | Mitigates gradient issues via gates | | Memory Management | Poor long-term memory | Efficient handling of long-term memory | | Complexity | Simple | Moderate (less than LSTM) | | Long-Term Dependencies| Weak | Strong |
理解“token”和“embedding”的概念在自然语言处理(NLP)中非常重要,因为它们是语言模型中两个关键的组成部分。我来详细解释一下这两者的区别及它们在模型中的角色:
1. Token(标记)
Token 是原始文本经过分词或编码后的最小单元,可以是单词、子词、字符甚至标点符号。文本数据是非结构化的,所以在输入给机器学习模型之前,需要将文本转换为数值形式,这个过程就涉及了“tokenization(标记化)”的步骤。
举个例子:
原始句子:“Hello, world!”
通过tokenization,我们可以把句子拆分为如下的 tokens:
- 如果按单词划分:
["Hello", ",", "world", "!"]
- 如果按字符划分:
["H", "e", "l", "l", "o", ",", "w", "o", "r", "l", "d", "!"]
- 在现代的BPE(Byte Pair Encoding)或其他子词标记化方式中,标记可能是子词(subword),比如
["He", "llo", ",", "wo", "rld", "!"]
。
Token 的目的是将自然语言的内容转换为模型可处理的离散单位,使得模型能够理解和生成语言。
在自然语言模型中,文本会先经过tokenizer进行处理,每个token会被分配一个唯一的索引(index),这些索引就是模型输入时使用的数值。
2. Embedding(嵌入)
Embedding 是将离散的 tokens 转换为密集的数值向量(向量空间中的点)。这些向量是实数,通常是高维的,目的是将每个 token 映射到一个可以捕捉语义和上下文关系的向量表示。通过 embedding,模型可以在一定程度上“理解”token之间的语义关系。
举个简单例子:
如果句子是“猫坐在垫子上”,模型中的 embedding 会为每个 token 分配一个向量,例如:
猫 -> [0.1, 0.3, -0.5, ...]
坐 -> [0.2, 0.1, 0.4, ...]
垫子 -> [-0.3, 0.7, 0.2, ...]
这些向量的维度通常较高(比如 128维、256维或更高),通过这些向量,模型能够表示词与词之间的某种语义关系。例如,类似的词(如“猫”和“狗”)在向量空间中的距离通常比较近,而不相关的词(如“猫”和“汽车”)则会有较大的距离。
区别与联系
Token 是离散化的文本单元,它是模型输入的数值索引。token 是通过分词得到的,例如单词或子词。它通常是一个整数,代表词汇表(vocabulary)中某个词的位置。
Embedding 是 token 的向量表示,它是用于捕捉语言的语义信息的连续数值向量。embedding 是通过查找词汇表中 token 的索引,然后从一个预训练的“嵌入矩阵”(embedding matrix)中提取对应的向量。
具体来说,embedding 的过程就是:将每个 token 的索引通过查找 embedding 矩阵转换为一个连续的向量。因此,token 和 embedding 之间的关系是这样的:
- Token 是文本分割后的一种形式,是模型的输入。
- Embedding 是模型对 token 的一种数值化表示,是一个密集的实数向量,用于捕捉 token 的语义信息。
例如在代码中:
tokens = [12, 43, 56, 78] # 一些 token 的索引
embeddings = embedding_matrix[tokens] # 将这些 token 索引转化为相应的向量
这里,tokens
是标记化后的索引,而 embeddings
则是从嵌入矩阵中查找到的实数向量。
通过 embedding 的方式,模型可以更好地理解词与词之间的复杂关系,而不只是将它们看作是独立的离散单位。embedding 在模型中被用于将文本的离散表示(token)转换为一个连续的、可以通过数学操作处理的向量表示,从而使得模型可以在理解和生成语言时捕捉到更多的语义和上下文信息。