时隔多年,我发现我写的和我一起构建搜索引擎系列是我的博客中访问量最高的内容,截至目前该搜索引擎的GitHub项目已经收获了上百个Star和Fork。这几天我又回顾了一下这个项目,并进行了部分的更新和修改,以及将该搜索引擎部署到了我的个人网站上,以便展示和外网访问。以下是我将搜索引擎部署到个人网站上的截图,大家可以访问 http://news.bitjoy.net/ 进行测试。
Continue readingCS224N(3.14)Future of NLP + Deep Learning
今天是该课程的最后一节课,介绍了使用未标注数据集进行NLP学习的方法,以及谈了谈NLP未来的发展方向。下面主要介绍使用未标注数据集进行NLP学习的方法。
我们知道,在机器翻译领域,特别缺少标注好的语料集。目前世界上有上千种语言,但用得最多的只有十几种。对于那些使用人数很少的语言,它们和其他语言之间标注好的翻译句子就更少了。如何使用少量标注集,甚至不用标注集,就能实现机器翻译功能,是NLP领域一个很有前景的发展方向。
之前的很多工作使用pre-training来提高机器翻译模型的性能。具体方法是,先在源语言和目标语言的语料集上分别训练一个语言模型,这是无监督的,这个语言模型可以学到不同词的含义。然后在翻译模型中,用源语言的语言模型初始化Encoder权重,用目标语言的语言模型初始化Decoder权重。使用pre-training的模型相比于不使用pre-training的模型的BLEU大概有2分的提高。
Pre-training的问题是,由于预训练是在两种语言上独立进行的,两种语言在预训练期间没有交互过程。
Continue readingCS224N(3.12)Bias in AI
今天介绍AI的偏见,本质上,AI的偏见由人类的偏见导致。
看到成熟的黄颜色的香蕉,我们不会说这是黄颜色的香蕉,我们只会说这是香蕉,而如果看到未成熟的青色的香蕉,我们会特别说明这是未成熟的香蕉,或者说这是青色的香蕉。所以我们通常说香蕉时,其实暗含了它是黄颜色这个属性。
原型理论(Prototype Theory)说的就是这个意思,原型理论认为,我们在定义事物,并且给事物分类时,把这类事物中最常见的状态或实体定义为这一类的原型(Prototype)。同属于这一类,但具有不同特性的实物,只需要对原型增加修饰词来说明即可。比如香蕉这个例子,成熟的黄色的香蕉就是香蕉这一类别中的原型,它具有常见香蕉最典型的特征,而未成熟的香蕉最大的区别是颜色,所以我们可以用青色的香蕉来表示这是未成熟的香蕉的意思。
Continue readingCS224N(3.7)Constituency Parsing, TreeRNNs
在开始今天的内容之前,给所有AI炼丹师的建议:
- 简化模型,使用最简单的词袋模型
- 使用很少的数据集进行训练和调试,比如就用10个样本,确保模型能够在10个样本上过拟合
- 确认模型没问题之后,增加模型的复杂度
- 画出训练集和测试集上的错误率变化曲线
- 如果一切都符合预期的话,增加L2正则和Dropout
- 搜索更优的超参数组合
明朝那些事儿(陆)——日暮西山
张居正死后,万历正式掌权。起初,万历还干点活,但是到后来就开始不理朝政了。而此时的首辅申时行又是个和事老,没啥真本事,朝廷被各种乱七八糟的事情搞得乌烟瘴气。下面列出其中三件事,见微知著。
第一件大事就是争国本。所谓太子者,国之根本,争国本就是皇帝和群臣因为册立太子的问题闹得不可开交。事情的经过是这样的,万历14岁的时候,张居正和李太后给他挑了个老婆当皇后,但这个皇后生不出儿子。后来,万历在后宫偶然临幸了一个姓王的宫女,该宫女生下万历的长子朱常洛。但万历并不喜欢这个宫女,那次临幸也只能算是万历一时冲动。万历真正宠幸的是郑贵妃,郑贵妃也很争气,给万历生下了三儿子朱常洵(二儿子夭折)。由于万历喜欢郑贵妃不喜欢王宫女,根据爱屋及乌定理,万历喜欢三儿子朱常洵不喜欢长子朱常洛。所以,万历一直想立朱常洵为太子。但是明朝历来都是立长子为太子,万历心里的小九九,群臣肯定不同意。为了拖延立太子的事情,万历死活不让朱常洛出阁读书,因为明朝皇子出阁读书就等于承认他是太子了。所以,一直到朱常洛十多岁了,他也没出阁读书,俨然一个失学儿童啊。群臣为了这个事情要死要活,要知道明朝的言官可是相当厉害,那时候言论自由,言官谁都敢骂。于是群臣前仆后继的给万历上书,要求早点让朱常洛出阁读书,并册立为太子,要不然就集体罢官回家,让你万历当光杆司令。万历也针锋相对,群臣要闹你就闹吧,大不了我不上朝,眼不见心不烦。可是,闹到最后没办法,万历终于在万历二十九年立19岁的朱常洛为太子,立朱常洵为福王。争国本事件告一段落。
Continue readingCS224N(3.5)Multitask Learning
今天介绍NLP中的多任务学习。
我们知道预训练和参数共享在CV中很重要,很多模型都会在ImageNet上预训练,然后迁移到具体的任务中进行微调。这种方式能够成功的原因是很多CV任务几乎都是以分类为基础任务,分类相当于CV的积木(building block),所以在ImageNet上训练的CNN分类模型迁移到其他CV任务中能起到很好的提升效果。
NLP中虽然也有一些预训练模块,比如预训练词向量,然后用到具体的NLP任务中,但也仅仅是将词向量作为下游模型的输入。在NLP中,并没有一个基础模型(包括模型的结构、权重等),能把整个基础模型迁移到下游任务进行微调,现在都是针对不同的问题设计专门的网络结构,比如POS、NER、NMT等,处于不同任务各自为政的局面。
Continue readingCS224N(2.26)Coreference Resolution
今天介绍的内容是指代消解(Coreference Resolution)。指代(mention)是指句子中出现的名词、名词短语、代词等,指代消解就是把指向同一实体(entity)的指代聚类到一起的过程。比如下面的两句话,蓝色的词就是很多的指代,需要找出来哪些指代是指向同一个实体。比如Barack Obama、his、He都是指奥巴马。
下面的例子是比较简单的情况,事实上,在真实的语言中,情况更加复杂,比如有些指代可能表示多个实体。比如“他们”,可能同时指代了“小明”和“小王”,这种指代对于现在的NLP模型来说比较难,暂时不考虑。
Continue readingCS224N(2.26)Natural Language Generation
今天要介绍的内容比较多,但都是概述性的内容,主要了解自然语言生成领域的进展。
Section 1: Recap LMs and decoding algorithms
之前已经讲过什么是语言模型,语言模型就是给定句子中的一部分词,要求预测下一个词是什么。形式化表述就是预测$P(y_t|y_1,...,y_{t-1})$,其中的$y_1,...,y_{t-1}$就是目前已知的词,$y_t$就是要预测的下一个词。
条件语言模型是指除了已知$y_1,...,y_{t-1}$,还给定了$x$,这个$x$就是提供给语言模型的额外的信息。比如机器翻译的$x$就是源语言的句子信息;自动摘要的$x$就是输入的长文;对话系统的$x$就是历史对话内容等。
需要提醒的是,语言模型在训练阶段,输入Decoder的是正确的词,这种方法被称为Teacher Forcing,即不论上一步的输出是什么,都强制给这一步输入正确的词。而如果在测试阶段,Decoder的输入是上一步的输出。
Continue readingCS224N(2.21)Transformers and Self-Attention For Generative Models
今天介绍大名鼎鼎的Transformer,它于2017年出自谷歌的论文《Attention Is All You Need》(https://arxiv.org/pdf/1706.03762.pdf),用Attention实现机器翻译模型,并取得了新的SOTA性能。
传统的机器翻译模型一般是结合RNN和Attention,可以看我之前的博客介绍:CS224N(1.31)Translation, Seq2Seq, Attention。虽然RNN+Attention的组合取得了不错的效果,但依然存在一些问题。由于RNN是序列依赖的模型,难以并行化,训练时间较长;且当句子很长时由于梯度消失难以捕捉长距离依赖关系。虽然相继推出的LSTM和GRU能一定程度上缓解梯度消失的问题,但这个问题依然存在。而且LSTM和GRU难以解释,我们根本不知道当前timestep依赖远的词多一点还是近的词多一点。
Transformer的思想很激进,它完全抛弃了RNN,只保留Attention,从其论文标题可见一斑。RNN无法并行化的根本原因是它的正向和反向传播是沿着句子方向(即水平方向),要想实现并行化,肯定不能再走水平方向了。于是,Transformer完全抛弃水平方向的RNN,而是在垂直方向上不断叠加Attention。由于每一层的Attention计算只和其前一层的Attention输出有关,所以当前层的所有词的Attention可以并行计算,互不干扰,这就使得Transformer可以利用GPU进行并行训练。
Continue readingCS224N(2.19)Contextual Word Embeddings
今天介绍几种新的词向量学习方法,在此之前,建议大家看看我关于word2vec或GloVe等传统词向量的介绍:CS224N(1.8)Introduction and Word Vectors。
传统词向量,比如word2vec,它在训练阶段学习到一个词的向量表示之后,在下游的各种NLP任务中,这个词向量不再变动了。也就是说传统词向量的特点是,对一个词只学习一个词向量,且在具体任务中固定不变。传统词向量有两个主要的不足:
1. 难以表达一词多义。一个词在不同的上下文语境中可能表示不同的含义,比如“苹果”在“苹果真好吃”和“苹果手机很好用”这两个句子中表示不同的含义,但word2vec学习到的“苹果”词向量只有一个,也就是说下游任务对于这两个句子用的是同一个词向量。虽然word2vec的词向量可能同时包含了这两个含义,但它把这两个含义糅合到一个向量中了,导致在“苹果真好吃”中可能引入了“苹果手机”的干扰因素,在“苹果手机很好用”中引入了“吃的苹果”的干扰因素。总之就是,word2vec学习到的词向量粒度较粗,向量固定不变,无法根据具体的上下文语境进行改变。
2. 难以表达不同的语法或语义信息。一个词,即使是同一个意思,在语法或语义上也可能充当不同的角色,比如“活动”这个词,既可以做名词、也可以做动词,既可以做主语、也可以做谓语等。但word2vec对一个词只给出一个词向量,无论这个词在句子中充当什么角色,词向量都是一样的。虽然word2vec训练时可能已经学到了一个词的不同语法或语义特征,但它把这些信息糅合到一个向量中了,也就是粒度较粗的问题。
其实上述两点暴露出来的word2vec的不足,本质上是同样的两个原因:1. 词向量是静态的,无法根据上下文进行调整;2. 词向量表示只有一个向量,糅合了太多信息,粒度较粗。
Continue reading