Zhao Li https://livc.io 2017-11-20T06:25:34+00:00 livc@outlook.com Ubuntu 安装 NVIDIA 显卡驱动 https://livc.io/blog/198 2017-11-11T00:00:00+00:00 Zhao Li https://livc.io/blog/198 在 ubuntu 上可以选择安装开源的 Nouveau 显卡驱动,英伟达官方的并不开源,根据统计一般闭源的显卡驱动效果要比开源的好。

Ctrl+Alt+T 打开终端,先卸载已安装的驱动并重启。

sudo apt-get purge nvidia*  
sudo reboot  

在 NVIDIA 官网查找适合自己显卡和操作系统的最新驱动版本(http://www.nvidia.cn/Download/index.aspx?lang=cn),假如是 nvidia-361

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-361
sudo reboot

Reference

  • https://askubuntu.com/questions/735572/how-to-install-nvidia-geforce-gtx-960-driver/735580
  • http://www.expreview.com/25231.html
  • https://www.howtogeek.com/242045/how-to-get-the-latest-nvidia-amd-or-intel-graphics-drivers-on-ubuntu/
]]>
ImprovMX:域名邮箱的无痛转发 https://livc.io/blog/197 2017-11-01T00:00:00+00:00 Zhao Li https://livc.io/blog/197 很多人都拥有自己的域名,使用自己的域名邮箱是一件很酷的事情。现在阿里和腾讯等邮箱服务商都推出了企业邮箱,也有 ZohoYandex 等国外服务商提供的域名邮箱,甚至可以使用开源的实现在 VPS 上搭建邮箱服务。但最便捷的方式还是使用 ImprovMX 这类通过设置 DNS 解析的邮件转发服务。

ImprovMX 的使用非常简单,首先向 DNS 中添加两条MX 记录,下面对很多常用的服务商的 DNS 设置给出了详细教程,然后填入域名和被转发到的邮箱地址即可。

设置完成后,所有发往 *@livc.io 的邮件都会被转发到记录的邮箱,但 ImprovMX 的缺点也很明显:

  1. 不能修改填入的邮箱地址
  2. 不能使用域名邮箱回邮件
  3. 转发速度非常慢!!!一两个小时算快的。

也有一些类似的服务比如 https://forwardmx.io 也是做类似的事情,不过是收费的。

另外最近才知道,对于邮箱前缀,livc 和 l.ivc 和 li.vc 和 liv.c 和 li…vc 等,加不加点都是一样的,同样地对于加号,如果前缀是 livc+cn, livc+us 等,他们和 livc 是等效的,参考 https://www.v2ex.com/t/235567

]]>
The Inside-Outside Algorithm https://livc.io/blog/196 2017-10-28T00:00:00+00:00 Zhao Li https://livc.io/blog/196 上篇文章中介绍了一种 parsing 算法 CYK,这篇文章要介绍的 inside-outside 是另一个 parsing 算法。

算法输入

  • 一句话
  • 满足 CNF 的 CFG
  • potential function

什么是 potential function?

对于一个规则 ,使用 代表这个规则的 potential,在这里也就是概率:

因此对于一个 parse tree t ,它的概率为 .

算法输出

表示所有可能的 parse tree 的概率和

对于所有规则 , 定义

也就是所有包括规则 的 parse tree 概率和

以及对于

也就是所有parse tree 中,以 为根节点,叶节点扩散到 这些单词的子树的概率和

我们使用 分别代表 inside 和 outside 算法。

Inside

inside 算法实际上就是把 CYK 中对所有 parse tree 取最大概率的操作换成了求和

以这个 parse tree 为例:

它关于 的 inside tree 就是

同样地,outside tree

这个 outside tree 根节点是 ,叶节点是

易知

Outside

由上述定义知,对于一个 outside tree ,它的 potential 为 ,也就是这个 tree 里所有规则的乘积。

我们使用符号 来代表所有可能的 outside tree 的集合(以 为根节点,扩散到 之间的所有单词),那么

也就是说, 是所有 中 potential 的和。

根据上述定义推出一些性质:

Inside-outside 算法的全部过程如图:

PCFG 中的 EM 算法

掷硬币中的 EM 算法中我们介绍了 EM 算法,EM 算法在 PCFG 中起着非常重要的作用,它的实质是参数的更新。

算法的输入有 个训练样本(n 句话),例如 代表第 个样本中的第一个单词。

为第 轮迭代时所有可能的 parse tree, 为规则 的参数(概率),

初始 可以设为随机值,然后算出 直到收敛。

的更新过程如下,首先需要算出在 次迭代时 下的 expected counts ,那么 就能求得:

那么如何计算 呢?

Expected Counts

为规则 出现在 中的次数, 是代表所有规则概率的 vector,那么有

第一个求和代表所有的训练样本,对于每个训练样本,再求和所有可能的 parse tree。对于每个 parse tree,将条件概率与 count 二者相乘。

因此对于单个训练样本,

可以使用 inside-outside 算法计算 ,如图:

References

]]>
CYK Parsing https://livc.io/blog/195 2017-10-28T00:00:00+00:00 Zhao Li https://livc.io/blog/195 介绍 PCFG 这篇文章中,我们提到了 parsing。parsing 的任务是根据 grammar 找到句子对应的合适的 parsing tree:

本文介绍的 CYK 算法就是寻找 parsing tree 的一种动态规划算法(CYK 是三个人名字的首字母)。

Chomsky Normal Form

CYK 算法要求使用的 grammar rule 必须遵守 Chomsky 范式(Chomsky Normal Form, CNF):

实际上,任何由上下文无关语法都能由重写规则为 CNF 的语法生成,比如:

可以被重写为下面的 CNF 规则:

因此,CNF 保证了其对应的 parsing tree 是二叉树。

下图是一个 CNF 重写示例:

CYK Algorithm

输入:满足 CNF 的 PCFG ,一个句子 ,其中 代表第 个词。

输出为:

也就是 parse tree 概率最大的那句话(以及 parse tree 结构)。

定义 为以 为 parse tree 根节点,扩充到 [i,j] 这几个词所有可能的 parse tree 集合,定义 为其中概率最大的 parse tree 对应的概率,那么我们实际上要求的就是

CYK 算法是自底向上的,因此对于 时,有

也就是为最底层与单词有关的规则的概率做初始化,这很容易理解,接下来就是 DP 算法中的状态转移方程:

其中 满足

这个方程的意思是说,如果存在 这条规则并且 能扩散到 两个词, 能扩散到 两个词,这样就包括了整句话,因此以 为根节点的 parse tree 的概率也能够求得,由于可能有多种可能,因此要取最大值。

这里有一个 CYK 算法的在线 demo,CYK demo

整个过程的伪代码如图:

References

]]>
概率上下文无关语法(PCFG) https://livc.io/blog/194 2017-10-27T00:00:00+00:00 Zhao Li https://livc.io/blog/194 在 NLP 任务中,我们可以根据一组 grammar 规则来生成一个句子。

下面这个 grammar 例子表示,一个句子能够由名词短语 I 和动词短语 want a morning filght 组成;名词短语能够由代词 I 组成,或由名词 Los Angeles 组成等。

Context-Free Grammar(CFG)

什么是“上下文无关”?

考虑下图这个 parse tree(语法树):

我们来模拟一下这句话生成的过程:

  1. S NP VP
  2. S NP VP DT NN VP
  3. S NP VP DT NN VP the NN VP
  4. S NP VP DT NN VP the NN VP the man VP
  5. S NP VP DT NN VP the NN VP the man VP the man Vi
  6. S NP VP DT NN VP the NN VP the man VP the man sleeps

在第一步到第二步时,DT 和 NN 的生成只与 NP 有关(根据 NP DT NN 这条规则),而与 VP 无关,也就是说,所有规则的左侧只有一个符号,这种形式称为上下文无关

CFG 定义

CFG 由一个四元组 组成。其中,

  • 是 non-terminal 符号的集合,理解为语法树中的非叶节点(S、NP……)
  • 是 terminal 符号的集合,也就是各个单词(叶节点 the、man、sleeps)
  • 代表 grammar 中的规则,如 S NP VP
  • 代表开始的标记,也就是语法树的根节点

上面例子的语法树是根据下面这个 grammar 生成的。由一句话和一个 grammar 生成 parse tree 的过程叫做 parsing。在这里由于句子是由 grammar 生成的,这种建模方法也被称为 generative grammar。

现在我们使用这个 grammar 来生成这样一句话:the man saw the dog with the telescope,会产生什么样的 parse tree 呢?

看,两个 parse tree 都是有效的,但却是两种语义。为了解决这种歧义的现象,我们在 CFG 中引入了概率的概念。

Probabilistic Context-Free Grammar(PCFG)

给定一个上下文无关语法 ,称 为 grammar 下的所有 parse tree 的集合,简写为 。那么就有

因此如果知道了概率分布 ,那么我们就可以通过排序找到一句话最有可能的 parse tree。

PCFG 定义

  1. 一个上下文无关语法

  2. 对应每个规则 的概率为 ,实际上这是在给定 为规则左侧符号时, 这条规则的条件概率。因此在任意 时,有

因此,如果一个parse tree 包含这些规则,那么 在 PCFG 下的概率为

上图为一个 PCFG,可以验证其满足

如果 parse tree 是这样:

那么这个parse tree的概率就是

References

]]>
掷硬币中的 EM 算法 https://livc.io/blog/193 2017-10-23T00:00:00+00:00 Zhao Li https://livc.io/blog/193 EM(expectation maximization)算法是一种用来对概率模型中不完整数据集做参数估计的方法。

假设有两种硬币 A 和 B,用 来表示硬币 A 正面朝上的概率,则 为其背面朝上的概率。 同理。

重复下列步骤五次:

  1. 从两个硬币之间随机选择一个。
  2. 将这枚硬币掷十次。

结果以下图为例(其中 H 代表正面朝上,T 代表背面朝上):

根据这个结果我们可以很轻松地算出 。实际上这也是最大似然估计(Maximum Likelihood Estimate,MLE)的思想:为什么掷 A 硬币 30 次,偏偏出现了 24 次正面和 6 次反面而不是其他结果呢?肯定是这种结果出现的概率最大,那么再去求使这个结果出现概率最大的参数

在这个问题中所有与模型相关的随机变量(硬币的种类、掷硬币的结果)都是已知的,因此我们称这种参数估计是建立在完整数据集上的。

现在加大难度,假如我们不知道每次取出的硬币是 A 还是 B 呢?

这时硬币的种类就是一个隐变量(hidden variable),我们设计了一个迭代模式来求解。

  1. 设定初始参数
  2. 计算每次选择的是硬币是 A 还是 B

这时我们就可以像之前一样计算出 了,然后重复执行这两步,直到收敛。如下图:

  1. 假设 A 和 B 正面朝上的概率分别是 0.6 和 0.5,开始执行掷硬币
  2. 第一个硬币 10 次中有 5 次正面和 5 次反面,那么对于这个硬币是 A 的可能性为 0.6^5*0.4^5,是 B 的可能性为 0.5^5*0.5^5,二者按比例计算得出这枚硬币是 A 的可能性为 0.45,是 B 的可能性为 0.55,那么在这 5 次正面中,可以认为 A 为正面有 5*0.45=2.2 次,B 为正面有 5*0.55=2.8 次,以此类推。
  3. 求出新的
  4. 重复上述步骤至收敛

第二步实际上是补充了缺失的数据,然后计算概率分布,被称为 E-step;然后估计模型参数,被称为 M-step。

Reference

What is the expectation maximization algorithm?

]]>
汉字屋论证与人工智能哲学 https://livc.io/blog/192 2017-07-03T00:00:00+00:00 Zhao Li https://livc.io/blog/192 1950 年图灵提出了著名的“图灵测试”,成为“人工智能之父”,以图灵为原型的电影《模仿游戏》也被搬上荧幕。“图灵测试“是人工智能哲学方面第一个严肃的提案,因为”智能“这一概念并没有一个明确的定义。

图灵去世两年后,在 1956 年美国达特矛斯学院的会议上,麦卡锡提出了“人工智能”这一概念。与会的几位元老(麦卡锡、马文·闵斯基司马贺(赫伯特·西蒙)、艾伦·纽厄尔)之后全部获得图灵奖,其中司马贺同时获得了图灵奖和诺贝尔经济学奖,闵斯基对哲学也非常有研究。会议上讨论的内容有自然语言处理、人工神经元网络、计算理论以及机器的创造性等非常前沿的课题。这些人随后在各个高校内建立起研究中心,引领着人工智能几十年的研究方向。


“人工智能”命名者 麦卡锡

美国社会涌现出很多在多个学科都很有造诣的学者,比如丹尼尔·丹尼特,既是哲学家又是认知学家,对计算机也非常有研究。这类学者在交叉学科之间的贡献使得美国社会的研究非常有活力。在我的读书笔记《硅谷之谜》中也介绍了跨界人才对美国社会的影响力。然而国内社会对此的宽容和认识还远远不够,比如前几天在听罗永浩和罗振宇的访谈节目,期间罗永浩就提起他在创业初期,很多人质疑“一个当老师的怎么可能做好手机?”其实学会欣赏和接受跨界、跨学科人才,并努力成为全才、通才,会对很多研究和思想带来启发。

话题稍扯远了,那么人工智能是怎么和哲学产生关系的?图灵的问题“机器会思考吗”的答案是什么?为什么人工智能科学需要哲学的参与?

这就要从“智能”的定义说起。

人工智能与哲学

定义分歧

什么是”智能“?

在“图灵测试”被提出后,对于”智能“有两种比较普遍的认识。

第一种可以理解为“白盒派”,他们认为“智能”就是对于所有可能的情况,都有应对的方法。这有点像诸葛亮交给赵云的三个锦囊,告诉他什么时候打开第几个,整体看起来类似一个流程图。

第二种对“智能”的理解为“黑盒派”,他们认为人工智能需要模拟人工大脑,因此可以不管人脑在想什么,把输入和输出的映射关系对应好就可以了。

因此,人工智能学科对于“智能”的定义还是有比较大的分歧的,这种分歧几乎和哲学有的一拼,因为哲学里也确实存在着“哲学应该研究什么”的重大分歧。这是人工智能可以和哲学交流的一个重要道理。

见仁见智

在物理等自然学科中,我们可以通过做实验来验证一个猜想是否正确,一个概念是否存在。比如“以太理论”通过实验被科学界抛弃,伽利略比萨斜塔实验验证自由落体等等。在这些学科中,可以通过一个大家都信服的实验证据来证明某一个假设是错的。然而在人工智能学科中,不做实验只做试验,从这一点上看它更像是工科,而不是理科。

一个人工智能系统是否智能,是否满足人们需求,这是一个仁者见仁智者见智的问题,是一个社会学标准和人类学标准的事情,并没有客观的标准或绝对的答案。这里面的思辨成分和哲学很像。举个例子,最近看见有人在群里问“百度的内容推荐也挺不错的为啥干不过头条?”,但是他可能不知道百度首页在内网几乎天天被骂……

尚未成熟

人工智能这门学科至今也才只有六十岁,它的发展还很不成熟,各路研究彼此竞争,各有优势,这在一定程度上又扩大了哲学在其中的表演舞台。因为如果一个学科非常成熟,大家没有什么内部争论,那么哲学家插话的机会很少。只要他们乱了,哲学家就会浑水摸鱼,乱中取胜。

与“图灵测试”的家喻户晓相比,哲学家塞尔提出的“汉字屋实验”倒是了解的人比较少。他认为既是计算机通过了图灵测试,也是依然没有智能的,不管你是真比我强还是看起来比我强,我依然有理由认为你没有我强。这样他自认为一劳永逸地终结了这个话题,然而很多人纷纷跳出来反驳他的论证。

在了解汉字屋实验之间,我们需要先了解一个概念前提,就是强 AI 和弱 AI 的区分。

强人工智能与弱人工智能

  • 强人工智能:计算机不仅仅是人们用来研究心灵的一种工具,被恰当编程的计算机本身就是一个心灵,具有心智。如果直观上认为计算机只是个工具,那是因为它没有被恰当地编程,只要它被恰当地编程,那么它就具有心智。
  • 弱人工智能:计算机只能模拟人类的心智,本身并不是人类心智的组成部分。

塞尔认为弱 AI 是正确的,强 AI 是错的

那么他的论证框架是什么呢?他的大前提是:每一种真正的心灵或智能都必须有能力在符号与对象之间建立起一种语义关系。比如知道红色是红色,绿色是绿色,水是那种能喝的东西。小前提是这种符号和对象之间的语义关系无法通过任何一台被恰当编程的计算机所获取。结论:计算机本身不可能具有真正的心灵,因此强 AI 无法实现。

塞尔的汉字屋实验就是用来证明小前提是对的。汉字屋实验是一个“思想实验”,是通过使用想象力去进行的实验,所做的都是在现实中无法做到或未做到的实验。著名的思想实验是爱因斯坦的“双生子佯谬”和莱布尼茨的“磨坊论证”。

汉字屋实验

汉字屋实验的初始条件是,一个对汉语一窍不通,只说英语的人关在一间只有一个开口的封闭房间中。房间里有一本用英文写成的规则书,指示该如何处理收到的汉语讯息及如何以汉语相应地回复,比如说写着“收到‘你吃了吗’的卡片就把 899 号卡片递回去,899 号卡片上写着‘我吃过了,那你呢’”。房外的人不断向房间内递进用中文写成的问题。房内的人便按照规则书的说明,查找到合适的指示,将相应的中文字符组合成对问题的解答,并将答案递出房间。

最后,汉字屋外面的人分辨不出屋内的人是否真的懂汉语。那么屋内的人算不算真的懂汉语了呢?

塞尔认为显然屋内的人不懂汉语。尽管房里的人可以以假乱真,让房外的人以为他确确实实说汉语,但是他却压根不懂汉语,因为他不可能通过完成这种输入和输出的传递工作理解任何一个汉语词汇。所以就算将来计算机真的聪明到这个地步了,它也不可能具有智能。

塞尔预设,汉字屋系统和计算机系统有一个很强的对应关系。在上述过程中,房外人的角色相当于程序员,房中人相当于计算机,而规则书则相当于计算机程序:每当房外人给出一个输入,房内的人便依照手册给出一个答复(输出)。而正如房中人不可能通过手册理解中文一样,计算机也不可能通过程序来获得理解力。既然计算机没有理解能力,所谓“计算机有智能”便更无从谈起了。计算机即使能够恰当地应答所有的人类语言提出的问题,它也没有办法真正地理解人类的语言。

塞尔的汉字屋实验从某种程度上是图灵测试的衍生版本,图灵认为计算机能否通过图灵测试是计算机是否具有智能的关键指标,而塞尔的观点相反,他认为即使通过了关于汉语的汉字屋实验,计算机依然没有智能。

但是这个论证并没有说服大多数的哲学家,那么大家是怎么反驳他的呢?

1. 他心应答

他心应答:假如我要判断你塞尔这个人懂不懂英语,如果按照汉字屋的论证,我不是你,我怎么知道你是否真的懂英语?你给我的只是那些看似懂英语的表现,有一种可能你根本不懂英语,在你脑中有一个小人接受了这些信息,按照一个手册(规则书)知道应该把哪些英文输出,让我误以为你懂英文。

按照这个思路,可以用汉字屋论证去怀疑身边任何一个人是否懂任何一种语言,这和塞尔论证的初衷是不一样的。塞尔论证的初衷是为了显示人和机器不一样,人比机器要高明,但是这个论证实际上把人也给灭掉了,因此论证失败。

正因为我们没有人愿意接受这样一种很疯狂的观点,认为人本身都是不懂任何语言的,所以我们用来捍卫人的标准也可以用来捍卫机器:既然我们判断人是否懂英语的标准是判断是不是有一个恰当的输入输出关系,那么我们用来判断机器是否懂语言的标准也应该是这样。

2.以偏概全

第二种思路认为,我承认汉字屋中的人是不懂汉语的,但是类比的计算机系统不仅仅只屋内的人,还包括了规则书,和规则书上的文字等等,这些构成了一个系统,整个系统是懂汉语的。按照这个思路,塞尔犯了“以偏概全”的问题,不能因为整个系统中的一个成员不懂汉语就推出整个系统不懂汉语。

上述两种思路都首先认可了塞尔所说的汉字屋系统的有效性,及汉字屋系统和计算机系统之间的同构关系,整个论证才得以进行,然后加以辩驳。但有的人认为,塞尔在很根本的问题上就开始错了。

3.自我矛盾

塞尔原始设想中有三个预设:

  1. 汉字屋系统与计算机系统之间是同构的。
  2. 即使整个汉字屋系统能够通过汉语测试,汉字屋中的人也不懂汉语。
  3. 我们不能从系统的外部行为特征中判断其内部是否具有智能。

实际上,这三点之间存在矛盾,我们可以使用反证法来论证:

  1. 汉字屋系统和计算机系统之间存在着实质性的可类比关系。
  2. 汉字屋论证的有效性,必须以 1 为必要前提。
  3. 汉字屋论证的一个核心目标是,一个系统在外部行为上具有语言智能,并不能代表其真的具有智能(即我们不能从系统的外部行为特征中判断其内部是否具有智能)。
  4. 由于1,汉字屋中规则书对应于计算机系统中的程序。
  5. 假设系统硬件条件不变的情况下,AI 系统智能程度的高下关键在于如何编写程序,不执行任何程序的纯硬件没有任何智能。
  6. 由于 4 和 5 ,整个汉字屋系统通过汉语测试的能力的高下取决于规则书的编制水平,而屋中的人本身是谈不上智能的,他必须要执行某种程序才能体现出这种程序的智能。
  7. 即使整个汉字屋系统能够通过汉语测试,汉字屋中的人也不懂汉语。

那么为何认为 7 是正确的呢?逻辑上只有两种可能性(关键的一步):

8A :屋内的人具有某种内部思考能力,以确定自己不懂汉语。这是塞尔会认为 7 的第一个道理。

8B:我们可以从屋内人的外部行为中确定他不懂汉语。

8A 和 8B 分别是从内外两个视角分析,因此含盖了所有可能性。

9.若 8A 是真的,那和 6 矛盾,因为屋内人的内部思考能力的存在就等于说他可以执行一个独立于规则书的程序。

10.若 8B 是真的,则和 3 矛盾。

11.因此塞尔没有理由说明 7 是正确的,这导致了整个汉字屋论证的崩溃。

12.总之,为了维护“屋中人也不懂汉语”这个步骤的有效性,我们要么否定汉字屋系统和计算机系统之间的类比的有效性,要么就要放弃整个论证的反行为主义目标。无论如何,这都会导致整个汉字屋论证的崩溃

因此,塞尔的汉字屋类比是不太成功的,他过多地把自己的直觉牵扯到了这个类比里面,没有看清楚这种类比是有缺陷性的。

那么,塞尔的汉字屋实验到底有没有驳倒了图灵测试呢?这个问题和其他许多哲学问题一样,仁者见仁,智者见智。总之,汉字屋实验吸引了世界上最优秀的哲学家们的讨论和思考,对推动哲学和人工智能科学的发展有着不可磨灭的贡献。

那么你的观点呢?

Reference

复旦大学公开课:人工智能哲学

]]>
Image Caption 评价标准——ROUGE https://livc.io/blog/191 2017-06-18T00:00:00+00:00 Zhao Li https://livc.io/blog/191 符号定义请参考 https://livc.io/190#符号定义

ROUGE

ROUGE 是用来评估文本摘要算法的标准集合。其中有三个评价标准分别是:

ROUGE-N

是第一个 ROUGE 标准,给定候选(candidate)句子,对于所有的参考(reference)摘要,它计算了一个简单的 -gram 召回:

其实它和 BLEU 挺像的,很好理解。

ROUGE-L

是基于最长公共子序列(LCS)的度量方法。LCS 是同时出现在两个句子中且顺序相同的一组词。将两个句子的 LCS 长度记为 通过计算 F-measure 来生成:

LCS 的召回率为:

准确率为:

其中, 一般设置为 1.2。由于使用 LCS 计算,不需要具体说明 -gram。

ROUGE-S

使用跳跃二元组(skip bi-gram),而不是 LCS 或 -gram。跳跃二元组是句子中的有序单词对。和 LCS 相似,单词对的两个单词可以不连续。比如说一个句子有 4 个单词,那么就会有个跳跃二元组。

这里同样使用精确度和召回率来计算 F-measure 分数,假如 是句子 的跳跃二元组数量,那么 计算为:

跳跃二元组能获取长句子的结构,实际计算时单词间长度最多为 4。

References

]]>
Image Caption 评价标准——BLEU https://livc.io/blog/190 2017-06-12T00:00:00+00:00 Zhao Li https://livc.io/blog/190 在 Image Caption 任务中,几种评价算法被用来度量预测结果(candidate caption)与 label (reference captions)的差异,这个系列主要介绍这几种评价标准。

符号定义

  • 为图像
  • candidate caption 为模型预测结果句子
  • reference captions 为训练图片的 label,也就是需要学习的句子(一幅图片被标注了多个句子)
  • 图像语句使用 -gram 来表示,一个 -gram 是一个或多个(其实就是 n 个)有序单词的集合,我们只谈论 -gram 从 1 个单词到 4 个单词的情况。
  • 为一个 -gram 在 reference caption 中出现的次数
  • 为一个 -gram 在 candidate caption 中出现的次数

BLEU

BLEU 是一种在机器翻译中度量 candidate 句子和 reference 句子间 -gram 的相关性的方法。我们先给出数学定义,然后根据一个例子来看看 BLEU 具体是如何工作的。

它计算整个语料库中 -gram 精度:

其中, 为这组 -gram 的索引,

引入惩罚值(brevity penalty)为:

其中, 为候选句子 的总长度, 为参考句子长度(当有多个参考句子时选择长度最接近候选句子长度的那个)。

最终计算 BLUE 分数,它实际上是 -gram 精度的加权几何平均:

其中, 并且对于所有的 是常量。

随着 的增加,BLEU 在语料库层级上的匹配效果较好,在句子层级上的匹配效果越来越差。因此 BLEU 在评估独立句子时表现糟糕。

接下来我们根据维基百科上的例子看一下 BLEU 是如何工作的,这个例子展示了糟糕的预测结果却得到了很高的一元组(unigram)精度分数。

表中第一行为预测结果,下面两行为训练集中的图片描述。候选句子的七个单词都出现在参考句子中,所以候选句子的一元组精度为

其中, 为候选句子中的单词出现在参考句子中的个数, 是候选句子的单词总数。所以可以看到,这是一个很完美的得分,但是实际的效果非常差。

BLEU 的修改非常直接,对于候选句子中的每个单词,算法计算它出现在每个参考句子中的最大次数, 。比如说,在上面的例子中,the 在参考句子 1 中出现了 2 次,在参考句子2 中出现了 1 次,所以

对于候选句子,记录每个单词的出现次数 ,比如对于 the,值为 7,那么 的值为 ,因此

实际上,使用单个单词(unigram)来比较并不理想,所以 BLEU 使用 -gram 来计算。

BLEU 在短句子上表现的精度非常高,假如上例中的候选句子为

the cat

而参考句子不变,那么。如果是二元组(bigram)结果同样为 1。

为了解决很短的句子产生很高的分数这个问题,BLEU 引入惩罚值(brevity penalty),即 。当 时,惩罚生效,具体计算如前面的的式子。

References

]]>
使用 command 命令暂时忽视 alias https://livc.io/blog/189 2017-06-03T00:00:00+00:00 Zhao Li https://livc.io/blog/189 我们经常会为某个命令设置 alias,比如我在 zsh 中设置了

alias diff="icdiff"

(icdiff 是一个加强版的 diff)

➜  which diff
diff: aliased to icdiff
➜  diff
Usage: icdiff [options] left_file right_file

Show differences between files in a two column view.

Options:
  --version             show program's version number and exit
……

如果想暂时忽略 alias,使用系统自带的 diff,则可以在前面加上 command 命令:

command diff --help
Usage: diff [OPTION]... FILES
Compare files line by line.

  -i  --ignore-case  Ignore case differences in file contents.
  --ignore-file-name-case  Ignore case when comparing file names.
……

Reference

  • https://www.cyberciti.biz/faq/ignore-shell-aliases-functions-when-running-command/
]]>