cs224d-lecture9 机器翻译

主要内容:

  • RNN Translation Model
  • GRU
  • LSTM
  • Towards a Better Language Modeling

RNN Translation Model

encoder: \[h_t=\phi(h_{t-1},x_t)=f(W^{(hh)}h_{t-1}+W^{(hx)}x_t)\]

encoder: \[h_t=\phi(h_{t-1})=f(W^{(hh)}h_{t-1})\] \[y_t=softmax(W^{(S)}h_t)\]

corss entropy function: \[max_{\theta}\dfrac{1}{N}\sum_{n=1}^Nlogp_{\theta}(y^{(n)}|x^{(n)})\]

rnn的几点扩展

1.在encoder和decoder中,\(W^{(hh)}\) 是不一样的

2.计算decoder中的隐藏神经元时,可以不仅仅只使用上一个隐藏层的信息,而是使用三种input来获取更多的信息

  • The previous hidden state (standard)
  • Last hidden layer of the encoder (c = hT)
  • Previous predicted output word, \(y^{t−1}\)

\[h_t=\phi(h_{t-1},c,y_{t-1})\]

3.使用deep rnn: 这需要更大的语料库

4.使用bi-directional encoder

5.颠倒词序进行训练

rnn 到底做了什么?

we never gave this model an explicit grammar for the source language, or the target language, right? It's essentially trying, in some really deep, clever, continuous function, general function approximation kind of way, just correlation, basically, right? And it doesn't have to know the grammar, but as long as you're consistent and you just reverse every sequence, the same way. It's still grammatical if you read it from the other side. And the model reads it from potentially both sides, and so on.

RNN的缺点

我们知道在传统的神经网络传递中\(a^{<t>} = g(W_{a}\cdot[a{<t-1>},x{<t>}] + b_a)\), 很容易造成梯度消失,并且神经网络不擅长处理长期依赖的问题。以语言模型为例,即序列很难反向传播到比较靠前的部分,也就难以调整序列前面的计算。

GRU(gated recurrent units)

原论文:https://arxiv.org/pdf/1406.1078v3.pdf

这个图画的算是很好了的吧。。但是还是复杂了一点,必须对着公式才能看懂。可以看简化图:

\[r_t=\sigma(W^{(r)}x_t+U^{(r)}h_{t-1})\tag{reset gate}\] \[u_t=\sigma(W^{(z)}x_t+U^{(z)}h_{t-1})\tag{update gate}\] \[\tilde h_t=tanh(Wx_t+r_t\circ Uh_{t-1})\tag{new memory}\] \[h_t=(1-u_t)\circ \tilde h_t+u_t\circ h_{t-1} \tag{Hidden state}\]

主要就是两个gate:

  • 重置门r:决定了如何将新的输入信息与前面的记忆相结合。所以它的作用对象是 \(\tilde h_t\) 也就是new memory cell.
  • 更新门u:定义了前面记忆保存到当前时间步的量。所以它的作用对象是 \(h_t\).也就是当前memory cell保存 \(h_{t-1}\)\(\tilde h_t\) 多少信息量。

GRU 背后的原理:

  • 如果我们将重置门设置为 1,更新门设置为 0,那么我们将再次获得标准 RNN 模型。
  • 如果重置门设为0,那么将忽视之前的隐藏状态,这意味着模型可以丢掉之前的信息,当它们与未来的信息不相关时。
  • 更新门u控制着过去的状态对现在的影响。If z close to 1, then we can copy information in that units through many time steps!这意味着 Less vanishing gradient!
  • Units with short-term dependencies often have reset gate very active.

这几句总结可以说是道出了GRU的精髓了!

仍需要理解的几个问题:

  1. 激活函数为什么是tanh ,sigmoid,并不能像概率图模型那样,用数学来解释,就是很玄学吧。。

这篇文章写的不错~经典必读:门控循环单元(GRU)的基本概念与原理

LSTM

这个图有点抽象。

这个图是来自Ng的课,将图中的 \(a^{< t >}\) 换成 \(h_t\) 就可以了~

三个gate以及新的记忆细胞,三个sigmoid和一个tanh

\[i_t = \sigma(W^{(i)}x_t+U^{(i)}h_{t-1})\tag{Input\update gate}\] \[f_t = \sigma(W^{(f)}x_t+U^{(f)}h_{t-1})\tag{forget gate}\] \[o_t = \sigma(W^{(o)}x_t+U^{(o)}h_{t-1})\tag{Output/Exposure gate}\] \[\tilde c_t = tanh(W^{(c)}x_t+U^{(c)}h_{t-1})\tag{New memory cell}\]

输入门和遗忘门作用于新的记忆细胞得到最终的记忆细胞:

\[c_t=f_t\circ c_{t-1}+i_t\circ \tilde c_t\]

输出门作用于新的记忆细胞得到最终的隐藏状态:

\[h_t=o_t\circ tanh(c_t)\]

这里要理解每个gate的目的到底是啥?虽然很难用数学来解释,但是从intuitive上来理解下还是可以的~

  • New memory cell: 在GRU中也存在,但是是有区别的,这里是通过input word \(x_t\) 和 过去的隐藏状态 \(h_{t-1}\) 得到的。GRU中虽然也是,但直接使用了reset gate

  • Input gate: 也叫更新门,因为新的记忆细胞 \(\tilde c_t\) 生成时并未考虑current word是否有保留的意义,因此 \(i_t\) 作用于 \(\tilde c_t\).

  • Forget gate: 跟输入门是同样的道理,新的记忆细胞 \(\tilde c_t\) 生成时并未考虑past memory cell是否有保留的意义,因此 \(f_i\) 作用于 \(c_{t-1}\)

  • Final memory generation: 综合考虑了遗忘门作用后的 \(c_{t-1}\) 和 输入门作用后的 \(\tilde c_t\)

  • Output/Exposure Gate: 在GRU中不存在,这里是用来区分最终的记忆细胞 \(c_t\) 和 最终的隐藏状态 \(h_t\) 的。因为记忆细胞中包含有很多对于隐藏状态来说不必要的信息。

使用LSTM的机器翻译效果

很神奇!!!

Presentation

Towards a Better Language Modeling.

  • Better inputs: word \(\rightarrow\) subword \(\rightarrow\) char
  • Better regularization/Processing
  • Better Model