注:这是2017年课程的lecture8。一直都在用RNN,但是对它内部的构造不甚了解,所以这次花了一个下午加一个晚上看了CS224n中关于RNN的推导,不敢说融会贯通,算是比以前清楚多了。做个笔记,便于日后查阅。

Overview

主要讲了以下几个内容:

  1. 传统语言模型

  2. RNN和RNN语言模型

  3. 一些问题(梯度消失爆炸问题)和训练技巧

  4. RNN的其他应用

  5. 双向RNN和多层RNN

传统语言模型

语言模型

首先介绍语言模型的概念,简言之,语言模型描述了一个单词序列的概率,原文是a language model computes a probability for a sentence of words. 这样的好处是可以描述单词顺序以及更好的单词选择。关于单词顺序,课上举的例子是\(P(the cat is small) > P(small is the cat)\),即正确语序在语言模型下的概率更高;关于单词选择,例子是\(P(walking home after school) > P(walking house after school)\)。也就是说概率越高,越像人话。

传统语言模型

  1. 定义:

传统的语言模型计算的概率大多基于“窗口”大小,也就是\(n-gram\)中的\(n\)的大小。一个自然的理解是当前词的概率也应该和之前所有词的选择有关,即:

\[P({w_t} = {v_j}) = P({w_t} = {v_j}|{w_1},{w_2},...,{w_{t - 1}})\]

但是问题是这种计算不可行,随着语料的增大,当\(t\)足够大的时候,计算这个概率是很难的事情。因此,我们做出一个在数学上来看不正确,但是在实际计算中很有必要的Markov假设,即当前词的概率仅与之前的\(n\)个词有关,即:

\[P({w_t} = {v_j}) = P({w_t} = {v_j}|{w_{t - n}},{w_{t - (n - 1)}},...,{w_{t - 1}})\]

  1. 计算:

计算多使用词频或者词组的频率计算,下面的公式展示了\(unigram\)和\(bi-gram\)的计算公式:

unigram:\[P({w_2}|{w_1}) = \frac{{count({w_1},{w_2})}}{{count({w_1})}}\]

bigram: \[P({w_3}|{w_1},{w_2}) = \frac{{count({w_1},{w_2},{w_3})}}{{count({w_1},{w_2})}}\]

其中,\(count\)表示对应数组在整个语料中的出现次数。根据公式可以看到,计算\[{{count({w_1},{w_2},{w_3})}}\]的复杂程度与词汇表大小有关,具体是n-gram的复杂程度是\({\left| V \right|^n}\),其中\(\left| V \right|\)表示词汇表的大小。所以我们会发现这种方法对内存空间的要求很大,模型的表现越好,所需要的内存就越大。

RNN和RNN语言模型

RNN的优点:

  1. 根据时间序列进行预测,具体方法是共享权值矩阵。

  2. 理论上可以考虑之前所有的单词

  3. 内存需求低于传统语言模型

RNN的基本公式:

\[{h_t} = \sigma ({W^{hh}}{h_{t - 1}} + {W^{hx}}{x_t}),{W^{hh}} \in {D_h} \times {D_h},{W^{hx}} \in {D_h} \times d\]

\[{\hat y_t} = softmax({W^S}{h_t}),{W^S} \in \left| V \right| \times {D_h}\]

\[\hat P({x_{t + 1}} = {v_j}|{x_1},{x_2},...,{x_t}) = {\hat y_{t,j}}\]

其中,\(D_h\)是隐藏层的维度,\(d\)是词向量的维度,\(\left| V \right|\)是词汇表的大小

训练问题与技巧

目标函数

目标函数采用交叉熵函数:

\(t\)时刻:\[{J^{(t)}}(\theta ) = - \sum\limits_{j = 1}^{\left| V \right|} {{y_{t,j}}\log {{\hat y}_{t,j}}} \]

全部:\[J = - \frac{1}{T}\sum\limits_{t = 1}^T {\sum\limits_{j = 1}^{\left| V \right|} {{y_{t,j}}\log {{\hat y}_{t,j}}} } \]

评价指标

困惑度(perplexity, PPL),PPL的计算公式如下:

\[PPL = {2^J}\]

所以,PPL越小越好。

梯度消失与爆炸问题

首先给出结论,基本的RNN存在长距依赖问题,即训练时间足够长时,会出现梯度的突变,使得训练失去意义。我们从公式推导的角度说明这个问题。

  1. 首先,我们考虑一个简化的RNN,或许不叫RNN,只是在传统的RNN上做了一些修改,不会影响具体的性质:

\[{h_t} = Wf({h_{t - 1}}) + {W^{hx}}{x_t}\]

\[{\hat y_t} = {W^S}g({h_t})\]

  1. 总误差可以表示为每个时间步误差的和:

\[\frac{{\partial J}}{{\partial W}} = \sum\limits_{t = 1}^T {\frac{{\partial {J_t}}}{{\partial W}}} \]

  1. 在反向传播过程中:

我们依次进行分析,首先是\(W^S\),它的梯度是比较容易得到的,即:

\[chain rules: \frac{{\partial {J_t}}}{{\partial {W^S}}} = \frac{{\partial {J_t}}}{{\partial {{\hat y}_t}}}\frac{{\partial {{\hat y}_t}}}{{\partial {W^S}}}\]

比较麻烦的是\(W\)和\(W^hx\)的梯度,但是这两个梯度很类似,求出一个另一个也类似可得,现在以\(W\)为例,我们先观察这三个式子:

\[{h_t} = Wf({h_{t - 1}}) + {W^{hx}}{x_t}\]

\[{\hat y_t} = {W^S}g({h_t})\]

\(t\)时刻:\[{J^{(t)}}(\theta ) = - \sum\limits_{j = 1}^{\left| V \right|} {{y_{t,j}}\log {{\hat y}_{t,j}}} \]

想要求\(t\)时刻\(W\)的梯度,应用链式法则有:

\[\frac{{\partial {J_t}}}{{\partial W}} = \frac{{\partial {J_t}}}{{\partial {{\hat y}_t}}}\frac{{\partial {{\hat y}_t}}}{{\partial {h_t}}}\frac{{\partial {h_t}}}{{\partial W}}\]

其中,\(\frac{{\partial {J_t}}}{{\partial {{\hat y}_t}}}\frac{{\partial {{\hat y}_t}}}{{\partial {h_t}}}\)是比较好求的,不好处理的只有\(\frac{{\partial {h_t}}}{{\partial W}}\),因为\({h_{t-1}}\)中也有\(W\)项,应该使用连式法则求解,即:

\[\frac{{\partial {J_t}}}{{\partial W}} = \sum\limits_{k = 1}^t {\frac{{\partial {J_t}}}{{\partial {{\hat y}_t}}}\frac{{\partial {{\hat y}_t}}}{{\partial {h_t}}}\frac{{\partial {h_t}}}{{\partial {h_k}}}\frac{{\partial {h_k}}}{{\partial W}}} \]

我们再来看上式中的\({\frac{{\partial {h_t}}}{{\partial {h_k}}}}\),由链式法则有以下的式子成立:

\[\frac{{\partial {h_t}}}{{\partial {h_k}}} = \prod\limits_{j = k + 1}^t {\frac{{\partial {h_j}}}{{\partial {h_{j - 1}}}}} \]

其中\(h_j\)与\({h_{j-1}}\)的关系可以写成\({h_j} = F({h_{j-1}})\),所以这个式子可以写成一个雅克比矩阵:

\[\frac{{\partial {h_j}}}{{\partial {h_{j - 1}}}} = \begin{array}{*{20}{c}}
{\frac{{\partial {F_1}}}{{\partial {h_{j - 1,1}}}}}&{\frac{{\partial {F_1}}}{{\partial {h_{j - 1,2}}}}}&{\frac{{\partial {F_1}}}{{\partial {h_{j - 1,3}}}}}&{...}&{\frac{{\partial {F_1}}}{{\partial {h_{j - 1,{D_h}}}}}}\\
{\frac{{\partial {F_2}}}{{\partial {h_{j - 1,1}}}}}&{\frac{{\partial {F_2}}}{{\partial {h_{j - 1,2}}}}}&{\frac{{\partial {F_2}}}{{\partial {h_{j - 1,3}}}}}&{...}&{\frac{{\partial {F_2}}}{{\partial {h_{j - 1,{D_h}}}}}}\\
{...}&{...}&{...}&{...}&{...}\\
{...}&{...}&{...}&{...}&{...}\\
{\frac{{\partial {F_{{D_h}}}}}{{\partial {h_{j - 1,1}}}}}&{\frac{{\partial {F_{{D_h}}}}}{{\partial {h_{j - 1,2}}}}}&{\frac{{\partial {F_{{D_h}}}}}{{\partial {h_{j - 1,3}}}}}&{...}&{\frac{{\partial {F_{{D_h}}}}}{{\partial {h_{j - 1,{D_h}}}}}}
\end{array}\]

即对这个偏导数求范数,其中\({\beta _W}\)和\({\beta _h}\)分别是\(\left\| {{W^T}} \right\|\)和\(\left\| {diag({f^{(1)}}({h_{j - 1}}))} \right\|\)的上界:

\[\left\| {\frac{{\partial {h_j}}}{{\partial {h_{j - 1}}}}} \right\| \le \left\| {{W^T}} \right\|\left\| {diag({f^{(1)}}({h_{j - 1}}))} \right\| \le {\beta _W}{\beta _h}\]

\[\left\| {\frac{{\partial {h_t}}}{{\partial {h_{k}}}}} \right\| = \left\| \prod\limits_{j = k + 1}^t {\frac{{\partial {h_j}}}{{\partial {h_{j - 1}}}}} \right\| \le ({\beta _W}{\beta _h})^{(t-k)}\]

所以,当\(0 < {\beta _W}{\beta _h} < 1\),在足够长的时间后会产生梯度消失,否则产生梯度爆炸。

双向RNN和多层RNN

今天太困了,以后再补吧,鸽了QAQ

【CS224n】Lecture8 Notes的更多相关文章

  1. 【原创】记一次Project插件开发

    一.开发背景 最近在使用微软的Office Project 2010 进行项目管理,看到排的满满的计划任务,一个个地被执行完毕,还是很有成就感的.其实,不光是在工作中可以使用Project进行项目进度 ...

  2. 【故障处理】ORA-28040: No matching authentication protocol

    [故障处理]ORA-28040: No matching authentication protocol 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者 ...

  3. 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】

    转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...

  4. SCI&EI 英文PAPER投稿经验【转】

    英文投稿的一点经验[转载] From: http://chl033.woku.com/article/2893317.html 1. 首先一定要注意杂志的发表范围, 超出范围的千万别投,要不就是浪费时 ...

  5. 程序员提高工作效率的15个技巧【Facebook】

    程序员提高工作效率的15个技巧[Facebook] 作者: habadog 日期: 2015 年 02 月 13 日发表评论 (0)查看评论 程序员提高工作效率的15个技巧[Facebook] 1,D ...

  6. 【POJ1743】 Musical Theme (二分+后缀数组)

    Musical Theme Description A musical melody is represented as a sequence of N (1<=N<=20000)note ...

  7. 【POJ2396】Budget(上下界网络流)

    Description We are supposed to make a budget proposal for this multi-site competition. The budget pr ...

  8. 【转】KVM/Installation

    [转]KVM/Installation Installation Pre-installation checklist Check that your CPU supports hardware vi ...

  9. 【原创】leetCodeOj --- Dungeon Game 解题报告

    原题地址: https://oj.leetcode.com/problems/dungeon-game/ 题目内容: The demons had captured the princess (P) ...

随机推荐

  1. 小div在大div中垂直居中方式

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  2. MySQL Percona Toolkit--pt-osc重点参数

    修改命令参数alter .不需要包含alter table关键字,可以包含多个修改操作,使用逗号分开,如"drop clolumn c1, add column c2 int" . ...

  3. Activity知识点详解

    Activity知识点详解 一.什么是Activity 官方解释: The Activity class is a crucial component of an Android app, and t ...

  4. 从客户端(content="xxxxx")中检测到有潜在危险的 Request.Form 值——较合理解决方案

    1,修改配置文件: <httpRuntime requestValidationMode = "2.0" /> 以上修改是必须的,因为高版本的.netframework ...

  5. Linux跑脚本用sh和./有什么区别?

    一个很有意思的例子: sh是一个shell.运行sh a.sh,表示我使用sh来解释这个脚本:如果我直接运行./a.sh,首先你会查找脚本第一行是否指定了解释器,如果没指定,那么就用当前系统默认的sh ...

  6. PHP-FPM的知识点

    https://blog.csdn.net/resilient/article/details/82420863 这个URL,将php的各种模式与知识点说清楚了. 因为php-fpm默认编译进了php ...

  7. [POJ2083] Fracal

    Description A fractal is an object or quantity that displays self-similarity, in a somewhat technica ...

  8. 关于c++中的类型转换符

    const_cast(链接) 用来去掉const或volatile属性 volatile: 用于并行设备的硬件寄存器(状态寄存器), 中断服务子程序中会访问到的非自动变量, 多线程中被几个任务共享的变 ...

  9. 《BUG创造队》第八次团队作业:Alpha冲刺

    项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 BUG创造队 作业学习目标 (1)掌握软件测试基础技术.(2)学习 ...

  10. Hadoop跨集群迁移数据(整理版)

    1. 什么是DistCp DistCp(分布式拷贝)是用于大规模集群内部和集群之间拷贝的工具.它使用Map/Reduce实现文件分发,错误处理和恢复,以及报告生成.它把文件和目录的列表作为map任务的 ...