RNN(Recurrent Neural Network Model
学习RNN之前,先来看一下普通的神经网络为什么不能用于自然语言模型。 普通神经网络存在两个问题:
- 训练句子长度不一样,因此神经网络的输入难以统一,不利于建模。
- 训练句子中无法共享词之间的特征,其次权重矩阵不共享(下面讨论矩阵共享问题),导致参数很多。
因此RNN出现了
先上图: 这张图还是很难理解的,但是,从这张图至少可以看出:上一刻算出来的S又通过了一个W重新影响下一个S的计算。 现在来看看具体是怎么影响的: 按照时间线展开:
举个例子: 比如一个句子:I love China,对应上图的
x
t
?
1
x_{t-1}
xt?1?,
x
t
x_{t}
xt?,
x
t
+
1
x_{t+1}
xt+1?,开始训练的时候,这三个单词都会转为词向量(one-hot或者分布式词向量,分布式词向量由word2vec训练得到),首先 I 这个词向量进入上述神经网络,得到了
s
t
?
1
s_{t-1}
st?1?,然后 love这个词向量进入网络,根据
s
t
=
f
(
U
x
t
+
W
s
t
?
1
)
s_t = f(Ux_t+Ws_{t-1})
st?=f(Uxt?+Wst?1?)求得
s
t
s_t
st?,以此类推,传入China
再来具体看看前几个单词是如何影响后面单词的: 从上面可以看出,循环神经网络的输出值,是受前面历次输入值影响的,这就是为什么循环神经网络可以往前看任意多个输入值的原因。
RNN语言模型举例
训练步骤:
- 足够大的语料库
- 对每句话就行分词(tokenize)
- 对单词进行向量化
比如我们有一句话:
我 昨天 上学 迟到 了
为什么要这么错位呢?是因为语言模型要预测下一个单词的概率,错位之后,正好对应的是下一个单词的输出。
然后就是损失函数: 单个元素的: 该样本所有元素的Loss function为:
参考 https://zybuluo.com/hanbingtao/note/541458
https://blog.csdn.net/red_stone1/article/details/79446105
|