Pipcook 和机器学习
发布于 4 年前 作者 Txiaozhe 3211 次浏览 来自 分享

Pipcook,一个旨在降低机器学习在前端开发领域使用成本的开源项目。

什么是机器学习??

来看看维基百科的解释:

大概意思是,机器学习是一种通过算法建立一个数学模型,利用 “训练数据” 在没有明确编程的情况下做出预测或决策的机制。接下来借用 Tensorflow 中文社区的一个比较通俗易懂但又不至于太 “失真” 的例子来讲一下我理解的机器学习。

通过计算机视觉来识别手写数字是一个很好而且非常常用的演示机器学习的例子,比如看一下这张图片:

对于肉眼的我们来说这太简单了,我们可以轻易读出这是手写的数字 “504192”,这是由于人类通过亿万年的进化以及我们自身若干年的学习,使得我们的大脑对这种图片形式的信息异常敏感,以至于这个过程在不知不觉间就发生了。但假如我们用计算机来实现这个过程就会发现没那么简单。

我们可以回味一下我们自己识别这串数字的过程。首先我们看到几个黑色的痕迹,比如第二个圆圆的,以及第五个,上半部分圆圆的,下面拖着一个尾巴,幼儿时期的启蒙教育告诉我们,圆圆的那个是数字 “0”,而上半部分圆圆的而且还拖着一条尾巴的那个是数字 “9”。

那么将这个过程映射到机器学习的机制上是否也可行呢?事实上机器学习算法可能(为什么说是可能?后面会说)也是利用了这个思路,比如,将黑色痕迹的像素信息输入计算机,计算机会读出整体图片的某些部分是深色而且连续的,将这些部分连起来就是一个圆,这个时候计算机可能会判定这个图片上画的可能是一个数字 “0”,就像这样:

但是假如识别图片的机制就是像这样简单通过像素来判定的,那未免也太普通了,当然这也就不能叫机器学习了,简直就是赤果果的编程。其实,机器学习的精髓就在于通过大量的训练数据和验证数据让计算机自己去发现这套识别的机制(这也就是为什么我前面说的是“可能”,因为这只是我想的,可能计算机跟我“想”得不一样呢~)

简单表示一下这个过程:

现在我有一个黑盒子 f(x),这个黑盒子的作用是在一端输入一个图片的像素信息,然后在另一端得到一个预测的数字,比如 “0”。最开始的时候,这个黑盒子并不是很好使,可能会出现错误的值。接下来我们去找大量类似的手写数字作为训练样本来训练和验证这个黑盒子,就像这样:

事实上,要训练出一个具有实际意义的机器学习模型仅有这么点样本是远远不够的。接下来把整个数据集分成两部分,一部分用来流过这个黑盒子来得到更加精确的黑盒子,训练的时候将图片信息输入 f(x),但这个时候也会告诉 f(x) 此时应该得到数字 “0”,并在 f(x) 确实输出 “0” 的时候给予一定的激励,此时在算法的作用下,f(x) 就会发现如此判断一个手写数字貌似是可行的,于是加重这种模式的比重。最后使用剩下的数据来验证一下这个模型 f(x) 的精确度。

当然,实际上机器学习算法的复杂度要远远高于上述所说,推荐阅读 Tensorflow 中文社区的几篇文章:

http://www.tensorfly.cn/special/deeplearning/chap1.html 这几篇文章描述了机器学习的大概思路与实现机制,还算是通俗易懂,只要你在大学学过高数读起来应该就没什么障碍。

说了这么多,对于大部分开发者来说机器学习看上去还是高大上的,当我们要用机器学习来实现我们的某项业务时仍然具有一定的困难。那么在智能化的大背景下,我们又能做些什么呢?

Pipcook 就是这样一个项目,它将机器学习的数据集、训练、模型评估等过程都进行了封装,换句话说 Pipcook 就是将机器学习的细节做成了一个黑盒子,让开发者可以在不了解机器学习机制的情况下使用机器学习来助长生产力,目前主要面向前端开发领域。接下来我将通过一个简单的例子来展示 Pipcook 究竟是如何运作的。

还是用上面的识别手写数字来作为例子吧!假设我是一个前端工程师,被996压榨的我现在有个需求,网页上有个按钮,点击上传一张写着数字的图片,然后得到一个这个数字的预测值,比如 “0”。老板要求直接使用机器学习来做,这样才能彰显公司强大的研发能力。

这在没有 Pipcook 的时候简直是不可想象的,我可能要去找大量数据集,然后阅读机器学习论文,自己训练模型并评估…(要是能干这个我简直就成天才了)。而现在,Pipcook 已经搞定了一切。

在使用 Pipcook 之前需要先安装一下,这个过程比较简单,可以读一下文档:

https://github.com/alibaba/pipcook

通常来说,得到一个机器学习模型的流程可能会分为几个阶段:

  • 收集样本数据集并进行处理,然后分成训练集和测试集
  • 选择用于训练的模型
  • 将训练集用于模型的训练
  • 用测试集评估训练出来的模型

这里,Pipcook 将这些过程很贴心地做了封装和集成,并用一个 json 文件来表示,就像这样:

{
  "plugins": {
    "modelDefine": {
      "package": "[@pipcook](/user/pipcook)/plugins-tfjs-simplecnn-model-define"
    },
    "modelTrain": {
      "package": "[@pipcook](/user/pipcook)/plugins-image-classification-tfjs-model-train",
      "params": {
        "epochs": 15
      }
    },
    "modelEvaluate": {
      "package": "[@pipcook](/user/pipcook)/plugins-image-classification-tfjs-model-evaluate"
    }
  }
}

Pipcook 用几种不同的插件类型来表示机器学习中不同的阶段,开发者也可以自己按照标准开发插件并安装在特定的流程阶段进行执行,安装执行的方式也非常简单,只要写在上述 json 配置文件中并运行即可:

$ pipcook run pipeline.json

流程训练执行结束后会生成一个 output 目录:

📂output
   ┣ 📂logs
   ┣ 📂model
   ┣ 📜package.json
   ┣ 📜metadata.json
   ┗ 📜index.js

优秀!这里直接生成了一个 npm 包,简直就是加班狗的福音。接下来只要按照 js 的标准在项目中直接调用这个包即可,就像这样:

const predict = require('/path/to/output');
const app = express();
app.post('/predict', async (req, res) => {
  const r = await predict(req.body.image);
  res.json(r);
});
app.listen(8080);

通过上述简单的配置和操作就完成了一个机器学习项目的创建和运行,是不是很简单?作为加班狗的我终于可以交差了。对于大部分的应用场景来说,Pipcook 官方也预置了一系列的插件来对基本的需求进行支持,比如插件,当然你也可以按照 Pipcook 的插件标准来开发自己的插件,从而也可以丰富 Pipcook 的应用生态。

另外,Pipcook 在机器学习生态方面也是有所期待的。我们知道,现有机器学习和人工智能应用生态大都基于 Python 语言,因为 Python 在计算及数学上的支持是其他语言暂时还比拟不了的。然而对于 Pipcook 来说,除了对机器学习流程本身的支持,其实更大的野心还在于要将机器学习真正普及到前端开发领域。因此,要将两边生态更好地融合则必然要在语言层面进行打通,在此 Pipcook 又贴心地给出了 Boa 解决方案。

Boa 可以看做是 Pipcook 中的 Python 桥接层,它通过 N-API 将 CPython 集成到了 Nodejs 环境,使得开发者能在 Node.js 中无缝调用 Python 库,比如numpyscikit-learnjieba 以及 tensorflow

来试一下~

const boa = require('[@pipcook](/user/pipcook)/boa');
const os = boa.import('os');
console.log(os.getpid()); // prints the pid from python.

// using keyword arguments namely `kwargs`
os.makedirs('..', boa.kwargs({
  mode: 0x777,
  exist_ok: false,
}));

// using bult-in functions
const { range, len } = boa.builtins();
const list = range(0, 10); // create a range array
console.log(len(list)); // 10
console.log(list[2]); // 2

上述代码就是 Boa 的一个简单例子,首先通过 require @pipcook/boa 包获取 Boa 实例,并通过 boa.import 方法调用 os 包,最后调用 os 的函数获取 pid。是不是很简单?另外对于 Python 的命名参数,Boa 也可以使用 boa.kwargs 来实现,还可以使用 boa.builtins 调用 Python 内置函数。在 Python 语境下 Boa 已经做到了尽可能的支持,更多 API 可以参考 Boa 文档 https://alibaba.github.io/pipcook/#/zh-cn/manual/intro-to-boa

本文讲述了我理解的机器学习和 Pipcook 最普通的一种用法以及其对于机器学习应用生态的期望和支持,对于 Pipcook 来说其实我们想做的远不止于此,我们期望在此基础上拿出更加通用、简便的机器学习工程化解决方案,使得机器学习真正成为程序员的得力工具,并将机器学习应用生态真正带入前端开发领域:)

更多内容和支持请了解 Pipcook

回到顶部