0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

新机器视觉 来源:机器之心 作者:机器之心 2022-11-18 14:47 次阅读

	

NumPy作为 Python 生态中最受欢迎的科学计算包,很多读者已经非常熟悉它了。

它为 Python 提供高效率的多维数组计算,并提供了一系列高等数学函数,我们可以快速搭建模型的整个计算流程。毫不负责任地说,NumPy 就是现代深度学习框架的「爸爸」。

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

项目地址: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 会理解这些资源或实现,并以一种更易读的方式写出来。 他表示,从 autograd repo 学到了很多,但二者的不同之处在于,他显式地进行了所有梯度计算,以突出概念/数学的清晰性。当然,这么做的缺点也很明显,在每次需要微分一个新函数时,你都要写出它的公式…… 估计 David Bourgin 在写完这个项目后,机器学习基础已经极其牢固了。项目总体介绍这个项目最大的特点是作者把机器学习模型都用 NumPy 手写了一遍,包括更显式的梯度计算和反向传播过程。可以说它就是一个机器学习框架了,只不过代码可读性会强很多。 David Bourgin 表示他一直在慢慢写或收集不同模型与模块的纯 NumPy 实现,它们跑起来可能没那么快,但是模型的具体过程一定足够直观。每当我们想了解模型 API 背后的实现,却又不想看复杂的框架代码,那么它可以作为快速的参考。 文章后面会具体介绍整个项目都有什么模型,这里先简要介绍它的整体结构。如下所示为项目文件,不同的文件夹即不同种类的代码集。 15ccbc5a-66f7-11ed-8abf-dac502259ad0.jpg  在每一个代码集下,作者都会提供不同实现的参考资料,例如模型的效果示例图、参考论文和参考链接等。如下所示,David 在实现神经网络层级的过程中,还提供了参考论文。 15e600c0-66f7-11ed-8abf-dac502259ad0.jpg  当然如此庞大的代码总会存在一些 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
  • Adam
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 数据结构
项目示例由于代码量庞大,这里整理了一些示例。 例如,实现点积注意力机制:1603bf84-66f7-11ed-8abf-dac502259ad0.png

								classDotProductAttention(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])ifself.scaleelse1 scores=Q@K.swapaxes(-2,-1)*scale#attentionscores weights=self.softmax.forward(scores)#attentionweights Y=weights@V returnY,weights def_bwd(self,dy,q,k,v,weights): d_k=k.shape[-1] scale=1/np.sqrt(d_k)ifself.scaleelse1 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 returndQ,dK,dV
									在以上代码中,Q、K、V 三个向量输入到「_fwd」函数中,用于计算每个向量的注意力分数,并通过 softmax 的方式得到权重。而「_bwd」函数则计算 V、注意力权重、注意力分数、Q 和 K 的梯度,用于更新网络权重。
									在一些实现中,作者也进行了测试,并给出了测试结果。如图为隐狄利克雷(Latent Dirichlet allocation,LDA)实现进行文本聚类的结果。左图为词语在特定主题中的分布热力图。右图则为文档在特定主题中的分布热力图。
									16214cd4-66f7-11ed-8abf-dac502259ad0.jpg图注:隐狄利克雷分布实现的效果。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4277

    浏览量

    62321
  • 机器学习
    +关注

    关注

    66

    文章

    8349

    浏览量

    132309
  • python
    +关注

    关注

    55

    文章

    4767

    浏览量

    84375

原文标题:​Numpy手写机器学习算法,3万行代码!

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    搓党分享:Air700E开发板+毫米雷达,搓个睡眠监测仪!

    ​只能说,看到这个大佬分享的睡眠监测仪,手上的手环瞬间不香了。。。 Air700E开发板+毫米雷达,个开箱即用的睡眠监测仪,不花冤枉钱!
    的头像 发表于 10-15 11:18 201次阅读
    <b class='flag-5'>手</b>搓党分享:<b class='flag-5'>用</b>Air700E开发板+毫米<b class='flag-5'>波</b>雷达,搓<b class='flag-5'>一</b>个睡眠监测仪!

    Air700E开发板+毫米雷达,搓了个睡眠监测仪

    Air700E开发板+毫米雷达,个开箱即用的睡眠监测仪,不花冤枉钱!
    的头像 发表于 10-05 14:43 208次阅读
    <b class='flag-5'>用</b>Air700E开发板+毫米<b class='flag-5'>波</b>雷达,<b class='flag-5'>手</b>搓了<b class='flag-5'>一</b>个睡眠监测仪

    为AI、ML和数字孪生模型建立可信数据

    在当今数据驱动的世界中,人工智能(AI)、机器学习(ML)和数字孪生技术正在深刻改变行业、流程和企业运营环境。每天产生的超过3.28亿TB数据已成为新“石油”——为下代数字系统提供所需的能源。
    的头像 发表于 09-30 10:23 233次阅读

    二只OPA548组成功率输出电路,二只管子的电流工作时一大一小,为什么?

    我有电路,二只OPA548组成功率输出电路,电流限在2.5A,电压峰峰值50V,现的问题是电路输出正弦正常,可二只管子的电流工作时一大一小(判断方法:从散片上摸
    发表于 08-30 06:38

    TINA如何搭建仿真模型

    使用TINA仿真单极运放的环路,仿真模型知道怎么搭建,现在要仿真由两级TL082搭建的两级运放的环路稳定性,请教,TINA如何搭建仿真模型,谢谢!
    发表于 08-15 08:10

    功率放大器在Lamb信号波包模型验证研究中的应用

    ​实验名称:窄带激励条件下的兰姆时域信号参数估计研究研究方向:Lamb测试目的:基于Lamb的二阶频散理论,提出了时域信号的波包模型,为全文奠定理论基础。
    的头像 发表于 08-08 11:35 751次阅读
    功率放大器在Lamb<b class='flag-5'>波</b>信号波包<b class='flag-5'>模型</b>验证研究中的应用

    OPA454没有放大波形输出是怎么回事?

    你好,我3.3V单片机输出PWM波形(也信号发生器模拟输入波形),接线图如上图,OPA454采用单电源供电,OPA454没有放大波形输出,示波器测量的信号比输入的信号还小,麻
    发表于 08-05 06:26

    如何训练个有效的eIQ基本分类模型

    在 MCX CPU和eIQ Neutron NPU上。 eIQPortal它是个直观的图形用户界面(GUI),简化了ML开发。开发人员可以创建、优化、调试和导出ML模型,以及导入数据
    的头像 发表于 08-01 09:29 1685次阅读
    如何训练<b class='flag-5'>一</b>个有效的eIQ基本分类<b class='flag-5'>模型</b>

    Achronix新推出款用于AI/ML计算或者大模型的B200芯片

    近日举办的GTC大会把人工智能/机器学习(AI/ML)领域中的算力比拼又带到了个新的高度,这不只是说明了通用图形处理器(GPGPU)时代的来临
    的头像 发表于 03-28 15:48 722次阅读
    Achronix新推出<b class='flag-5'>一</b>款用于AI/<b class='flag-5'>ML</b>计算或者大<b class='flag-5'>模型</b>的B200芯片

    请问下STM32G431CBT6的CANFD支持的最大波特率是多大呀?

    请问下STM32G431CBT6的CANFD支持的最大波特率是多大呀?
    发表于 03-14 07:14

    谷歌模型怎么PS打开文件和图片

    谷歌模型本身并不是Adobe Photoshop(简称PS)打开的文件和图片格式。谷歌模型通常是用于机器学习和深度学习的模型文件,如TensorFlow
    的头像 发表于 02-29 18:25 1334次阅读

    使用ml configurator进行tflite网络模型的转换不成功怎么解决?

    使用ml configurator进行tflite网络模型的转换不成功,提示错误,请帮忙协助谢谢 [ERROR] Failed to run QEMU
    发表于 01-31 06:56

    最佳开源模型刷新多项SOTA,首次超越Mixtral Instruct!「开源版GPT-4」家族迎来大爆发

    Mixtral 8x7B模型开源后,AI社区再次迎来一大波微调实践。来自Nous Research应用研究小组团队微调出新代大模型Nous-Hermes 2 Mixtral 8x7B
    的头像 发表于 01-30 15:29 879次阅读
    最佳开源<b class='flag-5'>模型</b>刷新多项SOTA,首次超越Mixtral Instruct!「开源版GPT-4」家族迎来大爆发

    基于NumPy的机器学习算法实现

    David Bourgin 表示他直在慢慢写或收集不同模型与模块的纯 NumPy 实现,它们跑起来可能没那么快,但是模型的具体过程定足够
    发表于 01-17 12:36 179次阅读
    基于<b class='flag-5'>NumPy</b>的机器学习算法实现

    端侧AI的“春风化雨”,翻开中国科技下

    MagicOS 8.0,双大模型的“春风化雨
    的头像 发表于 01-10 18:46 2037次阅读
    端侧AI的“春风化雨<b class='flag-5'>手</b>”,翻开中国科技下<b class='flag-5'>一</b>页