François Chollet 是深度学习框架 Keras 的作者,现就职于谷歌,从事深度学习技术的研究。近日,他在 Quora 进行了一场专题问答 ,回答了很多关于 Keras 的开发过程和现状,以及深度学习和神经网络的问题。机器之心将这些问题大致分为五类。 点击这里 下载文中涉及的论文及 PPT。
François Chollet:首先,让我们看看 Theano 和 TensorFlow。这两者非常相似,因为 TensorFlow 重复使用了许多在 Theano 中提出来的关键思想。这两者本质上都是用来定义抽象的、通用的计算图形(computation graph)的语言(Language)。它们算不上是真正的「深度学习框架」,它们的用途远不仅仅限于深度学习!另一方面,Keras 是一种真正的深度学习框架:一种精心设计的可以用来构建深度学习模型的 API,只需要将高层次的构造模块拼接到一起就可以了。而且因为 Keras 运行在 TensorFlow 或 Theano 之上,所以相比于使用其它更低层次的框架,使用 Keras 没有性能上的成本。
在 TensorFlow 或 Theano 中做深度学习时,你可以将 Keras 看作是更好的 UX。如果你熟悉 Numpy 和 Scikit-Learn,那么更公平地将 Theano 和 TensorFlow 比作是 Numpy,而 Keras 则更接近 Scikit-Learn。但是这样的比较并不是完美的,因为 Keras 比 Scikit-Learn 更灵活:它允许你定义你自己的机器学习模型,而不只是使用预定义的模型。
现在,如果你想比较 Keras 和 Torch/nn:它们具有很多相同的功能和理念,都是用于构建深度学习模型的高层次的模块化的库。Torch 在很多方面都是一个很棒的框架。但让我们来看看它们之间的不同点:
Keras 基于 Python,所以能与大量的 Python 数据科学生态系统进行很好的整合。而 Torch 基于 Lua——所谓的「Lua 数据科学生态系统」并不存在。
Keras 有一个远比 Torch 更大的社区。这不仅限于创业公司和大公司、研究生和爱好者,在学术界也是一样:Keras 最近已经在 arXiv 的每月提及次数上超过了 Torch。Keras 正在快速成长,而 Torch 的用户群过去 6 个月来一直在萎缩(许多研究者和组织迁移到了 TensorFlow/Keras)。
因此,Keras 有更好的文档资料、更多代码示例和更多学习资源让你起步。
Keras 可以运行在 TensorFlow 之上,因此可以受益于谷歌在使 TensorFlow 成为现在最快最可扩展的深度学习引擎中所投入的工程努力。
François Chollet:Keras 提供了一个更简单,更快的方式来在 TensorFlow 中构建并训练模型,因为模型仍然是由原本的 TensorFlow 引擎运行的,所以不会影响性能。所以如果你关心你自己的时间和生产效率的话,你就应该关注 Keras。
我上周偶然发现了这两段分别用 Keras 和 TensorFlow 实现的 XOR(异或运算)代码( https://gist.github.com/cburgdorf/e2fb46e5ad61ed7b9a29029c5cc30134 ),可以作为想要了解神经网络的人的「Hello World」。总结就是:Keras 版的代码更易于阅读、理解和编写。使用 Keras 工作的话,代码开销(code overhead)和认知开销(cognitive overhead)会更少。
当然,你开发的模型越复杂,你使用 Keras 所提高的生产效率就会越明显。Keras 真的在那些十分依赖权值共享(weight sharing)的模型、多个模型的组合、多任务模型等任务上有光彩夺目的表现。一个很好的例子是这篇在 Keras 中用 30 行代码再实现「Deep compositional captioning」论文的
GitHub( https://gist.github.com/fchollet/0ecc151189b997fd4400bc2fecf2489f )。同时一个纯 TensorFlow 的实现会需要多个文件、上百行的代码,根本就是一个相当大的挑战。
François Chollet:最重要的决定是将 Keras 设计成一个自包含(self-contained)的深度学习框架。也就是说,你可以使用 Keras 端到端地解决问题,而不需要与底层后端引擎 Theano 或 TensorFlow 有任何交互。Keras 最初构建于 Theano 之上,但因为完全不用考虑 Theano,所以在 TensorFlow 最初发布后很快就能轻松地将 TensorFlow 加为一种后端。未来,我们还将扩展 Keras 以支持下一代计算图形引擎(omputation graph engine)。Lasagne 等其它库选择作为可与 Theano 协作的实用工具箱,而没有覆盖 Theano,这就需要用户对 Theano 的额外知识,并将他们的成功和 Theano 的普及度捆绑在一起。这些库就是全部,但现在已经死掉了。
这一决定所带来的结果是 Keras 有了自己的用于处理计算的图形的图形数据结构(graph datastructure),而不需要依赖 TensorFlow 或 Theano 自带的图形数据结构。因此,Keras 可以在 Theano 中执行离线的形状推理( shape inference)(这是 Theano 目前还不具备的一个功能),以及轻松的模型共享或模型复制。比如说,当你在一个新的输入 ( y = model(x)
) 上调用一个 Keras 模型时,Keras 会重复应用包含在你的模型底层图形中的所有指令,可以做到这一点的原因是 Keras 实际上能够独立于 TensorFlow/Theano 而对图形进行管理。事实上,Keras 甚至可以做到:1)定义一个带有 Theano 后端的 Keras 模型,2)切换到 TensorFlow 后端,3)在一个 TensorFlow 输入上重复应用你的(构建于 Theano 之上的)Keras 模型,这给原本是 Theano 模型的东西创造了一个 TensorFlow 版本(注意:实际上我们不允许在会话过程中切换后端,因为这会非常不安全——用户可能会混淆 TensorFlow 和 Theano 张量(tensor)——但如果你熟悉 Keras 的内部机制的话,也许能通过手动的方式做到。)
另一个重要的决定是使用面向对象的设计(object-oriented design)。深度学习模型可以被理解成是函数链(chains of functions),因此一种函数方法看起来可能就很有趣。然而这些函数都是高度参数化的,大部分都是通过它们的权重张量完成的,而以一种函数的方式操作这些参数是很不实际的。所以在 Keras 中,每一个事物都是一个对象:层、模型、优化器等等呢个。一个模型的所有参数都可以作为对象性质而被获取,比如说 model.layers[3].output 是该模型的第 3 层的输出张量,model.layers[3].weights 是该层的符号权重张量(symbolic weight tensor)列表,等等。
函数方法则会将层看作是可以创造权重的函数,当其被调用时,会将这些权重存储在全局名称索引集合(global name-indexed collections )中(比如 TensorFlow-Slim 就使用了这样的方法)。这意味着许多操作(模型加载、获取已有的权重张量)都必须通过名称匹配(name-matching)实现,所以你需要小心地给你创造的每一个张量命名,而不能依靠自动生成的名称。而且理所当然会有名称冲突的问题,这通常会导致我们无法在一个单一的会话中对多个独立的模型进行操作。对我来说,这看起来很像是反模式(anti-pattern)。面向对象的方法更加整洁,可以更好地扩展。
François Chollet:在机器学习竞赛中,这些获胜者很少是从一开始就想出了最好的想法,然后简单地部署它,提交结果,最后很快忘了这回事。开发一个好的模型需要对最初的想法进行多次迭代,直到时间到了;你总是能进一步改进你的模型。最终的模型与你最初尝试解决这个问题时所设想的方案几乎没有任何共同点,因为一个事先想好的方案基本上从来不会在现实试验中存活下来。所以赢不是说你最初的理论构想有多棒,而在于你的设想有多少能通过现实的考验。你不会输给比你更聪明的人,你会输给那些比你重复更多实验的人,他们一点点精化他们的模型。如果你把 Kaggle 上的团队按照实验的次数排名,我保证你会发现试验次数排名与最后的竞争排行榜有很强的关联。
Keras 被设计作为一种可快速构建许多不同模型的原型的方法,其关注的重点是尽可能减少从想法到实验结果验证之间所需的时间。Keras API 和工作流程基本上可以减少设置新实验的开销(overhead)(代码开销和认知开销)。所以使用 Keras 让你可以更快地迭代,尝试更多事物。最终,这能让你赢得比赛(或发表论文)。能够以最小的延迟将想法变成结果对实现好的研究来说是很关键的——这是 Keras 背后的核心信念之一。
François Chollet:我正在编写关于深度学习的介绍性书籍,前几章想描述使用 Keras 合理地第一次接触深度学习的情况。然而,还得一段时间我才能发布这些章节。
如果你不是很熟悉深度学习和机器学习的话,你可能需要检查下你是否学过下列教程,只要你有一些 Python 的背景,这些很基础的课都很容易跟着学:
一个来自 CERN 的从零开始学神经网络和 Keras 的视频教程( http://cds.cern.ch/record/2157570?ln=en )
来自 FastForwardLabs 的 Keras 「Hello world」( https://github.com/fastforwardlabs/keras-hello-world/blob/master/kerashelloworld.ipynb )
「通过 Keras,一步步用 Python 开发你的第一个神经网络」( http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/ )
如果你已经了解了一些机器学习和深度学习的知识,那么最快上手的方式是:
阅读 Keras README( https://github.com/fchollet/keras/blob/master/README.md )
阅读序列模型( https://keras.io/getting-started/sequential-model-guide/ )
阅读功能 API( https://keras.io/getting-started/functional-api-guide / )
阅读一些关键的 Keras 代码:
MLP( https://github.com/fchollet/keras/blob/master/examples/mnist_mlp.py )
Convnet( https://github.com/fchollet/keras/blob/master/examples/cifar10_cnn.py )
LSTM( https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py )
阅读 Keras 博客里的教程:
使用少量数据构建图象分类器( https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html )
使用预训练词嵌入( https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html )
使用 Keras 构建自动编码器( https://blog.keras.io/building-autoencoders-in-keras.html ) ( https://blog.keras.io/building-autoencoders-in-keras.html%EF%BC%89 )
然后通过参加 Kaggle 比赛来将你学到的技能应用到现实世界的问题。或者,这里有一个 Keras 教程和项目的知识库( https://github.com/fchollet/keras-resources ),你能在这里找到很多教程和代码实例。
François Chollet:这取决于你正在做什么。对于涉及循环网络的模型,我会推荐使用 Theano 以获得更好的性能。如果你需要在分布式部署中运行你的模型,那么我推荐 TensorFlow。其它情况下,使用能让你的模型运行得最快那个。
通常来说,TensorFlow 在性能方面上进步得非常快(虽然循环神经网络的性能仍有待提高)并且它最终会取代 Theano 作为 Keras 的默认后台。然而,我们目前还没到达那种程度。
François Chollet:现在模型级并行(在一个单一网络中将不同的指令发送至不同的设备)和数据级并行(将一个模型复制到并行处理不同数据批的设备中,然后将结果合并)是有可能的,但它们都是基于 TensorFlow 的。在未来,我们可能会引入一种统一的、用户友好的、基于单一代码库的 API 来处理 Theano 和 TensorFlow 中的并行形式。
目前来说,使用 TensorFlow 后台时,模型并行基本上微不足道(Keras 与 TensorFlow 的设备范围兼容),并且数据平行也非常简单……只要你知道如何在 TensorFlow 操作,不过在只在 TensorFlow 上操作是有点挑战的。这里有一个如何做的教程( https://gist.github.com/fchollet/2c9b029f505d94e6b8cd7f8a5e244a4e ),要与这个教程结合起来( https://www.tensorflow.org/versions/r0.10/how_tos/distributed/index.html )。
* François Chollet: *大约是 2015 年 2 月的时候,我正在解决几个深度学习问题,主要涉及自然语言处理(问答是一个大问题),当时我正在寻找一个能够很好地实现 LSTM 和其他 RNN、并能在 RNN 和卷积网络之间实现良好互动的深度学习框架。令我沮丧的是,一个都没有找到。最有前途的选择是 PyLearn2,我觉得它笨拙而不实用,并且缺乏对 RNN 的支持。以前我用 Torch 的体验不错,但是由 Lua (其中我不得不为每个数据格式实现我自己的数据分析器,等等)导致的效率损失太高了。最重要的是,那时的 Torch 还有很多毛病。
所以我想到了建立自己的框架:选用 Python 和一个有着良好 RNN 支持的、类似于 Torch 的 API,并专注于运用许多不同架构来加速实验。同时,开发于 Theano 之上是快速落实这样一个框架的最好(唯一?)选择。我开始投入工作大约一个月后,发布了 Keras 0.0.1。
没有 Theano 的话不可能实现 Keras。 开发好工具是一个从根本上渐进的过程:你是在由之前其他人提供的开源代码的层次上进行开发。这是一个整洁、协同、开放的过程。
François Chollet:Keras 对于新的贡献总是很开放。当前我希望开源社区关注一些项目,即:
我们怎样在 Keras 中支持树形 RNN 和递归网络?
在Theano 和 TensorFlow中为多 GPU 并行和数据并行模型开发一个统一的 API 。
开发一个层的「 tensorflow 」子模,使其成为包裹 TensorFlow 的一些特别操作的稀薄封装( thin-wrappers )。比如纯正的 TensorFlow RNNs 。
François Chollet:这是一个鲜为人知的事实,但是在TensorFlow 发布以前我计划支持Neon,它在那时是一个非常有前途的架构。它没有发生主要是因为Nervana 队似乎并不特别感兴趣,也因为那时Neon仍然没有找到自动分化的关键特征。六个月后,TensorFlow 发布了,我们转而关注并支持了它。
我依然很乐意在未来为 Keras 加入一个 Neon 后台。如果我们可以使得用户运行他们已在使用的同样的 Keras 代码,但由于定制的 Neon 内核而效率更高,那么对于 Keras 和 Nervana / Intel 的用户都是最好的,否则大量的初创公司和企业将不得不去采纳 Neon。然而,为了实现它我们需要 Nervana 与我们密切协作,总而言之,这对我看起来不太可能。
François Chollet:Python / Numpy 是你开始使用 Keras 前所需准备的全部。我曾经与完全不知道神经网络的人谈论在一天里训练 Keras 深度网络。所以我认为你只需要一天就能上手,然后可能需要几周时间来适应各个特征。最好的上手方式是阅读 Keras 的代码实例,并尝试按照自己的意愿修改它们。
François Chollet:当然。深度学习民主化中的第一步是使能用于建立高水平的架构的基础平台(即 Theano 和 TensorFlow )变得可用。第二步是建立针对深度学习的用户友好型的开发工具,例如 Keras 。第三步则是将工作重点从代码本身转移到应用上。我们不但会将用于构建解决方案的工具商业化,而且会使解决方案本身商业化,使之再次应用到其它问题上。预训练模型显然是那个方向的第一步。
这是被 Caffe 运用 Caffe model zoo 开发出来的。现在 Keras 也转到这个方向上来,特别是在这个库中四个最流行的计算机视觉模型上,包括 ImageNet 中的权重预训练(weights pre-trained)。你现在可以开始仅仅通过几行 Keras 的代码在新的图像上进行预测。很多人能做到这一点——包括权重文件下载在内的一切事情,都被考虑在内了。
François Chollet:Keras 大体来说对于参数函数( parametric functions )的监督式训练是合适的,参数函数由神经层组成。所以,你能轻易地用它实现浅的机器学习算法,比如 logistic 回归、线性回归或 FastText 。Keras 中不同回归算法的例子: keras_logistic_regression.py( https://gist.github.com/fchollet/b7507f373a3446097f26840330c1c378 )
Keras 中的 FastText :fchollet/keras ( https://github.com/fchollet/keras/blob/master/examples/imdb_fasttext.py )
然而,Keras 不适合基于决策树或矩阵分解( matrix factorization )的算法,也不适合核方法( kernel methods )。
François Chollet:在许多方面是这样。当然,深度学习最近所取得的成就是令人惊讶的:我们对感知问题(图像分类、语音识别)上的监督学习从捉襟见肘变得真正擅长。深度学习在机器学习的多个子领域内都具有变革的意义。但这里有一点是:大部分人并不直接参与深度学习研究,却喜欢从最近所取得的成就中做很多推测。例如,当我们开始在 ImageNet 分类任务中实现低于 4% 的 top-5 误差时,人们开始声称我们已经「解决」了计算机视觉问题。我们可以肯定我们目前还没有解决它;生成有关图片或视频内容的准确而精确的描述,或者为基础的视觉查询(比如「给我一个左数第二位女士的手提包的特写镜头」)给出一个有意义的答案,仍然是一个巨大挑战,这些对人类来说都是理所当然的事情。我们所取得的成功,尽管显著但仍然是非常有限的,激起了人工智能几乎得到解决的说法,这么说的依据是机器现在可以「理解」图像或语言。而现实是我们离这个目标还非常非常的遥远。
在试图于深度学习上捞好处的初创公司的推销中,我看见许多非常不切实际的期望。其中一些人只是天真地想得过于乐观,但有些人基本上就是生活在一个虚构的宇宙中——我已经至少见过 3 个不同的初创公司声称他们将在未来几年内解决「通用人工智能(general artificial intelligence)」问题。祝他们好运。大多数的这些公司没有资金方面的问题,但他们相当多的人会发现要想合适的退出会很难。特别是在风险投资和企业的决策者之中,很多失望会随之而来,而且除非这是通过更大一波深度学习应用方面成功的价值生产所取得的平衡,那么我们可能会在未来见证一个新的人工智能的冬天。
总之:深度学习已经使我们真正的擅长将感知输入(图像、声音、视频)大数据集以及简单的人类标注目标(例如一张图片中的物体列表)转化成可以自动将输入映射到目标的模型。这是很不错的,而且还有大量有变革意义的实际应用。但它仍然只是一件我们真的能够做得很好的事情。我们不要把这个相当有限的监督学习方面的成功误解成已经「解决」了机器感知或者通用的机器智能。有关智能方面,我们所不了解的事依然远远多过我们确实了解的,并且尽管我们比十年前离通用人工智能更近了一步,那也只是一小步。
François Chollet:深度学习从根本上来说是关于从原始数据中自动化学习其特征的,这些原始数据被假定是相当芜杂且高度非结构化的。浅层次的机器学习就像给机器投喂有杂质的金块,然后得到纯净的金块,但是深度学习更像给机器投喂原始土块( raw dirt ),然后得到纯净的金块。你需要大量原始土块才能淘出金子来;你需要给深度网络大量数据才能从充满噪声的数据中自动找出信号。对于高维度数据这尤其确实如此:数据的内在维度越高,你需要越多的样本来取样数据流形( data manifold ),这对于从数据中提取优质特征往往是必要的。
还有一些实例,机器可能从「少量」样本数据中学习,但是这高度依赖于问题的本质和你对「少量」的定义。例如,很容易用几千甚至几百个样本来训练图像分类器,通过精确调整一个之前用大规模类似图像的数据集进行训练过的网络就能很好地做到这一点。在 fMRI 数据的例子中,尝试深度学习技术对我来说并不是什么奇闻怪事。但我当然不是 fMRI 上的专家。
François Chollet:有两个原因:第一,因为机器学习和人工智能对于创造价值有巨大潜力,而且我们不应该浪费其中任何潜力。具有能促进机器学习领域发展或使用人工智能创造伟大事物的驱动力量和智慧的人,可能来自任何地方,而且我们有责任确保这些人能获得所需的知识和工具来实现自身全部潜力。此外,我们应该尽最大努力激励世界上有能力的人,因此他们就会想奉献才能来实现人工智能的创造价值。如果我们相信人工智能有很高的投资回报,那么民主化人工智能就是理性策略。人工智能正要创造数量惊人的机会,这些机会不应该只给常春藤联盟院校或者出生在美国的 人,而是应该对所有人开放。
我认为另一个原因也许更加微妙:为了社会和经济稳定,我们应该让人工智能易于使用。在不远的将来,机器学习和人工智能使许多工作自动化,人工智能创造的许多价值将为开发者逐渐带来利益(但是总体来说,自由市场的动态变化将确保每个人最终都能在某种程度上获利)。一种达到平衡的方式让人工智能创造的价值尽可能广泛地普及,因而让经济控制变得更加分散,防止有潜在危险的集权。如果每个人能使用人工智能解决面临的问题,那么人工智能就是一个帮助个人的工具。如果需要与一家特定公司(它很可能有你的数据)签合同才能使用人工智能,那么人工智能就成为一个 集中和整合权力的工具。我更喜欢前一种情况。
François Chollet:用 Haskell 实现一个 C++/CUDA 计算图像引擎(例如TensorFlow 或是 Theano )的界面是可能的。但是在 Haskell 中从底层开始实现一个深度学习框架几乎是不可能的,由此也可能产生巨大的缺陷。Haskell 甚至没有一个好的可以上手的张量操作库( tensor manipulation library )。
总的来说,甚至是为 Theano / TensorFlow 做一个界面,我认为Haskell中的功能主义使得它不是很适合界定深度学习网络。一个面向对象的或是多范式的编程语言是最好的,例如 Keras 从根本上来说就是面向对象的。
François Chollet:这是一种虚假的二分法;我认为将人工智能应用到神经网络开发中会产出实证的研究结果,这些结果会让我们更加扎实地理解如何系统地设计人工智能。举个例子,假设我们还不知道 ConvNets 在计算机视觉应用上的效果:一个搜索许多可能的网络拓扑结构的进化算法,在监督学习任务的准确指导下,可能会重新发明卷积和最大池化( max-pooling )。相同的还有起始块( inception blocks)或剩余连接( residual connections)。当然,找出神经网络设计的拓扑技巧只是整个工作的一小部分;如果我们想做得认真点,就需要应用人工智能搜索算法来找到全新的训练网络的方法。
所以,简单来说,两种情况都会实现,因为搜索驱动的设计和理论驱动的设计都是能带来进步的有效且实际的方法。尤其是自我建立的神经网络很可能引导我们在理论上更好地理解它们是如何工作的,并对它们做出改进。如果你仔细想一下,就会发现迄今为止深度学习上的大部分进步都是随便扔一把意大利面看看哪根能立在墙上这样简单粗暴做出来的。深度学习是一个几乎完全实证性的研究领域。研究人员,其实是一些研究生,他们正在通过他们的一种大规模分布式搜索算法来实现深度学习,寻找新的神经设计模式。驱动一个搜索算法的不仅是任何特定人工智能技术,还有生物智能。这个过程的一部分现在是将来也肯定是自动化的。
François Chollet:在我的经历中没有遇到过。批量正则化的主要作用是通过减少在连续层间的内部协变量转移来帮助梯度( gradients )穿过更深的网络,所以批量正则化使得你可以训练更深的网络,这不能预先聚集,然后它用重要因子逐渐加快深度网络的训练。没有证据表明它增加或减少了网络的性能。
François Chollet:要取代程序员还有一段很长的路要走,因为程序员不只是操纵代码。他们在来自客户或产品经理的非正规的、专业不足的、经常是错误的技术说明( specification )和理应解决潜在问题(这些问题甚至可能没有被客户/经理很好地理解)的实际工作软件之间搭建了桥梁。要做到这一点需要的不只是理解所写的代码,还要理解代码运行的整个环境。
当然,我们距离创造能以接近人类水平操作代码的人工智能还很遥远。但是我相信在不远也不近的未来这个问题很可能能得到解决。
然后将会发生的是我们将为软件开发者创造出基于人工智能的编程助理。开发者将与具备先进编程能力的人工智能或多或少地交流确切的技术规格,而且人类和人工智能将互动交流,从而精心设计符合人类愿景的软件。随着这种助理的进步,它们最终将被精通科技的产品经理使用,到那时,将不会有任何程序员了。通过使用人工智能解决问题而不是用自己的大脑大量生产代码,人类将走向价值生产链的更高端。
François Chollet:Wysp 是我几年前为了娱乐做的一款网页应用。它由两个部分组成,一个是为艺术家准备的社交网络,在那里人们可以分享他们的艺术品并收集他人的艺术品;另一个是学习平台,在这里人们可以提升他们的绘画水平,他通过销售绘画课程盈利。
最近,Wysp 有 10 万注册用户和大约 2 万月活跃用户。2 万这个数字在过去几年一直保持稳定。由于我没有时间来做 Wysp ,自最后一次升级起,它已经完全自动运行了 2 年多了。这是一个火热却被遗忘的网页应用。
François Chollet:是的,他们忙于自动化定理证明(还有其他与之相关的,更加宏伟的项目)。在未来你们可以期待更多的论文。
François Chollet:矩阵因式分解(Matrix factorization):一个简单漂亮的降维方法——降维是认知的关键。推荐系统会是矩阵因式分解的一个大应用。另一个我这几年(从 2010 年使用视频数据开始)一直使用的应用是分解特征间的一个两两交互信息矩阵(或者是更常见的点互信息),该应用可用于提取特征、计算词嵌入、计算标签嵌入(我最近一篇论文「大规模图像分类的信息理论标签嵌入」中的主题)等等。
当被用在卷积环境中,这个算法可作为图像和视频的一个非常好的无监督特征提取器。但是它还有一个问题:它从根本上是一个浅算法。只要有任何一种可用的监督标签,深度神经网络就能很快超过它。
François Chollet:这是老生常谈了,但是我的最终目标是解决智能问题。还不清楚的是这是否可能在 21 世纪早期成为现实。但是我将尽我最大的努力。
我有一个计划。我认为要实现机器智能的最短路径是:首先,我们开发出一些方法让专用人工智能操纵形式概念、编写程序、运行实验以及同时发展关于它们正在操纵的概念的数学直觉(甚至创造力)。然后我们使用我们的发现开发出能够在人工智能研究以及其他领域上协助我们的人工智能科学家。一个专用的超越人类的人工智能将用于科学研究。这将极大地加快人工智能的发展。起初,我们用它来解决:例如,开发出代理来解决日益复杂和开放式的游戏。这种人工智能研究者通过与人类合作和不断自我完善,将最终继续前进, 解决智能——生物智能和机器智能—— 的一般问题。
所以我的长期目标是:让人工智能自力更生。这个过程的一个副作用是,能帮助解决许多突出的科学难题的研究助理会得到发展。将来,大多数科学研究将被人工智能独立完成,或者被人类在过于依赖这种人工智能助理的基础上完成。有了对人工智能的广泛定义,人们可能争论道,这种情况已经发生了:现今的所有科学研究都依赖与计算机和软件。这种趋势将会只增不减,不久将延伸到智能助理,它们能抽象出日益高级的思维过程,包括直觉和创造力。
François Chollet:当然。谷歌(尤其是机器智能组织机构)没有特别的学历要求。你可能是一位辍学的高中生,只要你本身足够有价值,你还是能进入的。如果你想在没有学术证书的情况下从事专门的机器学习研究,那你可能需要展示一些相关的个人项目:研究论文、开源代码、新算法……好消息是,自己动手开始人工智能研究几乎没什么成本。你所需要的所有知识和工具都可以免费获得。除了你的 GPU 和电费:你仍然需要为此付费,但一般来说还是负担得起的。
François Chollet:我认为学习机器学习的最好方法是:
首先,清楚地理解关键算法是怎样起作用的,试着自己在 Numpy 中重新实现一个有趣的例子(Numpy 卷积网络、Numpy 多层感知器, Numpy LSTM)。
熟悉实际应用,看看 Keras repo 提供的 Keras 实例。尝试着修改它们,使得它们适应新的数据,并调整模型的结构直到你得到了在你的问题上所能得到的最好结果。
通过 Kaggle 竞赛获得一种做研究和在现实生活中应用数据科学的感觉。和其他人组队,也许能赢得比赛!
最后,你可以开始阅读理论书籍(例如 Goodfellow, Bengio 和 Courville 的深度学习书籍)和论文来深化对于你正在进行的工作的更加抽象和数学的理解。
François Chollet:我希望可以在 2017 年一季度完成,它应该会在 2017 年底上架。