如何让团队开始使用ML以及如何最好地将ML与我们运行的现有系统集成?

实际上没有用Java构建的ML框架(有DL4J,但我真的不知道有谁使用它,MXNet有一个Scala API而不是Java,而且它不是用Java编写的,Tensorflow有一个不完整的Java API),但是Java在企业中拥有巨大的使用范围,在过去的20年中,在全球范围内投资了数万亿美元的金融服务,交易,电子商务和电信公司 - 这个名单是无穷无尽的。对于机器学习,“第一个公民”编程语言不是Java,而是Python。

就个人而言,我喜欢用Python和Java编写代码,但Frank Greco提出了一个让我思考的有趣问题:

Java还需要什么才可在ML中与Python竞争?如果Java认真对待真正支持机器学习怎么办?

很重要么?

自1998年以来,就多个企业的变革而言,Java一直处于领先地位 - 网络,移动,浏览器与原生,消息传递,i18n和l10n全球化支持,扩展和支持各种企业信息存储值得一提的是,从关系数据库到Elasticsearch。

机器学习行业并非如此。Java团队如果进入ML只能有两个选择:

  1. 在Python中重新训练/共同训练。
  2. 使用供应商API为您的企业系统添加机器学习功能。

这两种选择都不是真的很好。第一个需要大量的前期时间和投资加上持续的维护成本,而第二个风险是供应商锁定,供应商解除支持,引入第三方组件(需要支付网络价格),这可能是一个性能关键系统,并且需要您可以在组织边界之外共享数据 - 对某些人来说是不行的。

在我看来,最具破坏性的是文化消耗的可能性 - 团队无法改变他们不理解或无法维护的代码,Java团队有可能在企业计算的下一波浪潮机器学习浪潮中落后 。

因此,Java编程语言和平台拥有一流的机器学习支持是非常重要,如果没有,Java将面临被未来5到10年内支持ML的语言慢慢取代的风险。

为什么Python在ML中占据主导地位?

首先,让我们考虑为什么Python是机器学习和深度学习的主要语言。

我怀疑这一切都始于一个功能 - 列表的切片slicing支持。这种支持是可扩展的:任何实现__getitem__和__setitem__方法的Python类都可以使用这种语法进行切片。下面的代码段显示了这个Python功能的强大和自然性。

a = [1, 2, 3, 4, 5, 6, 7, 8]
print(a[1:4])
#returns [2, 3, 4] - -挑选出中间元素的切片print(a[1:-1])
#returns [2, 3, 4, 5, 6, 7] - 跳过第0和最后一个元素print(a[4:])
#returns [5, 6, 7, 8] - 终点默认print(a[:4])
#returns [1, 2, 3, 4] -开始点被默认
复制代码

当然,还有更多。与旧的Java代码相比,Python代码更简洁,更简洁。支持未经检查的异常,开发人员可以轻松地编写一次性Python脚本来尝试填充,而不会陷入“一切都是一个类”的Java思维模式中。使用Python很容易。

但是现在我认为是主要因素 - 尽管Python社区在维持2.7和3之间的凝聚力方面做了一顿狗晚餐,但他们在构建设计良好,快速的数字计算库(NumPy)方面做得更好  。Numpy是围绕ndarray构建的  - N维数组对象。直接来自文档:“ NumPy的主要对象是同构多维数组。它是一个元素表(通常是数字),所有相同的类型,由正整数元组索引 “。

NumPy中的所有内容都是将数据放入ndarray然后对其执行操作。NumPy支持多种类型的索引,广播,矢量化以提高速度,并且通常允许开发人员轻松创建和操作大型数字数组。

下一个片段显示了ndarray 索引和正在进行的广播,这些是ML / DL中的核心操作。

import numpy as np#Simple broadcast example
a = np.array([1.0, 2.0, 3.0])
b = 2.0
c = a * b
print(c)
#returns [ 2.  4.  6.] - the scalar b is automatically promoted / broadcast and applied to the vector a to create c
#return返回[2. 4. 6.] - 标量b被自动提升/广播并应用于向量a以创建c#2-d (matrix with rank 2) indexing in NumPy - this extends to Tensors - i.e. rank > 2
y = np.arange(35).reshape(5,7)
print(y)
# array([[ 0,  1,  2,  3,  4,  5,  6],
#        [ 7,  8,  9, 10, 11, 12, 13],
#        [14, 15, 16, 17, 18, 19, 20],
#        [21, 22, 23, 24, 25, 26, 27],
#        [28, 29, 30, 31, 32, 33, 34]])
print(y[0,0])
# 单个单元格访问 - notation is row-major, returns 0
print(y[4,])
# returns all of row 4: array([28, 29, 30, 31, 32, 33, 34])
print(y[:,2])
# returns all of column 2: array([ 2,  9, 16, 23, 30])
复制代码

处理大型多维数字数组是机器学习编码的核心,尤其是深度学习。深度神经网络是节点格和边格的数字模型。在训练网络或对其进行推理时的运行时操作需要快速矩阵乘法。

NumPy已经促成并启用了更多 -  scipy,pandas和许多其他依赖于NumPy的库。领先的深度学习库(Tensorflow来自谷歌,PyTorch来自Facebook)都投入巨资在Python。Tensorflow还有其他用于Go,Java和JavaScript的API,但它们不完整且被视为不稳定。PyTorch最初是用Lua编写的,当它们从2017年相当小的语言转移到主要的Python ML生态系统时,它的受欢迎程度大幅上升。

Python的缺点

Python不是一种完美的语言 - 特别是最流行的Python运行时 - CPython - 具有全局解释器锁(GIL),因此性能缩放并不简单。此外,像PyTorch和Tensorflow这样的Python DL框架仍然将核心方法交给不透明的实现。例如,NVidia 的cuDNN库对PyTorch中[url=https://pytorch.org/docs/stable/nn.html#rnn]RNN / LSTM实现[/url]的范围产生了深远的影响。RNN和LSTM是一种非常重要的DL技术,特别适用于商业应用,因为它们专门用于对顺序,可变长度序列进行分类和预测 - 例如网络点击流,文本片段,用户事件等。

为了公平对待Python,这种不透明度/限制几乎适用于任何未用C或C ++编写的ML / DL框架。为什么?因为为了获得核心的最大性能,像矩阵乘法这样的高频操作,开发人员尽可能“接近底层冶金工艺”。

Java需要做些什么才能参与竞争?

我建议Java平台有三个主要的补充,如果存在的话,会促使Java中一个健康且蓬勃发展的机器学习生态系统的萌芽:

1.在核心语言中添加本机索引/切片支持,以与Python的易用性和表现力相媲美,可能以现有的有序集合List 接口为中心。这种支持还需要承认重载以支持#2点。

2.构建Tensor实现 - 可能在java.math包中,但也可以桥接到Collections API。这组类和接口将作为ndarray的等价物,并提供额外的索引支持 - 特别是三种类型的NumPy索引:字段访问,基本切片和编码ML所必需的高级索引。

3.支持广播 - 任意(但兼容)维度的标量和张量。

如果在核心Java语言和运行时中存在这三件事,它将开辟构建“ NumJava ” 的道路,相当于NumPy。巴拿马项目还可以用于提供对CPU,GPU,TPU等运行的快速张量操作的矢量化低级访问,以帮助Java ML成为最快的。

我并不是说这些补充是微不足道的 - 远非如此,但Java平台的潜在优势是巨大的。

下面的代码片段展示了我们的NumPy广播和索引示例如何在NumJava中使用Tensor类,核心语言支持切片语法,并尊重当前对运算符重载的限制。

//Java广播的张量
//使用Java 10中的var语法进行简洁性
// Java不支持运算符重载,所以我们不能做“a * b”
//我们应该将其添加到需求列表中吗?
var a = new Tensor([1.0, 2.0, 3.0]);
var b = 2.0;
var c = a.mult(b);/*** And a snippet showing how the Java Tensor class could look.*显示Java Tensor类的外观的片段。*/import static java.math.Numeric.arange;//arange returns a tensor instance and reshape is defined on tensor
var y = arange(35).reshape(5,7);
System.out.println(y);
// tensor([[ 0,  1,  2,  3,  4,  5,  6],
//        [ 7,  8,  9, 10, 11, 12, 13],
//        [14, 15, 16, 17, 18, 19, 20],
//        [21, 22, 23, 24, 25, 26, 27],
//        [28, 29, 30, 31, 32, 33, 34]])
System.out.println(y[0,0]);
// single cell access - notation is row-major, returns 0
System.out.println(y[4,]);
// returns all of row 4 (5th row starting from 0 idx): tensor([28, 29, 30, 31, 32, 33, 34])
System.out.println(y[:,2]);
// returns all of column 2 (3rd col starting from 0 idx): tensor([ 2,  9, 16, 23, 30])
复制代码

总结

从本文中概述的实用起点开始,我们可以拥有用Java编写并在JRE上运行的尽可能多的机器/深度学习框架,因为我们有Web,持久性或XML解析器 - 想象一下!我们可以设想Java框架支持卷积神经网络(CNN)用于前沿计算机视觉,像LSTM这样的循环神经网络实现对于顺序数据集(对业务至关重要),具有尖端的ML功能,如自动差异化等。然后,这些框架将为下一代企业级系统提供动力并为其提供动力 - 所有这些系统都使用相同的工具 - IDE,测试框架和持续集成。

欢迎大家加入粉丝群:963944895,群内免费分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服务、Dubbo框架、Redis缓存、RabbitMq消息、JVM调优、Tomcat容器、MySQL数据库教学视频及架构学习思维导图

写在最后:

既然看到这里了,觉得笔者写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!

转载于:https://juejin.im/post/5c35962b6fb9a049ae0814d2

Java还欠缺什么才能真正支持机器/深度学习?相关推荐

  1. ECG ×AI: 机器/深度学习的ECG应用入门(3)

    QRS心拍定位: 解决识别对象问题 1.引言 上一节我们解决了数据来源问题,成功将ECG数据读入了Matlab中.而我们现在还不能马上使用高大上的机器/深度学习算法,原因在于一个问题:在这个问题中,对 ...

  2. 机器/深度学习Milvus、Annoy、Vearch、sk-dist介绍

    以下为你介绍的机器学习/深度学习软件都可用在Linux系统上:Milvus(向量搜索引擎).Annoy(求近似最近邻的库).Vearch(分布式向量搜索系统).sk-dist(PySpark中的分布式 ...

  3. 送你一份机器/深度学习自学指南(附视频amp;速成方案)

    本文经AI新媒体量子位(公众号ID:qbitai )授权转载,转载请联系出处. 本文约3052字,建议阅读6分钟. 本文详细讲解了机器/深度学习的学习方法,一共为分三个部分,做出了详细的指南. 怎么入 ...

  4. 深度学习如何入门?怎么入门机器/深度学习?

    链接:https://www.zhihu.com/question/26006703/answer/536169538 怎么入门机器/深度学习? 回答这个问题,最先要考虑的问题是:你有多少时间? 准备 ...

  5. 纯新手入门机器/深度学习自学指南(附一个月速成方案)

    原作:Masum Hasan 问耕 编译整理 量子位 出品 | 公众号 QbitAI 怎么入门机器/深度学习? 回答这个问题,最先要考虑的问题是:你有多少时间? 准备用三个月入门,和想要一个月速成,肯 ...

  6. ECG ×AI: 机器/深度学习的ECG应用入门(4)

    传统机器学习:特征工程+分类器 1.引言 经过前面的工作,我们已经解决了数据来源和识别对象问题.那么接下来,我们就要进行机器/深度学习算法的应用了.由于本人写这些博文的目的不在于讲解机器/深度学习理论 ...

  7. 2021 年了,机器/深度学习还有哪些坑比较好挖?

    作者丨张趔趄.微调.金雪锋 来源丨知乎问答 编辑丨极市平台 导读 深度学习以及机器学习发展至今,涌入了大量的人才和资源,有很多方向已经达到了一个瓶颈,短时间内有非常大的突破有些难以实现.那么对于有学术 ...

  8. ECG ×AI: 机器/深度学习的ECG应用入门(1)

    前言 你好,我是研究ECG算法的搬砖工Winham.目前搞这个方向已经挺长时间了,总想着把自己的一些入门经验分享一下,却不知道从何下手.说实话,关于ECG算法的研究相对冷门一些,网络上系统的资料也比较 ...

  9. [面经整理] 机器/深度学习补充篇

    文章目录 ~~~~~~~~传统图像处理~~~~~~~~ 介绍canny边缘检测算法 1. 图像降噪 简单易懂的高斯滤波 2. 计算图像梯度 图像梯度的基本原理 sobel算子 3.非极大值抑制NMS ...

最新文章

  1. php 进程函数,php多进程函数
  2. web服务器文件管理,web文件管理服务器
  3. propertyeditor java_PropertyEditor使用
  4. ASP.NET Core和Angular 2双剑合璧
  5. OpenCV图像识别初探-50行代码教机器玩2D游戏
  6. 杭电 1060 Leftmost Digit
  7. python编程-Python 编程速成(推荐)
  8. NUMA与英特尔下一代Xeon处理器学习心得(5)
  9. 适合android手机 pdf阅读器,手机版pdf阅读器有哪些 这五款软件一定有适合你的
  10. 2799元即可畅享12GB+256GB超大存储,荣耀60 SE新版本正式发布
  11. 如何把小米手机上的便签导出为文本?
  12. Win10专业版如何安装Docker
  13. 实战pixi+gsap,仿刹车动画
  14. 基于人工神经网络的MATLAB手写数字识别系统
  15. 【天地图】使用天地图api绘制GeoJson数据
  16. 前后端分离微服务管理系统项目实战SaaS-HRM项目(二)——数据库设计与前端框架
  17. 通过cmd调用网易云音乐
  18. matlab可以拟合分段函数吗,如何用matlab拟合出分段函数
  19. git将本地文件推到远程仓库
  20. 如何根据某一列数据合并多个excel为

热门文章

  1. 商汤科技发布迄今最大人脸检测数据集,绝杀Deepfake!
  2. mysql dml ddldcl权限_MySQL中的DML、DDL、DCL到底是什么呢?
  3. 不能摸鱼的工作不是好工作?
  4. 人脸识别的未来:对智慧城市有何影响
  5. 科学家研发出“读心术”,直接将脑电波翻译成文本,错误率低至 3%
  6. Batch Normalization——加速深度神经网络收敛利器
  7. 华为聚焦AI基础平台,加速行业智能化落地
  8. 机器学习-贝叶斯分类器
  9. Transformer与BERT浅说
  10. SAP MM A工厂下的PR可以转成B工厂下的PO?