5.1 循环序列模型 “吴恩达老师课程原地址[1]
1.7 对新序列采样 基于词汇进行采样模型 基于字符进行采样模型 根据实际问题,还可以建立基于字符的 RNN 结构,你的字典仅包含从 a 到 z 的字母,可能还会有空格符,数字 0-9,还有大写的 A-Z 字母,还有数据集中出现的特殊字符。最终使用这些字符组成你的字典。 这样每次 RNN 推断的输出都是字母而不是单独的词汇。 优点与缺点 缺点是使用字符进行采样的模型会得到很多很长的序列 因为一句话中的英文单词仅有几十个,但是字符的长度却有很多个,这样使得 RNN 的长度过大,使得其不可以捕捉长范围的关系,而且训练起来计算成本比较高昂。 优点是不会出现未知的标识 优点 缺点 所以现有的 RNN 都是使用基于单词的采样,但是随着计算机性能越来越高,使用基于字符进行采样也是一种趋势。 序列生成 使用新闻的语料库作为训练集,则生成的序列带有明显的新闻语感。 使用莎士比亚的语料库作为训练集,则生成的序列带有明显的莎士比亚风格。 1.8RNN 的梯度消失 vanishing gradient 基本的 RNN 有一个很大的问题,就是梯度消失问题 梯度消失 vanishing gradient 示例 THe cat, which already ate a bunch of food that was delicious ....was full. THe cats, which already ate a bunch of food that was delicious ....were full. 注意句式中的单复数问题,cat 作为主语,则使用 was,cats 作为主语,则使用 were. 主语和谓语的单复数关系,因为有从句(即主语和谓语之间的距离可以足够长)的关系,在时间上往往具有 很长时间的依赖效应(long-term dependencies) 但是普通的 RNN 并不擅长捕捉这种长期依赖效应(因为具有梯度消失的问题)。 梯度爆炸 exploding gradients 梯度不仅仅会指数级别的下降,也会指数级别的上升--即梯度爆炸(exploding gradients),导致参数的数量级及其巨大会看见许多 NaN 或者不是数字的情况--这意味着网络的计算出现了数值溢出。 如果出现了梯度爆炸的问题,一个解决方法就是使用梯度修剪(gradient clipping).即--设置一个梯度的天花板,梯度不能超过这个阈值,并对梯度进行缩放。 1.9GRU Gate Recurrent Unit 门控循环神经网络 GRU 网络改变了 RNN 的隐层结构,可以捕捉深层连接,并改善了梯度消失问题。 a^{t}=g(W_{a}[a^{t-1},x^{t}]+b_{a}) “[1] Cho K, Van Merrienboer B, Bahdanau D, et al. On the Properties of Neural Machine Translation: Encoder-Decoder Approaches[J]. Computer Science, 2014. [2] Chung J, Gulcehre C, Cho K H, et al. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling[J]. Eprint Arxiv, 2014.
门控循环神经网络单元 GRU The cat , which already ate ..., was full 为了记住话语中 cat 是单数还是复数,在时间 T 上需要使用记忆细胞 memory cell 记住 cat 这个单词,并且 c^{t}=a^{t} GRU 中真正重要的思想是,GRU 中有一个门 Gate( \gamma_u ) 这是一个 0 到 1 之间的值
\gamma_u=\sigma(W_{u}[c^{t-1},x^{t}]+b_{u})[2]
\breve{c}^{t} 的更新公式,[2]式计算的值用以控制是否采用[1]式进行更新
\breve{c}^{t} 用以控制 was 和 were 的值,而
\gamma_u 用以控制 在何时将 was 变为 were
C^{t}=\gamma_u * \breve{C}^{t}+(1-\gamma_u) * C^{t-1} 如果
\gamma_u=1 则
C^{t}=\breve{C}^{t} ,
\gamma_u=0 则
C^{t}=C^{t-1} ,即时间步没有扫到 was 时,
\gamma_u一直=0,此时C^{t}=c^{t-1} ,则 C 一直等于旧的值。而当时间步扫到"was"时,
\gamma_u=1 ,此时
GRU 计算过程
GRU 单元输入 C^{t-1} 对应于上一个时间步,先假设其正好等于
a^{t-1} , 然后
x^{t} 也作为输入,然后把这两个用合适的权重结合在一起再用 Tanh 计算,算出
\breve{c}^{t} 即
c^{t} 的替代值
再用一个不同的参数集,通过 \sigma 函数计算出
\gamma_u ,即更新门。
最后所有的值通过另一个运算符结合: C^{t}=\gamma_u * \breve{C}^{t}+(1-\gamma_u) * C^{t-1} ,其输入一个门值,新的候选值和旧的记忆细胞值,得到记忆细胞的新值
c^{t}=a^{t} ,也可以把这个值传入 Softmax 单元中,并计算出预测序列
\hat{y}^{t} GRU 优点 当你从左往右扫描一整个句子时,控制记忆细胞"不更新不更新不更新... 更新 " 因为门的值很容易取到 0,只要激活函数的输入是一个很大的负数,则激活函数的输出值就是一个很接近与 0 的值。所以 C^{t}=\gamma_u * \breve{C}^{t}+(1-\gamma_u) * C^{t-1} 中
C^{t}=C^{t-1} 则即是经过很多的时间步,记忆神经细胞的值都会很好的维持了下来--这样就避免了梯度消失的问题。这样可以保证 RNN 运行在十分庞大的依赖词上。
Note C^{t},\breve{C}^{t},\gamma_u 是具有一样的维度的向量,其中维度和隐藏层的激活值的个数相等。
完整 GRU 参考资料 [1]
吴恩达老师课程原地址: https://mooc.study.163.com/smartSpec/detail/1001319001.htm