zoukankan      html  css  js  c++  java
  • 【CS224n】Lecture8 Notes

    注:这是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 ight|^n}),其中(left| V ight|)表示词汇表的大小。所以我们会发现这种方法对内存空间的要求很大,模型的表现越好,所需要的内存就越大。

    RNN和RNN语言模型

    RNN的优点:

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

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

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

    RNN的基本公式:

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

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

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

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

    训练问题与技巧

    目标函数

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

    (t)时刻:$${J^{(t)}}( heta ) = - sumlimits_{j = 1}^{left| V ight|} {{y_{t,j}}log {{hat y}_{t,j}}} $$

    全部:$$J = - frac{1}{T}sumlimits_{t = 1}^T {sumlimits_{j = 1}^{left| V ight|} {{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}} = sumlimits_{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)}}( heta ) = - sumlimits_{j = 1}^{left| V ight|} {{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}} = sumlimits_{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}}} = prodlimits_{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}}}} = egin{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}]

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

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

    [left| {frac{{partial {h_t}}}{{partial {h_{k}}}}} ight| = left| prodlimits_{j = k + 1}^t {frac{{partial {h_j}}}{{partial {h_{j - 1}}}}} ight| le ({eta _W}{eta _h})^{(t-k)} ]

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

    双向RNN和多层RNN

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

  • 相关阅读:
    获取服务器的IP地址和MAC地址
    silverlight学习:RichTextBox[转]
    历次重要底部的数据特征 A股或将继续下跌?
    Silverlight开发工具集合[转]
    每个.NET 开发人员应该下载的十个必备工具
    VS 发布网站时如何产生固定命名的 Dll 文件 WebDeploymentSetup使用说明
    匈牙利命名法、骆驼命名法、帕斯卡(pascal)命名法 C#命名规范
    让你在股市中战无不胜的八大技巧
    C#编程规范
    Enterprise Architect 8.0 注册码及其使用教程
  • 原文地址:https://www.cnblogs.com/LuoboLiam/p/11717450.html
Copyright © 2011-2022 走看看