2018年2月2日星期五

玩转词向量:用fastText预训练向量做个智能小程序


越来越多的软件工程师开始学习和涉足机器学习开发。近日,伦敦的软件工程师 Martin Konicek 在 Medium 上介绍了他使用 fastText 预训练过的词向量创建一个智能回答小程序的过程,相信能给仍不理解词向量的初学者提供一些帮助。此外,这个程序的代码也已经在 GitHub 上公开,感兴趣的读者不妨自己动手实现一下。更多有关 fastText 的介绍,可参阅机器之心专栏文章《专栏 | fastText 原理及实践》。


过去几年,人工智能领域发展非常快,相关的文章也层出不穷,你很有可能已经听说过自然语言处理领域内的一些出色成果了。

 

比如,一个程序可以通过阅读维基百科完成对这个问题的分析:男人对于国王就相当于女人对于___?(女王/王后)

 

我自己也写过一个简单程序来完成这一任务。我很好奇:它能够回答多难的问题?

 

这篇博文是对这一主题的非常轻量的介绍。我没有训练任何机器学习模型,而是下载了使用 fastText 库创造的预训练英语词向量:http://ift.tt/2uU9eEM

 

首先先看数据

 

fastText 通过阅读维基百科学习到了什么?让我们打开这个 2GB 的文件一探究竟:


  1. good -0.1242 -0.0674 -0.1430 -0.0005 -0.0345 ...

  2. day 0.0320 0.0381 -0.0299 -0.0745 -0.0624 ...

  3. three 0.0304 0.0070 -0.0708 0.0689 -0.0005 ...

  4. know -0.0370 -0.0138 0.0392 -0.0395 -0.1591 ...

  5. ...


很好,这个格式应该很容易操作。每一行都包含一个词,表示成了 300 维空间中的一个向量。如果这是二维的,我们可以想象会是这样:


唯一的区别是每个词所具有的坐标的数量不是 2,而是 300。

 

这个输入文件中的词是按照频率排序的,这很方便。对于我的实验来说,使用最常见的 10 万个英语词就足够了,所以我将前 10 万行复制成了一个单独的文件。

 

使用 Python 3

 

为了让我的第一个项目足够简单,我决定使用普通的 Python 3,不带任何附加依赖包。我也在使用 Mypy,这是一个用于 Python 的静态类型检查器(http://mypy-lang.org)。

 

首先,我们定义一个类来表示每个词:


  1. from typing import List

  2. Vector = List[float]

  3. class Word:

  4.    def __init__(self, text: str, vector: Vector) -> None:

  5.        self.text = text

  6.        self.vector = vector


接下来,我们将数据加载到内存中:


  1. words = load_words('data/words.vec')


我们已经将该文件解析成了一个 List[Word]。这部分非常简单,我把细节放在本文后面,现在直接来看有意思的东西。

 

余弦相似度

 

将这些向量放入内存之后,我们就可以回答各种关于它们的问题了。我的第一个问题是:

 

在这个向量空间中,哪个词与给定的词最近?

 

我们如何计算两个词向量 a 和 b 之间的距离?你可能会说「欧几里得距离」,但对我们的用例而言,余弦相似度的效果要好得多。其背后的思想是:向量的绝对长度并不重要,重要的是两个向量之间的角度。

 

根据高中所学习到的内容(或根据维基百科),余弦相似度为:


用 Python 表示:


  1. def vector_len(v: Vector) -> float:

  2.    return math.sqrt(sum([x*x for x in v]))

  3. def dot_product(v1: Vector, v2: Vector) -> float:

  4.    assert len(v1) == len(v2)

  5.    return sum([x*y for (x,y) in zip(v1, v2)])

  6. def cosine_similarity(v1: Vector, v2: Vector) -> float:

  7.    """

  8.    Returns the cosine of the angle between the two vectors.

  9.    Results range from -1 (very different) to 1 (very similar).

  10.    """

  11.    return dot_product(v1, v2) / (vector_len(v1) * vector_len(v2))


现在我们可以得到一个词与给定词的相似度了:


  1. def sorted_by_similarity(words: List[Word], base_vector: Vector) -> List[Tuple[float, Word]]:

  2.    """Returns words sorted by cosine distance to a given vector, most similar first"""

  3.    words_with_distance = [(cosine_similarity(base_vector, w.vector), w) for w in words]

  4.    # We want cosine similarity to be as large as possible (close to 1)

  5.    return sorted(words_with_distance, key=lambda t: t[0], reverse=True)


我们只需要一些简单的实用函数来显示相关词:


  1. def print_related(words: List[Word], text: str) -> None:

  2.    base_word = find_word(text, words)

  3.    sorted_words = [

  4.        word.text for (dist, word) in

  5.            sorted_by_similarity(words, base_word.vector)

  6.            if word.text.lower() != base_word.text.lower()

  7.        ]

  8.    print(', '.join(sorted_words[:7]))

  9. def find_word(words: List[Word], text: str) -> Word:

  10.    return next(w for w in words if text == w.text)


现在试试看:


  1. >>> print_related(words, 'spain')

  2. britain, england, france, europe, germany, spanish, italy

  3. >>> print_related(words, 'called')

  4. termed, dubbed, named, referred, nicknamed, titled, described

  5. >>> print_related(words, 'although')

  6. though, however, but, whereas, while, since, Nevertheless

  7. >>> print_related(words, 'arms')

  8. legs, arm, weapons, coat, coats, armaments, hands

  9. >>> print_related(words, 'roots')

  10. root, origins, stems, beginnings, rooted, grass, traditions


结果非常好!看起来余弦相似度高的词确实是彼此相关的——要么是句法上相关(roots 和 rooted),要么是语义上相关(roots 和 grass、arms 和 legs)。

 

完成句子:巴黎对于法国就相当于罗马对于___

 

来试试更难的任务。给定的两个词「巴黎」和「法国」之间存在语义关系(巴黎是法国的首都);对于第三个词「罗马」,我们能推理得到「意大利」吗?

 

事实证明我们可以直接通过加减向量来做到这一点!这是因为这些词的向量在空间中具有特定的关系:


事实证明这两个红色的向量非常相似!我们可以想象它们表示「首都」这个关系。

 

惊人的来了:


  1. vector("France") - vector("Paris") = answer_vector - vector("Rome")


因此:


  1. vector("France") - vector("Paris") + vector("Rome") = answer_vector


我们会寻找接近于答案向量的词;这个答案就算不是「意大利」,也应该与之相近。

 

让我们实现它:


  1. def closest_analogies(

  2.    left2: str, left1: str, right2: str, words: List[Word]

  3. ) -> List[Tuple[float, Word]]:

  4.    word_left1 = find_word(left1, words)

  5.    word_left2 = find_word(left2, words)

  6.    word_right2 = find_word(right2, words)

  7.    vector = add_vectors(

  8.        sub_vectors(word_left1.vector, word_left2.vector),

  9.        word_right2.vector)

  10.    closest = sorted_by_similarity(words, vector)[:10]

  11.    def is_redundant(word: str) -> bool:

  12.        """

  13.        Sometimes the two left vectors are so close the answer is e.g.

  14.        "shirt-clothing is like phone-phones". Skip 'phones' and get the next

  15.        suggestion, which might be more interesting.

  16.        """

  17.        return (

  18.            left1.lower() in word.lower() or

  19.            left2.lower() in word.lower() or

  20.            right2.lower() in word.lower())

  21.    return [(dist, w) for (dist, w) in closest if not is_redundant(w.text)]

  22. def print_analogy(left2: str, left1: str, right2: str, words: List[Word]) -> None:

  23.    analogies = closest_analogies(left2, left1, right2, words)

  24.    if (len(analogies) == 0):

  25.        print(f"{left2}-{left1} is like {right2}-?")

  26.    else:

  27.        (dist, w) = analogies[0]

  28.        print(f"{left2}-{left1} is like {right2}-{w.text}")


接下来问一些问题:


  1. >>> print_analogy('Paris', 'France', 'Rome', words)

  2. Paris-France is like Rome-Italy

  3. >>> print_analogy('man', 'king', 'woman', words)

  4. man-king is like woman-queen

  5. >>> print_analogy('walk', 'walked' , 'go', words)

  6. walk-walked is like go-went

  7. >>> print_analogy('quick', 'quickest' , 'far', words)

  8. quick-quickest is like far-furthest


成功了!通过阅读维基百科,fastText 学会了关于首都、性别、不规则变化的动词和形容词的关系。再试试其它的:

 

  1. English-Jaguar is like German-BMW      // Expensive cars

  2. English-Vauxhall is like German-Opel   // Cheaper cars

  3. German-BMW is like American-Lexus      // Expensive cars

  4. German-Opel is like American-Chrysler  // Cheaper cars


还有:


  1. >>> print_analogy('dog', 'mammal', 'eagle', words)

  2. dog-mammal is like eagle-bird


这个模型并不能正确分析一切


你会怎样完成下列分析?


1. 寿司-米饭就像是披萨-___

2. 寿司-米饭就像是牛排-___

3. 衬衫-衣服就像是电话-___

4. 衬衫-衣服就像是碗-___

5. 书-阅读就像是电视-___


寿司是用米饭和其它配料做成的,披萨是用面团、肉肠、芝士等材料做成的。牛排是肉制品。衬衫是一种衣服,电话是一种电子设备,碗是一种餐具。书是用来阅读的,电视是用来观看的。


让我们看看答案:


  1. sushi-rice is like pizza-wheat      // Makes sense

  2. sushi-rice is like steak-chicken

  3. shirt-clothing is like bowl-food

  4. shirt-clothing is like phone-mobile

  5. book-reading is like TV-television


还有:


  1. >>> print_analogy('do', 'done' , 'go', words)

  2. do-done is like go-undertaken


可以看到,fastText 的分析并不都是正确的。它的结果很出色,但错起来也很离谱。

 

如果我们看看建议列表,而不只是第一个,会有更好的答案吗?


  1. sushi-rice is like steak-

  2. [chicken (0.58), beef (0.56), potatoes (0.56), corn (0.55)]

  3. book-reading is like TV-

  4. [television (0.68), watching (0.64), listening (0.57), viewing (0.57)]

  5. shirt-clothing is like bowl-[food, cereal, rice, porridge]

  6. shirt-clothing is like phone-[mobile, cellular]


其中第二个建议是非常好的。但是,看起来「衬衫」和「衣服」之间的关系仍然是一个谜。

 

结论

 

当我第一次在我的笔记本电脑上看到这些结果时,我完全震惊了。这个仅由少量 Python 代码组成的程序能让你感到它是智能的并且能真正理解你询问的东西。

 

在我尝试过一些困难的问题之后,我意识到这个程序也可能「离题千里」——任何人类都不会犯这样的错。这可能会让你认为这个模型根本就不聪明。

 

但是,想想这一点:这些向量是在英语文本上训练的,但和人类不一样,这个学习算法没有任何预先的英语知识。在阅读维基百科几个小时之后,它很好地学习到了英语语法以及很多真实世界概念之间的语义关系。只要文本足够,它也能使用德语、泰语、汉语或其它任何语言做到这一点。

 

对于一个人类孩童来说,需要多少时间才能发展出足以回答上述问题所需的逻辑思考能力?成年人学习一门外语的效果呢?或者说两门乃至三门外语呢?人类需要数年时间才能做到的事情 Word2vec 或 fastText 仅需数小时就能办到。人类的学习方式与这些算法有很大的差异。人类可以使用远远更少的数据而更好地学习到概念,但所需的时间更长。

 

本文中的所有代码都已公布在 GitHub 上。你只需要 Python 3 和预训练的向量来运行该代码,然后就能自己寻找词之间的有趣关系了。

 

代码:http://ift.tt/2Ee5Fik

预训练的向量:http://ift.tt/2uU9eEM


附录

 

我想尽可能地缩短正文的篇幅,同时涵盖最重要的基础和相关结果。下面给出了更多细节。

 

一点简单的开发工作

 

我第一次实现该算法时,得到的结果是错误的,比如:


  1. man-king is like woman-king


这是因为通过「向量(国王)- 向量(男人)+ 向量(女人)」所得到的答案向量与「国王」这个词非常接近。也就是说,减去「男人」向量再加上「女人」向量对「国王」向量的影响很小,这可能是因为「男人」与「女人」本身是相关的。

 

实际上,我得到的几乎所有答案都只是对某个输入词的简单重复。我做了一些开发来跳过建议答案中的这些多余的词,然后才开始得到上面给出的相关答案。这部分开发在代码中被称为 is_redundant。

 

更新:fastText 的作者 Tomas Mikolov 在 Facebook 上回复说我所做的实际上是一个众所周知的操作,而且是正确的。


向量是如何产生的?

 

我只写了少量代码就得到了这些惊人的结果。这是因为所有的神奇之处都在向量之中——使用 fastText 在数千兆字节的维基百科英语文本和其它来源上进行了训练。另外还有一些与 fastText 类似的库,比如 Word2vec 和 GloVe。这些库是如何工作的?这个主题值得再写一篇文章,但背后的思想是:出现在相似语境中的词应该具有相似的向量。比如如果词「披萨」通常出现在「吃」、「餐厅」和「意大利」等词的附近,那么「披萨」的向量就会与那些词的向量具有较高的余弦相似度。很少同时出现的词会有较低的余弦相似度,可能能够达到 -1。

 

历史

 

n-gram 和将词表示为向量等思想已经存在了很长时间,但直到 2013 年那篇 Word2vec 的论文和实现发表之后(https://arxiv.org/abs/1301.3781),才表明这些方法「能以远远更低的计算成本实现准确度的极大提升」。Tomas Mikolov 为 Word2Vec 和 fastText 这两个项目都立下过汗马功劳。


我现在才开始学习,但好事不嫌晚。


为什么在 Python 中使用类型(type)?

 

我同意 Michael Bolin 的说法:「在为大型软件项目选择语言时,静态类型是一项关键特性」。类型有助于我们让代码更具可读性和减少漏洞。即使是对于这样的小项目,如果在运行代码之前就能在 Atom 中看到错误,也能带来极大的帮助,节省很多时间。

 

Python 3 runtime 接受类型注释,这一点非常棒。任何人都无需任何额外设置就能运行我的代码。在运行这些代码之前无法对其进行转换,就像使用 JavaScript 的 Flow 一样。

 

优化

 

这个代码完全没有进行优化,而且也没有进行太多错误处理(error handling)。至少我们可以归一化所有的向量以使余弦相似度的计算更快(在 10 万词的情况下,调用一次 sorted_by_similarity 来回答一个问题,在我的 MacBook Pro 上耗时 7 秒)。我们也许应该使用 numpy。这个 Python 进程要使用近 1GB 的内存。我们可以使用一个已有的实现,可以直接加载文件然后问答问题。所有这些都超出了本文的范畴。我只是想知道我能不能从头开始写一些非常简单的代码来回答一些有趣的问题。


加载和清理数据

 

这是 load_words 函数所做的工作:


  1. def load_words(file_path: str) -> List[Word]:

  2.    """Load and cleanup the data."""

  3.    words = load_words_raw(file_path)

  4.    print(f"Loaded {len(words)} words.")

  5.    words = remove_stop_words(words)

  6.    print(f"Removed stop words, {len(words)} remain.")

  7.    words = remove_duplicates(words)

  8.    print(f"Removed duplicates, {len(words)} remain.")

  9.    return words


load_words_raw 只是逐行读取文件,然后将每一行解析成一个词。我们加载了 10 万词(每个词 300 维),而这个 Python 进程就用了近 1GB 的内存!这很糟糕,但可以忍受。

 

remove_stop_words 会将起始或结尾字符不是字母的词移除,比如「inter-」、「thanks.」、「--redrose64」。现在剩下 98,648 个词。

 

remove_duplicates 会忽略标点符号,所以「U.K」、「U.K.」和「UK」是一样的词,只存储一次。剩下 97,190 个词。但仍然还有一些重复,比如「years」和「Years」。我们也可以忽略大小写,但这样我们就无法区分「us」(我们)和「US」(美国)这样的词了。 


原文链接:

https://medium.com/swlh/playing-with-word-vectors-308ab2faa519


]]> 原文: http://ift.tt/2FFp1cX
RSS Feed

机器知心

IFTTT

CMU提出新型智能体定位方法:「主动神经定位器」


引言


定位(localization)是在给出环境地图和智能体观测的情况下估计智能体位置的一类问题。智能体需要具有在不确定的情况下进行定位的能力,以执行多种下游任务,如规划(planning)、探查(exploration)和目标导航(targetnavigation)。定位被认为是移动机器人最基础的问题之一(Cox & Wilfong, 1990; Borenstein et al., 1996)。定位在很多现实应用中非常有用,例如自动驾驶汽车、工业机器人和快递无人机。


本论文解决了智能体初始位置未知时的全局定位问题。尽管全局定位的研究历史很长,但它仍然是一个开放性问题,目前还没有多少方法可以通过端到端的方式从数据中学习,大多数方法通常需要领域专家进行重要的手动调整和特征选择。目前大多数定位方法的另一个局限是它们是被动的,即它们基于收到的观测流被动地估计智能体的位置,且没有能力决定智能体所采取的动作。决定智能体动作的能力可带来更快更准确地定位,因为 智能体可学习快速导航至环境中的明确位置。


论文提出「主动神经定位器(Active Neural Localizer)」,这是一个能够使用基于像素的原始观测和环境地图进行主动定位的神经网络模型。该模型基于贝叶斯过滤算法进行定位(Fox et al., 2003),包含一个用于估计智能体观测似然度的感知模型、一个表示信念(belief)、具备乘法相互作用(multiplicative interaction)的结构化组件(用于传播信念),以及一个基于当前信念的策略模型(用于准确定位并最小化定位所需的步骤数量)。整个模型完全可微,并且使用强化学习进行训练,从而以端到端的方式同时学习感知模型和策略模型。论文作者使用多种 2D、3D 仿真环境来测试该模型。结果表明,主动神经定位器不仅能够泛化至同一个域中的未知地图,还能够泛化至跨域未知地图。研究者还提供了全新的模拟场景,为未来的主动定位研究做准备。


图 1:论文提出的模型架构。感知模型计算当前观测值在所有可能位置的似然度。智能体位置的信念和似然度通过逐元素点积随时间进行传播。策略模型学习一个能准确定位的策略,同时最小化定位所需的步骤数量。


模型构成部分


感知模型


感知模型根据智能体的观测结果和地图信息中给出的状态来计算特征表征。地图信息中每个状态的似然度通过计算智能体观测的特征表征和该状态的特征表征的余弦相似度(cosine similarity)得到。余弦相似度通常用于计算表征的相似性(Nair & Hinton, 2010; Huang et al., 2013),并已经被用于文本定位中(Chaplot et al., 2016)。Chunjie 等人(2017 年)强调了余弦相似度相对于点积的优势。


在 2D 环境中,观测被用来计算 one-hot 向量,one-hot 向量的维度与表示深度(可直接用作特征表征)的维度相同。得到的似然图(Likelihood map)对所有具有观测深度的位置都具有统一的非零概率,而其它位置都具有零概率。对于 3D 环境,每个观测的特征表征使用可训练的深度卷积网络获取(LeCun et al., 1995)。图 2 是在 2D 和 3D 环境下智能体的观测和计算出的对应似然图的示例。


策略模型


策略模型基于智能体当前信念给出下一个动作的概率。它使用强化学习进行训练,具体来说,它使用的是 Asynchronous Advantage Actor-Critic(A3C)算法(Mnih et al., 2016)。用于预测策略和价值函数(value function)的方法是叠加信念地图(belief map)与地图设计矩阵(map design matrix),先穿过两个卷积层,然后穿过一个全连接层。策略和价值损失使用智能体观测到的奖励(reward)进行计算,然后反向传播通过整个模型。


图 2:在不同域中的地图设计、智能体观测和对应的似然图。在二维域中,智能体的观测为第一个障碍前智能体前方的所有像素。在三维域中,智能体的观测为智能体以第一人称视角看到的图像。



表 1:二维环境下的结果。「Time」指使用对应方法评估 1000 episode 所需的秒数,「Acc」指 1000 episode 之后的准确率。



表 2:三维环境下的结果。「Time」指使用对应方法评估 1000 episode 所需的秒数,「Acc」指 1000 episode 之后的准确率。



图 4:在 Maze3D 三维迷宫环境中的策略执行和信念传播的例子。


上图中,每行分别显示一个 episode 中连续的时间步。每列分别显示智能体观测、观测之前和观测之后基于位置的信念、地图设计和智能体观察世界的视角。智能体的真实位置也标记在地图设计中(但是智能体自己看不到)。信念地图显示在特定位置的概率,颜色越深代表概率越高。智能体对自己方位的信念和真实的方位也用颜色突出显示。例如,红色信念地图显示智能体在 x-y 坐标面向东的概率。注意地图设计不是信念地图的一部分,它被叠加在信念地图上以获得更好的可视化效果。在所有时间步中,所有与智能体视角相似的位置在信念地图中具有高概率。这个例子表明定位时动作决策的重要性。在 t=3 时,智能体对自己位置不是很确定,因为有 4 个具有相同视角的位置。智能体执行最优动作组合来降低不确定性,向前并左转,从而成功定位。


论文:Active Neural Localization




论文链接:http://ift.tt/2DJepgH


摘要:定位是在给出环境地图和智能体观测的情况下估计智能体位置的一类问题。就所需步骤数量来看,传统的定位方法(过滤基于观测的信念)并非最优,因为它们不进行智能体动作的决策。我们提出「主动神经定位器」(Active Neural Localizer),一个可以完全微分并能够准确高效地学习定位的神经网络模型。该模型包含了传统的基于过滤的定位方法思想(通过使用一个具有乘法相互作用(multiplicative interaction)的结构化状态信念来传播信念),同时将其与策略模型相结合,以准确定位并最小化定位所需的步骤数量。主动神经定位器通过端到端的强化学习进行训练。我们使用了多种仿真环境来测试该模型,包括二维迷宫、Doom 游戏引擎中的随机迷宫和虚幻游戏引擎(Unreal)中的拟真(photo-realistic)环境。在二维环境中的测试结果表明在理想设置下习得策略的有效性,而在三维环境中的测试结果表明,模型具备从基于 RGB 的原始像素观测中同时学习策略模型和感知模型的能力。实验还表明在 Doom 环境下基于随机纹理训练的模型能够很好地泛化至虚幻引擎中的拟真办公空间环境。

]]> 原文: http://ift.tt/2FIdPMX
RSS Feed

机器知心

IFTTT

炸了!这届ICLR论文被指太“渣”?Goodfellow围追堵截要说法

安妮 夏乙 发自 凹非寺量子位 出品 | 公众号 QbitAI

搞机器学习的这帮人在Twitter上又炸了。

起因是一名叫Anish Athalye的小哥率先"放出狠话"。

"对抗样本防御仍是一个未解决的问题,三天前的ICLR接收论文中,7/8关于防御的论文已经被我们攻破。"

此外,Athaly还在GitHub上放出了自己的论文和repo支持自己的说法。

也就是说,他们认为这届深度学习顶会ICLR的相关论文太渣了?

不得了。

一时间,各方大神纷纷赶来或围观或质疑或膜拜,谷歌大脑Jeff Dean也前来看戏。

他们在吵什么?

举个例子。在上面这张图片中,一张花斑猫的图像经过轻微扰乱后,就被骗过AI,被InceptionV3分类器错误的识别成了牛油果沙拉酱。

就是这么神奇。

人眼看起来完全不像的两类物体,怎么就被分类器混淆了呢?

早在2013年的论文Intriguing properties of neural networks中,一作Christian Szegedy就提出梯度下降的方法可以轻松合成出欺骗分类器的图像。

而这次Athalye等人这篇12页的论文中指出,当前大多数对抗样本防御方法依赖梯度混淆(obfuscated gradients),通过给attaker错误的梯度使基于梯度下降的对抗样本失效。这种防御方式可能会导致对对抗样本防御安全感的错误判断。

相关论文:Obfuscated Gradients Give a False Sense of Security: Circumventing Defenses to Adversarial Exampleshttps://arxiv.org/abs/1802.00420

论文中指出,基于这种技术的防御已经是过去时了,他们的方法可以克服对梯度混淆的依赖。之后,他们研究了ICLR 2018接收的有关对抗样本防御的8篇论文论文,发现8个系统中的7个依赖于梯度混淆,并用新方法对这8篇ICLR论文中的方法进行测试,结果如下:

只有Aleksander Madry等人的方法在此攻击下准确率达到47%,其他7篇中提到的方法准确率甚至降为0%。

这么可怕么?!

来者不"善"

这位在Twitter上公开叫板顶会论文的小哥Anish Athalye究竟何许人也?

据LinkedIn和GitHub上的资料显示,小哥目前是MIT计算机科学专业的博士生,同时也在OpenAI实习,此前也曾是谷歌实习生。

有意思的是,去年12月在国内引发热议的"谷歌AI将乌龟认成步枪"事件,也是Athalye的杰作。

除了论文一作Anish Athalye外,其他两位作者也不是等闲之辈。Nicholas Carlini目前是UC伯克利计算机安全专业的博士生,David Wagner是他的导师。

去年3月,两人曾合力研发出小有名气的构建对抗样本的方法CW attack(The Carlini and Wagner),将论文Explaining And Harnessing Adversarial Examples中提到的攻击方式转化成更高效的优化问题。

Goodfellow围追堵截要说法

Paper和GitHub repo一出,把对抗样例攻击和防御这个领域一手拉扯大的Ian Goodfellow立刻坐不住了,在GitHub上连续提了两条意见(issue),跑到Reddit社区回帖,还在论文一作Anish Athalye的twitter下留了言,可谓处处围追堵截,要作者们放学别走,给个说法。

Goodfellow的意见总结起来,主要是两点。是ICLR 2018一共接收了至少11篇关于对抗样例防御的论文,这篇论文只用了8篇,需要说清楚并非全部;是这篇论文提出的"混淆梯度(obfuscated gradients)",简直就是给"著名"的"梯度掩码(gradient masking)"起了个别名。

我们来分别看一下。

第一条意见很简单,主要是因为Athalye等人行文不严谨引起的。

在论文中,他们说从ICLR 2018接收的对抗样例防御论文中排除了3篇,其中两篇有已经证实的防御方法,一篇只针对一种黑盒情况。但是在论文摘要和GitHub repo里没有说清楚。Goodfellow建议严谨地写成"所有未经证实的白盒场景下的防御"。

几位作者也说,明后天上传更新版论文,会改正这个问题。

第二条意见就严重多了:Goodfellow指责这篇论文提出的混淆梯度并非独创,和前人(包括他自己)讲了又讲的"梯度掩码"是一样的。

这就比较尴尬了。

二作Nicholas Carlini在GitHub上作出了比较"柔软"的回应,大致意思是我一开始也纠结要不要叫这个名字,但后来觉得,混淆梯度和梯度掩码还是有区别的,梯度掩码保留了大部分梯度信号,我们说的混淆梯度,整体上梯度都是复杂的。

说他的回应"柔软",主要是因为他在其中承认"可能这个决定是错误的"、"如果研究人员们认为我错了,想叫梯度掩码,我也OK"。

除了Goodfellow之外,另一位研究者Florian也和他们讨论过这个问题。

为了让后生晚辈更深刻地理解梯度掩码,Goodfellow还给Athalye等人推荐了一串参考文献:

Practical Black-Box Attacks against Machine LearningNicolas Papernot, Patrick McDaniel, Ian Goodfellow, Somesh Jha, Z. Berkay Celik, Ananthram Swamihttps://arxiv.org/abs/1602.02697

Attacking Machine Learning with Adversarial Exampleshttps://blog.openai.com/adversarial-example-research/

Ensemble Adversarial Training: Attacks and DefensesFlorian Tramèr, Alexey Kurakin, Nicolas Papernot, Ian Goodfellow, Dan Boneh, Patrick McDanielhttps://arxiv.org/abs/1705.07204

Gradient Masking in Machine LearningNicolas Papernothttps://seclab.stanford.edu/AdvML2017/slides/17-09-aro-aml.pdf

另外,你们说研究了ICLR 2018接收的所有防御论文,但是有一篇专门解决梯度掩码问题的,就给漏掉了:

Ensemble Adversarial Training: Attacks and Defenseshttps://openreview.net/forum?id=rkZvSe-RZ

老师留作业啦 щ(゚Д゚щ)

当然,还有不少人的关注点在于,这个GitHub repo虽然已经火了起来,但其实……只包含readme,代码还没放出来。作者们说,如果有研究者想看源代码,可以找他们要;他们也会尽快将清理干净的源代码放出来。

Twitter效应

这次激烈的大讨论,意义已经不仅限于某一事件。

"当我在Twitter上讨论对抗样例的时候,其实希望这些可以更早地在OpenReview上发生。我们需要一个更好的机制来处理现代的同行评审和更正",斯坦福大学博士生Ben Poole说。

多伦多大学助理教授Daniel Roy补充说,他在OpenReview上的互动其实挺多,但基本没什么帮助,Twitter能够吸引注意力,但可能也不是解决问题的最佳场所。

Kaggle前任CEO、Fast.ai创始人Jeremy Howard看到这些讨论时,评论说:我认为arXiv上的预印版论文加上Twitter上的讨论是同行评审的好方法,比OpenReview的时效性和参与度都更高。

可以看出来,Jeremy Howard对Twitter上讨论学术还是挺推崇的。

他进一步指出,Twitter虽然不是唯一的场合,但经常能够触及很多OpenReview上没有的研究人员,而且并非只有名人的声音得到传播放大。

"我只想说:请接受并欢迎这个伟大的社区",Jeremy Howard说。

确实如此。前不久,谷歌传奇人物Jeff Dean终于开通了Twitter账号,而且一开不可收拾,活跃度非常高。这次的讨论,Jeff Dean也转发参与了。

不过更有意思的是上次,Jeff Dean团队发表了一篇关于深度学习应用于电子病历的论文。不过随即就有人尖锐的指出,这篇论文"令人震惊":没有提及任何人在这方面的研究。

"这真是太丢脸了",Jeff Dean随后回复,并承诺会立刻更新论文。

更充分的交流,这也是社交网络的意义。

欢迎大家关注我们的专栏:量子位 - 知乎专栏

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 http://ift.tt/2nxMSoo
RSS Feed

RSS5

IFTTT

炸了!这届ICLR论文被指太“渣”?Goodfellow围追堵截要说法

安妮 夏乙 发自 凹非寺量子位 出品 | 公众号 QbitAI

搞机器学习的这帮人在Twitter上又炸了。

起因是一名叫Anish Athalye的小哥率先"放出狠话"。

"对抗样本防御仍是一个未解决的问题,三天前的ICLR接收论文中,7/8关于防御的论文已经被我们攻破。"

此外,Athaly还在GitHub上放出了自己的论文和repo支持自己的说法。

也就是说,他们认为这届深度学习顶会ICLR的相关论文太渣了?

不得了。

一时间,各方大神纷纷赶来或围观或质疑或膜拜,谷歌大脑Jeff Dean也前来看戏。

他们在吵什么?

举个例子。在上面这张图片中,一张花斑猫的图像经过轻微扰乱后,就被骗过AI,被InceptionV3分类器错误的识别成了牛油果沙拉酱。

就是这么神奇。

人眼看起来完全不像的两类物体,怎么就被分类器混淆了呢?

早在2013年的论文Intriguing properties of neural networks中,一作Christian Szegedy就提出梯度下降的方法可以轻松合成出欺骗分类器的图像。

而这次Athalye等人这篇12页的论文中指出,当前大多数对抗样本防御方法依赖梯度混淆(obfuscated gradients),通过给attaker错误的梯度使基于梯度下降的对抗样本失效。这种防御方式可能会导致对对抗样本防御安全感的错误判断。

相关论文:Obfuscated Gradients Give a False Sense of Security: Circumventing Defenses to Adversarial Exampleshttps://arxiv.org/abs/1802.00420

论文中指出,基于这种技术的防御已经是过去时了,他们的方法可以克服对梯度混淆的依赖。之后,他们研究了ICLR 2018接收的有关对抗样本防御的8篇论文论文,发现8个系统中的7个依赖于梯度混淆,并用新方法对这8篇ICLR论文中的方法进行测试,结果如下:

只有Aleksander Madry等人的方法在此攻击下准确率达到47%,其他7篇中提到的方法准确率甚至降为0%。

这么可怕么?!

来者不"善"

这位在Twitter上公开叫板顶会论文的小哥Anish Athalye究竟何许人也?

据LinkedIn和GitHub上的资料显示,小哥目前是MIT计算机科学专业的博士生,同时也在OpenAI实习,此前也曾是谷歌实习生。

有意思的是,去年12月在国内引发热议的"谷歌AI将乌龟认成步枪"事件,也是Athalye的杰作。

除了论文一作Anish Athalye外,其他两位作者也不是等闲之辈。Nicholas Carlini目前是UC伯克利计算机安全专业的博士生,David Wagner是他的导师。

去年3月,两人曾合力研发出小有名气的构建对抗样本的方法CW attack(The Carlini and Wagner),将论文Explaining And Harnessing Adversarial Examples中提到的攻击方式转化成更高效的优化问题。

Goodfellow围追堵截要说法

Paper和GitHub repo一出,把对抗样例攻击和防御这个领域一手拉扯大的Ian Goodfellow立刻坐不住了,在GitHub上连续提了两条意见(issue),跑到Reddit社区回帖,还在论文一作Anish Athalye的twitter下留了言,可谓处处围追堵截,要作者们放学别走,给个说法。

Goodfellow的意见总结起来,主要是两点。是ICLR 2018一共接收了至少11篇关于对抗样例防御的论文,这篇论文只用了8篇,需要说清楚并非全部;是这篇论文提出的"混淆梯度(obfuscated gradients)",简直就是给"著名"的"梯度掩码(gradient masking)"起了个别名。

我们来分别看一下。

第一条意见很简单,主要是因为Athalye等人行文不严谨引起的。

在论文中,他们说从ICLR 2018接收的对抗样例防御论文中排除了3篇,其中两篇有已经证实的防御方法,一篇只针对一种黑盒情况。但是在论文摘要和GitHub repo里没有说清楚。Goodfellow建议严谨地写成"所有未经证实的白盒场景下的防御"。

几位作者也说,明后天上传更新版论文,会改正这个问题。

第二条意见就严重多了:Goodfellow指责这篇论文提出的混淆梯度并非独创,和前人(包括他自己)讲了又讲的"梯度掩码"是一样的。

这就比较尴尬了。

二作Nicholas Carlini在GitHub上作出了比较"柔软"的回应,大致意思是我一开始也纠结要不要叫这个名字,但后来觉得,混淆梯度和梯度掩码还是有区别的,梯度掩码保留了大部分梯度信号,我们说的混淆梯度,整体上梯度都是复杂的。

说他的回应"柔软",主要是因为他在其中承认"可能这个决定是错误的"、"如果研究人员们认为我错了,想叫梯度掩码,我也OK"。

除了Goodfellow之外,另一位研究者Florian也和他们讨论过这个问题。

为了让后生晚辈更深刻地理解梯度掩码,Goodfellow还给Athalye等人推荐了一串参考文献:

Practical Black-Box Attacks against Machine LearningNicolas Papernot, Patrick McDaniel, Ian Goodfellow, Somesh Jha, Z. Berkay Celik, Ananthram Swamihttps://arxiv.org/abs/1602.02697

Attacking Machine Learning with Adversarial Exampleshttps://blog.openai.com/adversarial-example-research/

Ensemble Adversarial Training: Attacks and DefensesFlorian Tramèr, Alexey Kurakin, Nicolas Papernot, Ian Goodfellow, Dan Boneh, Patrick McDanielhttps://arxiv.org/abs/1705.07204

Gradient Masking in Machine LearningNicolas Papernothttps://seclab.stanford.edu/AdvML2017/slides/17-09-aro-aml.pdf

另外,你们说研究了ICLR 2018接收的所有防御论文,但是有一篇专门解决梯度掩码问题的,就给漏掉了:

Ensemble Adversarial Training: Attacks and Defenseshttps://openreview.net/forum?id=rkZvSe-RZ

老师留作业啦 щ(゚Д゚щ)

当然,还有不少人的关注点在于,这个GitHub repo虽然已经火了起来,但其实……只包含readme,代码还没放出来。作者们说,如果有研究者想看源代码,可以找他们要;他们也会尽快将清理干净的源代码放出来。

Twitter效应

这次激烈的大讨论,意义已经不仅限于某一事件。

"当我在Twitter上讨论对抗样例的时候,其实希望这些可以更早地在OpenReview上发生。我们需要一个更好的机制来处理现代的同行评审和更正",斯坦福大学博士生Ben Poole说。

多伦多大学助理教授Daniel Roy补充说,他在OpenReview上的互动其实挺多,但基本没什么帮助,Twitter能够吸引注意力,但可能也不是解决问题的最佳场所。

Kaggle前任CEO、Fast.ai创始人Jeremy Howard看到这些讨论时,评论说:我认为arXiv上的预印版论文加上Twitter上的讨论是同行评审的好方法,比OpenReview的时效性和参与度都更高。

可以看出来,Jeremy Howard对Twitter上讨论学术还是挺推崇的。

他进一步指出,Twitter虽然不是唯一的场合,但经常能够触及很多OpenReview上没有的研究人员,而且并非只有名人的声音得到传播放大。

"我只想说:请接受并欢迎这个伟大的社区",Jeremy Howard说。

确实如此。前不久,谷歌传奇人物Jeff Dean终于开通了Twitter账号,而且一开不可收拾,活跃度非常高。这次的讨论,Jeff Dean也转发参与了。

不过更有意思的是上次,Jeff Dean团队发表了一篇关于深度学习应用于电子病历的论文。不过随即就有人尖锐的指出,这篇论文"令人震惊":没有提及任何人在这方面的研究。

"这真是太丢脸了",Jeff Dean随后回复,并承诺会立刻更新论文。

更充分的交流,这也是社交网络的意义。

欢迎大家关注我们的专栏:量子位 - 知乎专栏

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复"招聘"两个字。

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态



via 量子位 - 知乎专栏 http://ift.tt/2nxMSoo
RSS Feed

RSS5

IFTTT