网站性能检测评分
注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。
团队拓展训练视频
从自然语言处理到人工智能的两条路径(附64页PPT) 人工智能视频课程
大数据文摘作品,转载请联系
编译团队|寒阳,范玥灿,毛丽,曹翔
现在是机器思考,学习并创造的世界。此外,他们做这些事情的能力会迅速增加,直到在一个明显的未来,他们能处理的问题范围将与人类思想应用的范围一起扩大。
——赫伯特·西蒙, 1957
2017年1月14日Texas Data Day的大会上,Deep Grammar的联合创始人、CEO、人工智能专家和机器学习专家Jonathan Mugan做了题为《从自然语言处理到人工智能(Deep Learning for Natural Language Processing》的演讲。
Jonathan Mugan专注人工智能、机器学习与自然语言处理的结合。本次演讲中,他重点阐述了如何从自然语言处理到人工智能,以及两条具体路径:符号路线和亚符号路线。
本文基于本次演讲的64页ppt整理汉化完成。点击右上角进入大数据文摘后台,回复“自然语言处理”获取完整版演讲ppt。
人工智能已经变得更聪明。尤其是深度学习,但是,计算机仍不能智能地读取或交谈。
要想了解语言,计算机需要了解世界。他们需要回答类似于下面这样的问题——
为什么你可以用绳拉马车却不推它?
为什么体操运动员用一条腿竞争是不寻常的?
为什么只有外面下雨?
如果有一本书在桌上,你推桌子,会发生什么?
如果鲍勃去垃圾场,那么他会在机场吗?
让我们以一种基于感觉和行动的方式理解语言——
当某人说“鸡”的时候,我们直接把它和我们对于鸡的经验相匹配,我们理解彼此因为我们有相同的经历,这就是电脑需要的一种理解能力。
两种理解含义的路径:
无意义的标记
词袋(Bags-of-words)表述:
将词语视为任意符号,并查看其频率。“狗 咬 人”和“人 咬 狗”完全一致。考虑一个有50,000个单词的词汇表:
“aardvark” 的位置是 0
“ate” 的位置是 2
“zoo” 的位置是 49,999
一个词袋可以是一个有50,000维度的向量。
“The aardvark ate the zoo.”= [1,0,1, ..., 0, 1]
我们可以做的更好一点,通过数出这些词数出现的频率。
tf: 词频(term frequency),单词出现的频率。
“The aardvark ate the aardvark by the zoo.” = [2,0,1, ..., 0, 1]
提升非常见词汇:
认为非常见词汇比常见词汇更能表征文本,我们可以得到更好的结果。将每个条目乘以一个表示它在语料库中有多常见的度量。
idf: 逆文本频率指数
idf( 术语, 文本) = log(文本数量 / 包含术语的文本的数量)
10 文本, 只有一个 有 “aardvark” , 5 个有 “zoo” , 5个 有 “ate”
tf-idf: tf * idf
“The aardvark ate the aardvark by the zoo.” =[4.6,0,0.7, ..., 0, 0.7]
称为向量空间模型。你可以将这些向量放入任何分类器,或者基于类似的向量找到相似的文档。
主题模型 (LDA):
潜在狄利克雷分布(Latent Dirichlet Allocation)
你选择主题的数量 ,每个主题是一个关于单词的分布,每个文档是一个关于主题的分布,在Python主题模型 gensim中很容易操作(https://radimrehurek/gensim/models/ldamodel.html )
通过pyLDAvis在推特上应用LDA:
情感分析:——作者对文本是什么样的感受:
人工设置表达法
我们通过手动指定符号之间的关系来告诉计算机事物的意思。
1.使用预定的关系来储存意思
2.图示多种书写某种同意东西的方法
通过相对较少表述数量,我们可以对机器应该做什么进行编码。
单词网络(WordNet):
框架网络:
概念网络:
另一个知识本体:
建议上的合并本体:
意象图式(Image Schemas):
意象图式是人类关于跨共同文化经验的表示
——费尔德曼, 2006
人类使用意象图式来理解空间布置和空间运动
——曼德勒, 2004
意象图式的例子包括路径,先知,阻塞和吸引力
——约翰逊, 1987
抽象概念例如浪漫关系和论证被表示为这种经验的隐喻
——莱考夫和约翰逊, 1980
语义网-链接数据:
世界模型
计算机需要关于世界如何运作以及如何与之交互的因果模型。人们不会说一切事情来表达一个信息,只会说没有被我们共同的概念所涵盖的东西 。编码我们的共享概念最有效的方法来是借用模型。模型表达了世界如何根据事件变化。回顾商务购买框架 ,后来,一个人有更多的钱,另一个人有更少的钱 ,从模型中读出这样的结论 。
模型的纬度:
概率:确定性与随机比较。例如,逻辑与概率编程比较
因素状态:整体状态和使用变量比较。例如,有限自动机与动态贝叶斯网络比较
相关性: 命题逻辑和一阶逻辑比较。 例如, 贝叶斯网络与马尔可夫逻辑网络
同时发生Concurrent: 对一个事物模型与多个事物比较。例如, 有限自动机与Petri网比较
时间的: 静态与动态比较。 例如, 贝叶斯网络与动态贝叶斯网络比较
通过模型合并表达法:
Word2vec
Word2vec模型为词汇表中的每一个单词学习一个向量。每个词向量的维度是相同的,一般在300左右。和tf-idf向量不同,词向量是紧密的,大部分值不是0。
1.将每个单词初始化为一个随机向量
2.对于文档集里的每一个单词w1:
3.对于单词w1周围的每一个词w2:
4.移动向量,使w1和w2距离更近,同时其他单词和w1的距离更远。
5.若没有达到终止条件,跳转到步骤2
——Skip-gram 模型 (Mikolov et al., 2013)
注意:实际上每个单词对应两个向量,因为你不希望一个单词是在它本身附近的。(参见Goldberg and Levyhttps://arxiv.org/pdf/1402.3722v1.pdf ), 这个双层for循环的解释出自 Christopher Moody
word2vec 的含义:
我们常常可以看到这样名言:
“你可以通过一个词附近的其它词来理解这个词”
——J. R. Firth 1957
从某种意义上讲,这个似乎是个事实。
“向量具有内部结构。”
——Mikolov et al., 2013
意大利– 罗马= 法国– 巴黎
国王– 女王= 男人– 女人
但是……单词不是基于经验的,它们只是依赖于周围的其它单词的。
(也可以在ConceptNe上进行word2vec, 参见https://arxiv.org/pdf/1612.03975v1.pdf)
seq2seq 模型
seq2seq(序列-序列)模型可以对一个符号的序列进行编码,例如一个句子,将其编码为一个向量。进而,模型可以将向量解码为另一个符号的序列。编码和解码都可以通过循环神经网络(RNNs)进行。一个明显的应用就是机器翻译。例如,源语言是英语,目标语言是西班牙语。
将句意编码为向量:
将句意解码:
生成图片题注:
回答提问
兴趣点:
深度学习与回答提问:
神经网络学习到了各个符号序列之间的联系,但是这种描述并不足以覆盖真实世界的丰富的联系。
外部世界训练
如果我们希望和机器交流,我们需要在和我们自己尽可能相似的环境中训练他们。且不能仅仅是对话!(Harnad[1990] http://users.ecs.soton.ac.uk/harnad/Papers/Harnad/harnad90.sgproblem.html)为了理解“鸡”,我们需要机器尽可能多的得到关于“鸡”的经验。当我们说出“鸡”的时候,我们不仅仅指的是那种鸟类,我们指的是所有我们可以对它做的事情,以及它在我们文化中的所有含义。
这个方向已有很多工作:
首先,是在工业界——
1.OpenAI
世界: 在 VNC(远程桌面)的屏幕上训练
现在是通过Grand Theft Auto(侠盗车手)!
(https://openai/blog/GTA-V-plus-Universe/)
2.Google
Mikolov et al., A Roadmap towards Machine Intelligence(机器智能路线图).
他们定义了一个人工环境. (https://arxiv.org/pdf/1511.08130v2.pdf )
3.Facebook
Weston, 应用于对话的记忆网络https://arxiv.org/pdf/1604.06045v7.pdf
Kiela et al., Virtual Embodiment: A Scalable Long-Term Strategy for Artificial Intelligence Res(虚拟实体化:人工智能的可拓展长期战略). 提倡“有目的地” 使用视频游戏https://arxiv.org/pdf/1610.07432v1.pdf
当然还有学术界——
1.Ray Mooney
文本到局面的映射
http://videolectures/aaai2013_mooney_language_learning/
2.Luc Steels
具有词汇量和简单语法的机器人
3.Narasimhanet al.
训练神经网络来玩基于文字的冒险游戏
https://arxiv.org/pdf/1506.08941v2.pdf
但是,我们需要针对现实世界的更多训练:
也许在Amazon Alexa 有了一个摄像头以及一颗可以转动的脑袋之后?没有了老师的教益,我们还能走多远?
我们可以将目光作为信息的来源吗?
——Yu and Ballard, [2010]
从NLP到AI的两条路径
最后的思考
开放问题:
从商业视角来看,需要使用常识和逻辑推理的,最简单的任务是什么?
TensorFlow和Caffe、MXNet、Keras等其他深度学习框架的对比 流量视频课程
雷锋网按:本文作者黄文坚,PPmoney 大数据算法总监,《 TensorFlow 实战》作者。本文节选自《 TensorFlow 实战》第二章。
在下周二(2月28日)雷锋网硬创公开课栏目将会推出黄文坚老师的公开课《深度学习之经典卷积神经网络的技术浅析》(),欢迎大家报名!点击了解详情
Google 近日发布了 TensorFlow 1.0 候选版,这第一个稳定版将是深度学习框架发展中的里程碑的一步。自 TensorFlow 于 2015 年底正式开源,距今已有一年多,这期间 TensorFlow 不断给人以惊喜。在这一年多时间,TensorFlow 已从初入深度学习框架大战的新星,成为了几近垄断的行业事实标准。
主流深度学习框架对比
深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括 TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon 等等。然而 TensorFlow 却杀出重围,在关注度和用户数上都占据绝对优势,大有一统江湖之势。表 2-1 所示为各个开源框架在GitHub上的数据统计(数据统计于 2017 年 1 月 3 日),可以看到 TensorFlow 在 star 数量、fork 数量、contributor 数量这三个数据上都完胜其他对手。
究其原因,主要是 Google 在业界的号召力确实强大,之前也有许多成功的开源项目,以及 Google 强大的人工智能研发水平,都让大家对 Google 的深度学习框架充满信心,以至于 TensorFlow 在 2015 年 11 月刚开源的第一个月就积累了 10000+ 的 star 。其次,TensorFlow 确实在很多方面拥有优异的表现,比如设计神经网络结构的代码的简洁度,分布式深度学习算法的执行效率,还有部署的便利性,都是其得以胜出的亮点。如果一直关注着 TensorFlow 的开发进度,就会发现基本上每星期 TensorFlow 都会有1万行以上的代码更新,多则数万行。产品本身优异的质量、快速的迭代更新、活跃的社区和积极的反馈,形成了良性循环,可以想见 TensorFlow 未来将继续在各种深度学习框架中独占鳌头。
表2-1 各个开源框架在 GitHub 上的数据统计
观察表2-1还可以发现,Google、Microsoft、Facebook 等巨头都参与了这场深度学习框架大战,此外,还有毕业于伯克利大学的贾扬清主导开发的 Caffe,蒙特利尔大学 Lisa Lab 团队开发的 Theano,以及其他个人或商业组织贡献的框架。另外,可以看到各大主流框架基本都支持 Python,目前 Python 在科学计算和数据挖掘领域可以说是独领风骚。虽然有来自 R、Julia 等语言的竞争压力,但是 Python 的各种库实在是太完善了,Web 开发、数据可视化、数据预处理、数据库连接、爬虫等无所不能,有一个完美的生态环境。仅在数据挖据工具链上,Python 就有 NumPy、SciPy、Pandas、Scikit-learn、XGBoost 等组件,做数据采集和预处理都非常方便,并且之后的模型训练阶段可以和 TensorFlow 等基于 Python 的深度学习框架完美衔接。
表 2-1 和图 2-1 所示为对主流的深度学习框架 TensorFlow、Caffe、CNTK、Theano、Torch 在各个维度的评分,本书 2.2 节会对各个深度学习框架进行比较详细的介绍。
表2-2 主流深度学习框架在各个维度的评分
图2-1 主流深度学习框架对比图
各深度学习框架简介
在本节,我们先来看看目前各流行框架的异同,以及各自的特点和优势。
TensorFlow
TensorFlow 是相对高阶的机器学习库,用户可以方便地用它设计神经网络结构,而不必为了追求高效率的实现亲自写 C++或 CUDA 代码。它和 Theano 一样都支持自动求导,用户不需要再通过反向传播求解梯度。其核心代码和 Caffe 一样是用 C++编写的,使用 C++简化了线上部署的复杂度,并让手机这种内存和CPU资源都紧张的设备可以运行复杂模型(Python 则会比较消耗资源,并且执行效率不高)。除了核心代码的 C++接口,TensorFlow 还有官方的 Python、Go 和 Java 接口,是通过 SWIG(Simplified Wrapper and Interface Generator)实现的,这样用户就可以在一个硬件配置较好的机器中用 Python进行实验,并在资源比较紧张的嵌入式环境或需要低延迟的环境中用 C++部署模型。SWIG 支持给 C/C++代码提供各种语言的接口,因此其他脚本语言的接口未来也可以通过 SWIG 方便地添加。不过使用 Python 时有一个影响效率的问题是,每一个 mini-batch 要从 Python 中 feed 到网络中,这个过程在 mini-batch 的数据量很小或者运算时间很短时,可能会带来影响比较大的延迟。现在 TensorFlow 还有非官方的 Julia、Node.js、R 的接口支持,地址如下。
Julia: http://github/malmaud/TensorFlow.jl
Node.js: http://github/node-tensorflow/node-tensorflow
R: http://github/rstudio/tensorflow
TensorFlow 也有内置的 TF.Learn 和 TF.Slim 等上层组件可以帮助快速地设计新网络,并且兼容 Scikit-learn estimator 接口,可以方便地实现 evaluate、grid search、cross validation 等功能。同时 TensorFlow 不只局限于神经网络,其数据流式图支持非常自由的算法表达,当然也可以轻松实现深度学习以外的机器学习算法。事实上,只要可以将计算表示成计算图的形式,就可以使用 TensorFlow 。用户可以写内层循环代码控制计算图分支的计算,TensorFlow 会自动将相关的分支转为子图并执行迭代运算。TensorFlow 也可以将计算图中的各个节点分配到不同的设备执行,充分利用硬件资源。定义新的节点只需要写一个 Python 函数,如果没有对应的底层运算核,那么可能需要写 C++或者 CUDA 代码实现运算操作。
在数据并行模式上,TensorFlow 和 Parameter Server 很像,但 TensorFlow 有独立的 Variable node,不像其他框架有一个全局统一的参数服务器,因此参数同步更自由。TensorFlow 和 Spark 的核心都是一个数据计算的流式图,Spark 面向的是大规模的数据,支持 SQL 等操作,而 TensorFlow 主要面向内存足以装载模型参数的环境,这样可以最大化计算效率。
TensorFlow 的另外一个重要特点是它灵活的移植性,可以将同一份代码几乎不经过修改就轻松地部署到有任意数量 CPU 或 GPU 的 PC、服务器或者移动设备上。相比于 Theano,TensorFlow 还有一个优势就是它极快的编译速度,在定义新网络结构时,Theano 通常需要长时间的编译,因此尝试新模型需要比较大的代价,而 TensorFlow 完全没有这个问题。TensorFlow 还有功能强大的可视化组件 TensorBoard,能可视化网络结构和训练过程,对于观察复杂的网络结构和监控长时间、大规模的训练很有帮助。TensorFlow 针对生产环境高度优化,它产品级的高质量代码和设计都可以保证在生产环境中稳定运行,同时一旦 TensorFlow 广泛地被工业界使用,将产生良性循环,成为深度学习领域的事实标准。
除了支持常见的网络结构(卷积神经网络(Convolutional Neural Network,CNN)、循环神经网络(Recurent Neural Network,RNN))外,TensorFlow 还支持深度强化学习乃至其他计算密集的科学计算(如偏微分方程求解等)。TensorFlow 此前不支持 symbolic loop,需要使用 Python 循环而无法进行图编译优化,但最近新加入的 XLA 已经开始支持 JIT 和 AOT,另外它使用 bucketing trick 也可以比较高效地实现循环神经网络。TensorFlow 的一个薄弱地方可能在于计算图必须构建为静态图,这让很多计算变得难以实现,尤其是序列预测中经常使用的 beam search。
TensorFlow 的用户能够将训练好的模型方便地部署到多种硬件、操作系统平台上,支持 Intel 和 AMD 的 CPU,通过 CUDA 支持 NVIDIA 的 GPU (最近也开始通过 OpenCL 支持 AMD 的 GPU,但没有 CUDA 成熟),支持 Linux 和 Mac,最近在 0.12 版本中也开始尝试支持 Windows。在工业生产环境中,硬件设备有些是最新款的,有些是用了几年的老机型,来源可能比较复杂,TensorFlow 的异构性让它能够全面地支持各种硬件和操作系统。同时,其在 CPU 上的矩阵运算库使用了 Eigen 而不是 BLAS 库,能够基于 ARM 架构编译和优化,因此在移动设备(Android 和 iOS)上表现得很好。
TensorFlow 在最开始发布时只支持单机,而且只支持 CUDA 6.5 和 cuDNN v2,并且没有官方和其他深度学习框架的对比结果。在 2015 年年底,许多其他框架做了各种性能对比评测,每次 TensorFlow 都会作为较差的对照组出现。那个时期的 TensorFlow 真的不快,性能上仅和普遍认为很慢的 Theano 比肩,在各个框架中可以算是垫底。但是凭借 Google 强大的开发实力,很快支持了新版的 cuDNN (目前支持cuDNN v5.1),在单 GPU 上的性能追上了其他框架。表 2-3 所示为 给出的各个框架在 AlexNet 上单 GPU 的性能评测。https://github/soumith/convnet-benchmarks
表2-3 各深度学习框架在 AlexNet 上的性能对比
目前在单 GPU 的条件下,绝大多数深度学习框架都依赖于 cuDNN,因此只要硬件计算能力或者内存分配差异不大,最终训练速度不会相差太大。但是对于大规模深度学习来说,巨大的数据量使得单机很难在有限的时间完成训练。这时需要分布式计算使 GPU 集群乃至 TPU 集群并行计算,共同训练出一个模型,所以框架的分布式性能是至关重要的。TensorFlow 在 2016 年 4 月开源了分布式版本,使用 16 块 GPU 可达单 GPU 的 15 倍提速,在 50 块 GPU 时可达到 40 倍提速,分布式的效率很高。目前原生支持的分布式深度学习框架不多,只有 TensorFlow、CNTK、DeepLearning4J、MXNet 等。不过目前 TensorFlow 的设计对不同设备间的通信优化得不是很好,其单机的 reduction 只能用 CPU 处理,分布式的通信使用基于 socket 的 RPC,而不是速度更快的 RDMA,所以其分布式性能可能还没有达到最优。
Google 在 2016 年 2 月开源了 TensorFlow Serving,这个组件可以将 TensorFlow 训练好的模型导出,并部署成可以对外提供预测服务的 RESTful 接口,如图 2-2 所示。有了这个组件,TensorFlow 就可以实现应用机器学习的全流程:从训练模型、调试参数,到打包模型,最后部署服务,名副其实是一个从研究到生产整条流水线都齐备的框架。这里引用 TensorFlow 内部开发人员的描述:“ TensorFlow Serving 是一个为生产环境而设计的高性能的机器学习服务系统。它可以同时运行多个大规模深度学习模型,支持模型生命周期管理、算法实验,并可以高效地利用 GPU 资源,让 TensorFlow 训练好的模型更快捷方便地投入到实际生产环境”。除了 TensorFlow 以外的其他框架都缺少为生产环境部署的考虑,而 Google 作为广泛在实际产品中应用深度学习的巨头可能也意识到了这个机会,因此开发了这个部署服务的平台。TensorFlow Serving 可以说是一副王牌,将会帮 TensorFlow 成为行业标准做出巨大贡献。
图2-2 TensorFlow Serving 架构
TensorBoard 是 TensorFlow 的一组 Web 应用,用来监控 TensorFlow 运行过程,或可视化 Computation Graph。TensorBoard 目前支持五种可视化:标量(scalars)、图片(images)、音频(audio)、直方图(histograms)和计算图(Computation Graph)。TensorBoard 的 Events Dashboard 可以用来持续地监控运行时的关键指标,比如 loss、学习速率(learning rate)或是验证集上的准确率(accuracy);Image Dashboard 则可以展示训练过程中用户设定保存的图片,比如某个训练中间结果用 Matplotlib 等绘制(plot)出来的图片;Graph Explorer 则可以完全展示一个 TensorFlow 的计算图,并且支持缩放拖曳和查看节点属性。TensorBoard 的可视化效果如图 2-3 和图 2-4 所示。
图2-3 TensorBoard 的 loss 标量的可视化
图2-4 TensorBoard 的模型结构可视化
TensorFlow 拥有...