文章目录
- 1 DNN与词向量
- 1.1 DNN
- 1.2 skip-gram
- 1.3 简单句子分类模型DAN
- 2 RNN+LSTM+GRU
- 2.1 RNN
- 2.2 LSTM
- 2.3 LSTM变种
- 2.4 递归神经网络
- 2.5 双向RNN
- 2.6 堆叠RNN
1 DNN与词向量
1.1 DNN
神经网络中每一个神经单元是一个线性变化加一个激活函数
s=UTas=U^Tas=UTa
a=f(z)a=f(z)a=f(z)
z=Wx+bz=Wx+bz=Wx+b
多层神经网络就是不断向前加。
1.2 skip-gram
通过中心词 预测周围词。
整体训练网络如上图。词表大小为N。
输入X是一个one-hot的表示形式。其形状是NxN。
第一层是一个线性变换 h= XxW (W是一个Nx100的一个矩阵),得到一个Nx100维的隐层矩阵。
最后在隐层上加一个线性变换: hxW’ 得到输出是这里(X周围的一个位置)应该是某个词的概率。W’是一个Nx100的矩阵。
对下游有用的是W,用做词向量表示。一般把W称作输入向量,W’称作输出向量。
(这里看到模型维度对不上,不能做矩阵乘法,可能有一个转置操作。)
1.3 简单句子分类模型DAN
使用词向量,判断两句话语义是否相近,可以使用的一种方法是:找出两句话中的词,分别找出每个词的词向量,对每个句子的词向量做平均,然后两个句子的向量计算点乘。如果值很低,说明语义相近。
可以给句子中的词向量做平均拿到平均值。经过2层神经网络,最后做softmax可以分类该句子的情感属性。
2 RNN+LSTM+GRU
2.1 RNN
RNN相当于是一个事情反复做了很多次。
每一时刻t 输入为h(t−1)h^{(t-1)}h(t−1)、x(t)x^{(t)}x(t)。
h(t)=f(Wx(t)+Uh(t−1))h^{(t)}=f(Wx^{(t)}+Uh^{(t-1)})h(t)=f(Wx(t)+Uh(t−1))
y(t)=softmax(Vh(t))y^{(t)}=softmax(Vh^{(t)})y(t)=softmax(Vh(t))
目标函数
在做求导过程中得到
BPTT
()部分的连乘,在值<1的时候,连续乘,会趋近于0,发生梯度消失。在值>1的时候,连续乘会变成一个值很大的数,会发生梯度爆炸。
这里的值与激活函数有关系。非线性激活函数的导数一般都<1。所以更容易发生梯度消失。
怎么解决呢?可以选择一部分单元不进行更新,不计算梯度。从而引出了LSTM模型。
2.2 LSTM
LSTM相比较于RNN多了一个C,平行于h的C。
ft=σ(Wf.[ht−1,xt]+bf)f_t=\sigma(W_f.[h_{t-1},x_t]+b_f)ft=σ(Wf.[ht−1,xt]+bf)
注意[ht−1,xt][h_{t-1},x_t][ht−1,xt]是两个向量拼接。WfW_fWf与拼接向量是点乘.Wf.[ht−1,xt]W_f.[h_{t-1},x_t]Wf.[ht−1,xt]最后结果是一个n维的向量。ftf_tft就表示在n个维度,哪些应该被遗忘。
it=σ(Wi.[ht−1,xt]+bi)i_t=\sigma(W_i.[h_{t-1},x_t]+b_i)it=σ(Wi.[ht−1,xt]+bi)
C^t=tanh(WC.[ht−1,xt]+bC)\widehat{C}_t = tanh(W_C.[h_{t-1},x_t]+b_C)Ct=tanh(WC.[ht−1,xt]+bC)
Ct=ft∗Ct−1+it∗C^tC_t = f_t*C_{t-1}+i_t*\widehat{C}_tCt=ft∗Ct−1+it∗Ct
ot=σ(Wo.[ht−1,xt]+bo)o_t = \sigma(W_o.[h_{t-1},x_t]+b_o)ot=σ(Wo.[ht−1,xt]+bo)
ht=ot∗tanh(Ct)h_t = o_t*tanh(C_t)ht=ot∗tanh(Ct)
这就是一个 Ct,ht=f(ht−1,xt,Ct−1)C_t,h_t = f(h_{t-1},x^t,C_{t-1})Ct,ht=f(ht−1,xt,Ct−1)的函数。
2.3 LSTM变种
1 添加Peephole
让CCC参与到结果计算中
2 forget while input
去掉iti_tit
3 GRU
Ref: Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
去掉C,保留门结构。
2.4 递归神经网络
2.5 双向RNN
双向RNN的效果总是优于单向RNN。