NLP 研究者的编程指南

最近 AllenNLP 在 EMNLP2018 上做了一个主题分享,名为「写给 NLP 研究者的编程指南」(Writing Code for NLP Research)。该演讲从写原型和写模块两方面介绍了 NLP 研究该如何复制别人的代码、测试自己的代码块、记录及分享研究等,总之在研究者也要高效码代码的年代,这是一份浓缩的实践经验。

读者可以直接下载 PPT 了解详细内容,其中每一页 PPT 都带有简要的备注,根据这些备注可以将所有 PPT 以及整场演讲串联起来。

下载地址:https://pan.baidu.com/s/1G4rYjZ9JV7FJt9UbIc0_gw

下面是整个分享的大纲。通过这次演讲,你可以学到如何写代码来促进你的研究,以及可复现的实验。当然读者最好还是知道一点 NLP 相关的知识,因为这一份分享会以深度学习中的 NLP 问题作为案例。此外,能够大致读懂 Python 代码也是很好的背景,这篇文章都是以 Python 接口调用 DL 框架为例。

NLP
NLP

这里有两种写研究代码的模式,一种是写原型,一种是写组件。作为一名研究者,大多数时候我们都希望写原型,但是在没写好组件前是写不好原型的。而通过原型设计,有时候做出来的东西又是希望下次再复用的组件。因此这是编写代码的两种模式,它们并不独立。

两种写研究代码的模式
两种写研究代码的模式

我们先从写原型的方式开始介绍:

写原型

写原型
写原型

当我们开始写一个原型代码的时候,我们要做到下面三点:

1. 写代码要快
2. 跟踪实验结果
3. 分析模型结果

快速开发

快速开发
快速开发

要做到快速编程,不要从头开始写所有内容,而是使用框架。这里的框架不仅指 tensorflow 或 pytorch 之类的框架,也可以理解为模板。比如上图中如果写 training loop 的部分,已经有人写好了。我们只要看懂后,直接拿来用就行,没有必要从头开始自己写所有部分。

快速编程
快速编程

上面提到的一些内容,都是可以找到现成框架来套用的。很多时候我们在编程时遇到的问题不是构建模型,而是数据读取、预处理和写训练循环等部分。如果有人把你想用的东西模块化了,还等什么,直接拿来用啊!

当然拿来用也是有步骤的,首先我们应该获得基线模型的性能,这也是一个很好的研究实践。基线模型可能是别人的代码,你要是能修修改改就更好了。其次复现 SOTA 基线结果对于理解模型和做更多的研究是非常有帮助的。

基线模型
基线模型

要想快速开发,另一个建议就是先复制,再重构。要记住,我们是在写原型,不用在乎什么可用性,先把代码写 work 了再说。如果实现的效果不错的话,再回去重构。

代码
代码

另外,我们要有好的编程习惯。比如起有意义的变量名,写注释帮助理解。记住,我们是写给人看的,不是机器!此外在使用基线模型做试验的时候,我们可以现在小数据集上做测试,并确保模型能准确读取数据。

准确读取数据
准确读取数据

如果在做原型设计时,我们将 LSTM 写死了(hard-code),那么在我们希望使用 Transformer 等模块的时候就需要重新改代码。因此使用多态可以借助更高级的抽象扩展代码,这样在换模块时就能只修改少量代码。

跟踪实验结果

在写原型的时候你需要运行很多东西,这导致很难追踪发生了什么以及对应的代码部分。

跟踪实验结果
跟踪实验结果

可以准备一个 Excel 表格,来记录实验结果。

黑箱对比对于上下文理解有帮助,但不能深入理解两个结果之间的关系,因为有太多的变量在同时变化。我们需要每次仅改变一个变量,可以在代码中设置「开关」,将开关配置一些全局状态/依赖注入。

全局状态 依赖注入
全局状态 依赖注入

每次只改变一个部分,方便跟踪实验结果的变化其原因在于哪里。

每次只改变一个部分
每次只改变一个部分

这里光是 embedder,我们就有很多种选择

embedder
embedder

使用设定文件来记录模型的改变,方便我们以后查询当时的设定。

分析模型结果

在训练的时候,可视化对于分析模型表现是非常重要的。这个技能必须掌握。

分析模型结果
分析模型结果

Tensorboard 可以提供很多分析结果。

Tensorboard
Tensorboard

Tensorboard 能帮我们找到优化的 bug。比如上图中的 embedding 梯度有两个数量级的差别。

Tensorboard
Tensorboard

原因在于 embedding 的梯度是稀疏梯度,即只有一部分会被更新。但是 ADAM 中的动量系数是针对整个 embedding 计算的,所以解决方法是直接引入特定的优化器:DenseSparseAdam。

在解释你的模型的预测输出时,好的展示是静态预测;更好的展示是交互地查看预测;最好的展示是交互地查看内部过程。

best
best

对于预测结果,如果可以做到交互式的方式来查看的话,是最好的。

开发组件

与写原型不同,开发可重复使用的组件有很多要注意的地方。我们的代码需要写清楚,这样就能聚焦于建模决策,而不考虑代码到底在做什么。

Code Reveiw
Code Reveiw

Code Reveiw 是必不可少的。Review 的时候,不仅能发现错误,还能提高代码的可读性。

持续整合 以及构建自动化
持续整合 以及构建自动化

如果我们不是软件开发人员的话,对于持续整合 以及构建自动化 这两个词可能比较陌生。通常我们只说持续整合的时候,也包含了构建自动化的意思。想要做到这点,要多写测试才行。

当然,如果我们不是开发一个很多人都会用到的库,上面这些步骤是用不到的。不过测试很重要,如果是原型开发,也要做一些最基本的测试。

最基本的测试
最基本的测试

如上对读取的数据进行测试,看是否正确。这里在进行单元测试时常用的就是 assert 语句,如果程序有问题,运行到这边就自然会报错,这样可以让我们尽快找到错误。

 assert 语句
assert 语句

如上所示,当然我们也可以使用 assert 语句检查维度是否一致。这在模型运算部分经常会用到,例如判断每个卷积层输出结果的尺寸和深度等。可以看到这两种测试的代码都不会很多。所以不要犯懒了,好好写测试吧。

关于 AllenNLP 库的一些介绍,这里就不花时间讨论了,感兴趣的可以看 slide 中 p141~p205 的部分。下面直接进入分享的部分。

GitHub地址项目 GitHub 地址

分享研究

简化安装的流程
简化安装的流程

简化安装的流程,令代码运行在任何平台,使用隔离的环境。

下面是使用 Docker 的一些优点。

Docker
Docker
Docker 2
Docker 2

用 docker 开发的好处不用多说,大家想必也已经都知道了。当然,缺点也是有的。

cons of docker
cons of docker

至于 Python 的包管理系统,AllenNLP 采用了 ANACONDA

Python
Python

Docker 是不错,但不适合做本地开发,这样的话,使用一些本地的包管理系统反而更方便。

最后做个总结

in conclusion
in conclusion
  • 快速开发原型(要安全)
  • 写安全的产品代码(要快)
  • 好的流程有利于做出好的研究
  • 使用正确的抽象
  • 查看 AllenNLP(广告)

这次分享的 slide 看了几遍,很多地方看得自己脸上发热,不写测试什么的说到了痛处。现在人工智能领域对于算法工程师的要求已经不是能掉个包,谈谈研究那么简单了,工程实践能力已经变得越来越重要。写优秀的代码,做优秀的研究,二者是一个互相促进的过程。

解读 2019 中国大数据与实体经济融合发展白皮书

在第二届数字中国建设峰会大数据分论坛大数据分论坛上,中国信息通信研究院总工程师余晓晖发布了《中国大数据与实体经济融合发展白皮书( 2019 年)》。

该白皮书对大数据与实体经济融合发展情况进行了全景展现,报告显示我国大数据融合发展已具备技术、产业、应用和政策基础,大数据在制造业、农业、服务业等实体经济各领域应用不断深入,给经济社会带来的益处和价值日益显现。

此外,白皮书还对大数据与实体经济融合发展机遇与挑战进行了深入分析,对推动我国大数据与实体经济融合创新发展提出了政策建议。

白皮书
白皮书

当前,世界经济正在加速向以数字生产力为标志的新阶段迈进,大数据是信息社会的重要战略资源,与实体经济各领域的渗透融合已成为我国经济实现高质量发展的重要驱动力。

1 . 白皮书前言(节选)

当前,以互联网、大数据、人工智能为代表的新一代信息技术日新月异,给各国经济社会发展、国家管理、社会治理、人民生活带来重大而深远的影响。

近年来,我国大数据产业保持良好发展势头,大数据与实体经济各领域渗透融合全面展开,融合范围日益宽广,融合深度逐步加深,融合强度不断加大,融合载体不断完善,融合生态加速构建,新技术、新产业、新业态、新模式不断涌现,战略引领、规划指导、标准规范、政策支持、产业创新的良性互动局面加快形成。

中国信息通信研究院结合我国大数据与实体经济融合的发展趋势,从融合发展的意义、融合发展的基础、融合发展的成效以及未来发展的重点任务四个方面对我国大数据与实体经济融合发展分析总结,形成白皮书,勾画了我国大数据与实体经济融合发展的全景,望为社会各界深入了解大数据与实体经济各领域渗透融合的最新情况和发展机遇提供有价值的参考。

2.  白皮书目录

一、大数据与实体经济融合是新时代发展的内在要求

  1. 大数据与实体经济融合是建设现代化经济体系的必由之路
  2. 大数据与实体经济融合是推动国家治理现代化的必然选择
  3. 大数据与实体经济融合是满足人民美好生活需要的重要举措

二、大数据与实体经济融合发展具备基础

  1.  技术基础不断强化
  2.  产业基础日益坚实
  3.  应用基础加快构筑
  4.  政策环境持续完善

三、大数据与实体经济融合发展成效初显

  1. 大数据与实体经济融合走向纵深
  2. 数据推动制造业转型升级提速
  3. 大数据促进数字农业建设稳步推进
  4. 大数据助力服务业新兴业态蓬勃发展
  5. 大数据支撑公共服务智慧高效

四、努力开创大数据与实体经济融合发展的新局面

  1. 大数据与实体经济融合发展机遇与挑战并存
  2. 新思路、新举措力促大数据与实体经济融合创新发展

以下为白皮书解读 PPT :

解读
解读
大数据与实体经济融合是新时代发展的内在要求
大数据与实体经济融合是新时代发展的内在要求
大数据与实体经济融合发展具备基础
大数据与实体经济融合发展具备基础
技术基础不断强化
技术基础不断强化
产业基础日益坚实1/2
产业基础日益坚实1/2
产业基础日益坚实2/2
产业基础日益坚实2/2
应用基础加快构筑
应用基础加快构筑
政策环境持续完善
政策环境持续完善
大数据与实体经济融合发展成效初显
大数据与实体经济融合发展成效初显
与实体经济融合走向纵深
与实体经济融合走向纵深
数字化转型
数字化转型
促进数字农业建设稳步推进
促进数字农业建设稳步推进
数据推动制造业转型升级提速
数据推动制造业转型升级提速
助力服务业新兴业态蓬勃发展1/2
助力服务业新兴业态蓬勃发展1/2
助力服务业新兴业态蓬勃发展2/2
助力服务业新兴业态蓬勃发展2/2
支撑公共服务智慧高效
支撑公共服务智慧高效
努力开创大数据与实体经济融合发展的新局面
努力开创大数据与实体经济融合发展的新局面
机遇与挑战并存
机遇与挑战并存
新思路新与举措1/4
新思路新与举措1/4
新思路新与举措2/4
新思路新与举措2/4
新思路新与举措3/4
新思路新与举措3/4
新思路新与举措4/4
新思路新与举措4/4

GitHub 超 2.7 万星,最全 Python 入门算法

Github 上超过 2.7 万星标;最全算法及 Python 实现

该项目的算法包括排序:

搜索等经典算法,描述较为详细,对算法原理本身、应用场景以及实现过程的可视化等。

我们讨论机器学习的时候,其实很多时候都是在讨论算法。今天就向大家推荐一个好资源,用 Python 实现所有算法。该项目在 Github 上已经获得了超过 2.7 万星标,可以说非常受欢迎了。

该项目主要包括两方面内容:

  • 算法的基本原理讲解,
  • 以及 Python 代码实现,并给出了算法实现过程的动图,非常直观易懂。

项目地址:

GitHub地址项目 GitHub 地址

1. 冒泡算法

冒泡算法
冒泡算法

代码实现:

https://www.toptal.com/developers/sorting-algorithms/bubble-sort

2. 桶排序算法

桶排序算法
桶排序算法

桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。

3. 鸡尾酒排序算法

鸡尾酒排序算法
鸡尾酒排序算法

鸡尾酒排序,也叫双向冒泡排序(Bidirectional Bubble Sort)等。这是冒泡排序的一种变体。不同之处在于,冒泡排序是从低到高比较序列里的每个元素,而鸡尾酒排序从两个方向(低到高、高到低)来回排序,效率更高。

代码实现:

https://en.wikipedia.org/wiki/Cocktail_shaker_sort

4. 插入排序

插入排序
插入排序

插入排序(英语:Insertion Sort )是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用 in-place 排序,因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

代码实现:

https://www.toptal.com/developers/sorting-algorithms/insertion-sort

5. 归并排序

归并排序
归并排序

归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。

代码实现:

https://www.toptal.com/developers/sorting-algorithms/merge-sort

6. 快速排序

快速排序
快速排序

快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出,用作按顺序放置数组元素的系统方法。

代码实现:

https://www.toptal.com/developers/sorting-algorithms/quick-sort

7. 堆排序

堆排序(英语:Heapsort )是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。

代码实现:

https://www.toptal.com/developers/sorting-algorithms/heap-sort

8. 基数排序

基数排序(英语:Radix sort )是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机( Tabulation Machine )上的贡献。

9. 选择排序

选择排序
选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

代码实现:

https://www.toptal.com/developers/sorting-algorithms/selection-sort

10. 希尔排序

希尔排序
希尔排序

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:

插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率

但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位

代码实现:

https://www.toptal.com/developers/sorting-algorithms/shell-sort

11. 拓扑排序

在计算机科学领域,有向图的拓扑排序是其顶点的线性排序,使得对于从顶点 u 到顶点 v 的每个有向边uv ,u 在排序中都在 v 之前。例如,图形的顶点可以表示要执行的任务,并且边可以表示一个任务必须在另一个任务之前执行的约束; 在这个应用中,拓扑排序只是一个有效的任务顺序。 如果且仅当图形没有定向循环,即如果它是有向无环图(DAG),则拓扑排序是可能的。任何 DAG 具有至少一个拓扑排序,并且已知这些算法用于在线性时间内构建任何 DAG 的拓扑排序。

搜索算法

12. 线性搜索

线性搜索
线性搜索

线性搜索或顺序搜索是一种寻找某一特定值的搜索算法,指按一定的顺序检查数组中每一个元素,直到找到所要寻找的特定值为止。是最简单的一种搜索算法。

13. 二分搜索算法

二分搜索算法
二分搜索算法

二分搜索(英语:binary search ),也称折半搜索(英语:half-interval search ),对数搜索(英语:logarithmic search ),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

14. 插值搜索算法

插值查找( Interpolation Search )是根据要查找的关键字 key 与顺序表中最大、最小记录的关键字比较后的查找方法,它假设输入数组是线性增加的(这个假设的精确度会影响算法的效率,但不会影响算法的正确性)。

15. 跳跃搜索算法

跳跃搜索算法( Jump Search )跟二分查找算法类似,它也是针对有序序列的查找,只是它是通过查找比较少的元素找到目标。当然它需要通过固定的跳跃间隔,这样它相比二分查找效率提高了很多。

16. 快速选择

快速选择
快速选择

快速选择(英语:Quickselect )是一种从无序列表找到第k小元素的选择算法。它从原理上来说与快速排序有关。与快速排序一样都由托尼·霍尔提出的,因而也被称为霍尔选择算法。它在实际应用是一种高效的算法,具有很好的平均时间复杂度,然而最坏时间复杂度则不理想。快速选择及其变种是实际应用中最常使用的高效选择算法。与快速排序一样,快速选择一般是以原地算法的方式实现,除了选出第k小的元素,数据也得到了部分地排序。

17. 禁忌搜索

禁忌搜索( Tabu Search,TS,又称禁忌搜寻法)是一种现代启发式算法,由美国科罗拉多大学教授 Fred Glover 在 1986 年左右提出的,是一个用来跳脱局部最优解的搜索方法。其先创立一个初始化的方案;基于此,算法“移动”到一相邻的方案。经过许多连续的移动过程,提高解的质量。

加密算法

18. 凯撒密码

凯撒密码(英语:Caesar cipher ),或称凯撒加密、凯撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是 3 的时候,所有的字母 A 将被替换成 D ,B 变成 E ,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

19. 维吉尼亚密码

维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。维吉尼亚密码曾多次被发明。该方法最早记录在吉奥万·巴蒂斯塔·贝拉索( Giovan Battista Bellaso )于 1553 年所著的书《吉奥万·巴蒂斯塔·贝拉索先生的密码》(意大利语:La cifra del. Sig. Giovan Battista Bellaso )中。然而,后来在 19 世纪时被误传为是法国外交官布莱斯·德·维吉尼亚(Blaise De Vigenère )所创造,因此现在被称为“维吉尼亚密码”。

20. 置换密码

又名取代加密法,是密码学中按规律将文字加密的一种方式。置换密码中可以用不同字母数为一单元,例如每一个或两个字母为一单元,然后再作加密。密文接收者解密时需用原加密方式解码才可取得原文本。由于拼音文字中字的组成为有限的字母,以英语为例只有 26 个字母,组成可能的单元数较少,因此使用置换密码相对较为容易,而且亦可使用简单机械进行加密;相反,非拼音文字如中文则因单元数非常大难以使用一般加密方式,必需建立密码本,然后逐字替换。更何况某些非拼音文字中字字皆由不同大小的字根来组字,较难转换,因此使用置换密码的示例比较少。

21. RSA 加密算法

RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用。RSA 是 1977 年由罗纳德·李维斯特( Ron Rivest )、阿迪·萨莫尔( Adi Shamir )和伦纳德·阿德曼( Leonard Adleman )一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。对极大整数做因数分解的难度决定了 RSA 算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA 算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的 RSA 钥匙才可能被强力方式解破。到当前为止,世界上还没有任何可靠的攻击 RSA 算法的方式。只要其钥匙的长度足够长,用 RSA 加密的信息实际上是不能被解破的。

22. ROT13 算法

ROT13(回转 13 位,rotate by 13 places ,有时中间加了个连字符称作 ROT-13 )是一种简易的替换式密码。它是一种在英文网络论坛用作隐藏八卦(spoiler)、妙句、谜题解答以及某些脏话的工具,目的是逃过版主或管理员的匆匆一瞥。ROT13 被描述成“杂志字谜上下颠倒解答的 Usenet 点对点体”。(Usenet equivalent of a magazine printing the answer to a quiz upside down.)ROT13  也是过去在古罗马开发的凯撒加密的一种变体。

23. 异或密码

异或密码是密码学中一种简单的加密算法,异或运算符常作为更为复杂的加密算法的组成部分。对于其本身来说,如果使用不断重复的密钥,利用频率分析就可以破解这种简单的异或密码。如果消息的内容被猜出或知道,密钥就会泄露。异或密码值得使用的原因主要是其易于实现,而且计算成本小。简单重复异或加密有时用于不需要特别安全的情况下来隐藏信息。

NLP 科研现状更新

一、资源简介

自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。

中科院自动化研究所自然语言处理团队负责人宗成庆研究员的报告从学科产生与发展、技术挑战、基本方法、应用举例、技术现状等多个视角对自然语言处理领域进行了全面梳理,以及对该学科未来发展方向的分析和展望。我们希望这份报告能够帮助读者了解学科发展的脉络,激发研究兴趣,思考核心问题,领悟未来走向。

作者团队主要研究方向包括自然语言处理基础任务、机器翻译、知识图谱、信息抽取、问答系统、情感分类、基于多模态信息融合的自然语言处理、类脑启发的自然语言处理方法研究等,在上述各方向上都进行了深入研究和探索,产出了一批优秀成果,包括三部专著:《统计自然语言处理》、《文本数据挖掘》和《知识图谱》。对该学科未来发展的趋势和方向进行了简要分析和展望。

二、主要内容目录

PPT 的提纲为:

  1. 学科产生与发展
  2. 技术挑战
  3. 基本方法
  4. 应用举例
  5. 技术现状
  6. 我们团队

三、资源分享

同时为了方便大家,我们把最新 《自然语言处理方法与应用》PDF 打包好了,可以直接下载。

计算机视觉各研究方向汇总

所谓计算机视觉,即 compute vision ,就是通过用计算机来模拟人的视觉工作原理,来获取和完成一系列图像信息处理的机器。计算机视觉属于机器学习在视觉领域的应用,是一个多学科交叉的研究领域,涉及数学,物理,生物,计算机工程等多个学科,由此也可以想象到计算机视觉的研究范围非常广,也是图像,语音,自然语言处理领域中从业人数最多的。

1. 图像分类

1.1 基本概念

图像分类是计算机视觉中最基础的一个任务,也是几乎所有的基准模型进行比较的任务,从最开始比较简单的 10 分类的灰度图像手写数字识别 mnist ,到后来更大一点的 10 分类的 cifar10 和 100 分类的cifar100 ,到后来的 imagenet ,图像分类任务伴随着数据库的增长,一步一步提升到了今天的水平。

现在在 imagenet 这样的超过 1000 万图像,2 万类的数据集中,计算机的图像分类水准已经超过了人类。

图像分类,顾名思义,就是一个模式分类问题,它的目标是将不同的图像,划分到不同的类别,实现最小的分类误差。

总体来说,对于二分类的问题,图像分类可以分为跨物种语义级图像分类,子类细粒度图像分类,以及实例级图像分类三大类别。

图像分类三大类别
图像分类三大类别

传统机器学习方法:
通过各种经典的特征算子+经典分类器组合学习,比如 HoG+SVM。

深度学习方法:
各种分类网络,最为大家熟知的就是 ImageNet 竞赛了。

2012 年 Alexnet 诞生,意味着 GPU 训练时代的来临。
Alexnet 是第一个真正意义上的深度网络,与 LeNet5 的 5 层相比,它的层数增加了 3  层,网络的参数量也大大增加,输入也从 32 变成了 224 。

2014 年 VGG 诞生,它共包含参数约为 550M 。全部使用 3*3* 的卷积核*和 2*2 的最大池化核,简化了卷积神经网络的结构。VGG 很好的展示了如何在先前网络架构的基础上通过增加网络层数和深度来提高网络的性能,网络虽然简单,但是却异常的有效,在今天 VGG 仍然被很多的任务选为基准模型。

同一年 GoogleNet 诞生,也被成为 Inception Model ,它的核心是 Inception Module 。一个经典的   inception 结构,包括有四个成分,1*1 卷积,3*3  卷积, 5*5  卷积,3*3  最大池化,最后对运算结果进行通道上组合,可以得到图像更好的表征。自此,深度学习模型的分类准确率已经达到了人类的水平(5%~10%)。

2015 年,ResNet 被提出。ResNet 以  3.57% 的错误率表现超过了人类的识别水平,并以 152 层的网络架构创造了新的模型记录。由于 resnet 采用了跨层连接的方式,它成功的缓解了深层神经网络中的梯度消散问题,为上千层的网络训练提供了可能。

2016 年 ResNeXt 诞生,101 层的 ResNeXt 可以达到 ResNet152  的精确度,却在复杂度上只有后者的一半,核心思想为分组卷积。即首先将输入通道进行分组,经过若干并行分支的非线性变换,最后合并。

在 resnet 基础上,密集连接的 densenet 将前馈过程中将每一层与其他的层都连接起来。对于每一层网络来说,前面所有网络的特征图都被作为输入,同时其特征图也都被其他网络层作为输入所利用。

2017 年,也是 imagenet 图像分类比赛的最后一年,senet 获得了冠军。这个结构,仅仅使用了“特征重标定”的策略来对特征进行处理,也就是通过学习获取每个特征通道的重要程度,根据重要性去抑制或者提升相应的特征。

1.2 方向特点

图像分类的比赛基本落幕,也接近算法的极限。但是在实际的应用中却面临着比比赛中更加复杂,比如样本不均衡,分类界面模糊,未知类别等。

2. 目标检测

2.1 基本概念

分类任务给出的是整张图片的内容描述,而目标检测任务则关注图片中特定的目标。

检测任务包含两个子任务,其一是这一目标的类别信息和概率,它是一个分类任务。其二是目标的具体位置信息,这是一个定位任务。

face 0.996
face 0.996

与计算机视觉领域里大部分的算法一样,目标检测也经历了从传统的人工设计特征和浅层分类器的思路(以),到大数据时代使用深度神经网络进行特征学习的思路

在传统方法时代,很多的任务不是一次性解决,而是需要多个步骤的。而深度学习时代,很多的任务都是采用 End-To-End 的方案,即输入一张图,输出最终想要的结果,算法细节和学习过程全部丢给了神经网络,这一点在物体检测这个领域,体现得尤为明显。

不管是清晰地分步骤处理,还是深度学习的 end-to-end 的方法,目标检测算法一定会有 3 个模块。第一个是检测窗口的选择,第二个是图像特征的提取,第三个是分类器的设计。

2.2 方法分类

传统机器学习方法:
以保罗·维奥拉和迈克尔·琼斯于 2001 年提出的维奥拉-琼斯目标检测框架为代表,这是第一篇基于Haar+Adaboost 的检测方法,也是首次把检测做到实时的框架;

此方法在 opencv 中被实现为

cvHaarDetectObjects()

是 opencv 中最为人熟知的目标检测方法。

速度非常快,检测召回率相对如今的算法较低。

深度学习方法:
仍然要解决区域选择、提取特征、分类回归三个问题。但是在演变过程中,却发展出了 multi-stage和one-stage 的方法。其中 multi-stage 方法,是分步骤完成上面的任务,甚至可能需要单独训练各个网络。而 one-stage 则是一步到位。

RCNN 的框架是 multi-stage 方法的典型代表。它使用了 Selective search 先生成候选区域再检测,候选窗口的数量被控制在了 2000 个左右。选择了这些图像框之后,就可以将对应的框进行 resize 操作,然后送入 CNN 中进行训练。由于 CNN 非常强大的非线性表征能力,可以对每一个区域进行很好的特征表达,CNN 最后的输出,使用多个分类器进行分类判断。该方法将 PASCAL VOC 上的检测率从  35.1%  提升到了 53.7% ,其意义与  Alexnet 在 2012 年取得分类任务的大突破是相当的,对目标检测领域影响深远。

随后 Fast R-CNN 提出 RoIPooling 从整图对应的卷积特征图选取区域特征,解决了重复提取特征的问题。Faster R-CNN 则提出 Region Proposal , anchors 把一张图片划分成  n*n 个区域,每个区域给出 9 个不同 ratio 和 scale 的 proposal ,解决了重复提取候选 proposal 的问题。 RCNN 系列在工业届应用非常广泛,因此从事目标检测的同学必须掌握。

除了 multi-stage 方法,还有 one-stage 方法。以 YOLO 为代表的方法,没有显式的候选框提取过程。它首先将图片 resize 到固定尺寸,将输入图片划分成一个 7×7 的网格,每个网格预测 2 个边框,对每一个网络进行分类和定位。YOLO 方法也经过了许多版本的发展,从 YOLO v2  到  YOLO v3 。YOLO 的做法是速度快,但是会有许多漏检,尤其是小的目标。所以 SSD 就在  YOLO 的基础上添加了 Faster R-CNN 的   Anchor  概念,并融合不同卷积层的特征做出预测。虽然 YOLO 和 SSD 系列的方法没有了 region proposal 的提取,速度更快,但是必定会损失信息和精度。

2.3 方向特点

目标检测方向有一些固有的难题,比如小脸,遮挡,大姿态。

小脸,遮挡,大姿态
小脸,遮挡,大姿态

而在方法上,多尺度与级联网络的设计,难样本的挖掘,多任务 loss 等

3. 图像分割

3.1 基础概念

图像分割属于图像处理领域最高层次的图像理解范畴。所谓图像分割就是把图像分割成具有相似的颜色或纹理特性的若干子区域,并使它们对应不同的物体或物体的不同部分的技术。这些子区域,组成图像的完备子集,又相互之间不重叠。

图像分割
图像分割

在图像处理中,研究者往往只对图像中的某些区域感兴趣,在此基础上才有可能对目标进行更深层次的处理与分析,包括对象的数学模型表示、几何形状参数提取、统计特征提取、目标识别等。

传统方法:
图像分割问题最早来自于一些文本的分割,医学图像分割。在文本图像分割中,我们需要切割出字符,常见的问题包括指纹识别,车牌识别;由于这一类问题比较简单,因为基于阈值和聚类的方法被经常使用。

基于阈值和聚类的方法虽然简单,但因此也经常失效。以 graphcut 为代表的方法,是传统图像分割里面鲁棒性最好的方法。Graphcut 的基本思路,就是建立一张图,其中以图像像素或者超像素作为图像顶点,然后移除一些边,使得各个子图不相连从而实现分割。图割方法优化的目标是找到一个切割,使得移除边的和权重最小。

深度学习方法:
全卷积神经网络(Fully connected Network)是第一个将卷积神经网络正式用于图像分割问题的网络。

一个用于分类任务的深度神经网络通过卷积来不断抽象学习,实现分辨率的降低,最后从一个较小的featuremap 或者最后的特征向量,这个 featuremap 通常为 5*5 或者 7*7 等大小。而图像分割任务需要恢复与原尺度大小一样的图片,所以,需要从这个 featuremap 恢复原始图片尺寸,这是一个上采样的过程。由于这个过程与反卷积是正好对应的逆操作,所以我们通常称其为反卷积。

实际上并没有反卷积这样的操作,在现在的深度学习框架中,反卷积通常有几种实现方式,一个是双线性插值为代表的插值法,一个是转置卷积。

转置卷积
转置卷积

3.2 方向特点

在基于深度学习的图像分割中,有一些比较关键的技术,包括反卷积的使用,多尺度特征融合,crf  等后处理方法。

多尺度与上下文信息:
多尺度的信息融合可以从特征图,还可以直接采用多尺度的输入图像,不过这两者本质上没有太多的差异。使用金字塔的池化方案可实现不同尺度的感受野,它能够起到将局部区域上下文信息与全局上下文信息结合的效果。对于图像分割任务,全局上下文信息通常是与整体轮廓相关的信息,而局部上下文信息则是图像的细节纹理,要想对多尺度的目标很好的完成分割,这两部分信息都是必须的。

CRF:
由于经典的 cnn 是局部的方法,即感受野是局部而不是整个图像。另一方面,cnn 具有空间变换不变性,这也降低了分割的边缘定位精度。针对 cnn 的这两个缺陷,crf 可以进行很好的弥补。crf 是一种非局部的方法,它可以融合 context 信息,Deeplab 系列就使用了cnn 加上全连接的 crf 的方式。

另一方面,前面我们说的图像分割,是属于硬分割,即每一个像素都以绝对的概率属于某一类,最终概率最大的那一类,就是我们所要的类别。但是,这样的分割会带来一些问题,就是边缘不够细腻,当后期要进行融合时,边缘过渡不自然。此时,就需要用到 image matting 技术。

4. 目标跟踪

4.1 基本概念

目标跟踪,指的其实就是视频中运动目标的跟踪,跟踪的结果通常就是一个框。目标跟踪是视频监控系统中不可缺少的环节。

目标跟踪
目标跟踪

根据目标跟踪方法建模方式的不同,可以分为生成式模型方法与判别式模型方法。

生成式模型跟踪算法以均值漂移目标跟踪方法和粒子滤波目标跟踪方法为代表,判别式模型跟踪算法以相关滤波目标跟踪方法和深度学习目标跟踪方法为代表。

生成类方法:
在原始影像帧中对目标按指定的方法建立目标模型,然后在跟踪处理帧中搜索对比与目标模型相似度最高的区域作为目标区域进行跟踪。算法主要对目标本身特征进行描述,对目标特征刻画较为细致,但忽略背景信息的影响。在目标发生变化或者遮挡等情况下易导致失跟现象。

判别类方法:
通过对原始影像帧,对目标及背景信息进行区分建立判别模型,通过对后续影像帧搜索目标进行判别是目标或背景信息进而完成目标跟踪。

判别类方法与生成类方法的根本不同在于判别类方法考虑背景信息与目标信息区分来进行判别模型的建立,由于判别类方法将背景与目标进行区分,因此该类方法在目标跟踪时的表现通常更为鲁棒,目前已经成为目标跟踪的主流跟踪方式。判别类方法包括相关滤波,深度学习方法。

4.2 方向特点

目标跟踪有一些难点:

  1. 目标表征表达问题,虽然深度学习方法具有很强的目标表征能力,但是仍然容易受相似环境的干扰。
  2. 目标快速运动,由于很多跟踪的物体都是高速运动,因此既要考虑较大的搜索空间,也要在保持实时性的前提下减小计算量。
  3. 变形,多尺度以及遮挡问题,当目标发生很大的形变或者临时被遮挡如何保持跟踪并且在目标重新出现时恢复跟踪。

5. 图像滤波与降噪

5.1 基本概念

现实中的数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,称为含噪图像或噪声图像。减少数字图像中噪声的过程称为图像降噪,有时候又称为图像去噪。

降噪可以应用于图像增强和美颜等领域。

图像降噪
图像降噪

传统方法:
传统降噪算法根据降噪的原理不同可分为基于邻域像素特征的方法,基于频域变换的方法,和基于特定模型的方法。

基于空域像素特征的方法,是通过分析在一定大小的窗口内,中心像素与其他相邻像素之间在灰度空间的直接联系,来获取新的中心像素值的方法,因此往往都会存在一个典型的输入参数,即滤波半径r。此滤波半径可能被用于在该局部窗口内计算像素的相似性,也可能是一些高斯或拉普拉斯算子的计算窗口。在邻域滤波方法里面,最具有代表性的滤波方法有以下几种:算术均值滤波与高斯滤波,统计中值滤波,双边滤波,非局部平均滤波方法,BM3D 算法。

深度学习方法:
在 2012 年,随着 Alexnet 的出现,深度学习做去噪的工作取得了一些进展,可以达到和 BM3D 差不多的水平。对于仿真的噪声和固定的噪声,深度学习已经可以很好的去除,达到或超过传统领域里最好的算法。

利用卷积神经网络去除噪声的原理很简单,输入是一张有噪声的图,标签是一张无噪声的图,输出是一张降噪后的图,损失函数是无噪声 groundtruth 与网络输出的 L2 距离,网络通常就是与图像分割算法一样的网络,卷积+与之对称的反卷积。

5.2 方向特点

降噪的研究聚焦在真实数据的去噪声,因为真实世界的噪声不符合高斯加性噪声的假设,而且是依赖于信息本身的。不过,真实噪声图像和相应的无噪声图像获取是非常困难,慢慢的也有了一些 benchmark 。

6. 图像增强

6.1 基本概念

图像增强,即增强图像中的有用信息,改善图像的视觉效果。

图像增强
图像增强

图像增强实际上包含了很多的内容,上面的降噪也属于其中,只是因为降噪多了美颜这一个应用单独拿出来说一下。

对比度增强,用于扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,可用于改善图像的识别效果,满足某些特殊分析。

超分辨,使图像变得更加清晰,可以用于视频的传输先进行降采样,再进行升采样,即降低了传输成本,又增加了视觉效果。

图像修复,重建图像和视频中丢失或损坏的部分,也被称为图像插值或视频插值,主要是替换一些小区域和瑕疵,如 photoshop 中的印章工具。随着发展,已经从原先针对划痕、污点等的修复到现在对图像、视频中文字、物体等的移除,比如水印等。

传统方法:
传统的方法就是一个预定义好的非线性变换,主要有三大类方法,一类是点操作,一类是直方图操作,一类是 Retinex 理论。

点操作也被称为直接对比度增强,将每个像素独立操作,包括对数变化,指数变化,负图像,阈值化等。我们熟知的 gamma 变换如下,可以进行不同形状的映射。

直方图操作也被称为间接对比度增强,包括直方图均衡,直方图匹配等。直方图均衡化通常用来增加图像的全局对比度,尤其是当图像中主体和背景对比度相当接近的时候。直方图均衡化的效果就是让直方图更均衡的分布,这种方法对于背景和前景都太亮或者太暗的图像非常有用,通常是曝光过度或者曝光不足的图片。

Retinex 理论,即颜色恒常知觉的计算理论,Retinex 是一个合成词,它的构成是 retina (视网膜)+cortex (皮层),它将图像认为是 reflectance 和 illumination 的点乘,理论基础是在不同的照明条件下,物体的色彩不受光照非均性的影响是恒定的,而物体的颜色是由物体对长波、中波和短波光线的反射能力决定的而不是由反射光强度的绝对值决定。

深度学习方法:
以增强对比度为例,深度学习方法使用了CNN 来进行非线性变换的学习,而且通常不仅仅局限在对比度增强,经常会同时学习到降噪。深度学习的方法有两种,一种是采用成对的图片训练,比如 pix2pix,learning in the dark ,缺点是没有普适性,只能对所实验的数据集有用。一种是不需要成对图片训练,只需要好图,比如 WESPE ,常配合 GAN 使用。

6.2 方向特点

一个图像增强任务,传统方法需要分别进行降噪,颜色校正,对比度增强等各种操作,而深度学习算法的好处就是 end-to-end 输出,将整个流程丢给了网络。目前图像增强相对于前面的一些方向还是一个蓝海,覆盖的方向和应用非常广,有精力的朋友可以好好研究。

7. 风格化

图像风格化之所以引起我们的注意,完全是因为 2015 年的一个研究,可以将任意的图像转换为梵高的画作风格。 也是得益于深度学习技术的发展,传统的方法做不到这么好的效果。而随着美图秀秀,天天 P 图等 app 层出不穷的滤镜,风格化已经成为了单独的一个研究领域。

图像风格化是一个综述性的技术应用,为了简单起见,就理解为艺术类滤镜把,它指通过算法,将数码相机拍摄的照片,变成绘画、素描等艺术类的非数码相机效果,是后期程度最深的操作,将彻底改变相片的风格。

风格化
风格化

深度学习方法:
以 A Neural Algorithm of Artistic Style 论文发表为起始,Prisma 滤镜为典型代表。虽然风格迁移技术的发展日新月异,但是最革命性的还是该文章的方法,这是德国图宾根大学的研究,它通过分析某种风格的艺术图片,能将图片内容进行分离重组,形成任意风格的艺术作品,最开始的时候需要将近一个小时来处理。

就是把一幅图作为底图,从另外一幅画抽取艺术风格,重新合成新的艺术画,可以参考上面的图。

研究者认为,图片可以由内容层(Content)与风格层(Style)两个图层描述,相互分离开。在图像处理中经常将图像分为粗糙层与细节层,即前者描述图像的整体信息,后者描述图像的细节信息,具体可以通过高斯金字塔来得到。

卷积神经网络的各个神经元可以看做是一个图像滤波器,而输出层是由输入图像的不同滤波器的组合,深度由浅到深,内容越来越抽象。

底层信息重建,则可以得到细节,而从高层信息重建,则得到图像的”风格“。因此,可以选择两幅图像,一幅构建内容信息,一幅构建风格信息,分别进行 Content 重建与 Style 重建。通过将内容与风格组合,可以得到新的视觉信息更加有意思的图像,如计算机油画,这就是它的基本原理。方法的核心在于损失函数的设计,包括内容损失和风格损失

内容损失在像素空间,要求风格化后的图能够保证内容的完整性。风格损失使用 vgg 特征空间的 gram 矩阵,这样就有了较高的抽象层级,实践结果表明可以很好的捕捉风格。

7.2 方向特点

如今风格化方法在很多地方都有应用,比如大家熟悉的变脸等。方法也演变成了几个方向;

  1. 单模型单风格,即一个网络只能做一种风格化。
  2. 单模型多风格,即一个网络可以实现多种风格,比(1)实用的多。
  3. 单模型任意风格,即一个网络可以任意风格,视输入图像而定,这是最好的,更多的研究我们以后会开专题。

8. 三维重建

8.1 基本概念

什么是三维重建呢?广义上来说,是建立真实世界的三维模型。随着软硬件的成熟,在电影,游戏,安防,地图等领域,三维重建技术的应用越来越多。目前获取三维模型的方法主要包括三种,手工建模,仪器采集与基于图像的建模。

三维重建
三维重建
  1. 手工建模作为最早的三维建模手段,现在仍然是最广泛地在电影,动漫行业中应用。顶顶大名的3DMax 就是典型代表,当然了,它需要专业人士来完成。
  2. 由于手工建模耗费大量的人力,三维成像仪器也得到了长期的研究和发展。基于结构光(structured light)和激光扫描技术的三维成像仪是其中的典型代表。这些基于仪器采集的三维模型,精度可达毫米级,是物体的真实三维数据,也正好用来为基于图像的建模方法提供评价数据库。由于仪器的成本太高,一般的用户是用不上了。
  3. 基于图像的建模技术(image based modeling),顾名思义,是指通过若干幅二维图像,来恢复图像或场景的三维结构,这些年得到了广泛的研究。

我们这里说的三维重建,就特指基于图像的三维重建方法,而且为了缩小范围,只说人脸图像,并简单介绍其中核心的 3DMM 模型。

3DMM 模型:

人脸三维重建方法非常多,有基于一个通用的人脸模型,然后在此基础上进行变形优化,会牵涉到一些模板匹配,插值等技术。有基于立体匹配(各种基于双目,多目立体视觉匹配)的方法,通过照相机模型与配准多幅图像,坐标系转换,获取真实的三维坐标,然后进行渲染。有采用一系列的人脸作为基,将人脸用这些基进行线性组合的方法,即 Morphable models 方法。

其中,能够融会贯通不同传统方法和深度学习方法的,就是 3D Morphable Models 系列方法,从传统方法研究到深度学习。

它的思想就是一幅人脸可以由其他许多幅人脸加权相加而来,学过线性代数的就很容易理解这个正交基的概念。我们所处的三维空间,每一点(x,y,z),实际上都是由三维空间三个方向的基量,(1,0,0),(0,1,0),(0,0,1)加权相加所得,只是权重分别为 x,y,z。

转换到三维空间,道理也一样。每一个三维的人脸,可以由一个数据库中的所有人脸组成的基向量空间中进行表示,而求解任意三维人脸的模型,实际上等价于求解各个基向量的系数的问题。

每一张人脸可以表示为:
形状向量 Shape Vector:S=(X1,Y1,Z1,X2,Y2,Z2,…,Yn,Zn)
纹理向量 Texture Vector:T=(R1,G1,B1,R2,G2,B2,…,Rn,Bn)

形状向量 纹理向量
形状向量 纹理向量

而一张任意的人脸,其等价的描述如下:

形状和纹理的平均值
形状和纹理的平均值

其中第一项 Si,Ti 是形状和纹理的平均值,而 si,ti 则都是 Si ,Ti 减去各自平均值后的协方差矩阵的特征向量。 基于 3DMM 的方法,都是在求解 α,β 这一些系数,当然现在还会有表情,光照等系数,但是原理都是通用的。

8.2 方向特点

人脸的三维建模有一些独特的特点:

1.预处理技术非常多,人脸检测与特征点定位,人脸配准等都是现在研究已经比较成熟的方法。利用现有的人脸识别与分割技术,可以缩小三维人脸重建过程中需要处理的图像区域,而在有了可靠的关键点位置信息的前提下,可以建立稀疏的匹配,大大提升模型处理的速度。

2.人脸共性多。正常人脸都是一个鼻子两只眼睛一个嘴巴两只耳朵,从上到下从左到右顺序都不变,所以可以首先建立人脸的参数化模型,实际上这也是很多方法所采用的思路。

人脸三维重建也有一些困难:

  1. 人脸生理结构和几何形状非常复杂,没有简单的数学曲面模型来拟合。
  2. 光照变化大。同一张脸放到不同的光照条件下,获取的图像灰度值可能大不一样的,这些都会影响深度信息的重建。
  3. 特征点和纹理不明显。图像处理最需要的就是明显的特征,而光滑的人脸除了特征关键点,很难在脸部提取稠密的有代表性的角点特征。这个特点,使得那些采用人脸配准然后求取三维坐标的方法面临着巨大的困难。

9. 图像检索

9.1 基本概念

图像检索的研究从 20 世纪 70 年代就已经开始,在早期是基于文本的图像检索技术(Text-based Image Retrieval,简称 TBIR ),利用文本来描述图像的特征,如绘画作品的作者、年代、流派、尺寸等。随着计算机视觉技术的发展,90年代开始出现了对图像的内容语义,如图像的颜色、纹理、布局等进行分析和检索的图像检索技术,也就是基于内容的图像检索(Content-based Image Retrieval,简称 CBIR )技术,本小节的图像检索就特指基于内容的图像检索。

基于内容的图像检索也经历了传统方法和深度学习方法两个主要阶段,传统的基于内容的图像检索通常包括以下流程:

图像检索流程
图像检索流程

预处理,通常包括一些图像归一化,图像增强等操作。特征提取,即提取一些非常鲁棒的图像特征,比如SIFT,HoG 等特征。特征库就是要查询的库,库中不存储图像而是存储特征,每一次检索图像完成特征提取之后,就在特征库中进行匹配和相似度计算。索引就是在某种相似性度量准则下计算查询向量到特征库中各个特征的相似性大小,最后按相似性大小进行高效的排序并顺序输出对应的图片。

图像检索的中最复杂的一步就是检索,在这一步完成验证过程。

图像检索验证过程
图像检索验证过程

最简单的方法就是暴力(brute-force) 搜索方法(又称线性扫描),即逐个与数据库中的每个点进行相似性计算然后进行排序,这种简单粗暴的方式虽然很容易实现,但是会随着数据库的大小以及特征维度的增加其搜索代价也会逐步的增加,从而限制在数据量小的小规模图像数据库,在大规模图像库上这种暴力搜索的方式不仅消耗巨大的计算资源,而且单次查询的响应时间会随着数据样本的增加以及特征维度的增加而增加,为了降低搜索的空间的空间复杂度与时间复杂度,研究者们提出了很多高效的检索技术,其中最成功的大家也最熟悉到方法是基于哈希的图像检索方法

深度学习在图像检索里面的作用就是把表征样本的特征学习好,就够了。

9.2 方向特点

图像检索系统具有非常大的商业价值,从搜索引擎的以图搜图,到人脸验证和识别系统,到一些搜索排序系统(比如基于美学的摄影图库)。由于图像特征的学习是一个通用的研究方向,因此更多的在于设计高效的检索系统。

10. GAN

10.1 基本概念

GAN,即 Generative adversarial net ,被誉为新的深度学习,涉及的研究非常多,可以单列为一个方向,一个经典的网络结构如下。

Generative adversarial net
Generative adversarial net

GAN 的原理很简单,它包括两个网络,一个生成网络,不断生成数据分布。一个判别网络,判断生成的数据是否为真实数据。

Generative adversarial net
Generative adversarial net

上图是原理展示,黑色虚线是真实分布,绿色实线是生成模型的学习过程,蓝色虚线是判别模型的学习过程,两者相互对抗,共同学习到最优状态。

关于 GAN 的基础,我们以前已经写过相关的内容,大家去看就可以了。

10.2 方向特点

作为新兴和热门方向,GAN 包含的研究方向非常的广,包括 GAN 的应用,GAN 的优化目标,GAN 的模型发展,GAN 的训练技巧,GAN 的理论分析,GAN 的可视化等等。

开源 Python 爬虫网站秒搜所有豆瓣好书

程序员在提升自己的道路,大多还是会选择阅读编程书籍这一途径,但找到一本好书就没那么容易了。

通过查看各大销售网站的销量数据和评价,以及豆瓣评分和评价人数,可以帮助我们更快的挖掘出经典的计算机书籍,还有那些被人们忽视的好书。

为什么说它很好用呢?演示一遍你就知道了:

好书一下
好书一下

可以看出这网站的界面非常简洁,没有花里花哨的内容,只有干货,你可以直接通过关键字、分数、和评价人数这三个选项进行搜索,比如我们可以搜索关键字:编程;分数:9.0;评价人数:100 人以上

查找结果的显示方式有按照分数排序和人数排序两种,按照分数排序的截图如下:

分数排序
分数排序

按照评价人数排序的截图如下:

人数排序
人数排序

除了以上演示的操作,这个网站并实现了以下功能:

  • 可以爬下豆瓣读书标签下的所有图书
  • 按评分排名依次存储
  • 存储到 Excel 中,可方便大家筛选搜罗,比如筛选评价人数 >1000 的高分书籍;可依据不同的主题存储到 Excel 不同的 Sheet
  • 采用 User Agent 伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封

也就是说你不仅可以在网站上搜索,还能通过下载各类目下的 Excel 书单文件,直接在 Excel 中搜索

Excel书单文件
Excel书单文件

效果截图如下:

效果截图
效果截图

GitHub地址项目 GitHub 地址

12 大深度学习框架的入门项目

概述

开源框架总览:现如今开源生态非常完善,深度学习相关的开源框架众多,光是为人熟知的就有 caffe,tensorflow,pytorch/caffe2,keras,mxnet,paddldpaddle,theano,cntk,deeplearning4j,matconvnet 等。如何选择最适合你的开源框架是一个问题。一个合格的深度学习算法工程师怎么着得熟悉其中的 3 个以上吧。下面是各大开源框架的一个总览。

开源框架总览
开源框架总览

在这里我们还有一些框架没有放上来,是因为它们已经升级为大家更喜欢或者使用起来更加简单的版本,比如从 torch->pytorch,从 theano 到 lasagne。另外这些框架都支持 CUDA ,因此编程语言这里也没有写上 cuda 。

在选择开源框架时,要考虑很多原因,比如开源生态的完善性,比如自己项目的需求,比如自己熟悉的语言。当然,现在已经有很多开源框架之间进行互转的开源工具如 MMDNN 等,也降低了大家迁移框架的学习成本。

除此之外还有 tiny-dnn,ConvNetJS,MarVin,Neon 等等小众,以及 CoreML 等移动端框架,就不再一一介绍。总的来说对于选择什么样的框架,有三可以给出一些建议。

  1. 不管怎么说,tensorflow/pytorch 你都必须会,是目前开发者最喜欢,开源项目最丰富的框架。
  2. 如果你要进行移动端算法的开发,那么 Caffe 是不能不会的。
  3. 如果你非常熟悉 Matlab,matconvnet 你不应该错过。
  4. 如果你追求高效轻量,那么 darknet 和 mxnet 你不能不熟悉。
  5.  如果你很懒,想写最少的代码完成任务,那么用 keras 吧。
  6. 如果你是 java 程序员,那么掌握 deeplearning4j 没错的。

其他的框架,也自有它的特点,大家可以自己多去用用。

如何学习开源框架

要掌握好一个开源框架,通常需要做到以下几点:

  •  熟练掌握不同任务数据的准备和使用。
  • 熟练掌握模型的定义。
  • 熟练掌握训练过程和结果的可视化。
  • 熟练掌握训练方法和测试方法。

一个框架,官方都会开放有若干的案例,最常见的案例就是以 MNISI 数据接口+预训练模型的形式,供大家快速获得结果,但是这明显还不够,学习不应该停留在跑通官方的 demo 上,而是要解决实际的问题。我们要学会从自定义数据读取接口,自定义网络的搭建,模型的训练,模型的可视化,模型的测试与部署等全方位进行掌握。这是一个二分类任务,给大家准备了500 张微笑表情的图片、500 张无表情的图片,放置在 git 工程的data 目录下,图片预览如下,已经全部缩放到 60*60 的大小:

这是无表情的图片:

无表情的图片
无表情的图片

这是微笑表情的图片:

微笑表情的图片
微笑表情的图片

因此,我们的目标就是利用这 500 张图片完成好这个图像分类任务。

在下面的所有框架的学习过程中,我们都要完成下面这个流程,只有这样,才能叫做真正的完成了一个训练任务。

流程
流程

另外,所有的框架都使用同样的一个模型,这是一个 3 层卷积 +2 层全连接的网络,由卷积+BN 层+激活层组成,有的使用带步长的卷积,有的使用池化,差别不大。

  • 输入图像,48*48*3 的 RGB 彩色图。
  • 第一层卷积,通道数 12,卷积核 3*3。
  • 第二层卷积,通道数 24,卷积核 3*3。
  • 第三层卷积,通道数 48,卷积核 3*3。
  • 第一层全连接,通道数 128。
  • 第二层全连接,通道数 2,即类别数。

这是最简单的一种网络结构,优化的时候根据不同的框架,采用了略有不同的方案。因为此处的目标不是为了比较各个框架的性能,所以没有刻意保持完全一致。

开源框架

下面我们开始对各个框架进行简述。

1.  Caffe

概述:Caffe 是伯克利的贾扬清主导开发,以 C++/CUDA 代码为主,最早的深度学习框架之一,比TensorFlow、Mxnet、Pytorch 等都更早,需要进行编译安装。支持命令行、Python 和 Matlab 接口,单机多卡、多机多卡等都可以很方便的使用。目前 master 分支已经停止更新,intel 分支等还在维护,caffe  框架已经非常稳定。

caffe 的使用通常是下面的流程:

caffe
caffe

以上的流程相互之间是解耦合的,所以 caffe 的使用非常优雅简单。

caffe 有很明显的优点和缺点。

优点:

  • 以 C++/CUDA/python 代码为主,速度快,性能高。
  • 工厂设计模式,代码结构清晰,可读性和拓展性强。
  • 支持命令行、Python 和 Matlab 接口,使用方便。
  • CPU 和 GPU 之间切换方便,多 GPU 训练方便。
  • 工具丰富,社区活跃。

缺点:

  • 源代码修改门槛较高,需要实现前向反向传播,以及 CUDA 代码。
  • 不支持自动求导。
  • 不支持模型级并行,只支持数据级并行
  • 不适合于非图像任务。
caffe
caffe

2. Tensorflow

概述:TensorFlow 是 Google brain 推出的开源机器学习库,可用作各类深度学习相关的任务。TensorFlow = Tensor + Flow,Tensor 就是张量,代表 N 维数组,这与 Caffe 中的 blob 是类似的;Flow  即流,代表基于数据流图的计算。

特点:TensorFlow 最大的特点是计算图,即先定义好图,然后进行运算,所以所有的 TensorFlow 代码,都包含两部分:

  • 创建计算图,表示计算的数据流。它做了什么呢?实际上就是定义好了一些操作,你可以将它看做是Caffe 中的 prototxt 的定义过程。
  • 运行会话,执行图中的运算,可以看作是 Caffe 中的训练过程。只是 TensorFlow 的会话比 Caffe 灵活很多,由于是 Python 接口,取中间结果分析,Debug 等方便很多。
tensorflow
tensorflow

3 . Pytorch

概述:一句话总结 Pytorch = Python + Torch。Torch 是纽约大学的一个机器学习开源框架,几年前在学术界非常流行,包括 Lecun 等大佬都在使用。但是由于使用的是一种绝大部分人绝对没有听过的 Lua 语言,导致很多人都被吓退。后来随着 Python 的生态越来越完善,Facebook 人工智能研究院推出了 Pytorch 并开源。Pytorch 不是简单的封装 Torch 并提供Python 接口,而是对 Tensor 以上的所有代码进行了重构,同 TensorFlow 一样,增加了自动求导。

后来 Caffe2 全部并入 Pytorch,如今已经成为了非常流行的框架。很多最新的研究如风格化、GAN 等大多数采用 Pytorch 源码。

特点:

  • 动态图计算。TensorFlow 从静态图发展到了动态图机制 Eager Execution ,pytorch 则一开始就是动态图机制。动态图机制的好处就是随时随地修改,随处 debug ,没有类似编译的过程。
  • 简单。相比 TensorFlow1.0 中 Tensor、Variable、Session 等概念充斥,数据读取接口频繁更新,tf.nn、tf.layers、tf.contrib 各自重复,Pytorch 则是从 Tensor 到 Variable 再到 nn.Module ,最新的Pytorch 已经将 Tensor 和 Variable 合并,这分别就是从数据张量到网络的抽象层次的递进。有人调侃TensorFlow 的设计是 “make it complicated” ,那么 Pytorch 的设计就是 “keep it simple”。
pytorch
pytorch

4 . Mxnet

概述:  Mxnet 是由李沐等人领导开发的非常灵活,扩展性很强的框架,被 Amazon 定为官方框架。

特点:  Mxnet 同时拥有命令式编程和符号式编程的特点。在命令式编程上 MXNet 提供张量运算,进行模型的迭代训练和更新中的控制逻辑;在声明式编程中 MXNet 支持符号表达式,用来描述神经网络,并利用系统提供的自动求导来训练模型。Mxnet 性能非常高,推荐资源不够的同学使用。

Mxnet
Mxnet

5.  Keras

概述:  Keras 是一个对小白用户非常友好而简单的深度学习框架,严格来说并不是一个开源框架,而是一个高度模块化的神经网络库。

Keras 在高层可以调用 TensorFlow,CNTK,Theano ,还有更多的库也在被陆续支持中。 Keras 的特点是能够快速实现模型的搭建,是高效地进行科学研究的关键。

特点:

  •  高度模块化,搭建网络非常简洁。
  •   API 很简单,具有统一的风格。
  •  容易扩展,只需使用 python 添加新类和函数。
Keras
Keras

6.  Paddlepaddle

概述:  正所谓 Google 有 Tensorflow,Facebook 有 Pytorch,Amazon 有 Mxnet,作为国内机器学习的先驱,百度也有 PaddlePaddle,其中 Paddle 即 Parallel Distributed Deep Learning (并行分布式深度学习)。

特点:  paddlepaddle 的性能也很不错,整体使用起来与 tensorflow 非常类似,拥有中文帮助文档,在百度内部也被用于推荐等任务。另外,配套了一个可视化框架 visualdl,与 tensorboard 也有异曲同工之妙。国产框架不多,大家多支持啊!

paddlepaddle
paddlepaddle

7.  CNTK

概述:  CNTK 是微软开源的深度学习工具包,它通过有向图将神经网络描述为一系列计算步骤。在有向图中,叶节点表示输入值或网络参数,而其他节点表示其输入上的矩阵运算。

CNTK 允许用户非常轻松地实现和组合流行的模型,包括前馈 DNN,卷积网络(CNN)和循环网络(RNN / LSTM)。与目前大部分框架一样,实现了自动求导,利用随机梯度下降方法进行优化。

特点:

  • CNTK 性能较高,按照其官方的说法,比其他的开源框架性能都更高。
  • 适合做语音,CNTK 本就是微软语音团队开源的,自然是更合适做语音任务,使用 RNN 等模型,以及在时空尺度分别进行卷积非常容易。
cntk
cntk

8.  Matconvnet

概述:  不同于各类深度学习框架广泛使用的语言 Python,MatConvnet 是用 matlab 作为接口语言的开源深度学习库,底层语言是 cuda。

特点:  因为是在 matlab 下面,所以 debug 的过程非常的方便,而且本身就有很多的研究者一直都使用 matlab 语言,所以其实该语言的群体非常大。

matconvnet
matconvnet

9. Deeplearning4j

概述:  不同于深度学习广泛应用的语言 Python,DL4J 是为 java 和 jvm 编写的开源深度学习库,支持各种深度学习模型。

特点:  DL4J 最重要的特点是支持分布式,可以在 Spark 和 Hadoop 上运行,支持分布式 CPU 和 GPU 运行。DL4J 是为商业环境,而非研究所设计的,因此更加贴近某些生产环境。

Deeplearning4j
Deeplearning4j

10 .  Chainer

概述:  chainer 也是一个基于 python 的深度学习框架,能够轻松直观地编写复杂的神经网络架构,在日本企业中应用广泛。

特点:  chainer 采用 “Define-by-Run” 方案,即通过实际的前向计算动态定义网络。更确切地说,chainer 存储计算历史而不是编程逻辑,pytorch 的动态图机制思想主要就来源于 chaine

chainer
chainer

11 .  Lasagne/Theano

概述:  Lasagen 其实就是封装了 theano,后者是一个很老牌的框架,在 2008 年的时候就由 Yoshua Bengio 领导的蒙特利尔 LISA 组开源了。

特点:  theano 的使用成本高,需要从底层开始写代码构建模型,Lasagen 对其进行了封装,使得 theano 使用起来更简单。

Theano
Theano

12 .  Darknet

概述:  Darknet 本身是 Joseph Redmon 为了 Yolo 系列开发的框架。
Joseph Redmon 提出了 Yolo v1,Yolo v2,Yolo v3。

Darknet
Darknet

特点:  Darknet 几乎没有依赖库,是从 C 和 CUDA 开始撰写的深度学习开源框架,支持 CPU 和 GPU。Darknet跟 caffe 颇有几分相似之处,却更加轻量级,非常值得学习使用。

上市的 Uber 背后有哪些强大的开源项目

当地时间 5 月 10 日上午,出行巨头 Uber 在纽交所挂牌上市,Uber 崛起背后的技术文化,也是众多专家们研究的对象之一,本文将和大家盘点下 Uber 都开源了哪些项目

1. deck.gl

GitHub地址项目 GitHub 地址 Star 6063

deck.gl
deck.gl

deck.gl ,是由 Uber 开源的基于 WebGL 的可视化图层。用于React 的 WebGL 遮罩套件,提供了一组高性能的数据可视化叠加层。为数据可视化用例提供测试、高性能的图层,如 2 维和 3 维的散点图、choropleths 等。

2.  react-vis

GitHub地址项目 GitHub 地址 Star 5590

react-vis
react-vis

react-vis 是 Uber 公司开源的数据可视化库,能够制作折线图、饼状图等常用图表。

3.  ludwig

GitHub地址项目 GitHub 地址 Star 4597

ludwig
ludwig

这是一款基于 Google TensorFlow 框架上的开源工具箱。藉由 Ludwig,用户无需再编写任何代码即可进行深度学习的开发。

4. Kraken

GitHub地址项目 GitHub 地址 Star 2519

P2P 的镜像仓库,这个项目着重于可扩展性和可用性,并且适用于再混合云架构中的镜像管理,复制和分布。Kraken 还支持后台扩展,可以以其他容器仓库为后台,单纯的作为发布层来部署。

5. RIBs

GitHub地址项目 GitHub 地址 Star 4586

Uber 的移动架构框架,构建具有类似架构的跨平台应用程序,使 iOS 和 Android 团队能够交叉审查业务逻辑代码

RIBs
RIBs

上图是一个 RIB 各组件之间相互协作的依赖关系。

6. cadence

GitHub地址项目 GitHub 地址 Star 1908

Cadence 是一种分布式,可扩展,持久且高度可用的编排引擎,可以以可伸缩和弹性的方式执行异步长期运行的业务逻辑。

7. luma.gl

GitHub地址项目 GitHub 地址 Star 1409

一个用于数据可视化的 JavaScript WebGL 框架

8. react-map-gl

GitHub地址项目 GitHub 地址 Star 4452

react-map-gl 提供一个围绕 Mapbox GL JS的React 友好 API 封装,是一个基于 webGL 的矢量瓦片地图库。

9. AresDB

GitHub地址项目 GitHub 地址 Star 1916

AresDB 是 Uber 开源的一个基于 GPU 运算的实时分析存储引擎和查询引擎。具备低查询延迟、高数据刷新率和高效内存和磁盘存储管理。AresDB 的查询引擎使用 C++ 编写,存储管理和其他查询组件使用 Go 编写。

10. AutoDispose

GitHub地址项目 GitHub 地址 Star 2193

AutoDispose 是 Uber 开发的自动绑定+处理 RxJava 2 流的 Java 库。可以用来解决 Android 生命周期组件导致的 RxJava 的内存泄漏情况。

11. Makisu

GitHub地址项目 GitHub 地址 Star 1604

  • Uber 开源的快速 Docker 镜像生成工具,其特点包括:
  • 不需要特殊权限,开发过程更加容易移植;
  • 开发集群内部使用分布式层间缓存提高性能;
  • 提供灵活层间管理,减少 images 中不必要文件;
  • 与容器 Docker 兼容;支持标准和多阶段开发命令。

12. NullAway

GitHub地址项目 GitHub 地址 Star 2509

NullAway 是 Uber 开源的一款帮助你清除 Java 代码中的 NullPointerException(NPE)的工具,快速且实用。NullAway 类似于 Kotlin 和 Swift 语言中的基于类型的可空性检查,能显着提高开发人员的生产力,同时也满足高要求的安全检查需求。

13. h3

GitHub地址项目 GitHub 地址 Star 1348

蜂窝多边形算法 H3,首先这个包是用 C 写的,要在 Python上用,就必须要 gcc 和 make 来进行编译。

14. pyflame

GitHub地址项目 GitHub 地址 Star 2285

pyflame 则是由 Uber 开源出来的针对 python 程序生成火焰图的工具。

15. tchannel

GitHub地址项目 GitHub 地址 Star 1058

TChannel 是用于 RPC 的网络复用和成帧协议。

数据科学、神经网络、机器学习完全图解

这是一份非常详实的备忘单,涉及具体内容包括:

  1. 神经网络基础知识
  2. 神经网络图谱
  3. 机器学习基础知识
  4. 著名 Python 库 Scikit-Learn
  5. Scikit-Learn 算法
  6. 机器学习算法选择指南
  7. TensorFlow
  8. Python 基础
  9. PySpark 基础
  10. Numpy 基础
  11. Bokeh
  12. Keras
  13. Pandas
  14. 使用 Pandas 进行Data Wrangling
  15. 使用 dplyr 和 tidyr 进行 Data Wrangling
  16. SciPi
  17. MatPlotLib
  18. 使用 ggplot 进行数据可视化
  19. Big-O
神经网络 Cheat Sheet
神经网络 Cheat Sheet

第一部分:神经网络

神经网络基础知识
神经网络基础知识

神经网络基础知识

人工神经网络(ANN),俗称神经网络,是一种基于生物神经网络结构和功能的计算模型。 它就像一个人工神经系统,用于接收,处理和传输计算机科学方面的信息。

神经网络
神经网络

基本上,神经网络中有 3 个不同的层:

  • 输入层(所有输入都通过该层输入模型)
  • 隐藏层(可以有多个隐藏层用于处理从输入层接收的输入)
  • 输出层(处理后的数据在输出层可用)

神经网络图谱

神经网络图谱
神经网络图谱

图形数据可以与很多学习任务一起使用,在元素之间包含很多丰富的关联数据。例如,物理系统建模、预测蛋白质界面,以及疾病分类,都需要模型从图形输入中学习。图形推理模型还可用于学习非结构性数据,如文本和图像,以及对提取结构的推理

第二部分:机器学习

机器学习 Cheat Sheet
机器学习

用 Emoji 解释机器学习

用 Emoji 解释机器学习
用 Emoji 解释机器学习

Scikit-Learn 基础

Scikit-learn 是由 Python 第三方提供的非常强大的机器学习库,它包含了从数据预处理到训练模型的各个方面,回归和聚类算法,包括支持向量机,是一种简单有效的数据挖掘和数据分析工具。在实战使用scikit-learn 中可以极大的节省代码时间和代码量。它基于 NumPy,SciPy 和 matplotlib 之上,采用 BSD许可证。

Scikit-Learn 基础
Scikit-Learn 基础

Scikit-Learn 算法

这张流程图非常清晰直观的给出了 Scikit-Learn 算法的使用指南。

Scikit-Learn 算法
Scikit-Learn 算法

针对 Azure Machine Learning Studios 的 Scikit-Learn 算法

针对 Azure Machine Learning Studios 的 Scikit-Learn 算法
针对 Azure Machine Learning Studios 的 Scikit-Learn 算法

第三部分:Python 数据科学

Python
Python

TensorFlow

 

 

 

TensorFlow
Python 基础

 

Python 基础
Python 基础

PySpark RDD 基础

Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎,通过 Scala 语言实现,拥有 Hadoop MapReduce 所具有的优点,不同的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。PySpark 是 Spark  为 Python 开发者提供的  API。

NumPy基础

NumPy 是 Python 语言的一个扩展程序库。支持高端大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,前身 Numeric,主要用于数组计算。它实现了在 Python 中使用向量和数学矩阵、以及许多用 C 语言实现的底层函数,并且速度得到了极大提升。

NumPy基础
NumPy基础

Bokeh

Bokeh 是一个交互式可视化库,面向现代 Web 浏览器。目标是提供优雅、简洁的多功能图形构造,并通过非常大或流数据集的高性能交互来扩展此功能。Bokeh 可以实现快速轻松地创建交互式图表、仪表板和数据应用程序。

Bokeh
Bokeh

Keras

Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK , 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。

Keras
Keras

Pandas

pandas 是一个为 Python 编程语言编写的软件库,用于数据操作和分析,基于 NumPy,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas 提供了大量快速便捷地处理数据的函数和方法。

Pandas
Pandas

使用 Pandas 进行 Data Wrangling

使用 Pandas 进行 Data Wrangling

使用Pandas进行Data Wrangling
使用 Pandas进行 Data Wrangling

使用 ddyr 和 tidyr 进行 Data  Wrangling

为什么使用 tidyr 和 dplyr 呢?因为虽然 R 中存在许多基本数据处理功能,但都有点复杂并且缺乏一致的编码,导致可读性很差的嵌套功能以及臃肿的代码。使用 ddyr 和 tidyr 可以获得:

  • 更高效的代码
  • 更容易记住的语法
  • 更好的语法可读性
使用ddyr和tidyr进行Data Wrangling
使用 ddyr和 tidyr进行 Data Wrangling

Scipy 线性代数

SciPy 是一个开源的 Python 算法库和数学工具包。 SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。 与其功能相类似的软件还有 MATLAB、GNU Octave 和 Scilab。

Scipy线性代数
Scipy 线性代数

Matplotlib

Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。 它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)。

Matplotlib
Matplotlib

使用 ggplot2 进行数据可视化

使用ggplot2进行数据可视化
使用 ggplot2 进行数据可视化

Big-O

大 O 符号(英语:Big O notation),又稱為漸進符號,是用于描述函数渐近行为的数学符号。 更确切地说,它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。 … 阶)的大 O,最初是一个大写希腊字母 “Ο” (omicron),现今用的是大写拉丁字母 “O”。

Big-O
Big-O

PDF下载(或点击阅读原文链接):
https://cheatsheets.becominghumanai.com/

参考链接:
https://becominghuman.ai/cheat-sheets-for-ai-neural-networks-machine-learning-deep-learning-big-data-science-pdf-f22dc900d2d7

 

 

 

 

 

 

LaTeX 快速入门教程(附 PDF 下载)

一、书籍简介

LaTeX  是一个文档准备系统(Document Preparing System),它非常适用于生成高印刷质量的科技类和数学类文档。它也能够生成所有其他种类的文档,小到简单的信件,大到完整的书籍。LaTeX 使用 TeX 作为它的排版引擎。 这份短小的手册描述了 LaTeX2e 的使用,对 LaTeX 的大多数应用来说应该是足够了。参考文献对 LaTeX 系统提供了完整的描述。

二、主要内容目录

  • 第一章:讲述 LaTeX 的来源,源代码的基本结构,以及如何编译源代码生成文档。
  • 第二章:讲述在 LaTeX 中如何书写文字,包括中文。
  • 第三章:讲述文档排版的基本元素——标题、目录、列表、图片、表格等等。结合前一章的内容,你应当能够制作内容较为丰富的文档了。
  • 第四章:LaTeX 排版公式的能力是众人皆知的。本章的内容涉及了一些排版公式经常用到的命令、环境和符号。章节末尾提供了 LaTeX 常见的数学符号。
  • 第五章:介绍了如何修改文档的一些基本样式,包括字体、段落、页面尺寸、页眉页脚等。
  • 第六章:介绍了 LaTeX 的一些扩展功能:排版参考文献、排版索引、排版带有颜色和超链接的电子文档。
  • 第七章:介绍了如何在 LaTeX 里使用 TikZ 绘图。作为入门手册,这一部分点到为止。
  • 第八章:当你相当熟悉前面几章的内容,需要自己编写命令和宏包扩展 LaTeX 的功能时,本章介绍了一些基本的命令满足你的需求。

三、资源分享

同时为了方便大家,我们把最新 LaTeX 快速入门教程 (PDF)打包好了,可以直接下载。

可视化神器 Altair 登场 – 2

图表的扩展

Altair 的另一个美妙之处就是,我们可以从现有的图表中创建新的图表。例如,我们现在要加入新的数据 income,我们唯一需要做的就是告诉 Altair:用 income 作为y轴,代码如下所示:

categorical_chart = alt.Chart(data).mark_circle(size=200).encode(
x='population:Q',
y='income:Q',
color='country_id:N')

population
population

如果想添加数据提示的功能(tooltip,鼠标悬停在数据上时,会显示该数据的详细信息),只需要增加一行代码:

categorical_chart = alt.Chart(data).mark_circle(size=200).encode(
x='population:Q',
y='income:Q',
color='country_id:N',
tooltip=['country_id', 'population', 'income']))

Altair 的迷人之处

在接触 Altair 之前,我们常常持有一种的怀疑态度:这些可视化工具的包装器真的好用吗?通常来讲,包装是一个坏主意,就拿 ggplot2 来说,它的很多包装器都没有被 Python 社区广泛采用。这些包装器很难创建功能完整的版本,而且它们的更新也常常不及时。然而 Altair 却不一样:

  • Altair 的 API 非常全面。
    这就要感谢 Jake Vanderplas(JVP)伟大的设计,凡是 Vega-Lite 能够做的,Python 就可以做。这是因为 Altair 只是一个 Python API,它能够生成有效的 Vega-Lite jsons,而 API 是以编程的方式生成的,因此在 Vega-Lite 的新版本发布后,Altair 能够全面而且快速的更新,这一切都显得如此美妙。
  • 直观且具有符合 Python 习惯的接口。
    就像使用其他的 Python 库一样,我们需要一些时间来习惯。但 Altair 的精彩之处在于,它所有的设置都符合人类的推理方式,这样我们就能很快的了解它内部的运作原理,并且因此而变得高效。
  • 互动性强。
    Vega-Lite 交互性非常强大,我们不仅能够使用一行代码来添加 tooltips,还能将图的选择区与另一个可视化图关联。
  • 高度灵活性。
    Altair的marks可以理解为图表构建中的模块。如下图所示,我们用圆圈标记、线标记和文本标记的组合来构建一个图。最终的代码可读性强,而且易于修改,这对于 matplotlib 来说是很难的。

Altair 的主要缺点

  • 没有 3d 绘图。
    如果3d可视化对您的工作很重要,那么 Altair 不太适合您。
  • Altair 不是 D3.js。
    就像许多的高级可视化框架一样,Altair 也不是 100% 可定制的,在某些时候,我们会遇到一些无法用Altair制作的图表。(注:D3.js 是一个 JavaScript 库,用于在 Web 浏览器中生成动态的交互式数据可视化。 它利用了广泛实施的 SVG,HTML5 和 CSS 标准,具有高度的可定制性)
  • 统计支持较差。
    如果需要对数据进行线性回归的话,还是推荐用 Seaborn 来进行快速可视化。

深度学习最常见的 26 个模型 – 含实现代码

本文首先从 4 个方面(张量、生成模型、序列学习、深度强化学习)追踪深度学习几十年的发展史,然后再介绍主流的 26 个深度学习模型。

1. 深度学习发展史

主要按最早研究出现的时间,从 4 个方面来追踪深度学习的发展史。

1.1 张量

  • 1958 年 Frank 提出感知机,但后来被一些学者发现因算力的不足,制约了较大神经网络的计算,导致很长时间发展缓慢。
  • Fukushima 在 1979 年左右提出 Neocognitron,感觉这是卷积和池化的雏形。
  • Hinton 在 1986 年提出反向传播的思想和多层感知机(BPNN/MLP),有非常大的意义,对未来几十年(可以说直到现在)影响深远。
  • 接下来比较重要的发展是,LeCun 在 1998 年提出 LeNet-5,7 层的 CNN 做数字识别。
  • 然后 AlexNet 在 12 年在 ImageNet 夺冠,主要是 CNN+Dropout+Relu,又是 Hinton 极大的带动了 DL 的发展,大佬的地位毋庸置疑。另外相似的还有 15 年的 GoogLeNet。
  • 总算有华人大佬作出大贡献了,16 年何恺明(CV领域应该无人不知)提出 Resnet,还拿了 best paper,影响较大,当然效果也很好。另外相似的还有 17 年的 DenseNet。
  • 17年 Capsule Network 登场了,又是 Hinton。我比较看好胶囊网络在 NLP 领域的发展,虽然现在还没太明显的效果。因为用胶囊网络来做文本的特征表示的话,可以极大的丰富特征,更适合处理文本这种比较灵活的数据

1.2 生成模型

  • 上世纪 80 年代提出 RBM,06 年叠加成 Deep Belief Network(DBN),这算是重新叠加网络的一个比较重要的开始吧。
  • 上世纪 80 年代 Hinton 提出 Auto-Encode,过了较长时间 Bengio 在 08 年提出 Denoise Auto-Encode。Welling 在 13 年提出 Variational Auto-Encode。
  • 接下来,在 14 年 Goodfellow 和 Bengio 等提出 GAN,从此生成网络不仅是 AE 以及其变种(Denoise Auto-Encode、Variational Auto-Encode等)了,可以这么说:GAN 的出现极大的提高了生成模型的地位和热点,GAN 也是席卷 NLP、CV、AI 等领域的各大顶会,甚至是一些 best paper。另外,陆续出现很多很多 GAN 的变种,比如 DCGAN、CGAN、PGGAN、LAPGAN、InfoGAN、WGAN、F-GAN、SeqGAN、LeakGAN 等。

1.3 序列学习

  • 1982 年提出 hopfield network,1997 年 Schmidhuber 提出 LSTM。Hinton 组在 13 年把 RNN 用在语音识别上取得巨大突破,RNN 立马爆火。
  • 03 年提出 LM(语言模型),13 年提出 w2v,佩服 Bengio,这也是我为啥千里迢迢跑去找 Benign 合影的原因之一。w2v 带来的影响不言而喻,目前 NLP 领域基本上所有 Paper 都会用到词向量,包括也影响了后面出现的 Glove、FastText、ELMo( 18 年 2 月)、Transformer( 18 年 6 月)、Bert ( 18 年 10 月提出,Jacob 一战封神,我感觉至少是 18 年 NLP 领域最大的发展,甚至可以说是近几年最大的发展)等。Bert 的出现,很可能改变所有主流 NLP 任务的打法和 Baseline
  • 还有一个分支,14 年出现 Seq2Seq,这个重要性也无需赘述了,NLP 领域的都知道。然后 15 年出现Charater  CNN ,17 年出现 self-attention。

1.4 深度强化学习

  • 提到强化学习就不得不提这 Deep Mind 、AlphaGo 以及其变种、Silve r。13 年提出 Deep Q-learning 15 年提出 Double DQN,16 年提出 Dueling Net。 15 年的 DDPG 和 16 年的 A3C 都是 NN+Policy Gradient,也应用在不少领域。16 年的 AlphaGo(除了 AI 领域,很多不懂AI的人都知道,甚至可以说是 AI 爆火的最大助力),17 年出现更疯狂的 Alpha Zero。

2. 深度学习模型

深度学习模型
深度学习模型

2.1 Feed forward neural networks (FF or FFNN) and perceptrons (P)

前馈神经网络和感知机,信息从前(输入)往后(输出)流动,一般用反向传播(BP)来训练。算是一种监督学习。

前馈神经网络和感知机
前馈神经网络和感知机

对应的代码:

https://github.com/danijar/layered

https://github.com/civisanalytics/muffnn

2.2 Radial basis function (RBF)

径向基函数网络,是一种径向基函数作为激活函数的 FFNNs(前馈神经网络)。

径向基函数网络
径向基函数网络

对应的代码:

https://github.com/eugeniashurko/rbfnnpy

2.3 Hopfield network (HN)

Hopfield 网络,是一种每个神经元都跟其它神经元相连接的神经网络。

Hopfield 网络
Hopfield 网络

对应的代码:

https://github.com/yosukekatada/Hopfield_network

2.4 Markov chains (MC or discrete time Markov Chain, DTMC)

马尔可夫链 或离散时间马尔可夫链,算是 BMs 和 HNs 的雏形。

马尔可夫链
马尔可夫链

对应的代码:

Markov chains:https://github.com/jsvine/markovify

DTMC:https://github.com/AndrewWalker/dtmc

2.5 Boltzmann machines (BM)

玻尔兹曼机,和 Hopfield 网络很类似,但是:一些神经元作为输入神经元,剩余的是隐藏层。

玻尔兹曼机
玻尔兹曼机

对应的代码:

https://github.com/yell/boltzmann-machines

2.6 Restricted Boltzmann machines (RBM)

受限玻尔兹曼机,和玻尔兹曼机 以及  Hopfield 网络 都比较类似

受限玻尔兹曼机
受限玻尔兹曼机

对应的代码:

https://github.com/echen/restricted-boltzmann-machines

2.7 Autoencoders (AE)

自动编码,和 FFNN 有些类似,它更像是 FFNN 的另一种用法,而不是本质上完全不同的另一种架构。

自动编码
自动编码

对应的代码:

https://github.com/caglar/autoencoders/blob/master/ae.py

2.8 Sparse autoencoders (SAE)

稀疏自动编码,跟自动编码在某种程度比较相反

稀疏自动编码
稀疏自动编码

对应的代码:

https://github.com/caglar/autoencoders/blob/master/sa.py

2.9 Variational autoencoders (VAE)

变分自动编码,和 AE 架构相似,不同的是:输入样本的一个近似概率分布。这使得它跟 BM、RBM 更相近。

变分自动编码
变分自动编码

对应的代码:

https://github.com/mattjj/svae

2.10 Denoising autoencoders (DAE)

去噪自动编码,也是一种自编码机,它不仅需要训练数据,还需要带噪音的训练数据。

去噪自动编码
去噪自动编码

对应对应的代码:

https://github.com/caglar/autoencoders/blob/master/da.py

2.11 Deep belief networks (DBN)

深度信念网络,由多个受限玻尔兹曼机或变分自动编码堆砌而成。

深度信念网络
深度信念网络

对应的代码:

https://github.com/albertbup/deep-belief-network

2.12 Convolutional neural networks (CNN or deep convolutional neural networks, DCNN)

卷积神经网络,这个不解释也都知道。

卷积神经网络
卷积神经网络

对应的代码:

CNN:https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_CNN.py

DCNN:https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_DeepCNN.py

2.13 Deconvolutional networks (DN)

去卷积网络,又叫逆图形网络,是一种逆向的卷积神经网络。

去卷积网络
去卷积网络

对应的代码:

https://github.com/ifp-uiuc/anna

2.14 Deep convolutional inverse graphics networks (DCIGN)

深度卷积逆向图网络,实际上是 VAE,且分别用 CNN、DNN 来作编码和解码。

深度卷积逆向图网络
深度卷积逆向图网络

对应的代码:

https://github.com/yselivonchyk/TensorFlow_DCIGN

2.15 Generative adversarial networks (GAN)

生成对抗网络,Goodfellow 的封神之作,这个模型不用解释也都知道

生成对抗网络
生成对抗网络

对应的代码:

https://github.com/devnag/pytorch-generative-adversarial-networks

2.16 Recurrent neural networks (RNN)

循环神经网络,这个更不用解释,做语音、NLP 的没有人不知道,甚至非 AI 相关人员也知道。

循环神经网络
循环神经网络

对应的代码:

https://github.com/farizrahman4u/recurrentshop

2.17 Long / short term memory (LSTM)

长短期记忆网络, RNN 的变种,解决梯度消失/爆炸的问题,也不用解释,这几年刷爆各大顶会。

长短期记忆网络
长短期记忆网络

对应的代码:

https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_LSTM.py

2.18 Gated recurrent units (GRU)

门循环单元,类似 LSTM 的定位,算是 LSTM 的简化版。

门循环单元
门循环单元

对应的代码:

https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_GRU.py

2.19 Neural Turing machines (NTM)

神经图灵机,LSTM 的抽象,以窥探 LSTM 的内部细节。具有读取、写入、修改状态的能力

神经图灵机
神经图灵机

对应的代码:

https://github.com/MarkPKCollier/NeuralTuringMachine

2.20 Bidirectional recurrent neural networks, bidirectional long / short term memory networks and bidirectional gated recurrent units (BiRNN, BiLSTM and BiGRU respectively)

双向循环神经网络、双向长短期记忆网络和双向门控循环单元,把 RNN、双向的 LSTM、GRU 双向,不再只是从左到右,而是既有从左到右又有从右到左。

对应的代码:

BiRNN:https://github.com/cstghitpku/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/tree/master/models

BiLSTM:https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_BiLSTM.py

BiGRU:https://github.com/bamtercelboo/cnn-lstm-bilstm-deepcnn-clstm-in-pytorch/blob/master/models/model_BiGRU.py

2.21 Deep residual networks (DRN)

深度残差网络,是非常深的 FFNN,它可以把信息从某一层传至后面几层(通常2-5层)。

深度残差网络
深度残差网络

对应的代码:

https://github.com/KaimingHe/deep-residual-networks

2.22 Echo state networks (ESN)

回声状态网络,是另一种不同类型的(循环)网络。

回声状态网络
回声状态网络

对应的代码:

https://github.com/m-colombo/Tensorflow-EchoStateNetwork

2.23 Extreme learning machines (ELM)

极限学习机,本质上是随机连接的 FFNN。

极限学习机
极限学习机

对应的代码:

https://github.com/dclambert/Python-ELM

2.24 Liquid state machines (LSM)

液态机,跟 ESN 类似,区别是用阈值激活函数取代了 sigmoid 激活函数。

液态机
液态机

对应的代码:

https://github.com/kghose/Liquid

2.25 Support vector machines (SVM)

支持向量机,入门机器学习的人都知道,不解释。

支持向量机
支持向量机

对应的代码:

https://github.com/ajtulloch/svmpy

2.26 Kohonen networks (KN, also self organising (feature) map, SOM, SOFM)

Kohonen 网络,也称之为自组织(特征)映射。

Kohonen 网络
Kohonen 网络

对应的代码KN/SOM:

https://github.com/mljs/som

可视化神器 Altair 登场 – 1

如何将我们的数据以更好的形势呈现出来?擅长不同编程语言的程序员会选择各自技术范畴内成熟、好用的工具包,比如 R 语言的开发者最常使用的是 ggplot2,但它不支持 Python;以前 Python 语言的开发者使用最多的是 matplotlib,一个很强大的可视化库,不过它的局限也非常严重,制作交互式图表也是一件难事。今天要给大家推荐一个新的工具—— Altair,一个 Vega-Lite 的包装器,也许这些概念你都还不没了解过,接下来我们就在下面的文章为大家作介绍。

ggplot2 是 R 的作图工具包,可以使用非常简单的语句实现非常复杂漂亮的效果。然而不幸的是,ggplot2 并不支持 Python。在 Python 中,我们常使用 matplotlib 用于可视化图形,matplotlib是一个很强大的可视化库,但是它有着很严重的局限性。matplotlib 的使用非常灵活,这可以说的上是它的一个优点,但是当我们想为图形加一个小小的功能的时候,它的繁琐操作会让我们举步维艰。除此之外,matplotlib 的两种界面(面向对象界面、基于状态的界面)令人相当困惑,对于新手很不友好。即使对于多年使用 matplotlib 的人而言,他们也无法完全掌握这些操作。最后不得不说的是,用 matplotlib 制作交互式图表是一件相当困难的事情。

Altair 和图形语法

Altair 是 Vega-Lite 的包装器。Vega-Lite 是 JavaScript 的高级可视化库,它最最重要的特点是,它的 API 是基于图形语法的。

什么是图形语法呢?图形语法听起来有点像一个抽象的功能,值得注意的是,它是 Altair 和其他 Python 可视化库之间最主要的区别。Altair 符合我们人类可视化数据的方式和习惯,Altair 只需要三个主要的参数:

  • Mark. 数据在图形中的表达形式。点、线、柱状还是圆圈?
  • Channels. 决定什么数据应该作为x轴,什么作为y轴;图形中数据标记的大小和颜色。
  • Encoding. 指定数据变量类型。日期变量、量化变量还是类别变量?

基于以上三个参数,Altair 将会选择合理的默认值来显示我们的数据。

Altair 最让人着迷的地方是,它能够合理的选择颜色。如果我们在 Encoding 中指定变量类型为量化变量,那么 Altair 将会使用连续的色标来着色(默认为 浅蓝色-蓝色-深蓝色)。如果变量类型指定为类别变量,那么 Altair 会为每个类别赋予不同的颜色。(例如 红色,黄色,蓝色)

补充:Vega-Lite 有两种类型的类别变量:名义变量和序数变量。名义变量的集合中,各元素的排序阶数没有任何实际意义,例如大陆集合是欧洲,亚洲,非洲,美洲,大洋洲,他们的次序没有任何数值上的意义;序数变量的集合中,各元素的排序阶数是有实际意义的,例如亚马逊的评论可以是一星,二星,三星,四星或五星,星级的高低次序是由意义的。

让我们来看一个具体的例子,如下所示,我们组织了 6 个国家和它们所对应的人口数据,除此之外,还有相应的收入数据:

import pandas as pd
import altair as alt
data = pd.DataFrame({'country_id': [1, 2, 3, 4, 5, 6],
'population': [1, 100, 200, 300, 400, 500],
'income': [1000, 50, 200, 300, 200, 150]})
国家的人口数据
国家的人口数据
首先我们绘制每个国家的人口数据:
"""As we mentioned before, we need to define 3 parameters:
1. Mark: We do this by using "mark_circle".
2. Channel: We only define an x-axis and we map it to the population.
3. Encodings: We define both variables as quantitative by using :Q after the column name"""
categorical_chart = alt.Chart(data).mark_circle(size=200).encode(
x='population:Q',
color='country_id:Q')
每个国家的人口数据
每个国家的人口数据

从上图可以看出,Altair 选择了连续色标,在本例中这是没有意义的。问题的根源在于,我们将 country_id 定义为量化变量,而实际上,它应该是一个类别变量,修改代码如下:

# We changed color='country_id:Q' to color='country_id:N' to indicate it is a nominal variable
categorical_chart = alt.Chart(data).mark_circle(size=200).encode(
x='population:Q',
color='country_id:N')
每个国家的人口数据
每个国家的人口数据

从图中可以看到,每个国家都用了不同的颜色表示。我们仅仅改变了变量 country_id 的编码,即用 N (Nominal 名义变量)替换了 Q (Quantitative 量化变量)。这点小小的改变就足以使得 Altair 明白,它不该使用连续色标,而是使用独立色标。

NLP最新科研福利!MSRA开源学术界最全面语义分析数据集

微软亚洲研究院(MSRA),刚刚送出最新一批 AI 资源和福利。

在“中国高校人工智能人才国际培养计划” 2019 国际人工智能专家论坛暨 2019 微软新一代人工智能开放科研教育平台合作论坛,MSRA 面向高校提供最新的人工智能技术、工具、科研成果,以及数据集。

新增业界最全面的语义分析数据集

在新一代人工智能开放科研教育平台的合作框架下,微软开放了自身人工智能领域的数据集供合作高校在科研和教育工作上进行引用,如微软机器阅读理解(MS MARCO)、微软研究院社交媒体对话语料库、18K 数学文字题测试集 SigmaDolphin 等。

高校也通过平台贡献了各自在多个领域的数据集,如中国科学技术大学类脑实验室的海量类脑数据等。

2019 年,微软亚洲研究院正式发布自然语言处理(NLP)领域全新的语义分析数据集 MSParS (Multi-perspective Semantic ParSing Dataset)。

作为智能音箱、搜索引擎、自动问答和对话系统等人工智能产品中的核心技术,语义分析(Semantic Parsing)面临着因人工标注代价高昂而导致的数据缺乏问题,目前已有的语义分析数据集在数据规模和问题类型覆盖度上非常有限。

为此,微软亚洲研究院提出并构建了 MSParS,该数据集(1.0版本)包含 81,826 个自然语言问题及其对应的结构化语义表示,覆盖 12 种不同的问题类型和 2,071 个知识图谱谓词,是学术界目前最全面的语义分析数据集。未来,微软将与各高校一起开放、共享更多数据,促进产教融合合作生态的建设。

MSParS 数据集:

https://github.com/msra-nlc/MSParS

 

国内第一部 AI 本科专业教育培养体系

5 月 6 日,人工智能学院院长周志华教授在微博上分享了最新出炉的《南京大学人工智能本科专业教育培养体系》(简称《培养体系》),这是南大在 AI 本科专业人才培养方面的初步探索成果,还成为了国内第一本 AI 本科专业教育培养体系的著作。