最全面的《深度学习》精炼笔记

《深度学习》,又名『花书』。该书由三位大佬 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 撰写,是深度学习领域奠基性的经典教材,被誉为深度学习“圣经”。

深度学习
深度学习

花书怎么学?参考优秀的笔记往往能帮助你事半功倍!今天给大家推荐一份不错的花书学习笔记,挺详细的。作者是来自于谷歌的软件工程师—川陀学者。我们一起来看看!

为方便以后查阅,把深度学习花书 Deep Learning 每一章的读书笔记做个索引,完整的笔记也是根据书籍目录来的。

花书的目录如下:

目录
目录

下面我们来详细看一下完整笔记内容!

第一部分 机器学习基础

第一章 前言

1. 前言(上)

花书可以大致分为三大部分:

  • 机器学习基础知识:涵盖线性代数,概率论,数值计算和传统机器学习基础等知识。如果之前学过Andrew Ng 的 CS229 的话基本可以跳过。
  • 深度神经网络核心知识:属于本书必读部分,涵盖前馈神经网络,卷积神经网络( CNN ),递归神经网络( RNN ) 等。
  • 深度学习前沿:有一些前沿研究领域的介绍,如线性因子模型,表征学习,生成模型等。 可以按照自己的需要选读相关章节。

完整版

https://zhuanlan.zhihu.com/p/37753117

2. 前言(下)

继续总结深度学习花书第一章前言下半部分,主要内容有:

  • 深度学习历史悠久,在不同时期名字不同,代表不同的侧重点。
  • 由于训练数据的增多和软硬件性能的提高,深度学习的模型越来越准确。
  • 深度学习逐渐走向实用化。

完整版:
https://zhuanlan.zhihu.com/p/37800558

第二章 线性代数

线性代数是机器学习的数学基础之一,这里总结一下深度学习花书线性代数一章中机器学习主要用到的知识,并不囊括所有线性代数知识。

完整版:
https://zhuanlan.zhihu.com/p/38197420

第三章 概率论

概率论是研究随机性和不确定性的科学,在人工智能领域主要有两大应用:

1. 概率论可以指导人工智能模型所需模拟或近似的概率分布。

2.概率与统计可以帮助我们分析模型的预测的准确性。可以说,线性代数和概率论是人工智能系统的两大数学基石,这一章对于理解很多机器学习模型的背后驱动力是关键的。

完整版:
https://zhuanlan.zhihu.com/p/38424019

第四章 数值计算

第四章主要研究的是优化问题。

我们机器学习的目标常常是使某个目标函数(objective function)或损失函数(cost function)尽量小,即找到一个 x* = argminf(x). 对于有的问题我们可能可以得到解析解,但对于大多数问题,我们可能无法得到解析解,这时候就需要一些数值计算的方法使我们逐渐逼近最优解,这一章里就主要讲了利用一阶导数的梯度下降算法和利用二阶导数的牛顿方法,另外还有研究在给定某些限制条件下的条件极值的解法,Ian 在这一章有些解释可能略过了,在这里我加入了自己的理解使其更易懂。

完整版:
https://zhuanlan.zhihu.com/p/38644738

第五章 机器学习基础

1. 机器学习问题定义与线性回归

之前已经总结了第二到四章数学基础部分,第五章讲的是机器学习基础,内容较多,包括机器学习问题的定义,机器学习算法过拟合和验证集的概念,贝叶斯推断,经典的监督学习和非监督学习的算法等,而且Ian 很多方面一笔带过,其实每个经典的算法都可以单独出来写一篇文章详述,所以准备将第五章分几部分总结,而且争取把书中比较模糊的涉及到的概念也补充清楚。

这篇先总结一下对于机器学习问题如何定义并以线性回归来举例说明。

完整版:
https://zhuanlan.zhihu.com/p/38790135

2. 欠拟合、过拟合与正则化

继续花书第五章总结,主要内容是模型的泛化误差,过拟合与正则化方法。

完整版:
https://zhuanlan.zhihu.com/p/39035752

3. 最大似然法与最大后验概率估计

继续花书第五章总结,主要内容有最大似然法(Maximum likelihood estimation), 贝叶斯统计(Bayesian statistics)与最大后验概率估计(Maximum A Posteriori estimation简称MAP estimation)。

完整版:
https://zhuanlan.zhihu.com/p/39063974

4. 逻辑回归

继续花书第五章机器学习基础部分总结,接下来是经典监督学习算法,不过 Ian 对于逻辑回归和支持向量机一笔带过,解释的不是很详细,我准备结合 Andrew Ng 的 cs229 内容将逻辑回归(logistic regression)与支持向量机(support vector machine)分两篇详细写一下。

完整版:
https://zhuanlan.zhihu.com/p/39784376

5. 支持向量机

支持向量机(Support Vector Machine, 简称SVM)是传统监督学习中一个经典的算法,Ian 在花书中讲的比较简略,这里我结合 CS229 的内容进行补充。

完整版:
https://zhuanlan.zhihu.com/p/39815531

6. 主成分分析 PCA

接下来总结经典的无监督学习模型主成分分析(Principal component analysis , 简称 PCA )。Ian 分别在第二章和第五章从不同角度讨论了 PCA 算法,分别是在第二章线性代数中本征分解和奇异值分解 SVD 之后和第五章无监督学习模型中,这里总结在一起。

完整版:
https://zhuanlan.zhihu.com/p/39847860

第二部分 深度神经网络核心知识

第六章 前馈神经网络

1. 前馈神经网络初探

前五章总结了深度学习的数学基础及经典机器学习算法(深度学习花书读书笔记目录),第 6 到 12 章是花书的深度网络核心部分,包括如下内容:前馈神经网络,深度学习的正则方法,训练深度学习模型的优化方法,卷积神经网络,循环及递归神经网络,关于模型训练的建议与方法以及深度学习的应用,这部分的技术已经广泛应用到工业界,对于想要用深度学习来解决实际工作中的问题的从业人员很有必要。

现在就开始第六章前馈神经网络的总结,准备分为三篇:

1.初识前馈神经网络

2.前馈神经网络的基本组成与架构

3.反向传播算法。现在开始第一篇总结。

完整版:
https://zhuanlan.zhihu.com/p/40519236

2. 神经网络损失函数、输出层、隐藏层详解

神经网络的设计主要包含两方面:1)损失函数的选择 2)模型的具体架构。

完整版:
https://zhuanlan.zhihu.com/p/41194849

3. 反向传播算法

为了理解什么是反向传播(backward propagation),先要知道什么是正向传播(forward propagation)。顾名思义,正向传播就是对于前馈神经网络来说,信息从输入到隐藏层再到输出的正向流动过程,最终会得到损失函数的值。而反向传播就是从损失函数反向流入网络以计算梯度(gradient)的过程。

要注意,有个普遍的误解是反向传播就是神经网络的全部学习算法,实际上,反向传播仅指计算梯度的过程,实际上的学习过程是诸如随机梯度下降(stochastic gradient descent,SGD)更新网络的算法。

完整版:
https://zhuanlan.zhihu.com/p/41379139

第七章 正则化方法

继续总结深度学习花书,第七章主要讲了深度学习中的各种正则化方法(regularization),即为了减小泛化误差而对机器学习算法进行的修改。关于泛化、欠拟合、过拟合的基础概念,可参考之前的总结文章欠拟合、过拟合与正则化。

总体来说,一部分正则化方法使给模型施加额外的限制条件,例如限制参数值范围,有些会在目标函数中添加一些额外惩罚项,本质上也是希望限制参数值。有的时候,这些限制条件或惩罚项代表了特定的先验经验,有的时候是希望避免模型过于复杂。正则化常常会增加一些 bias 但同时会减少 variance,好的正则化方法就是在能够显著减小 variance 的情况下又不显著地增加 bias。

完整版:
https://zhuanlan.zhihu.com/p/41462329

第八章 优化方法

1. 深度学习优化算法比较

继续深度学习第八章总结,这章主要讲了深度学习的优化方法,主要涉及的内容有 Stochastic Gradient Descent (SGD) ,  Momentum ,  Adagrad ,  RMSProp ,  Adam ,模型参数初始化和 Batch Normalization,第一部分先总结 SGD 及其各种改进算法,由于这一部分内容在斯坦福 CS231n 中的解释更清晰,会结合起来一起总结。

完整版:
https://zhuanlan.zhihu.com/p/42183379

2. Batch Normalization

前面一篇(深度学习优化算法比较——深度学习第八章(一))总结了常见的优化算法 SGD 以及其改进方法Momentum ,Adagrad ,Adam 等,这篇继续总结最近优化深度神经网络的一种高效的方法——Batch Normalization ,该方法有 Ioffe 和 Szegedy 在 2015 年提出(Accelerating Deep Network Training by Reducing Internal Covariate Shift)。

完整版:
https://zhuanlan.zhihu.com/p/42982530

第九章 卷积神经网络

继续深度学习花书的读书笔记总结,这一章主要介绍了卷积神经网络(convolutional neural network, 简称CNN), 它通常适用于具有网格状结构的数据,例如时序数据可看做是在特定时间间隔上的一维网格,图像可以看做是像素构成的二维网格,医学成像如 CT 等为三维网格数据。

卷积神经网络,顾名思义,利用了数学上的卷积操作(convolution)。和前面第六章总结的基本的前馈神经网络相比,CNN 只不过是将某层或某几层中的矩阵乘法运算替换为卷积运算,其他的比如说最大似然法则,反向传播算法等等都保持不变。

完整版:
https://zhuanlan.zhihu.com/p/43143470

第十章 循环神经网络

继续深度学习花书的读书笔记总结。这一章主要介绍了循环神经网络(Recurrent neural network, 简称RNN),主要用来处理序列数据,比如一些文字序列或时序数据。对于这类数据,基本的前馈神经网络会对每一个输入的特征都训练一个单独的参数,而不能很好的进行参数的共享,而 RNN 就可以通过对不同时间点的特征共享参数而更容易的进行训练,泛化效果也更好。上一章卷积神经网络——深度学习第九章总结过 CNN 也可以实现参数共享,RNN 与其不同的地方在于其每一点的输出还依赖于之前的结果。

完整版:
https://zhuanlan.zhihu.com/p/44145288

第十一章 实战经验

前面几章我们总结了机器学习以及深度学习中一些常用的模型以及训练方法,实际应用中,我们还要知道对于一些特定的情景选择哪种模型,以及如何通过收集模型的反馈结果来不断改善模型。有时候不一定需要采用最新最复杂的模型,而是需要深入的理解一些通用的模型,并更好的应用到我们所处理的具体问题中。这一章会总结一下我们面对一个机器学习问题时的实战步骤:确立性能指标;快速建立端到端的流程;分析模型效果,并不断的对模型进行改进。下面详细解释一下每个步骤。

完整版:
https://zhuanlan.zhihu.com/p/44643887

第十二章 深度学习应用

继续《深度学习》花书笔记总结,这一章主要是结合前面几章内容简要介绍了深度学习在图像识别,自然语言处理及其他领域的应用。

完整版:
https://zhuanlan.zhihu.com/p/45225601

第三部分 深度学习前沿研究

第十三章 线性因子模型

继续深度学习花书总结,从第十三章开始,主要是一些前沿研究领域。之前总结的方法大部分是在有大量数据情况下的监督学习方法,而假如我们想减小数据量的要求,则需要一些无监督学习及半监督学习方法,虽然有很多无监督学习方法,但是目前还无法达到深度学习在监督学习问题中所达到的精度,这常常是由于我们需要解决的问题的维度过高或计算量过大造成的。

完整版:
https://zhuanlan.zhihu.com/p/45898775

第十四章 自编码器

自编码器(Autoencoder)是一种特定的神经网络结构,其目的是为了将输入信息映射到某个更低维度的空间,生成包含重要特征的编码 code,这部分称为 Encoder,可用函数 h=f(x) 表示,然后再利用 Decoder将 code 重构成为尽量能还原原输入的结果,用函数 r=g(h) 。我们的目的就是尽量使 g(f(x))=x ,当然如果只是简单的将输入复制到输出是没有任何意义的,我们需要加一定的限制条件,使我们的模型学习到数据中更重要的特征。

完整版:
https://zhuanlan.zhihu.com/p/46067799

第十五章 表示学习

这一章聚焦表示学习(Representation Learning)及其应用,主要内容有无监督及有监督预训练的作用,迁移学习及分布式表示。在前言部分(机器学习的《易筋经》:深度学习花书前言(上))提到过,机器学习的主要问题就是如何更合理高效的将特征表示出来。那么,我们怎么判定某种表示更好呢,这需要具体问题具体分析,这通常依赖于后续的学习任务是否能够得益于这种表示。通常,我们是进行某些无监督学习提取出特征,而这些特征可用来我们更好的进行监督学习,或者将这些特征迁移到其他相关任务中。我们也可以将监督学习训练的前馈神经网络看做是一种表示学习,通常神经网络的最后一层是个分类器如softmax,它之前的隐藏层可以看做是给这个分类器提供一个高效的表征。

完整版:
https://zhuanlan.zhihu.com/p/46286036

第十六章 结构化概率模型

继续《深度学习》花书总结,从第 16 章开始直到第 20 章都是在讨论概率模型,其中第 16 到 19 章着重于概率模型基础及一些近似方法,第 20 章讨论应用这些方法的生成模型。我们先来总结第 16 章概率图的主要概念。

完整版:
https://zhuanlan.zhihu.com/p/47892761

第十七章 蒙特卡洛方法

继续《深度学习》花书总结,本章主要介绍采样的蒙特卡洛方法,准备结合斯坦福 CS 228 – Probabilistic Graphical Models 课程相关内容一起总结。

完整版:https://zhuanlan.zhihu.com/p/48481980

第十八章 配分函数

继续《深度学习》花书总结,本章主要介绍了各种求配分函数的方法,准备结合斯坦福 cs228Learning in undirected models 这部分内容一起总结。

完整版:
https://zhuanlan.zhihu.com/p/48552020

第十九章 近似推断

继续《深度学习》花书总结,本章介绍了各种近似推断的方法,有 EM 算法,变分推断等,重点是变分推断,这部分内容个人感觉 Variational Inference: A Review for Statisticians 这篇论文对变分推断的解释思路更清晰,所以会主要根据这篇论文来进行总结。

完整版:
https://zhuanlan.zhihu.com/p/49401976

第二十章 生成模型

1. 生成模型综述

这是《深度学习》花书最后一章,内容也比较多,所以准备分为四篇总结:

  • 生成模型综述,比较一下常见的几种生成模型。
  • 详解玻尔兹曼机,GSN以及Fully Visible Belief Network如PixelRNN/PixelCNN。
  • 详解变分自编码器Variational Autoencoder。
  • 详解生成对抗网络Generative Adversarial Network。

另外,由于部分内容其他资料会梳理的更清晰,所以会结合 Ian 在 2016 NIPS 的 GAN tutorial NIPS 2016 tutorial: Generative Adversarial Networks 和斯坦福 Syllabus | CS 231N 中与 Generative Model 相关的内容一起总结。

这一篇先来综述一下什么是生成模型,我们为什么要研究生成模型以及常见生成模型谱系及比较。

完整版:
https://zhuanlan.zhihu.com/p/50278440

2. 玻尔兹曼机、生成随机网络与自回归网络

继续总结花书第20章,这一章花了很大的篇幅介绍玻尔兹曼机及其变种,但实际应用中主要用到的三种方法还是

  • 自回归网络 Auto-Regressive Networks,又叫做 Fully-visible Bayes networks(FVBN)。
  • 变分自解码器 Variational Autoencoder (VAE)。
  • 生成对抗网路 Generative Adversarial Networks(GAN) 。所以这篇会简要的总结一下玻尔兹曼机以及生成随机网络,然后着重总结一下自回归网络。

完整版:
https://zhuanlan.zhihu.com/p/50745191

3. 变分自编码器 VAE

继续总结花书第 20 章,这一篇我们来看另一种常用的生成模型——变分自编码器 Variational Autoencoder ,简称 VAE ,主要会结合斯坦福 Syllabus | CS 231N 中与 Generative Model 相关的内容来总结。

完整版:
https://zhuanlan.zhihu.com/p/51355416

4. 生成模型中的左右互搏术

继续总结花书第 20 章最后一部分生成对抗网络 Generative Adversarial Network,简称 GAN 。主要结合斯坦福 Syllabus | CS 231N 中与 Generative Model 相关内容以及 NIPS 2016 tutorial: Generative Adversarial Networks 来进行总结。

完整版:
https://zhuanlan.zhihu.com/p/37846221

后记与延伸

深度学习花书读书笔记后记与延伸:
https://zhuanlan.zhihu.com/p/51431332

花书完整笔记的目录可以看这里:
https://zhuanlan.zhihu.com/p/38431213

最后,希望这份资源对你有用!也感谢原作者的辛勤整理!

DeepMind 发布星际争霸强化学习课程

此前,跨象乘云介绍了:Pysc2 —— 基于 Python 的星际争霸 II 机器学习环境,这是 DeepMind 和暴雪合作开发星际争霸 II 到强化学习研究的一个丰富环境,为强化学习代理提供了与星际争霸 II 进行交互的界面,获得观察结果并发送动作。

很长时间以来,因为星际争霸这个游戏包含非常多的状态和动作空间,以及只有部分可观察和多玩家的特点,这个游戏一直被机器学习界认为是人工智能的下一个『大挑战』。

于是,一个由澳大利亚开发人员、机器学习工程师和研究人员组成的团队 —— StarAi 就基于星际争霸开发了一个机器学习课程!

课程特色

大多数强化学习课程都是采用高度数学化的方法学习的,但是这个课程使用更加人性化工具 —— 『故事』,来解释基本的强化学习概念。不能自己动手创造的东西你是不会明白的!所以课程提供了易于实际操作的练习,与步骤详解,以帮助学习。

学习方法

所有练习都在谷歌实验室中执行,直接在浏览器中就可以操作,而与硬件无关。所以你所需要的只是一个谷歌帐户和 Chrome 浏览器。学习的步骤就是先观看演讲材料,然后尝试进行练习。当然课程官方就像高中老师一样,也是要求你在自己实际操作很多遍之后如果还不能解决再看答案,不要直接看答案!

而对于基础较好的技术人员,如果想深入了解的话,课程还提供了Sutton & Bartos 的优秀教科书《An Introduction for each week’s material》中相关章节的链接。课程一共六周,每一部分都包含视频讲解、PPT、课后练习和答案,非常完善!赶紧上手进行学习吧!

课程链接

https://www.starai.io/course/

Pytorch 图神经网络(GNN)实战推荐

一、资源简介

最近以来图神经网络 (GNN) 在各个领域越来越受到欢迎,包括社交网络、知识图谱、推荐系统,甚至生命科学。GNN 在对图形中节点间的依赖关系进行建模方面能力强大,使得图分析相关的研究领域取得了突破性进展。今天给大家推荐一篇关于 Pytorch 实战图神经网络的笔记,图神经网络在最近的学术界和工业界都十分的火热,非常值得一学!

PyTorch
PyTorch

PyTorch 是什么?

PyTorch 是一个基于 Python 的科学计算工具包,它主要面向两种场景:

  1. 用于替代 NumPy ,可以使用 GPU 的计算力
  2. 一种深度学习研究平台,可以提供最大的灵活性和速度

原作者: Steeve Huang
网页链接:http://t.cn/AiKsApEM

二、主要内容

在本文中,作者将使用 PyTorch 和 PyTorch Geometry (PyG) ,这是一个构建在 PyTorch 之上的图形神经网络框架,运行速度非常快。它有多快?与另一个流行的图神经网络库 DGL 相比,它的训练时间最多快80% !除了其惊人的速度,PyG 还提供了一组在各种论文中都有说明的 GNN 模型。因此,用 PyG 重做实验是非常方便的。由于 PyG 在速度和方便方面的优势,毫无疑问,它是最受欢迎和广泛使用的 GNN 库之一。

作者主要是用 PyTorch 和 PyG 做了图神经网络的实验,更多相关,请查阅原资料~

Example graph
Example graph
Example graph2
Example graph2

三、资源分享

同时为了方便大家,我们把最新 PDF 打包好了,可以直接下载 ——

Hands on Graph Neural Networks with PyTorch & PyTorch Geometric

TensorFlow 2.0 构建和部署端到端的图像分类器

2019 年 3 月 6 日,谷歌在 TensorFlow 开发者年度峰会上发布了最新版的 TensorFlow 框架 TensorFlow 2.0 。新版本对 TensorFlow 的使用方式进行了重大改进,使其更加灵活和更具人性化。具体的改变和新增内容可以从 TensorFlow 的官网找到,本文将介绍如何使用 TensorFlow 2.0 构建和部署端到端的图像分类器,以及新版本中的新增内容,包括:

  • 使用 TensorFlow Datasets 下载数据并进行预处理
  • 使用 Keras 高级 API 构建和训练图像分类器
  • 下载 InceptionV3 卷积神经网络并对其进行微调
  • 使用 TensorFlow Serving 为训练好的模型发布服务接口

本教程的所有源代码都已发布到 GitHub 库中,有需要的读者可下载使用。

GitHub地址项目 GitHub 地址

《深度学习入门之 PyTorch》教程

一、资源简介

深度学习入门之 PyTorch》深度学习如今已经成为科技领域最炙手可热的技术,在《深度学习入门之 PyTorch》中,我们将帮助你入门深度学习。《深度学习入门之 PyTorch》将从机器学习和深度学习的基础理论入手,从零开始学习 PyTorch ,了解 PyTorch 基础,以及如何用 PyTorch 框架搭建模型。通过阅读《深度学习入门之 PyTorch》,你将学到机器学习中的线性回归和 Logistic 回归、深度学习的优化方法、多层全连接神经网络、卷积神经网络、循环神经网络,以及生成对抗网络,最后通过实战了解深度学习前沿的研究成果,以及 PyTorch 在实际项目中的应用。《深度学习入门之PyTorch》将理论和代码相结合,帮助读者更好地入门深度学习,适合任何对深度学习感兴趣的人阅读。

作者简介

廖星宇,就读于中国科学技术大学应用数学系,获得国家一等奖学金。在个人博客、知乎等平台上发布多篇关于深度学习的文章,具有一定的阅读量和人气。

二、主要内容目录

PyTorch 是一个开源的 Python 机器学习库,基于 Torch , 应用于人工智能领域,如自然语言处理。 它最初由 Facebook 的人工智能研究团队开发, 并且被用于 Uber 的概率编程软件” Pyro “。

PyTorch 主要有两大特征:

  1. 如 NumPy 的张量计算,但使用 GPU 加速
  2. 基于带基自动微分系统的深度神经网络
  • 第 1 章 深度学习介绍 1
  • 第 2 章 深度学习框架 11
  • 第 3 章 多层全连接神经网络 24
  • 第 4 章 卷积神经网络 76
  • 第 5 章 循环神经网络 111
  • 第 6 章 生成对抗网络 144
  • 第 7 章 深度学习实战 173

四个实例

  • 实例一:猫狗大战:运用预训练卷积神经网络进行特征提取与预测 . 173
  • 实例二: Deep Dream :探索卷积神经网络眼中的世界 183
  • 实例三: Neural-Style :使用 PyTorch 进行风格迁移 196
  • 实例四:Seq2seq :通过 RNN 实现简单的 Neural Machine Translation . 205

机器学习科普大全

一、资源简介

机器学习作为人工智能领域里的一个重要部分,越来越多的人开始关注。但是大部分人对机器学习的了解不深入,不完整,甚至是存在一些误解。本文就是面向所有人的机器学习科普大全,涉及所有机器学习相关的关键知识点。

机器学习
机器学习

机器学习属于人工智能的范畴,所以我们需要先简单了解一下人工智能的 3 个关键要素:

数据;算法;算力

3 大要素
3 大要素

我们以制造桌子为例:木材就是数据,提供基础是素材;制造桌子的流水线就是一套算法,解决把木头变成桌子;工厂里的机器就是算力,机器越厉害,制造桌子的效率就越高,速度就越快。

二、主要内容目录

主要讲解的算法有:

  1. 线性回归
  2. 逻辑回归
  3. 线性判别分析
  4. 决策树
  5. 朴素贝叶斯
  6. K邻近算法
  7. 学习向量量化
  8. 支持向量机
  9. 随机森林
  10. Adaboost
  11. 限制玻尔兹曼机
  12. K均值聚类

三、资源分享

同时为了方便大家,我们把最新 PDF 已打包好,可以直接下载

机器学习科普大全

第二版《机器学习基础》发布

Foundations of Machine Learning

从 05 年到 19 年,Mehryar Mohri 在纽约大学已经教过 14 年的 Foundations of Machine Learning 课程。在 2012 年,他就完成了第一版的《机器学习基础》,这本书的数学氛围非常浓厚。2018 年 Mohri 等研究者又完成了第二版,现在第二版及其资料都已经开放下载。

书籍主页:https://cs.nyu.edu/~mohri/mlbook/

百度云下载地址:https://pan.baidu.com/s/194wEpl5fsyJHKE49uc92pg;提取码: xud2

机器学习基础》(Foundations of Machine Learning)是对机器学习的通用简介,可作为研究者的参考书和学生的教科书来使用。该书覆盖机器学习领域的基础现代话题,同时提供讨论和算法证明所需的理论基础与概念工具。这本书还介绍了算法应用的多个关键方面。

这本书旨在呈现最新的理论工具和概念,同时提供准确的证明。该书写作风格力求简洁,同时讨论了机器学习领域的一些关键复杂话题,以及多个开放性研究问题。一些经常与其他话题混合的话题以及没有得到足够关注的话题在本书中得到了单独讨论和重视,例如,这本书专门有一个章节讲多类别分类、排序和回归。

这本书覆盖了机器学习领域的大量重要话题,但作者也省略了个别话题,如图模型和流行的神经网络,这是出于简洁性的考虑,以及这些方法暂时缺少一些坚实的理论保证。

什么样的读者适合读

这本书针对的读者群体是机器学习、统计学及相关领域的学生和研究者。它可用作机器学习研究生和高年级本科生的教材,或者科研讨论会的参考书。

本书前三四章主要讲理论,为后续章节夯实理论基础。其他章各自独立,第 6 和 13 章除外,第六章介绍了和后面章节有关的一些概念,第 13 章和 第 12 章关联度很高。每一章的最后都有一系列练习题(附完整答案)。

本书希望读者熟悉、概率和算法分析。但是,为了进一步帮助到大家,这本书的扩展附录中还包括:对线性代数的概述、简介、概率论简介、对书中算法分析和讨论有用的一些集中不等式(Concentration inequality),以及简介。

第二版的小目标

Mehryar Mohri 等作者的目标是为多个主题和领域提供统一的内容框架,而不是其它书籍采用的专题展示。这些专题书籍只描述某个特殊的视角或主题,例如贝叶斯视角或核方法主题。这本书有比较强的理论基础,证明与分析也会着重强调,因此它相比很多书籍都有较大的差别。

在第二版中,作者们更新了整本书。其主要改变体现在很多章节的写作风格、新的图表可视化、简化的内容与推导过程、对现有章节的一些补充,特别是第 6 章与第 17 章等一些新的章节。此外,作者们新添了完整的章节「模型选择」(第四章),这是非常重要的一个主题,但以前只简要讨论过。

对于第二版的最后,作者在附录中添加了很多新内容,包括线性代数和概率论等数学基础,也包括了信息论等机器学习基础。另外,作者为新章节提供了很多练习题与解决方案,读者也可以做做习题。

补充资料

这本书提供了很多材料,其中大多数都是纽约大学 Mehryar Mohri 的课程机器学习基础(Foundations of Machine Learning)提供的。这门课已经开展了 14 年,这本书也是该课程的内容概述。Mehryar Mohri 表示,正因为该课程学生的一些好建议,第二版才能最终出版。

课程主页:https://cs.nyu.edu/~mohri/ml18/

该课程主页上有额外的家庭作业、课件和项目等资料,配合书籍使用效果更佳。

目录

1~4.3
1~4.3
4.4~7.2
4.4~7.2
7.3~10.3
7.3~10.3
10.4~12.9
10.4~12.9
12.1~16.1
12.1~16.1
16.2~17.6
16.2~17.6

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. 异或密码

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

开源 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 颇有几分相似之处,却更加轻量级,非常值得学习使用。

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

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

  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 明白,它不该使用连续色标,而是使用独立色标。