zoukankan      html  css  js  c++  java
  • 循环神经网络

    原文:https://zybuluo.com/hanbingtao/note/541458 

    循环神经网络也可以画成下面这个样子:

    双向循环神经网络

    对于语言模型来说,很多时候光看前面的词是不够的,比如下面这句话:

    我的手机坏了,我打算____一部新手机。

    可以想象,如果我们只看横线前面的词,手机坏了,那么我是打算修一修?换一部新的?还是大哭一场?这些都是无法确定的。但如果我们也看到了横线后面的词是『一部新手机』,那么,横线上的词填『买』的概率就大得多了。

    在上一小节中的基本循环神经网络是无法对此进行建模的,因此,我们需要双向循环神经网络,如下图所示:

     

    深度循环神经网络

    前面我们介绍的循环神经网络只有一个隐藏层,我们当然也可以堆叠两个以上的隐藏层,这样就得到了深度循环神经网络。如下图所示:

    循环神经网络的训练

     

    循环神经网络的训练算法:BPTT

    BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的三个步骤:

    1. 前向计算每个神经元的输出值;
    2. 反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入的偏导数;
    3. 计算每个权重的梯度。

    最后再用随机梯度下降算法更新权重。

    RNN的应用举例——基于RNN的语言模型

    现在,我们介绍一下基于RNN语言模型。我们首先把词依次输入到循环神经网络中,每输入一个词,循环神经网络就输出截止到目前为止,下一个最可能的词。例如,当我们依次输入:

    我 昨天 上学 迟到 了

    神经网络的输出如下图所示:

    可以用下面的图来直观的表示:

    使用这种向量化方法,我们就得到了一个高维、稀疏的向量(稀疏是指绝大部分元素的值都是0)。

    其中,s和e是两个特殊的词,分别表示一个序列的开始和结束。

     

    向量化

    我们知道,神经网络的输入和输出都是向量,为了让语言模型能够被神经网络处理,我们必须把词表达为向量的形式,这样神经网络才能处理它。

    神经网络的输入是词,我们可以用下面的步骤对输入进行向量化:

    1. 建立一个包含所有词的词典,每个词在词典里面有一个唯一的编号。
    2. 任意一个词都可以用一个N维的one-hot向量来表示。

    语言模型要求的输出是下一个最可能的词,我们可以让循环神经网络计算计算词典中每个词是下一个词的概率,这样,概率最大的词就是下一个最可能的词。因此,神经网络的输出向量也是一个N维向量,向量中的每个元素对应着词典中相应的词是下一个词的概率。如下图所示:

    最后,我们使用交叉熵误差函数作为优化目标,对模型进行优化。

    在实际工程中,我们可以使用大量的语料来对模型进行训练,获取训练数据和训练的方法都是相同的。

    。。。

  • 相关阅读:
    Java(八)——面向对象(4)-抽象类与接口
    Java(七)——面向对象(3)-多态
    Java(六)——面向对象(2)-继承
    Java(五)——面向对象(1)-基础
    Java(四)——数组
    Java(三)——流程控制
    Java(二)——Java基础
    易忘小技巧--yum
    网络测速命令--speedtest
    大型网站架构技术读后感
  • 原文地址:https://www.cnblogs.com/bonelee/p/7717569.html
Copyright © 2011-2022 走看看