基于循环神经网络的自然语言处理技术解析
立即解锁
发布时间: 2025-09-09 00:26:31 阅读量: 9 订阅数: 13 AIGC 


深度学习实战:TensorFlow数学解析
### 基于循环神经网络的自然语言处理技术解析
#### 1. 词向量的类比应用
词向量嵌入的一个显著优势在于其能够将类比关系线性化。这里我们使用预训练的 GloVe 向量来进行一些类比操作。
##### 1.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.
```
##### 1.2 构建伪词向量并计算余弦相似度
我们选取“king”、“queen”、“man”和“woman”这几个词的 GloVe 向量来寻找类比关系。创建一个伪词向量 `pseudo_king`,其计算方式为:`pseudo_king = queen_wordvec - woman_wordvec + man_wordvec`。
以下是具体代码:
```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
```
输出的余弦相似度约为 0.663537,这表明 `queen - woman + man` 很好地代表了“king”的概念。
##### 1.3 使用 t-SNE 进行可视化
通过 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”之间的向量差几乎平行且长度相近。
##### 1.4 词嵌入对循环神经网络的重要性
在自然语言处理中,循环神经网络本身无法理解文本,因此文本中的每个词都需要有某种数字表示形式。词嵌入向量是一个很好的选择,因为词可以由词嵌入向量的各个分量所代表的多个概念来表示。循环神经网络可以通过两种方式使用词嵌入向量:一是将预训练的词嵌入向量作为输入;二是让网络自己学习这些嵌入向量。但在某些情况下,如网络需要学习大量其他参数或训练数据较少时,学习词嵌入向量作为参数可能会导致过拟合或次优结果,此时使用预训练的词向量嵌入可能是更明智的选择。
#### 2. 循环神经网络简介
循环神经网络(RNN)旨在利用和学习序列信息。其架构会对序列中的每个元素执行相同的任务,因此得名“循环”。由于语言中单词的顺序依赖性,RNN 在自然语言处理任务中非常有用。例如,在预测句子中的下一个单词时,前面的单词序列至关重要。
在序列的每个时间步,RNN 会根据之前的计算(即先前的记忆和当前输入)计算一些记忆。这个计算得到的记忆用于当前时间步的预测,并作为输入传递到下一个时间步。
RNN 的基本架构可以在时间上展开,以表示完整的序列。如果要处理长度为 7 的单词序列,展开后的 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 的详细组件分析
##### 3.1 输入、隐藏状态和输出
- **输入 $x_t$**:表示时间步 $t$ 的输入单词的向量。可以是独热编码向量,也可以是来自预训练库(如 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}$。
- **输出 $o_t$**:当涉及多类分类问题(如预测下一个单词)时,输出层是词汇表中单词数量的 SoftMax 函数。预测的输出向量 $o_t \in \mathbb{R}^{1\times V}$ 可以表示为 $SoftMax(W_{ho}h_t)$。
##### 3.2 隐藏状态的计算
隐藏状态 $h_t$ 在时间步 $t$ 的计算方式
0
0
复制全文
相关推荐










