NLP自然语言处理之RNN--LSTM--GRU--seq2seq--attention--self attetion

1、RNN原理和数学公式

""" 执行
# 定义RNN的参数。 
X = [1,2] 
state = [0.0, 0.0] 
w_cell_state = np.asarray([[0.1, 0.2], [0.3, 0.4]]) 
w_cell_input = np.asarray([0.5, 0.6]) 
b_cell = np.asarray([0.1, -0.1]) 
w_output = np.asarray([[1.0], [2.0]]) 
b_output = 0.1
  
# 执行前向传播过程。 
for i in range(len(X)): 
    before_activation = np.dot(state, w_cell_state) + X[i] * w_cell_input + b_cell 
    state = np.tanh(before_activation) 

    final_output = softmax(np.dot(state, w_output) + b_output)
    print ("before activation: ", before_activation) 
    print ("state: ", state) 
    print ("output: ", final_output)
"""

2、LSTM原理和数学公式

        σ这里表示sigmoid函数 == 1/1+exp(-x)

3、GRU原理和数学公式

        GRU即Gated Recurrent Unit。前面说到为了克服RNN无法很好处理远距离依赖而提出了LSTM,而GRU则是LSTM的一个变体,当然LSTM还有有很多其他的变体。GRU保持了LSTM的效果同时又使结构更加简单。

        GRU模型如下,它只有两个门了,分别为更新门和重置门,即图中的zt和rt。更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。重置门用于控制忽略前一时刻的状态信息的程度,重置门的值越小说明忽略得越多。

        前向传播:

        []表示两个向量相加,*表示矩阵元素相乘

4、seq2seq原理和数学公式

        seq2seq模型是以编码(Encode)和解码(Decode)为代表的架构方式,seq2seq模型是根据输入序列X来生成输出序列Y,在翻译,文本自动摘要和机器人自动问答以及一些回归预测任务上有着广泛的运用。以encode和decode为代表的seq2seq模型,encode意思是将输入序列转化成一个固定长度的向量,decode意思是将输入的固定长度向量解码成输出序列。其中编码解码的方式可以是RNN,CNN等。

        但是纯粹简单的seq2seq模型,会把编码encode中输出的隐藏层全部传给解码层,导致信息严重压缩,为了使解码结果更准确,模拟人的注意力机制attention。

        公式如下:

        结合图和公式每一步进行说明:

 

        从左边Encoder开始,输入转换为word embedding, 进入LSTM。LSTM会在每一个时间点上输出hidden states。如图中的h1,h2,...,h8。 

        接下来进入右侧Decoder,输入为(1) 句首 <sos>符号,原始context vector(为0),以及从encoder最后一个hidden state: h8。LSTM的是输出是一个hidden state。(当然还有cell state,这里没用到,不提。)

 

        Decoder的hidden state与Encoder所有的hidden states作为输入,放入Attention模块开始计算一个context vector。之后会介绍attention的计算方法。

        下一个时间点

        来到时间点2,之前的context vector可以作为输入和目标的单词串起来作为lstm的输入。之后又回到一个hiddn state。以此循环。

        另一方面,context vector和decoder的hidden state合起来通过一系列非线性转换以及softmax最后计算出概率。

        在luong中提到了三种score的计算方法。这里图解前两种:

        Attention score function: dot

        输入是encoder的所有hidden states H: 大小为(hid dim, sequence length)。decoder在一个时间点上的hidden state, s: 大小为(hid dim, 1)。

  • 第一步:旋转H为(sequence length, hid dim) 与s做点乘得到一个 大小为(sequence length, 1)的分数。
  • 第二步:对分数做softmax得到一个合为1的权重。
  • 第三步:将H与第二步得到的权重做点乘得到一个大小为(hid dim, 1)的context vector。

         Attention score function: general

        输入是encoder的所有hidden states H: 大小为(hid dim1, sequence length)。decoder在一个时间点上的hidden state, s: 大小为(hid dim2, 1)。此处两个hidden state的纬度并不一样。

  •         第一步:旋转H为(sequence length, hid dim1) 与 Wa [大小为 hid dim1, hid dim 2)] 做点乘, 再和s做点乘得到一个 大小为(sequence length, 1)的分数。
  •         第二步:对分数做softmax得到一个合为1的权重。
  •         第三步:将H与第二步得到的权重做点乘得到一个大小为(hid dim, 1)的context vector。

        这些好多是我整理的别处的资料,汇总起来做了大量的筛选,希望可以帮助到别人,互联网降低了我们信息获取的门槛,同时提高了我们筛选信息的门槛,希望大家努力都有回报

5、集束搜索----beam search算法  和 贪心搜索----greedy search算法

        在数学之美中曾介绍维特比算法,其根据自然语言句子生成的特性,利用动态规划方法,找到生成的最大可能性句子。但其同样存在弊端,如如果字典的长度非常大的话,那么查找的状态将会非常多,影响效率。而在句子生成中还有些如下方法:

        贪心搜索(greedy search):

                贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度。

        集束搜索(beam search):

                集束搜索可以认为是维特比算法的贪心形式,在维特比所有中由于利用动态规划导致当字典较大时效率低,而集束搜索使用beam size参数来限制在每一步保留下来的可能性词的数量。集束搜索是在测试阶段为了获得更好准确性而采取的一种策略,在训练阶段无需使用。

        对于MLE(极大似然估计--Maximum Likelihood Estimate)算法训练的模型,beam search只在预测的时候需要。训练的时候因为知道正确答案,并不需要再进行这个搜索。  假设字典为[a,b,c],beam size选择2,则如下图有:

        1:在生成第1个词的时候,选择概率最大的2个词,那么当前序列就是a或b

        2:生成第2个词的时候,我们将当前序列a或b,分别与字典中的所有词进行组合,得到新的6个序列aa ab ac ba bb bc,然后从其中选择2个概率最高的,作为当前序列,即ab或bb

        3:不断重复这个过程,直到遇到结束符为止。最终输出2个概率最高的序列。

        显然集束搜索属于贪心算法,不能保证一定能够找到全局最优解,因为考虑到搜索空间太大,而采用一个相对的较优解。而维特比算法在字典大小较小时能够快速找到全局最优解。

        而贪心搜索由于每次考虑当下词的概率,而通常英文中有些常用结构,如“is going”,出现概率较大,会导致模型最终生成的句子过于冗余。如“is visiting”和“is going to be visiting”。贪心搜索可以认为beam size为1时的集束搜索特例。

        可参见知乎上的回答:https://www.zhihu.com/question/54356960

        也可参见本网站的回答:https://blog.csdn.net/qq_16234613/article/details/83012046

6、self attention    |    transformer

        Wrapper--包装、包装材料

7、seq2seq进行机器翻译的代码--tensorflow

        参见:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值