用 NumPy 手写所有主流 ML 模型,普林斯顿博士后 David Bourgin 最近开源了一个非常剽悍的项目。超过 3 万行代码、30 多个模型,这也许能打造「最强」的机器学习基石?(编辑:机器之心)

项目简介

NumPy 作为 Python 生态中最受欢迎的科学计算包,很多读者已经非常熟悉它了。它为 Python 提供高效率的多维数组计算,并提供了一系列高等数学函数,我们可以快速搭建模型的整个计算流程。毫不负责任地说,NumPy 就是现代深度学习框架的「爸爸」。

尽管目前使用  写模型已经不是主流,但这种方式依然不失为是理解底层架构和深度学习原理的好方法。最近,来自普林斯顿的一位博士后将 NumPy 实现的所有机器学习模型全部开源,并提供了相应的论文和一些实现的测试效果。

  • 项目地址:https://github.com/ddbourgin/numpy-ml

根据机器之心的粗略估计,该项目大约有 30 个主要机器学习模型,此外还有 15 个用于预处理和计算的小工具,全部.py 文件数量有 62 个之多。平均每个模型的代码行数在 500 行以上,在神经网络模型的 layer.py 文件中,代码行数接近 4000。
这,应该是目前用 NumPy 手写机器学习模型的「最高境界」吧。
谁用 NumPy 手推了一大波 ML 模型
通过项目的代码目录,我们能发现,作者基本上把主流模型都实现了一遍,这个工作量简直惊为天人。我们发现作者 David Bourgin 也是一位大神,他于 2018 年获得加州大学伯克利分校计算认知科学博士学位,随后在普林斯顿大学从事博士后研究。
尽管毕业不久,David 在顶级期刊与计算机会议上都发表了一些优秀论文。在最近结束的 ICML 2019 中,其关于认知模型先验的研究就被接收为少有的 Oral 论文。
David Bourgin 小哥哥就是用 NumPy 手写 ML 模型、手推反向传播的大神。这么多的工作量,当然还是需要很多参考资源的,David 会理解这些资源或实现,并以一种更易读的方式写出来。
正如 reddit 读者所质疑的:在 autograd repo 中已经有很多这样的例子,为什么你还要做这个项目?
作者表示,他的确从 autograd repo 学到了很多,但二者的不同之处在于,他显式地进行了所有梯度计算,以突出概念/数学的清晰性。当然,这么做的缺点也很明显,在每次需要微分一个新函数时,你都要写出它的公式……
估计 David Bourgin 小哥哥在写完这个项目后,机器学习基础已经极其牢固了。最后,David 表示下一步会添加文档和示例,以方便大家使用。
项目总体介绍
这个项目最大的特点是作者把机器学习模型都用 NumPy 手写了一遍,包括更显式的梯度计算和反向传播过程。可以说它就是一个机器学习框架了,只不过代码可读性会强很多。
David Bourgin 表示他一直在慢慢写或收集不同模型与模块的纯 NumPy 实现,它们跑起来可能没那么快,但是模型的具体过程一定足够直观。每当我们想了解模型 API 背后的实现,却又不想看复杂的框架代码,那么它可以作为快速的参考。
文章后面会具体介绍整个项目都有什么模型,这里先简要介绍它的整体结构。如下所示为项目文件,不同的文件夹即不同种类的代码集。

在每一个代码集下,作者都会提供不同实现的参考资料,例如模型的效果示例图、参考论文和参考链接等。如下所示,David 在实现神经网络层级的过程中,还提供了参考论文。

当然如此庞大的代码总会存在一些 Bug,作者也非常希望我们能一起完善这些实现。如果我们以前用纯 NumPy 实现过某些好玩的模型,那也可以直接提交 PR 请求。因为实现基本上都只依赖于 NumPy,那么环境配置就简单很多了,大家差不多都能跑得动。

主要内容

手写 NumPy 全家福
作者在 GitHub 中提供了模型/模块的实现列表,列表结构基本就是代码文件的结构了。整体上,模型主要分为两部分,即传统机器学习模型与主流的深度学习模型。
其中浅层模型既有隐马尔可夫模型和提升方法这样的复杂模型,也包含了线性回归或最近邻等经典方法。而深度模型则主要从各种模块、层级、、最优化器等角度搭建代码架构,从而能快速构建各种神经网络。
除了模型外,整个项目还有一些辅助模块,包括一堆预处理相关的组件和有用的小工具。
该 repo 的模型或代码结构如下所示:
1. 高斯混合模型

  • EM 训练

2. 隐马尔可夫模型

  • 维特比解码

  • 似然计算

  • 通过 Baum-Welch/forward-backward 算法进行 MLE 参数估计

3. 隐狄利克雷分配模型(主题模型)

  • 用变分 EM 进行 MLE 参数估计的标准模型

  • 用 MCMC 进行 MAP 参数估计的平滑模型

4. 神经网络
4.1 层/层级运算

  • Add

  • Flatten

  • Multiply

  • Softmax

  • 全连接/Dense

  • 稀疏进化连接

  • LSTM

  • Elman 风格的 RNN

  • 最大+平均池化

  • 点积注意力

  • 受限玻尔兹曼机 (w. CD-n training)

  • 2D 转置卷积 (w. padding 和 stride)

  • 2D 卷积 (w. padding、dilation 和 stride)

  • 1D 卷积 (w. padding、dilation、stride 和 causality)

4.2 模块

  • 双向 LSTM

  • ResNet 风格的残差块(恒等变换和卷积)

  • WaveNet 风格的残差块(带有扩张因果卷积)

  • Transformer 风格的多头缩放点积注意力

4.3 正则化项

  • Dropout

  • 归一化

  • 批归一化(时间上和空间上)

  • 层归一化(时间上和空间上)

4.4 优化器

  • SGD w/ 动量

  • AdaGrad

  • RMSProp

4.5 学习率调度器

  • 常数

  • 指数

  • Noam/Transformer

  • Dlib 调度器

4.6 权重初始化器

  • Glorot/Xavier uniform 和 normal

  • He/Kaiming uniform 和 normal

  • 标准和截断正态分布初始化

4.7 损失

  • 交叉熵

  • 平方差

  • Bernoulli VAE 损失

  • 带有梯度惩罚的 Wasserstein 损失

4.8 激活函数

  • ReLU

  • Tanh

  • Affine

  • Sigmoid

  • Leaky ReLU

4.9 模型

  • Bernoulli 变分自编码器

  • 带有梯度惩罚的 Wasserstein GAN

4.10 神经网络工具

  • col2im (MATLAB 端口)

  • im2col (MATLAB 端口)

  • conv1D

  • conv2D

  • deconv2D

  • minibatch

5. 基于树的模型

  • 决策树 (CART)

  • [Bagging] 随机森林

  • [Boosting] 梯度提升决策树

6. 线性模型

  • 岭回归

  • Logistic 回归

  • 最小二乘法

  • 贝叶斯线性回归 w/共轭先验

7.n 元序列模型

  • 最大似然得分

  • Additive/Lidstone 平滑

  • 简单 Good-Turing 平滑

8. 强化学习模型

  • 使用交叉熵方法的智能体

  • 首次访问 on-policy 蒙特卡罗智能体

  • 加权增量重要采样蒙特卡罗智能体

  • Expected SARSA 智能体

  • TD-0 Q-learning 智能体

  • Dyna-Q / Dyna-Q+ 优先扫描

9. 非参数模型

  • Nadaraya-Watson 核回归

  • k 最近邻分类与回归

10. 预处理

  • 离散傅立叶变换 (1D 信号)

  • 双线性插值 (2D 信号)

  • 最近邻插值 (1D 和 2D 信号)

  • 自相关 (1D 信号)

  • 信号窗口

  • 文本分词

  • 特征哈希

  • 特征标准化

  • One-hot 编码/解码

  • Huffman 编码/解码

  • 词频逆文档频率编码

11. 工具

  • 相似度核

  • 距离度量

  • 优先级队列

  • Ball tree 数据结构

项目示例
由于代码量庞大,机器之心在这里整理了一些示例。

例如,实现点积注意力机制:

class DotProductAttention(LayerBase):def __init__(self, scale=True, dropout_p=0, init="glorot_uniform", optimizer=None):super().__init__(optimizer)self.init = initself.scale = scaleself.dropout_p = dropout_pself.optimizer = self.optimizerself._init_params()def _fwd(self, Q, K, V):scale = 1 / np.sqrt(Q.shape[-1]) if self.scale else 1scores = Q @ K.swapaxes(-2, -1) * scale  # attention scoresweights = self.softmax.forward(scores)  # attention weightsY = weights @ Vreturn Y, weightsdef _bwd(self, dy, q, k, v, weights):d_k = k.shape[-1]scale = 1 / np.sqrt(d_k) if self.scale else 1dV = weights.swapaxes(-2, -1) @ dydWeights = dy @ v.swapaxes(-2, -1)dScores = self.softmax.backward(dWeights)dQ = dScores @ k * scaledK = dScores.swapaxes(-2, -1) @ q * scalereturn dQ, dK, dV

在以上代码中,Q、K、V 三个向量输入到「_fwd」函数中,用于计算每个向量的注意力分数,并通过 softmax 的方式得到权重。而「_bwd」函数则计算 V、注意力权重、注意力分数、Q 和 K 的梯度,用于更新网络权重。

在一些实现中,作者也进行了测试,并给出了测试结果。如图为隐狄利克雷(Latent Dirichlet allocation,LDA)实现进行文本聚类的结果。左图为词语在特定主题中的分布热力图。右图则为文档在特定主题中的分布热力图。
_图注:_隐狄利克雷分布实现的效果。

打包下载

如果访问Github困难的朋友,可以用百度云下载。

下载方式:

1.百度云下载:

链接:https://pan.baidu.com/s/1zM09GiI7eP87p6wExYUAaA

提取码:t666

2.(备选)关注公众号,回复“numpy-ml”可以获取下载地址。

Github标星10.4k:用 NumPy 实现所有主流机器学习模型相关推荐

  1. Github标星86.4K+:常见数据结构与算法的Python实现

    有人问我数据结构与算法怎么学? 免费的我推荐严蔚敏老师的数据结构课程,网上可以查到,当年考博士时候学的就是这个. 收费的我推荐王争老师的<数据结构与算法之美>,内容挺全面,学了应该对算法有 ...

  2. GitHub标星10.8K!快速搭建私人网盘

    来自:开源最前线(ID:OpenSourceTop) 链接:https://blog.eduonix.com/software-development/top-10-ides-c-c-develope ...

  3. 【CV】给AI一张高清照片,分分钟还你细节满满的3D人体模型,GitHub标星4.4k | 在线可玩...

    继上次分享的中科院博士用一张"静态图"就能实现人脸3D建模新研究,又一重要力作. 手动对人体进行3D建模并非易事. 但现在,只给AI一张高清照片,它还真就能分分钟搞定这件事. 甚至 ...

  4. 【机器学习】GitHub 标星17.4K:机器学习 100 天!

    Github热门项目:100-Days-Of-ML-Code 中文版地址: https://github.com/MLEveryday/100-Days-Of-ML-Code 英文版地址: https ...

  5. 【经典干货】GitHub标星10万+,史上最强Google面试指南!

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 一位从1997年就入行的Web工程师,立志要成为Google软件工程师,3年前写下 ...

  6. GitHub标星10,000+,Apache项目ShardingSphere的开源之路

    [编者按]几天前,当 GitHub 全球产品技术生态总经理 Michael Francisco 谈到中国开发者已经成为 GitHub 上最活跃的群体时,有开发者提出数量之后质量也要跟上.的确,过去十数 ...

  7. GitHub 标星 10,000+,Apache 顶级项目 ShardingSphere 的开源之路

    [CSDN 编者按]几天前,当 GitHub 全球产品技术生态总经理 Michael Francisco 谈到中国开发者已经成为 GitHub 上最活跃的群体时,有开发者提出数量之后质量也要跟上.的确 ...

  8. Github标星5.4k+:常见NLP模型的代码实现(基于TensorFlow和PyTorch)

    推荐github上的一个NLP代码教程:nlp-tutorial,教程中包含常见的NLP模型代码实现(基于TensorFlow和Pytorch),而且教程中的大多数NLP模型都使用少于100行代码. ...

  9. (github标星9200+)《南瓜书》:周志华《机器学习》的代码实现

    有个非盈利的开源学习组织Datawhale开源了一个github仓库:"南瓜书(PumpkinBook)",对<机器学习>(西瓜书)里比较难理解的公式加以解析,以及对部 ...

最新文章

  1. vba编程教程视频教程_我已经完成了编程教程。 怎么办?
  2. 8张图带你深入理解Java
  3. 乐Phone:还原联想的联想
  4. mysql别名的使用
  5. ASP.NET Core 6.0对热重载的支持
  6. .net core redis的全套操作
  7. java8默认内存收集器_使用正确的垃圾收集器将Java内存使用量降至最低
  8. Win11系统自动暂停更新后想继续怎么办 Win11系统重新启动更新教程
  9. php2个数字拼接,PHP合并2个数字键数组值示例详解
  10. Ubuntu 安装 chrome
  11. linux遍历目录漏洞,Mutiny 多个目录遍历漏洞(CVE-2013-0136)
  12. 外星人做系统logo_深圳福田外星人笔记本电脑维修服网点
  13. POJ1053 Set Me
  14. 企业报表系统搭建很难?其实选对工具就成功了一半
  15. 微软和美国航空航天局(NASA)强强联手,推出Python免费课程
  16. 排期计划需要写哪些字段
  17. 美国ZIP Code 一览表
  18. eclipse 3.7 中英文自由切换
  19. java开发报错怎么处理_Java开发中常见报错及解决办法
  20. 基于java中国象棋游戏

热门文章

  1. POJ 2492 A Bug's Life 带权并查集
  2. 设备管理学习之概念篇
  3. 设置宿舍路由器为多账号登录的方法
  4. 基于卷积神经网络的匹配代价算法
  5. IntellIJ IDEA 启动 参数 配置
  6. pl/sql里的exists和in的差别
  7. 多项式相乘快速算法原理及相应C代码实现
  8. SQL Server 2000+ADO.NET实现并发控制
  9. uibot和按键精灵区别_uibot和按键精灵哪个强大
  10. VSCode 更新后打不开之解决办法