来源:Coursera吴恩达深度学习课程
本节先从定义符号(notation)开始一步步构建序列模型。
如上图,你想要建立一个序列模型,它的输入语句是这样的:“Harry Potter and Herminoe Granger invented a new spell.”,(这些人名都是出自于J.K.Rowling笔下的系列小说Harry Potter)。假如你想要建立一个能够自动识别句中人名位置的序列模型,那么这就是一个命名实体识别问题(Name entity recognition),这常用于搜索引擎(search engines)。
现在给定这样的输入数据x,假如你想要一个序列模型输出y,使得输入的每个单词都对应一个输出值,同时这个y能够表明输入的单词是否是人名的一部分。技术上来说这也许不是最好的输出形式,还有更加复杂的输出形式,它不仅能够表明输入词是否是人名的一部分,它还能够告诉你这个人名在这个句子里从哪里开始到哪里结束。比如Harry Potter、Hermione Granger。
更简单的那种输出形式:这个输入数据是9个单词组成的序列,最终用9个特征集合来表示这9个单词:
用x^来索引这个序列的中间位置。t意味着它们是时序序列(temporal sequences),但不论是否是时序序列,我们都将用t来索引序列中的位置。输出数据表示为:
输入序列的长度表示为T_x,在这里T_x=9,输出序列的长度表示为T_y,在这里T_y=T_x=9(输入序列长度和输出序列长度也可以不相等)。
还有一些符号,第i个训练样本的序列中第t个元素表示为:
第i个训练样本的输出序列的长度表示为:
第i个训练样本的输出序列中第t个元素表示为:
第i个训练样本的输出序列的长度表示为:
接下来我们讨论一下怎样表示一个句子里单个的词。
如上图,想要表示一个句子里的单词,第一件事是做一张词表(Vocabulary),有时也称词典(Dictionary),意思是列一列你的表示方法中用到的单词。这个词表(下图所示)中的第一个词是a,也就是说词典中的第一个单词是a,第二个单词是Aaron,然后更下面一些是单词and,再后面你会找到Harry,然后找到Potter,这样一直到最后,词典里最后一个单词可能是Zulu。
因此a是第一个单词,Aaron是第二个单词,在这个词典里,and出现在367这个位置上,Harry是在4075这个位置,Potter在6830,词典里的最后一个单词Zulu可能是第10,000个单词。所以在这个例子中Andrew用了10,000个单词大小的词典,这对现代自然语言处理应用来说太小了。对于商业应用来说,或者对于一般规模的商业应用来说30,000到50,000词大小的词典比较常见,也有100,000词,而且有些大型互联网公司会用百万词,甚至更大的词典。
如果你选定了10,000词的词典,构建这个词典的一个方法是遍历你的训练集,并且找到前10,000个常用词,你也可以去浏览一些网络词典,它能告诉你英语里最常用的10,000个单词,接下来你可以用one-hot表示法(representations)来表示词典里的每个单词。
举个例子,(1)在这里x^表示Harry这个单词,它就是一个第4075行是1,其余值都是0的向量(上图编号1所示),因为那是Harry在这个词典里的位置。(2)同样x^是个第6830行是1,其余位置都是0的向量(上图编号2所示)。(3)第三个单词and在词典里排第367,所以x^就是第367行是1,其余值都是0的向量(上图编号3所示)。(4)因为a是字典第一个单词,x^对应a,那么这个向量的第一个位置为1,其余位置都是0的向量(上图编号4所示)。
所以这种表示方法中,x^指代句子里的任意词,它就是个one-hot向量,因为它只有一个值是1,其余值都是0,所以会有9个one-hot向量来表示这个句中的9个单词,如果你的词典大小是10,000的话,那么这里的每个向量都是10,000维的。目的是用这样的表示方式表示X,用序列模型在X和目标输出Y之间学习建立一个映射。Andrew把它当作监督学习的问题(supervised learning problem),而且确信会给定带有(x,y)标签的数据。
注意一下,如果你遇到了一个不在你词表中的单词,答案就是创建一个新的标记,也就是一个叫做Unknow Word的伪单词,用<UNK>作为标记,来表示不在词表中的单词,我们之后会讨论更多有关这个的内容。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。