基于循环神经网络的自然语言处理
立即解锁
发布时间: 2025-09-07 01:29:32 阅读量: 7 订阅数: 86 AIGC 


深度学习实战:从理论到应用
### 基于循环神经网络的自然语言处理
#### 1. 词向量的类比
词向量嵌入的优点在于它能够将类比关系线性化。下面我们使用预训练的 GloVe 向量来进行一些类比操作。
首先,加载预训练的 GloVe 向量并存储在字典中,代码如下:
```python
import numpy as np
import scipy
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
%matplotlib inline
########################
# Loading glove vector
########################
EMBEDDING_FILE = '~/Downloads/glove.6B.300d.txt'
print('Indexing word vectors')
embeddings_index = {}
f = open(EMBEDDING_FILE)
count = 0
for line in f:
if count == 0:
count = 1
continue
values = line.split()
word = values[0]
coefs = np.asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
f.close()
print('Found %d word vectors of glove.' % len(embeddings_index))
```
输出结果为:
```
Indexing word vectors
Found 399999 word vectors of glove.
```
接着,我们使用“queen”、“man”和“woman”的词向量来创建一个伪“king”的词向量,代码如下:
```python
king_wordvec = embeddings_index['king']
queen_wordvec = embeddings_index['queen']
man_wordvec = embeddings_index['man']
woman_wordvec = embeddings_index['woman']
pseudo_king = queen_wordvec - woman_wordvec + man_wordvec
cosine_simi = np.dot(pseudo_king/np.linalg.norm(pseudo_king),king_wordvec/np.linalg.norm(king_wordvec))
print 'Cosine Similarity',cosine_simi
```
输出结果为:
```
Cosine Similarity 0.663537
```
这表明 `queen - woman + man` 很好地代表了“king”的概念,因为伪“king”和“king”的词向量之间的余弦相似度较高,约为 0.67。
最后,我们通过 t-SNE 将 300 维的 GloVe 向量降维到二维空间,以展示词向量之间的类比关系,代码如下:
```python
tsne = TSNE(n_components=2)
words_array = []
word_list = ['king','queen','man','woman']
for w in word_list:
words_array.append(embeddings_index[w])
index1 = embeddings_index.keys()[0:100]
for i in xrange(100):
words_array.append(embeddings_index[index1[i]])
words_array = np.array(words_array)
words_tsne = tsne.fit_transform(words_array)
ax = plt.subplot(111)
for i in xrange(4):
plt.text(words_tsne[i, 0], words_tsne[i, 1],word_list[i])
plt.xlim((-50,20))
plt.ylim((0,50))
```
从结果图中可以看到,“king”和“queen”的词向量彼此靠近并聚集在一起,“man”和“woman”的词向量也聚集在一起。而且,“king”和“man”以及“queen”和“woman”之间的向量差几乎平行且长度相当。
在进入循环神经网络之前,需要强调词嵌入对于自然语言处理中的循环神经网络的重要性。循环神经网络无法直接理解文本,因此文本中的每个单词都需要有某种数字表示形式。词嵌入向量是一个很好的选择,因为单词可以由词嵌入向量的各个分量所代表的多个概念来表示。循环神经网络可以通过两种方式工作:一种是将词嵌入向量作为输入;另一种是让网络自己学习这些嵌入向量。在后一种情况下,词嵌入向量将更倾向于通过循环神经网络解决的最终问题。然而,有时循环神经网络可能需要学习大量其他参数,或者网络可能只有很少的数据用于训练。在这种情况下,将词嵌入向量作为参数进行学习可能会导致过拟合或次优结果。因此,在这些场景中,使用预训练的词向量嵌入可能是一个更明智的选择。
#### 2. 循环神经网络简介
循环神经网络(RNN)旨在利用和学习序列信息。RNN 架构对序列中的每个元素执行相同的任务,因此得名“循环”。由于任何语言中单词的顺序依赖性,RNN 在自然语言处理任务中非常有用。例如,在预测句子中的下一个单词时,前面的单词序列至关重要。
一般来说,在序列的任何时间步,RNN 会根据之前的计算结果(即先前的记忆和当前输入)计算一些记忆。这个计算得到的记忆用于对当前时间步进行预测,并作为输入传递到下一步。循环神经网络的基本架构原理如下图所示:
```mermaid
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A(输入 x1):::process --> B(隐藏状态 h1):::process
B --> C(输出 o1):::process
D(输入 x2):::process --> E(隐藏状态 h2):::process
E --> F(输出 o2):::process
G(输入 x3):::process --> H(隐藏状态 h3):::process
H --> I(输出 o3):::process
B --> E
E --> H
```
如果要处理七个单词的句子序列,展开的 RNN 架构将表示一个七层的前馈神经网络,不同之处在于每层的权重是共享的。这显著减少了循环神经网络中需要学习的参数数量。
下面是 RNN 中一些常用符号的含义:
| 符号 | 含义 |
| ---- | ---- |
| $x_t$ | 时间步 t 的输入 |
| $h_t$ | 时间步 t 的计算记忆或隐藏状态 |
| $o_t$ | 时间步 t 的输出 |
| $W_{hh}$ | 从时间步 t 的记忆状态 $h_t$ 到时间步 t+1 的记忆状态 $h_{t+1}$ 的权重矩阵 |
| $W_{xh}$ | 从输入 $x_t$ 到隐藏状态 $h_t$ 的权重矩阵 |
| $W_{ho}$ | 从记忆状态 $h_t$ 到输出 $o_t$ 的权重矩阵 |
当输入以独热编码形式呈现时,权重矩阵 $W_{xh}$ 起到某种词向量嵌入矩阵的作用。或者,在独热编码输入的情况下,也可以选择使用一个可学习的单独嵌入矩阵,使得独热编码输入向量通过嵌入层时输出所需的嵌入向量。
#### 3. RNN 各组件详细分析
- **输入 $x_t$**:表示时间步 t 的输入单词的向量。例如,它可以是一个独热编码向量,其中对应词汇表中单词索引的分量设置为 1,也可以是来自预训练库(如 GloVe)的词向量嵌入。一般假设 $x_t \in \mathbb{R}^{1\times D}$。如果要预测 V 个类别,那么输出 $y_t \in \mathbb{R}^{1\times V}$。
- **记忆或隐藏状态向量 $h_t$**:其长度可以根据用户的选择而定。如果选择的状态数量为 n,则 $h_t \in \mathbb{R}^{1\times n}$,权重矩阵 $W_{hh} \in \mathbb{R}^{n\times n}$。
- **权重矩阵**:$W_{xh} \in \mathbb{R}^{n\times D}$ 是连接输入到隐藏状态的权重矩阵,$W_{ho} \in \mathbb{R}^{n\times V}$ 是连接隐藏状态到输出的权重矩阵。
- **隐藏状态 $h_t$ 的计算**:$h_t = f(W_{hh}h_{t - 1} + W_{xh}x_t)$,其中 f 是一个选定的非线性激活函数。$W_{hh}h_{t - 1} + W_{xh}x_t$ 的维度为 n,即 $W_{hh}h_{t - 1} + W_{xh}x_t \in \mathbb{R}^{1\times n}$。函数 f 对 $W_{hh}h_{t - 1} + W_{xh}x_t$ 进行逐元素操作以产生 $h_t$,因此 $W_{hh}h_{t - 1} + W_{xh}x_t$ 和 $h_t$ 具有相同的维度。
- **输出 $o_t$ 的计算**:当涉及多类分类问题(如预测下一个单词)时,输出层是词汇表中单词数量的 SoftMax 函数。
0
0
复制全文
相关推荐










