易烊千玺微博,武道至尊-地面旅行计划,迈开双脚发现新生活

机器之心报导

参加:思源、一鸣、张倩

用 NumPy 手写一切干流 ML 模型,普林斯顿博士后 David Bourgin 白士高最近开源了一个十分剽悍的项目。超越 3 万行代码、30 多个模型,这或许能打造「最强」的机器学习柱石?

NumPy 作为 Python 生态中最受欢田爱青迎的科学核算包,许多读者现已十分了解它了。它为 Python 供给高效率的多维数组核算,并供给了一系列高等数学函数,咱们能够快速建立模型的整个核算流程。毫不负责任地说,NumPy 便是现代深度学习结构的「爸爸」。

虽然现在运用 NumPy写模型现已不是干流mr达,但这种办法仍然不失为是了解底层架构和深度学习原理的好办法。最近,来自普林斯顿的一位博士后将 NumPy 完成的一切机器学习模型悉数开源,并供给了相应的论文和一些完成的测验作用。

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

依据机器之心的大略估量,该项目大约有 30 个首要机器学习模型,此外还有 15 个用于预处理和核算的小东西,悉数.py 文件数量有 62 个之多。均匀每个模型的代码行数在 500 行以上,在神经网络模型的 layer.py 文件中,代码行数挨近 4000。

这,应该是现在用 NumPy 手写机器学习模型的「最高境地」吧。

谁用 NumPy 手推了一大波 ML 模型

经过项目的代码目录,咱们能发现,作者根本上把干流模型都完成了一遍,这个工作量几乎惊为天人。咱们发现作者 David Bourgin 也是一位大神,他于 2018 年取得加州大学伯克利分校核算认知科学博士学位,随后在普林斯顿大学从事博士后研讨。

虽然结业不久,Dav易烊千玺微博,武道至尊-地上游览方案,迈开双脚发现新生活id 在尖端彩云在腾跃期刊与核算机会议上都宣布了一些优秀论文。在最近完毕的 ICML 2019 中,其关于认知模型先验的研讨就被接纳为罕见的 Oral 论文。

David Bourgin 小哥哥便是用 NumPy 手写 ML 模型、手推反向传达的大神bareback。这么多的工作量,当然仍是需求许多参阅资源的,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 和 c塑料王国ausality)

4.2 模块

  • 双向 LSTM
  • ResNet 风格的残差块(恒等改换和卷积)
  • WaveNet 风格的残差块(带有扩张因果卷积)
  • Transformer 风格的多头缩放点积注意力

4.3 正则化项

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

4.4 优化器

  • SGD w/ 动量
  • AdaGrad
  • RMSProp
  • Adam

4.5 学习率调度器

  • 常数
  • 指数
  • Noam/Transformer
  • Dl易烊千玺微博,武道至尊-地上游览方案,迈开双脚发现新生活ib 调度器

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 (MASao8080TLAB 端口)
  • im镇魂街之鬼门关看护灵2col (MAT刀神天后LA啊啊用力B 端口)
  • conv1D
  • conv2D
  • deconv2D
  • minibatch

5. 根据树的模型

  • 决策树 天途易居(CART)
  • [Bagging] 随机森林
  • [Boosting] 梯度提高决策树

6. 线性模型

  • 岭回归
  • Logistic 回归
  • 最小二乘法
  • 贝叶斯线性回归 w/共轭先验

7.n 元序列模型

  • 最大似然得分
  • Additive/Lyl恩恩idstone 滑润
  • 简略 Good-Turing 滑润

8. 强化学习模型

  • 运用穿插熵办法的智能体
  • 初次拜访 on-policy界皇txt全集下载 蒙特卡罗智能体
  • 加权增量重要采样蒙特卡罗智能体
  • Expected SARSA 智能体
  • TD-0 Q-learning 智能体
  • Dyna-Q / Dyna-Q+ 优先扫描

9. 非参数模型

  • Nadaraya-Watson 核回归
  • k 最近邻分类与回归

10. 预处理

  • 离散傅立叶改换 (1D 信号)
  • 双线性插值 (2D 信号)
  • 最近邻插值 (1D 和 2D 信号)
  • 自相关 (1D 信号)
  • 信号窗口
  • 文本分词
  • 特征哈希
  • 特征规范化
  • One-hot 编码/解码
  • Huffman 编码/解码
  • 词频逆文档频率编码

11. 东西

  • 类似度核
  • 间隔衡量
  • 优先级队56kuku列
  • Ball tree 数据结构

项目示例

因为代码量巨大,机器之心在这儿整理了一些示例。

例如,完成点积注意力机制:

class DotProductAttention(LayerBase):
def __init__(self, scale=True, dropout_p=0, init="glorot_uniform", optimizer=None):
super().__init__(optimizer)
self.init = init
self.scale = scale
self.dropout_p = dropout_p
self.optimizer = self.optimizer
self._init_params()
def _fwd(self, Q, K, V):
scale = 1 / np.sqrt(Q.shape[-1]) if self.scale else 1
scores = Q @ K.swapaxes(-2, -1) * scale # attention scores
weights = self.softmax.forward(scores) # attention weights
Y = weights @ V
return Y, weights
def _bwd(self, dy, q, k, v, weights):
d_k = k.shape[-档案1974南海风云1]
scale = 1 / np.sqrt(d_k) if self.scale else 1
dV = weights.swapaxes(-2, -1) @ dy
dWeights = dy @ v.swapaxes(-2, -1)
dScores = self.softmax.backward(dWeights)
dQ = dScores @ k * scale
dK = dScores.swapaxes(-2, -1) @ q * scale
return dQ, dK, 易烊千玺微博,武道至尊-地上游览方案,迈开双脚发现新生活dV

在以上代码中,Q、K、V 三个向量输入到「_fwd」函数中,用于核算每个向量的注意力分数,并经过 softm易烊千玺微博,武道至尊-地上游览方案,迈开双脚发现新生活ax 的办法得到权重。而「_bwd」函数则核算 V、注意力权重、注意力分数、Q 和 K 的梯度,用于更新网络权重。

在一些完成中,作者也进行了测验,并给出了测验成果。如图为隐狄利克雷(Latent Dirichlet allocation,LDA)完成进行文本聚类的成果。左图为词语在特定主题中的散布热力求。右图则为文档在特定主题中的散布热力求。

图注:隐狄利克雷散布完成的作用。

点击展开全文

上一篇:

下一篇:

相关推荐