**背景:**近期,CV领域很多任务上都采用了transformer系列模型,自己也对这个原来主要用于处理时序信息的模型很感兴趣,所以开始对transformer的学习。由于很长一段时间都是做机器学习和CV,对于NLP相关的序列模型也只是当初入门深度学习的时候稍微学了一下,这里要学transformer,感觉还是有必要从RNN开始复习的,然后逐步到attention注意力机制,然后transformer(transformer 可以说就是attention 的另一个名字吧)
**文章内容:**整个文章首先介绍RNN,然后相应往后介绍GRU和LSTM,由于序列模型中处理文本数据,还需要将文本中的字或者词(一般是字,因为对于语言来说,字的总数往往远远小于词的总数)转换成计算机可以识别的数字(我们叫做词向量),词向量的产生需要用到一种叫word embedding的技术(也是用到一些模型,比如大家常见的word2vec),所以也会对word embedding进行介绍(最后再补,因为暂时不是重点,大家需要知道的是我们要将文本转换成向量才可以用,最简单的一种转换就是onehot)。 然后引出seq2seq,编码器解码器结构;然后由于种种缺陷,就有了attention注意力机制(能够关注我们更想要关注的地方,通俗理解可以说是有些字或者词对应的词向量的权重更大),然后就有了现在的transformer系列模型。
**下面的内容主要参考:**以吴恩达深度学习、动手学深度学习、Datawhale组队学习(基于transformers的自然语言处理入门)为主,李宏毅深度学习和邱锡鹏神经网络与深度学习为辅助。 另外如果参考了一些博客,我都会尽量把链接补上(如果有漏掉,可以告诉我补上,如果介意我也可以删去,感谢理解~)
一、循环神经网络(RNN)
其实在RNN之前,大家做自然语言处理(NLP)用的也是统计自然语言处理,就像很多机器学习一一样,主要基于概率模型。 对于传统概率模型来说,里面有一个关键点:n元语法。它是基于 阶马尔可夫链的概率语言模型。当 分别为1、2和3时,我们将其分别称作一元语法(unigram)、二元语法(bigram)和三元语法(trigram)。例如,长度为4的序列 在一元语法、二元语法和三元语法中的概率分别为:
当n较小时, 元语法往往并不准确。例如,在一元语法中,由三个词组成的句子“你走先”和“你先 走”的概率是一样的。然而,当n较大时, 元语法需要计算并存储大量的词频和多词相邻频率。(所以n权衡了计算复杂度和模型准确性。) 那么,有没有方法在语言模型中更好地平衡以上这两点呢?
这就引出了RNN, RNN就很好的解决了上述的弊端: RNN并非刚性地记忆所有固定长度的序列,而是通过隐藏状态来存储之前时间步的信息。
|