ERNIE Tutorial(论文笔记 + 实践指南)

ERNIE 2.0 发布了,刷新了 SOTA,而且中文上做了不少优化,这种大杀器作为一个 NLP 工程师我觉得有必要深入了解了解,最好能想办法用到工作中。

ERNIE 2.0 是基于持续学习的语义理解预训练框架,使用多任务学习增量式构建预训练任务。ERNIE 2.0 中,新构建的预训练任务类型可以无缝的加入训练框架,持续的进行语义理解学习。通过新增的实体预测、句子因果关系判断、文章句子结构重建等语义任务,ERNIE 2.0 语义理解预训练模型从训练数据中获取了词法、句法、语义等多个维度的自然语言信息,极大地增强了通用语义表示能力。

这是官方的描述,我觉得那张配图可能更加直观:

老习惯还是先理论再实践,所以看 paper 先,我们只看关键信息。

More

ChatBot 设计方案

最近公司有个客服机器人的需求,下午大概看了一下网上现有的一些方案,总感觉不是特别满意,而且整个 AI 圈子都透露出一点点的浮躁。其实对话机器人这个主题并不新颖,但对我来说,最早是在大学期间(2004-2008年)了,那时候的对话机器人都是基于模板的,印象很深刻有个网页版的机器人,名字叫 God,闲聊非常顺溜;再往后一点,记得在 2009 年看到的一篇文章,当时就特别想做一个,可惜不会写代码;然后就到了刚转行做技术的 2017 年,那时候有了 DeepLearning,也有了 RNN,于是就用对话语料自己训练了一个玩儿。

现在莫名其妙突然火起来我猜一方面是客服机器人确实解决了企业部分的需求;另一方面是这方面的技术更加成熟了。去看了一下发现虽然没有什么新东西(比如,意图理解是一个分类器,多轮对话是设计好的模板,甚至对话的生成也是基于模板),有点莫名其妙,可能还是得益于 NLP 基础技术不断取得的效果。还有一些借助知识图谱(又一个很早就提出最近突然火的东西)的客服机器人,看了几个项目,发现非常基础和简单粗暴,完全没有感觉到 AI 在哪里。感觉还不如三年前 memect 的 memect/kg-beijing: 北京知识图谱学习小组

冷静点看,现在的人工智能其实过于依赖数据,这究竟是聪明还是愚蠢只能见仁见智了。想想先哲们六七十年代从事 AI 所做的工作,直感觉汗颜不已,都是利益造就啊。有时候不得不感慨,人一旦对某一事物开始投入就会逐渐变得盲目,随着投入的不断增加会越来越盲目。经济学把这叫沉没成本,心理学上也有类似的研究,大家都把精力和金钱砸进来了,谁会说不好呢?明知道不好也要说好,还要继续增加投入,当然有些人纯粹是起哄或者薅羊毛。说的有点偏,倒不是说对 AI 没有信心,而是觉得被过于神化(人们总是喜欢一拥而上),在没有解决意识问题之前,它看起来再怎么 “聪明” 也就是个工具而已,对于一个工具自然应该以对待 “工具” 的方式去看。

言归正传,对话机器人既然有这么悠久的历史,我们当然不应该完全忽视先哲们的研究,所以我决定结合历史 AI 技术和现在新的 AI 技术,以自己的理解去做一个工业级别、开源的客服机器人系统。这篇文章要谈的就是机器人整个架构的设计以及背后的思想和逻辑。

More

Statistical Parsing Note (SLP Ch12)

One crucial use of probabilistic parsing is to solve the problem of disambiguation. CYK only represent them.

Probabilistic context-free grammar (PCFG) is the most commonly used probabilistic grammar formalism. Ways that improve PCFGs trained on Treebank grammars:

  • change the names of the non-terminals (sometimes more specific and sometimes more general)
  • adding more sophisticated conditioning factors, extending PCFGs to handle probabilistic subcategorization information and probabilistic lexical dependencies

Heavily lexicalized grammar formalisms:

  • Lexical-Functional Grammar (LFG) Bresnan, 1982
  • Head-Driven Phrase Structure Grammar (HPSG) Pollard and Sag, 1994
  • Tree-Adjoining Grammar (TAG) Joshi, 1985
  • Combinatory Categorial Grammar (CCG)

More

随笔:命运

最近新上映了《狮子王》,据说没有使用任何实景拍摄,纯电脑特效制作,这不免让人心里好奇:这到底能做成啥样子?就冲着这点买了票慢悠悠晃进了电影院。这部电影很久以前就看过了,久到已经记不起究竟有多久了,只依稀记得辛巴最后成功打败反派当上了国王,并和自己心爱的人快乐地生活着,就像格林童话的大结局一样。我本以为这次也是一样,却没想到竟引发了自己的一些思考。

辛巴的父亲在他很小的时候就告诉他,生命是一个循环,你有自己的责任;彭彭他们却告诉辛巴,生命是一条直线,只有一次,快乐至上。后者像个乌托邦,它看起来非常美好,前者就像这现实世界,遍地阴霾。辛巴最后还是回去了,回到了他自己的循环,也许他内心深处并不喜欢,但他必须这么做。刀疤一心向往权力,处心积虑,最后依然落入到他自己的循环,他的心底又作何感想?

电影是虚构的,但我们每个人的人生却是实实在在的。那么,我们又当如何,是否也处于自己的某种循环,终其生而不得解脱?我记得以前在知乎上看过一个问题:“为什么随着人的年纪增长会越来越相信命运?”当时觉得最好的一个回答是 “命由天定,运由自转”。有些人一出生就含着金钥匙,有些人却温饱问题不得解决,还有些人可能有各种生理缺陷;但随着时间的推移,也总有一些人在金钥匙下沉沦,而还有一些人在困境中逆袭,他们的结果是由自己的选择造就的。这个答案一直和我认为的保持一致,不过今天似乎有些动摇,前半句我依旧认同,但后半句我开始怀疑。因为我突然意识到,难道你努力了就一定能心想事成?爱迪生说 “天才是 99% 的汗水和 1% 的灵感,那 1% 的灵感至关重要” 也许说的是这个意思呢。听起来好像很沮丧,因为逆袭的好像就只有那 1% 的可能,芸芸众生谁能保证自己就一定是那 1% 呢?我又想起某位大亨曾说,他永远不会做出 100% 的保证,他要为那冥冥之中的不确定分配 1%。看来,我们好像终究跳不出命运的圈子,终究只是其中的一个部分,随着时间的流逝而烟消云散。有人可能觉得我太悲观,其实恰恰相反,我自己是乐观大于悲观的,这些感慨只是在描述一个客观事实。我无法接受自己明明认识到事实而选择对它视而不见。

其实,在想到这个问题的时候,我就开始思考该如何去面对这个现实。默认命运的安排显然不是我们想要的答案,它不但略显消极,而且马上就涉及到了另一个问题:默认之后该干什么?我首先想到的是:“听从内心的声音”,这是我从很多地方听到过的类似的回答,当我们对外界的纷纷扰扰迷茫的时候,要倾听自己心底究竟想要什么。我不否认这个答案的可取之处,但总觉得用这么轻飘飘一句话去解决我们所面临的问题有点过于轻率,以及有些逃避的感觉。我想自己可能忽略了一个大问题:“现实”,“内心的声音” 可能往往与现实相左,两者似乎经常有不可调和的矛盾。这可能来自这样一个事实:“我们总是倾向于渴求自己所没有的东西”,长得丑的想要变美,没钱的想要富有,愚笨的想要聪明……在现实面前,所谓 “内心的声音” 可能只是冬日里一杯苦涩的冷饮。进入而立之年,“无奈” 这个词经常会见到和听到,它意味着挣扎、妥协、屈从、酸楚,以及一点点的悲凉和痛苦。就像摁在地上被人强奸一样,只不过这人是 “生活”,是 “人生”,是那让人颇为无力面对的 “现实”。我思来想去,觉得可能只有唯一的一条出路:“面对现实,接受现实,改变自己”。现实是无论你怎么样它都在那里,所以我们不得不面对它、接受它,离开这一点的任何行为和想法都只能是空中楼阁。佛说,要接纳自己,也就是无论 “我” 是好的还是坏的,都是真实的 “我”,意思也是我们首先要做的就是接受这个 “真的我”。然后就是去改变自己,通过改变自己去改变自己的 “生活”,进而影响到别人。听起来结果好像和 “命由天定,运由自转” 没啥区别,但这里明显不同的是过程,从之前的被动变为现在的主动:“命由自转,运由天定”,在现实面前主动地调整自己,改变自己的命运,至于那缥缈不定的 “运” 则交给上天。此时,即便不是那 1% 我们依然可以人生无悔,我想起《古剑奇谭》中百里屠苏(也就是太子长琴)在生命尽头所说的一句话:“虽有遗憾,并无后悔”,也许这就是最好的人生了。退一步来说,这样的选择也许不会让你得偿所愿,但不这样做却根本没有可能。经济学中有个词叫 “帕累托最优”,就是说 “在有限资源的分配中,在没有使任何人情况变坏的前提下,使得至少一个人变得更好”,而这被证明是不可能的。命运或人生可能也是这样,我们有限的精力和时间只能用在一小块地方,无论如何总也不能处处满意。佛说,知足常乐,大意也是如此吧。而且,我甚至怀疑根本没有所谓的 “最优选择” 或者 “最优人生”,也许所谓的 “全局最优解” 只是我们自己的一厢情愿罢了。我们能做的可能只是在 “贪心” 和 “全局” 之间选择一个自己力所能及、适合自己的解吧。这也是我所能想到的最好的答案。

辛巴依然可以当自己的国王,即便他心里始终念念不忘乌托邦,他没办法放弃自己的王国而永远生活在那个理想世界,但他可以在现实世界实施仁政,他可以将心中的美好带给更多的人。可以肯定和他心中的那个不一样,但此时又有什么关系呢?至少他的选择改变了自己的命运,也影响了无数人的命运,且朝着最优的方向。

去做命运的掌舵人吧,即便你的生活充满艰难,至于结果,交给命运自己吧。

XLNet, Generalized Autoregressive Pretraining for Language Understanding Note

zihangdai/xlnet: XLNet: Generalized Autoregressive Pretraining for Language Understanding

XLNet 的核心思想:PermutationLM 使用双向上下文 + Transformer-XL 对架构进行改进。

Abstract

BERT 忽略了屏蔽位置之间的依赖关系,会有预训练和 Fine-tuning 效果的差异。

XLNet:

  • 通过最大化因式分解顺序所有可能排列的对数似然,学习双向语境信息。
  • 依靠自回归克服了 BERT 的缺点。

此外,XLNet 还将最先进的自回归模型 Transformer-XL 的思想整合到预训练中。

More

数据结构与算法:线性结构

上一章提到了数据结构的重要性,这章开始我们就逐步深入理解一下数据结构相关的内容。最常用也是最常见的数据结构都是线性结构,线性结构简单来说就是一条序列,中间有若干元素,“线性” 也是和后面要说的树、图相比而言的。

需要注意的是,数据在计算机中有两种物理存储方式,分别是链式存储和顺序存储,顺序存储是利用计算机中连续一块内存进行存储,链式存储利用指针指向不同的地址进行存储;而上面列出的这些数据结构都是逻辑结构,存储方式不同数据结构的实现方法和复杂度也不同,但效果是可以完全相同的。

存储方式和结构之间没有关系,任何一种结构都可以使用顺序或链式存储实现,要看具体的场景和目的。

More

《Elasticsearch 权威指南》之基础入门 Note(基于 7.x)

目录

为了搜索

Elasticsearch 建立在 Lucene 上,它不仅仅是一个全文搜索引擎:

  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

Install Elasticsearch with Docker | Elasticsearch Reference [7.2] | Elastic

  • docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.2.0
  • curl http://127.0.0.1:9200/_cat/health

  • curl 'http://localhost:9200/?pretty'

Running Kibana on Docker | Kibana User Guide [7.2] | Elastic

  • docker run --link YOUR_ELASTICSEARCH_CONTAINER_NAME_OR_ID:elasticsearch -p 5601:5601 {docker-repo}:{version}

  • http://localhost:5601

存储数据到 Elasticsearch 的行为叫做 索引,但在索引一个文档之前,需要确定将文档存储在哪里。

一个 Elasticsearch 集群可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性

More

Syntactic Parsing Note (SLP Ch11)

This chapter focuses on the structures assigned by context-free grammars. Context-free grammars don’t specify how the parse tree for a given sentence should be computed. We therefore need to specify algorithms that employ these grammars to efficiently produce correct trees. They are useful in applications such as grammar checking, semantic analysis, question answering and information extraction.

More