找回密码
 立即注册
查看: 571|回复: 5

为什么Python成了开发AI的主流语言?Java系列、Ruby等编程语言不行吗?

[复制链接]

1

主题

0

回帖

6

积分

新手上路

积分
6
发表于 2023-6-2 16:11:28 | 显示全部楼层 |阅读模式
为什么Python成了开发AI的主流语言?Java系列、Ruby等编程语言不行吗?
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2023-6-2 16:11:51 | 显示全部楼层
任何东西成为主流的前提就是「门槛低」。
只有门槛足够的低,才会吸引足够多的人加入,从而形成聚集效应。
比如我们拿一个代码来举例(prime number是质数的意思,质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。比如1,3,5,7,11,13等)
test_number = 407  # our example is not a prime number
# prime numbers are greater than 1
if test_number > 1:
    # check for factors
    number_list = range(2, test_number)
    for number in number_list:
        number_of_parts = test_number / number
        print(f"{test_number} is not a prime number")
        print(f"{number} times {number_of_parts} is {test_number}")
        break
    else:
        print(f"{test_number} is a prime number")
else:
    print(f"{test_number} is not a prime number")这是用来判断是否是质数的一段python程序,只要一个英语基础还不错同时能看懂并了解prime number代表质数,那么你可以非常自然的理解这个代码是怎么运行的。
因为它非常像自然语言,很容易理解,特别是英文是母语的人。
同样的代码,如果用C++写
#include <iostream>
using namespace std;

int main() {
    int test_number = 407;  // our example is not a prime number

    // prime numbers are greater than 1
    if (test_number > 1) {
        // check for factors
        for (int number = 2; number < test_number; number++) {
            if (test_number % number == 0) {
                double number_of_parts = static_cast<double>(test_number) / number;
                cout << test_number << " is not a prime number\n";
                cout << number << " times " << number_of_parts << " is " << test_number << "\n";
                break;
            }
        }
        // If no factor found, then it is a prime number
        if (number == test_number) {
            cout << test_number << " is a prime number\n";
        }
    } else {
        cout << test_number << " is not a prime number\n";
    }

    return 0;
}
就比较下这个理解难度,明显的C++版本更难看懂。

就跟以前的AI工具有,但是一点儿也不流行,就是因为门槛太高,非科班的人很难学的会。

而python特别适合,研究生研究方向偏向AI,由于读论文了解基本的英文词汇,python一下子就变成了主流语言。
这帮搞科研的用python来做AI,开源的东西自然也是python的居多,后来随着社群的不断壮大,python就基本上垄断AI了。


最后还有一个,python的库多呀,虽然这是结果,不是原因,但是现在基本上数据处理什么的,就是numpy,pandas,matplotlib这三把斧。
python的库资源非常之多,就拿机器学习框架,就有:

FrameworkDescription
TensorFlowAn Open Source Machine Learning Framework for Everyone.
scikit-learnMachine learning in Python.
PyTorchTensors and Dynamic neural networks in Python with strong GPU support.
KerasDeep Learning for humans.
StatsModelsStatistical modeling and econometrics in Python.
XGBoostScalable, Portable and Distributed Gradient Boosting (GBDT, GBRT, or GBM).
jaxComposable transformations of Python+NumPy programs: differentiate, vectorize, just-in-time compilation to GPU/TPU.
LightGBMA fast, distributed, high-performance gradient boosting framework.
pytorch-lightningDeep learning framework to train, deploy, and ship AI models.
PaddlePaddleParallel Distributed Deep Learning: Machine Learning Framework.
FastaiA deep learning library.
JinaBuild multimodal AI services via cloud-native technologies.
PySparkApache Spark Python API.
MXNetLightweight, portable, flexible distributed/mobile deep learning framework.
CatboostA fast, scalable, high-performance Gradient Boosting on Decision Trees.
FlaxA neural network library for JAX designed for flexibility.
ThincA refreshing functional take on deep learning, compatible with your favorite libraries.
Vowpal WabbitA machine learning system that pushes the frontier of machine learning.
einopsDeep learning operations reinvented (for PyTorch, TensorFlow, JAX, and NumPy).
ivyThe Unified Machine Learning Framework.
LudwigData-centric declarative deep learning framework.
tensorpackA neural net training interface on TensorFlow, with a focus on speed + flexibility.
ChainerA flexible framework of neural networks for deep learning.
PyFlinkApache Flink Python API.
SonnetTensorFlow-based neural network library.
skorchA scikit-learn compatible neural network library that wraps PyTorch.
IgniteA high-level library to help with training and evaluating neural networks.
HaikuA JAX-based neural network library.
ktrainA Python library that makes deep learning and AI more accessible.
tensorflow-upstreamTensorFlow ROCm port.
Neural Network LibrariesNeural Network Libraries.
GeomstatsComputations and statistics on manifolds with geometric structures.
DyNetThe Dynamic Neural Network Toolkit.
TowheeA framework dedicated to making neural data easy and efficient.
Neural TangentsFast and Easy Infinite Neural Networks in Python.
xLearnHigh-performance, easy-to-use, and scalable machine learning (ML) library.
fklearnFunctional Machine Learning library.
NeuPyA TensorFlow-based Python library for prototyping and building neural networks.
maceA deep learning inference framework optimized for mobile devices.
ThunderSVMA fast SVM library on GPUs and CPUs.
NeoMLA machine learning framework for both deep learning and traditional models.
chefboostA lightweight decision tree framework supporting regular algorithms.
elegyA high-level API for deep learning in JAX.
ThunderGBMFast GBDTs and Random Forests on GPUs.

数据可视化

LibraryDescription
MatplotlibPlotting with Python
SeabornStatistical data visualization in Python
BokehInteractive data visualization in the browser, from Python
PlotlyInteractive graphing library for Python
AltairDeclarative statistical visualization library for Python
dashData apps and dashboards for Python
pyechartsPython Echarts plotting library
plotnineGrammar of graphics for Python
PyQtGraphFast data visualization and GUI tools for scientific/engineering
FiftyOneVisualize, create, and debug image and video datasets
PyVista3D plotting and mesh analysis through a streamlined interface
UMAPUniform Manifold Approximation and Projection
HoloViewsData visualization library that makes data visualize itself
GraphvizSimple Python interface for Graphviz
datashaderRender large datasets quickly and accurately
D-TaleVisualizer for pandas data structures
bqplotPlotting library for IPython/Jupyter notebooks
mpld3D3 renderings of Matplotlib graphics
hvPlotHigh-level plotting API for pandas, dask, xarray, and networkx
wordcloudWord cloud generator in Python
missingnoMissing data visualization module for Python
Facets OverviewVisualizations for machine learning datasets
data-validationLibrary for exploring and validating machine learning
PerspectiveData visualization and analytics component
openTSNEExtensible, parallel implementations of t-SNE
lets-plotOpen-source plotting library for statistical data
ChartifyLibrary to create interactive visualizations easily
Plotly-ResamplerVisualize large time series data with Plotly.py
AutoVizAutomatically visualize any dataset with a single line of code
HiPlotTool to visualize high-dimensional data
Pandas-BokehBokeh plotting backend for Pandas and GeoPandas
Multicore-TSNEParallel t-SNE implementation with Python and Torch
python-ternaryTernary plotting library for Python with Matplotlib
SweetvizVisualize and compare datasets easily
PopmonMonitor the stability of Pandas or Spark dataframes
vegaIPython/Jupyter notebook module for Vega and Vega-Lite
PyWaffleMake waffle charts in Python

至于更多的库,可以参考这个github库:https://github.com/ml-tooling/best-of-ml-python#machine-learning-frameworks
整合了数百个库

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

0

主题

3

回帖

2

积分

新手上路

积分
2
发表于 2023-6-2 16:12:32 | 显示全部楼层
这里讨论的是以Deep Learning为代表的,最近一次AI浪潮中,GPU端的AI模型训练、推理场景下的情况。这些情况下Python毫无疑问是使用最广泛的语言(移动端的部署,Python并不占优势)。
其实Python并不是一开始就是这样大范围使用的。在2015年读研进实验室时,应用最广泛的AI训练推理框架是Caffe。
Caffe是用C++编写的深度学习框架,提供C++,Python和MatLab接口。训练网络时,使用比较多的是直接用编译好的C++二进制文件,修改训练超参数所在的配置文件。推理时,使用Python和MatLab的接口会容易一些,它们相比C++有更多的现成工具库。
如果要修改网络结构,修改网络结构定义的prototxt文件即可。如果要新增加一个层或者模块,那就只能自己写C++代码来实现了,整体难度还是挺大的,我记得有一个自定义层写了很久,训练出来结果都不对,最终也没分析出原因,没有真正用上。
这个时代还有一些别的语言的框架,像基于MatLab的MatConvNet,基于Lua的Torch,基于Python的Theano,总体来说是百花齐放的。


我觉得这是因为深度学习还在兴起阶段,已经验证可以做的任务(图像分类等)还不太多,网络设计偏向于静态结构,因此用一些动态性支持不太好的语言问题也不大。
但随着RNN,LSTM等时序模型的兴起,对灵活性的要求越来越高,像Caffe这种用prototxt配置文件来构建网络的的方式不能很好的应对时序上的变化,因此迫切需要更灵活的框架来训练这些网络。
然后就出现了Keras和Pytorch这些基于Python,可以灵活搭建网络结构的框架。基于Python文件而不是配置文件来搭建网络,利用框架提供的大量的基础层,满足大部分场景的使用,对于自定义的网络,也可以用一些基础的Conv层通过修改层的参数来实现。
同时随着越来越多人才涌入AI行业,随着越来越多的论文都用Pytorch来开源代码,也助长了Pytorch用法的普及。


时至今日,Python已经成为AI训练的最广泛使用的语言。
但Python运行慢的影响也日益体现出来,比如在端侧部署等场景,Python的性能问题还是难以解决的瓶颈,未来或许有极快又好写的语言来填补这块空白。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

0

主题

4

回帖

7

积分

新手上路

积分
7
发表于 2023-6-2 16:13:07 | 显示全部楼层
实际上有很多语言尝试侵入 AI 领域,比如 Java 有 deeplearning4J,Lua 有早先的 Torch 等等。新语言也有一些尝试,Chris Lattner 试图让 swift 语言能成为 TF 上的一个主流语言,他后来创业又搞了 mojo 语言等等。这些尝试要么失败了,要么就才刚开始(失败的路上)。
我个人认为,要成为主流的 AI 开发语言,离不开几个因素。
强大的群众基础

从事 AI 开发的用户众多,如果这个语言很小众,上手困难,很难被 AI 开发社区接受。
Python 社区群众基础非常庞大,比如 Kaggle 上,有大量的数据、案例和代码。用户很容易就可以基于前人的成果来演进。
动态语言

对于深度学习来说,核心的地方还是模型本身,如果需要在类型指定上都需要花时间,无疑本末倒置。比如一个变量声明还需要指定 Tensor[float32, float32, float32],即便有自动类型推导,如果不是动态语言,使用的便捷程度会大大受限。
易于绑定 C/C++

大量的底层算法库都是用 C++ 等语言实现,CUDA 的支持也以 C++ 为主,如果这个语言不能很好地绑定这些实现,反而要从头开始实现所有的底层库,这是不切实际的。
Python 诞生后的一大特点,就是所谓“胶水语言”,它可以轻松绑定 C/C++/Fortran。
生态



深度学习的周边是庞大的,包括数据获取,数据预处理、模型评估等等,这需要庞大的生态支撑,Python 在这块已经有丰富的生态。

  • 数据获取:scrapy、pandas
  • 数据处理:numpy、pandas
  • 机器学习:scikit-learn
  • 深度学习:PyTorch、Jax、TensorFlow
  • 分布式计算:dask、Xorbits (夹带私货)



Python 生态(+ Xorbits 会完整一些 :) )

总结

这几个因素是成为 AI 主流语言的核心要素,缺一不可,目前看来,只有 Python 能胜任。这些鸿沟对于其他语言来说,其实相当难跨越。
而 Python 自身的问题,主要就是性能慢,其实以 Guido 为核心的社区也在积极改进。相信这块在未来也会越来越好。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

0

主题

4

回帖

15

积分

新手上路

积分
15
发表于 2023-6-2 16:13:12 | 显示全部楼层
Python成为AI的主流开发语言,是一个很复杂的问题。包括编程语言特性、AI开发特点、社区环境支持等因素都对这一结果有影响。我这里主要结合个人经历来谈谈我觉得的原因。
Python很适合做数据处理

作为一个脚本语言,python非常轻量级,很适合做数据处理。比如调整、合并文件内容等。很多操作,甚至可以直接在命令行中做。
如果需要交互、需要留存代码,也可以用ipython,jupiter lab等“类似命令行”的开发工具来完成。结合了轻量级、即时交互、代码留存的优势。
而我们知道,AI开发里很多时候在处理数据,常见的比如清洗数据、数据集分割、分词并根据word2vector词表转成词ID向量、计算评价指标等。用Python,可以很好的完成这些步骤。
而一个人一般同一时间只能写一种代码,不然语法容易弄混,毕竟很多时候都是肌肉记忆,不会过脑子的。记得我刚写python时就喜欢每行后面打个分号。。。所以,预处理后处理都用python解决的花,中间模型的代码也用python解决会更顺一点。
python的pickle包,以及更高级的,tensorflow和huggingface中的dataset对象,也给数据保存和传输带来了很大的便利。



随便找了一篇知识库问答的论文,可以看到AI开发的数据处理流程经常是挺复杂的

Python有很多支持包

这里说得还不只是那些耳熟能详的神经网络工具。
我们先来看看历史,看看神经网络刚开始火起来的那几年(2012年左右)python环境支撑。这有助于帮助我们了解为什么tensorflow等工具在python中出现。
numpy,1995年,提供了大量矩阵运算工具。
NLTK,2001年,提供了大量自然语言处理工具。
Scikit-learn,2010年,提供了大量传统机器学习的算法与评价指标。
这些工具为基于Python的神经网络工具,如Theano(2008年)、Tensorflow(2015年)等奠定了基础。
当然,同期也有很多竞品。比如C/C++的caffe、OpenCV、word2vector,Java的Stanford CoreNLP,HanLP等。所以,一度有一个说法,是做CV的用C/C++,做NLP的用Python/Java。我在2015年左右刚接触NLP时,还纠结过应该用哪种语言来着。



功能强大的sklearn

奠定Python王者地位的,是Tensorflow和Keras

TensorFlow和Keras都是2015年发布的。早期Keras只支持Theano的backend,后来也支持了TensorFlow。
2015年那会儿,神经网络并不好写。反正我写作业,简单的前馈神经网络,用过java、C#等。而复杂的神经网络,用啥写的都有。因为Theano等库实在太难用,我也见过直接用numpy写CNN的。但这些玩意儿对初学者实在不友好。
而keras简直是神器,居然支持layer对象,居然直接有fit和evaluate方法,极大地方便了初学者学习神经网络,从而提高了Python在AI 开发中的地位。
后来的Tensorflow和Pytorch吸收了很多keras中优秀的特性。并且基于这些,有了很多更高级的工具,如DGL和transformers等,让python的环境生态得以蓬勃发展。同时,由于python的用户群体很大,很多其它工具也都开始提供python接口。比如Stanford CoreNLP(2016年)。
而我觉得,这些的根源,主要是Tensorflow和Keras的成功所吸引的用户群体和业界的关注。



Keras的完全版,支持多种backend组合

<hr/>当然,以上只是我个人的观点。都只是站在一个NLP的学习者与研究的角度思考得,没有做过全面的调查。欢迎大家讨论交流。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

0

主题

4

回帖

19

积分

新手上路

积分
19
发表于 2023-6-2 16:13:36 | 显示全部楼层
这个问题,要拆开了看。
java和ruby也不是一个设计理念下的产物。
先说说java,如果说java为什么没有成为AI主流语言,那么java要对标的并不是python本身,因为这两者简直无法直接对比,当AI程序员写下
x=3的时候,他只需要关心这个x是number类型就行了,不需要关心它是不是int,会不会溢出,什么时候要定义成double,float。这些跟他主要注意力无关的事情,只会“影响他拔剑的速度”。所以硬要对标,那所有的编译语言在脚本语言面前都是自讨苦吃。
java真正要对标是c/cpp。为什么这么说呢?因为python在AI领域的底层计算库,清一色是c/cpp构建的。所以java要跟c/cpp直接对位,那么java是没有优势的,因为java要吃更多的资源,反而更慢的性能。且过于严苛的语法规则让算法开发人员不得不分一部分精力来调试自己的语法。
其实java曾经接近过这个目标,在12年,13年那会儿,java在大数据,数据分析,数据挖掘这几个领域一度占据了首席生态位。


但很快,数据库厂商反应迅速,直接从数据库层面就掏出了大一统方案,纷纷推出自家的基于sql的扩展语法+自定义窗口函数来解决这一痛点。以至于后来出现的各种olap,htap,文档,半结构,无结构的各类数据库。直接压制了java在大数据,甚至大数据本身的声浪。
然后,说说ruby。首先ruby很有趣,python所有的优点,ruby几乎都有,而ruby还有比python更高的自由度和可玩性。但要说ruby在跟python的竞争中落败我觉得跟python的先发优势是息息相关的。python创造于89年,91年release。而反观ruby,93年被创造96,97年才正式release。那个时期python已经被选为许多大学的计算机入门课程了。并且这些高校里面,并不是只有计算机专业的才学python,包括数学,物理,金融等各种泛化专业都会教授python。也正式由于这一点,让python比较早的积累出了许多数学计算库。他们发展到今天,就是各种大名鼎鼎的AI底层计算库,比如numpy,pandas


而ruby的火爆要到2000之后,ruby on rails让ruby在web领域爆火,相比python落后了10年,这10年的积累正是因为沉淀了这些宝贵的基础库,才有后来的TensorFlow,pytorch等ML库,以及最近大热的langchain,这才是python在Ai的护城河。整个过程是一个厚积薄发的积累过程。尽管苹果在2007年为ruby站台,吸收ruby成为了苹果系统的御用脚本语言。但python的护城河已经建立了。苹果当年,哪怕苹果现在的号召力也不足以让ruby正面挑战python的护城河。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|T9AI - 深度人工智能平台 ( 沪ICP备2023010006号 )

GMT+8, 2024-11-23 17:57 , Processed in 0.060781 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表