zoukankan      html  css  js  c++  java
  • 李宏毅机器学习课程笔记-9.1循环神经网络RNN入门

    Slot Filling

    比如在订票系统中,输入“Arrive Taipei on November 2nd”这样一个序列,我们设置几个slot(槽位),希望算法能够将关键词“Taipei”放入Destination这个slot,将"November"和"2nd"放入到达时间Time of Arrival这个slot,而“Arrive”和“on”不属于任何slot。那这个算法如何实现呢?

    Slot Filling with FNN

    可以用Feedforward Neural Network实现Slot Filling吗?可以,下面介绍这种FNN的输入和输出,但其存在问题。

    输入是一个word(比如“Taipei”)并用vector来表示它;输出是1个probablity distribution,表示输入的word属于各个slot的概率。

    如何用vector表示1个word呢?方法有很多。比如1-of-N Encoding(又名one-hot Encoding),如下图所示。设定1个lexicon(词汇表),那vector的size就和lexicon的size相同,vector中的每个维度对应lexicon中的word,vector中word对应的维度的值为1、其它维度的值为0。

    img

    如下图所示,只有1-of-N Encoding还不够,一些word不在lexicon中,对此我们需要在lexicon中添加1个"other"。除了1-of-N Encoding,还可以通过word hashing。可以用1个26×26×26的vector表示1个word,该vector中每个元素代表1个3字母序列。比如"apple"包括"app"、"ppl"、"ple"。

    img

    使用FNN实现Slot Filling时会存在一个问题:假如有2个句子“Arrive Taipei on November 2nd”和“Leave Taipei on November 2nd”,在处理这2个句子时FNN会先处理“arrive”和“leave”这2个词汇然后再处理“Taipei”。这时FNN没有办法区分出“Taipei”是出发地还是目的地,而我们希望算法在处理序列时是有“记忆力”的(即在处理“Taipei”时,它还记得“Leave”或“Arrive”),于是RNN诞生了。

    Recurrent Neural Network

    如下图所示,将每1个隐藏层的输出保存在memory中,网络不仅考虑了input,还要考虑memory中的数据(merory中的数据是需要有初值的,比如0)。

    img

    因为RNN会考虑memory中存储的临时值,而不同输入产生的临时值不一定相同,所以改变输入序列中元素的顺序会导致最终输出结果的改变(Changing the sequence order will change the output)。

    Slot Filling with RNN

    如下图所示,以“Arrive Taipei on November 2nd” 这个word sequence为例,将“Arrive”的vector(x^1)输入到RNN,隐藏层生成(a^1),根据(a^1)生成(y^1),表示“arrive”属于每个slot的概率,其中(a^1)会被存储到memory中;将“Taipei”的vector(x^2)输入到RNN,此时隐藏层同时考虑(x^2)和memory中的(a^1)生成(a^2),根据(a^2)生成(y^2),表示“Taipei”属于某个slot的概率,此时再把(a^2)存到memory中;以此类推根据(x_3)(a_2)生成(a_3)进而得到(y^3)……

    img

    RNN的变体

    Elman Network & Jordan Network

    RNN也有不同的变形。Elman Network是把隐藏层的输出存到memory中,而Jordan Network是把输出层的输出保存到memory中。由于隐藏层没有明确的训练目标,而整个NN具有明确的目标,因此Jordan Network的表现会更好一些。

    img

    Bidirectional RNN

    如下图所示,RNN可以是双向的。训练2个方向的RNN,1个从前往后读取序列,1个从后往前读取序列,然后使用2个RNN的隐藏层得到最后的输出层。这样的好处是,输出层的感受野更大,因为RNN在得到(y^{t+1})的时候,它不只看了从句首(x^1)开始到(x^{t+1})的数据,还看了从句尾(x^{n})一直到(x^{t+1})的输入,这就相当于RNN是在看过整个句子之后才计算每个word属于哪个slot的概率

    img


    Github(github.com):@chouxianyu

    Github Pages(github.io):@臭咸鱼

    知乎(zhihu.com):@臭咸鱼

    博客园(cnblogs.com):@臭咸鱼

    B站(bilibili.com):@绝版臭咸鱼

    微信公众号:@臭咸鱼

    转载请注明出处,欢迎讨论和交流!


  • 相关阅读:
    tyvj1034 尼克的任务
    一维数状数组区间修改,查询
    ACM-T3分块
    测试2T3
    IOS下自定义click事件使用alert的bug
    小知识点
    CSS3动画基本知识
    CSS3秘笈:第十二章&第十三章
    CSS3秘笈:第十一章
    CSS3秘笈:第十章
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/14639558.html
Copyright © 2011-2022 走看看