前沿
本次笔记主要会描述NLP的相关知识,包括RNN,GRU,LSTM等模型;以及机器翻译的相关技术;Seq2Seq等。
由于对RNN接触不多,尝试记一些笔记会很凌乱,但是可以顺着知识线,按照给出的链接去自行阅读相关知识。
RNN的基础知识
关于RNN,也是老生常谈的网络结构了,为了提醒自己,补充一点小观点。下面是一些博客上讲解RNN的链接。
RNN
这篇文章比较概述性的讲解了RNN的一些基本知识。
除此之外,RNN是一个序列形的结构,在实现机器翻译的时候,或者句子简单的预测,都是有多个RNN构成的长序列。
上图显示了RNN的结构,在pytorch中有如下代码:
class RNNModel(nn.Module):
def __init__(self, hidden_size, vocab_size):
super(RNNModel, self).__init__()
self.rnn = nn.RNN(input_size=vocab_size, hidden_size=num_hiddens)
self.dense = nn.Linear(hidden_size, vocab_size)
def forward(self, inputs, state):
# inputs.shape: (batch_size, num_steps)
X = to_onehot(inputs, vocab_size)
X = torch.stack(X) # X.shape: (num_steps, batch_size, vocab_size)
hiddens, state = self.rnn(X, state)
hiddens = hiddens.view(-1, hiddens.shape[-1]) # hiddens.shape: (num_steps * batch_size, hidden_size)
output = self.dense(hiddens)
return output, state
这仅仅代表了一个RNN块,在机器翻译中,vocab_size表示了单词表的长度,按照以下举例,假如一个长度为26的词汇表,我们需要通过5个词汇来预测下一个词汇。那么vocab_size就为26。hidden_size就是RNN中h的部分,即使用了多少个隐藏单元。
假如在预测中,这5个词汇为[‘i’, ‘will’, ‘kick’, ‘your’, ‘ass’],我们就需要5个RNNModel,输入分别是将’i’转化为长度为26,对应词汇表位置为1,其余为0的向量。比如’i’在词汇表的排序为第3个,那么第一个输入为[0,0,1,0…]。我们可以按照下列公式写出训练的方式(假设整句话为"I will kick your ass !",output为[‘will’, ‘kick’, ‘your’ ‘ass’, ‘!’])。
这样,就形成了一个简单的RNN网络,我们把每次输入句子的长度n称为时间步长。
这样的简单RNN缺点很明显:
1.不适合长句子的使用,因为太长的传递容易遗忘之前的信息。这一点可以用其他RNN的变形来代替。
2.不适合于多对多的机器翻译。这里需要引入Seq2Seq的机制来处理。
RNN的改良结构
RNN的问题当然是容易出现梯度衰减和梯度爆炸。所以在此引入一种新的循环网络结构,即门控循环网络GRU。由于这不是一个理论性论文,就直接将其公式和结论拿出来。
我这里直接将一些讲的比较好的相关连接给出,人人都能看懂的GRU
,深度学习之GRU
总之大概是这么个东西
σ,tanh表示sigmoid和tanh激活函数,其中我们把图中的和成为重置门和更新门,他们的公式我就不写了,这样设计的作用是:
• 重置⻔有助于捕捉时间序列⾥短期的依赖关系;
• 更新⻔有助于捕捉时间序列⾥⻓期的依赖关系。
##LSTM
LSTM也有一大堆介绍了,这里给出一些帖子
LSTM通俗易懂版
LSTM的理解
按照图中从左到右的顺序,我们可以把这些逻辑运算分为遗忘门、输入门和输出门。
·经过第一个σ的运算为遗忘门,用来控制上一时间步的记忆细胞;
·经过第二个σ以及tanh的运算为输入门,输入门:控制当前时间步的输入
·最后一个σ运算的过程为输出门,控制从记忆细胞到隐藏状态。
其中的表示⼀种特殊的隐藏状态的信息的流动。
深度循环神经网络
深度也就是有多个隐藏层。假设RNN可表示为,那么深度也就是,表示有n个隐藏层的RNN。
双向循环神经网络
所谓双向就是考虑一个输入的正向和反向信息,然后累加训练得到的信息。比如输入的信息是[“1”,“2”,“3”,“4”,“5”],按照这个循序训练有一个结果,再按照[“5”,“4”,“3”,“2”,“1”]的顺序训练一遍,结果为,与通过计算得到结果。
机器翻译
前期工作
假如我们想采用英译法的形式,我们就必须找到两者对应的词汇信息,如下图所示
这样,英语和法语各自可以建立一个词汇表,我们除了文本中的对照词汇外,还需要列举文本中不存在的词语,比如’bos’, ‘eos’, ‘padding’, ‘unknown’,分别作为句子的开始符,结束符,补足符,未知词语。一般他们四个词语作为词汇表的第1,2,3,4个单词。
Seq2Seq
Seq2Seq模型是输出的长度不确定时采用的模型,一般在机器翻译的任务中出现。
seq2seq属于encoder-decoder结构的一种,这里看看常见的encoder-decoder结构,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码,如下图,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C(thought vector)。
这篇文章介绍的比较易懂,给出连接:Seq2Seq模型概述
简单来说就是用定长的输入得到不定长的输出。下图也是人家博客中的图,贴在这里方便理解。
由"Are you free tomorrow?“这四个字符,得到"Yes, what’s up?“这三个字符。
训练方法
以上简单介绍了Seq2Seq是个什么东西,在真正进行翻译操作的时候,有许多小问题,比如训练的时候,原始句子和翻译句子的长度必须固定,如若不然则无法有效的批量训练,进而无法从统计角度进行参数调节。办法是,假如我们的句子固定的输入长度为8,输出长度也为8,那么,我们就对我们的句子进行填补操作。还是用上面的例子"Are you free tomorrow?”,被我们填补为"Are you free tomorrow? ‘padding’ ‘padding’ ‘padding’ ‘padding’”, 假如翻译法语为“Es tu libre demain?”,就需要填补为"‘bos’ Es tu libre demain? ‘eos’ ‘padding’ ‘padding’"。将所有小批次中的句子变成8到8的长度进行翻译训练。
同时,我们还需要保证原来的有效长度,这部分才是真正用于求损失的部分,上述翻译过来的法语句子加上开始符和结束符,一共有6个有效长度,那么我们的交叉熵损失的长度本来为8,就要将后两个loss变为0,保留前面的6个loss作反向传播。
然后我们就可以将以上得到的输入输出分别作为Seq2Seq中,Encode的输入,和Decode中的输入和输出。由Decode得到loss反向传播。
集束搜索
在测试中,我们通过之前训练好的网络,通过输入到encode,得到隐藏状态,通过和,训练得到第一个字符和隐藏状态,随后的过程如下所示:
这里存在一个问题,Y的选择是根据概率选择而来的,但是时候某一个词汇概率最高却并不一定带来最好的效果,要考虑到整体的概率最高。这里就要尝试一些搜索的方法。
集束搜索是一种类似贪心算法的搜索方法,有一个参数n表示当前保留多少个最优情况,当n=2时,若有一个输出情况为[0,6, 0.3, 0.05, 0.02, 0.03],就同时保留[1, 0, 0, 0, 0]和[0, 1, 0, 0, 0]代表的词汇,将这两个词汇分别作为输入,再进行搜索,在两种情况的搜索下,保留概率最高的值作为下一次的搜索。如下图所示。
注意力机制
背景
解码器在各个时间步依赖相同的背景变量(context vector)来获取输⼊序列信息。当编码器为循环神经⽹络时,背景变量来⾃它最终时间步的隐藏状态。将源序列输入信息以循环单位状态编码,然后将其传递给解码器以生成目标序列。然而这种结构存在着问题,尤其是RNN机制实际中存在长程梯度消失的问题,对于较长的句子,我们很难寄希望于将输入的序列转化为定长的向量而保存所有的有效信息,所以随着所需翻译句子的长度的增加,这种结构的效果会显著下降。
与此同时,解码的目标词语可能只与原输入的部分词语有关,而并不是与所有的输入有关。例如,当把“Hello world”翻译成“Bonjour le monde”时,“Hello”映射成“Bonjour”,“world”映射成“monde”。在seq2seq模型中,解码器只能隐式地从编码器的最终状态中选择相应的信息。然而,注意力机制可以将这种选择过程显式地建模。
方法
注意力机制的方法我还没有详细掌握,需要编码实现一层,所以在这里先贴上别人的文章,等自己实现后再进行补充。
基本思路是通过decode部分于encode部分进行互动,encode中,每个隐藏状态的加权分数,分数利用softmax变为概率,概率乘上对应的隐藏状态,进行第二次输出隐藏状态,确定下一次decode的输出。
机器翻译中的注意力机制
注意力机制
图解神经机器翻译中的注意力机制
Transform
背景
在之前的章节中,我们已经介绍了主流的神经网络架构如卷积神经网络(CNNs)和循环神经网络(RNNs)。让我们进行一些回顾:
CNNs 易于并行化,却不适合捕捉变长序列内的依赖关系。
RNNs 适合捕捉长距离变长序列的依赖,但是却难以实现并行化处理序列。
为了整合CNN和RNN的优势,transformer——Attention is all your need 创新性地使用注意力机制设计了Transformer模型。该模型利用attention机制实现了并行化捕捉序列依赖,并且同时处理序列的每个位置的tokens,上述优势使得Transformer模型在性能优异的同时大大减少了训练时间。
具体方法
相关的其他讲解文章如下:
The Inllustrated Transformer
transformer代码解析
(未完待续。。。)
来源:CSDN
作者:fatekong
链接:https://blog.csdn.net/fatekong/article/details/104319354