讨论 2020-10-08 = ###### tags: `tutorials` `Fudan` `2020` # NLP中的常用模型 (一) ## RNN 循环神经网 假设有一个序列$X=x_0, x_1, x_2, ..., x_n$,与HMM类似,RNN通过递推的方式来建模这个序列,$$ h_t = \mathrm{tanh}(Wx_t+U h_{t-1}) $$ 这种方式的好处是同一个模型可以应对任意长度的序列。同时RNN也有很多性质,而其中不乏双刃剑,比如RNN建模序列式可以考虑相对次序,输出与$t$无关。这在很多场景下是优势,比如类周期性的信号,没有明确的开始与结束。但同时有时确实劣势,因为与$t$无关也就意味着RNN不能感知绝对位置。但假如了解RNN的特性,这一缺点完全可以规避。\<BOS\> \<EOS\>就可以解决这一问题。 在对RNN的研究中,最具代表性的就是长时记忆问题,也就是探讨RNN记忆力如何的问题。实际上,在应用RNN的过程中,许多人都发现了RNN不能记住多步之前的信息(通常指几十步以上)。对此主流的解释是梯度弥散和梯度爆炸问题 \begin{align} \frac{\partial h_t}{\partial h_{t-1}} &= (1-h_t^2)U \\ \frac{\partial h_t}{\partial h_{t-k}} &= \prod_{i=t-k+1}^t (1-h_i^2) U^k \end{align} 我们可以很容易发现,k步间的导数传递十分不问题,很容易快速增大或快速减小。也就带来了梯度爆炸和梯度弥散问题。另外这种现象同样存在于深层网络中,因为相应的项从$U^k$变为$\prod_i U_i$同样很不稳定。同时根据这一推导我们也可以理解为甚RNN难以记住几十步以前的信息。并且我们发现只有$U$接近于1,RNN才可能稳定这一思想也影响了后续众多对RNN的改进工作。 ### 正交初始化 假如矩阵$A$满足$A^TA=AA^T=I$,则A为正交阵,同时正交阵有一个重要性质,即模长不变 \begin{align} ||x||_2 &= x^T x \\ ||Ax||_2 & = (Ax)^T Ax \\ & = x^T A^T A x \\ & = x^T x \\ & = ||x||_2 \\ \end{align} 知道了经过正交矩阵不会改变模长,我们就想到如果 $U$是一个正交矩阵,那么长距离梯度传递问题是不是就得到很好解决? 受这种想法启发,现在很多RNN的实现都会把 $U$初始化为一个正交阵。但遗憾的是在优化过程中很难保持正交性质,把$U$重参数化,让其强制为正交阵又会使网络能力大大下降。 ### 激活函数的选择 我们已经知道了tanh的导数,并且发现它在0~1之间的,这不利于长距离梯度传递。所以也有一些工作探讨了是否有其他更适合RNN的激活函数,比如使用ReLU替代tanh,我们知道ReLU在正数部分的导数就是1,所以很有利于长距离传递。一些研究也表明这种改进在一些情况下确实提高了RNN的记忆能力,但我的个人经验是这种结构非常脆弱,很难调。(大家可以思考一下为什么比tanh难调) ### 集大成者 LSTM LSTM既考虑了长距离梯度传递问题,又兼顾了网络的表达能力,看似复杂,其实考虑周全。 \begin{align} i_t &= \sigma(Wx_t+Uh_{t-1}) \\ o_t &= \sigma(Wx_t+Uh_{t-1}) \\ f_t &= \sigma(Wx_t+Uh_{t-1}) \\ \hat{h}_t &= \mathrm{tanh}(Wx_t+Uh_{t-1}) \\ c_t &= f_t * c_{t-1} + i_t * \hat{h}_t \\ h_t &= o_t * \mathrm{tanh} (c_t) \end{align} 注意每一行的$W$和$U$都是不同参数。 我们可以发现$c_t$是一条记忆的通路,与$U$无关,只收gate的控制。假如gate常开,LSTM可以允许长距离的梯度传输。 但也要注意,$f_t$ 是sigmoid函数出来的,所以初值不会太接近1,而指数衰减速度很快,所以想要学习长距离关系,一般要把$f_t$相应的参数单独初始化,让其初始值就接近1。 ## 预告 ### 外部记忆 ### NTM 神经图灵机 ### RNN中的Attention ### 层次化的RNN ### 超越序列的RNN
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.