在探讨“苹果的Siri”和“亚马逊的Alexa”如何理解话语时,不得不提及一个在这些应用背后默默工作的算法——循环神经网络(Recurrent Neural Networks,简称RNN)。
当首次接触到RNN时,感到非常困惑。神经网络如何记忆信息?为什么在已经有了前馈神经网络和卷积神经网络之后,还需要RNN?经过大量的研究和努力,终于对这种算法有了一定的理解。在本文中,希望能够将知识分享给大家,以便在阅读实际的研究论文时能够感到轻松。
让从一个简单的问题开始:"love I go to the gym to"这句话对来说有意义吗?显然没有。现在读一下这句话:"I love to go to the gym",这句话就变得有意义了。单词顺序的轻微混乱使得整个句子变得难以理解。如果人脑都难以理解这种混乱的句子,那么计算机又如何能够编码这种句子呢?这将是一个非常困难的任务。
从上述例子中,可以了解到文本的顺序是非常重要的。那些顺序或序列重要的数据被称为序列数据。文本、语音和时间序列数据是序列数据的几个例子。
假设有一些板球运动员的评论,任务是预测这些评论是积极的还是消极的。在建立模型之前,第一步是将所有评论(文本数据)转换成机器可以理解的形式。可以使用各种技术,如独热编码或深度学习技术,例如Word2vec。
例如,句子1——"Sachin Tendulkar Legend of cricket",可以看到这句话总共有5个单词或标记。同样,句子2——"He is great"有3个单词,但是输入层的架构是固定的,为5。因此,没有直接的方法将这些数据输入到网络中。现在可能在想,为什么不将每个句子转换成与最长句子长度相等的长度,通过添加零来解决这个问题。是的,这可能解决了问题,但想想网络将有多少权重,它肯定会呈指数级增长。
假设句子的最大长度是10(这在现实世界的应用中是不现实的,它将大得多)。
假设语料库中的单词数量=10k(考虑到一个非常小的语料库)。
那么每个输入将变成100k维,并且只有10个神经元在隐藏层,参数数量就变成了100万!要有一个适当的网络意味着拥有数十亿的参数。为了克服这个问题,需要一个具有权重共享能力的网络。
这就是RNN发挥作用的地方。它们对序列的每个元素使用相同的权重,减少了参数的数量,并允许模型泛化到不同长度的序列。
在上述图表中,“折叠”部分代表神经网络,不是将整个句子传递给它,而是传递一个单词给它,这个单词将给一个输出。它还会产生一个激活函数,然后传递到下一个时间步,如图表所示。这两个图表表示的是同一件事。
让通过一个例子来理解这一点。假设正在进行一个“命名实体识别”项目,想要预测实体的名称。传递给模型的句子是“Chirag worked at Microsoft in India”。不是一次性传递整个句子,而是只传递第一个单词给模型。
这个RNN将接受一个输入激活,最初是一个零矩阵(它会逐渐学习),并给出一个输出激活函数,然后传递到下一个时间步。在t=2时,它将接受“worked”作为输入,并产生激活和输出。这里0意味着它不是一个实体。然后它将在t=3时接受第三个单词,它将继续重复这个过程,直到到达语句的末尾。
这里需要注意的几点是,这是通过时间重复的相同块,并且传递句子的顺序在这里很重要,例如,在上述图表中,预测“组织”不仅仅是考虑单词Microsoft,还考虑了到目前为止出现在句子中的所有单词,因为正在反复将激活函数传递到下一个时间戳。
许多到一个(Many to one):假设想制作一个模型,根据电影评论预测电影的评分(电影评分预测)。那么输出将始终是一个,即电影的评分,输入可以是任何大小,评论可以是任何长度。一些更多的应用是情感分析、情绪识别等。
一对一(One to many):一个例子可能是一个模型,其工作是根据给定的输入生成一个婴儿名字。例如,如果传递“男性”作为输入,那么模型应该生成一个男性名字,反之亦然。这里输入大小可以只有一个,输出大小可以是任何东西。需要注意的一点是,每个时间戳的输出也作为输入传递到下一个时间戳,这就是模型知道哪个字符首先发生以及产生哪个字符的方式。
多对多(Many to many):在语言翻译的情况下,输入大小可以是任何长度,输出也可以是任何长度。例如,英语到法语的翻译。在这里,只有当所有输入单词都传递后,才会生成输出(上述图表中的图4)。在这种类型的模型中,接受输入的第一部分被称为“编码器”,给出输出的第二部分被称为“解码器”,将在后面更多地了解这两个部分。
希望本文为提供了所需的基本直觉。在下一篇文章中,将了解这个模型在内部是如何工作的,将了解RNN中的反向传播是如何工作的,以及LSTM和GRU的详细描述。总之,学习了什么是序列数据,以及如何利用文本数据制作出像语音识别、图像字幕生成器等出色的应用。