AI概念验证,如何建立成功的AI PoC

今天浏览国外的网站,发现一篇写得不错的文章,结合作者的观点,我做了一些注释。这是数据科学家阿诺特写的文章,他为我们梳理了如何将人工智能理念转化为可运行的软件的方法及经验。
首先,我觉得智能时代的创业者有两种选择:
- 选择一
- AI技术创业=api+算法

通过自建科学家团队,投入大量研发资金,形成无人驾驶算法、医学图像诊断算法、智能城市人脸识别算法等领先技术。
- 选择二
- AI应用创业=app+算法

它并不是去雇佣一大批科学家生产某项算法,而是整合各种成熟的人工智能技术和自主研发的核心算法,为特定行业提供全面的解决方案。
我个人比较喜欢的是应用方向,提供的是智能产品,而不是技术输出。
所以今天的文章也是帮助大家如何应用好AI技术~

- 那么,PoC是什么?

我们先看看PoC相关的文章是怎么使用这个概念的。

1 软银宣布正在开发跨运营商移动支付服务的概念验证(PoC);

2 摩根士丹利声称区块链技术仍处于“概念验证(PoC)”阶段;

3 2019年3D打印现状报告中指出,概念验证和原型设计依然是2019年3D打印的主导应用。

可见,概念验证(PoC)的目标是测试是否值得花时间在其中,如果通过概念验证,意味着可以进入正式的生产、商业化应用阶段。构建PoC很难,但是构建AI PoC更加困难,因为它需要大量技能。

- 人工智能系统概述

作者举例,他打算开发一个对文件进行自动分类的AI系统。AI系统会用“电子发票”或“待办事项清单”之类的标签回答“这是哪种文件”。
AI系统的工作流包括5个步骤:
  • 收到一个问题:“这是什么样的文档?”

  • 在用户或上下文中获取额外的信息,了解“用户拥有哪种类型的文档?”

  • 使用标签回答问题 “此文档属于哪种类型?”

  • 存储计算结果:将新文档添加到数据库

  • 回答用户的问题:“这是发票类型的文档”

作者将其分解为  3个功能模块:
  • 模块1 :处理用户请求:收到问题,让用户等待...

    比如:准备一台HTTP服务器,用来接收文件及用户提交的信息

  • 模块2:调取数据:与数据库进行通信以添加或接收相关数据。

    比如:处理与数据库通信的逻辑,存储用户提交的数据及调取数据库中保存的其他相关数据

  • 模块3:AI 模块:实现AI系统,让其可以根据上下文回答问题。

    比如:我们可以通过专家系统,SVM,神经网络…等来实现

AI回答问题“这是哪种类型的文件?”
作者推荐,Python中AI PoC的最简单解决方案是使用Flask和SQL数据库,但这在很大程度上取决于您的需求和已有的东西。(我现在常使用的是sanic跟mongodb)

- 设计AI模块

AI模块的输入: 
例如,用户的年龄和位置或电子邮件的正文等各种形式的输入。
AI模块的输出:
AI要回答的用户提交的问题。人工智能中有很多不同的任务。比如计算机视觉中的一些常见任务,如下图
单物体识别跟多物体识别难度是不一样的,仅识别物体跟识别并定位物体复杂度也是不一样的。所以我们需要根据输入跟输出确认AI系统的任务是怎么样的。
为了帮助你确定构建AI的复杂性,  作者推荐了3个步骤。

步骤1:确认输入

千万不要考虑包含很多输入的解决方案,例如,如果仅提供用户的位置可以解决问题的时候,千万不要再收集电子邮件的正文等更多的输入。
避免迷失在将具有不同含义或性质的各种输入混合在一起而最终什么也没做的情况。
构建AI时,请坚持简单的输入。

步骤2:向量化输入

第二步是预处理这些输入,以使其可用于各种算法。
文字转向量
如果是文字,有种简单的方案,比如计算单词在文档中出现的频率;如果是图像,则直接使用图像像素的值即可。
注意,如果进行多层预处理,它也可能变得非常复杂。
图像到矢量
除此之外,还需标准化输入,比如图像的大小,色阶或格式不同。
建立AI输入的标准化向量表示。

步骤3:处理向量

第三步是思考输出的形式。
像输入一样,输出也需要“向量化”。对于分类,这很简单:一个类一个字段(标签)来表示。
然后,我们需要找到一种可以把输入向量转化为输出向量的方法(确认AI任务)。
大多数任务(例如回归,分类或推荐)都已有成功的最佳实践。 对于PoC,最简单的操作是使用预先实现的算法库(例如  scikit-learn)  并进行尝试。
寻找简单且预先实现的AI算法。

- 一个简单的例子

任务: 判断文本是法语还是英语?一个解决方案:

步骤1:确认输入 

如果我们没有任何来源或其他元数据,则文本是唯一可能的输入。

步骤2:向量化数据

向量化的一种简单方法是计算英语单词和法语单词是否存在。我们将使用该语言特定的最常用的停用词。法语中常用的词跟英语中常用的词是不一样的。

步骤3:处理向量

然后,我们可以选择使用最大值进行分类以获得二进制输出:True或False。
构建AI通常是人类专长(商业知识)和计算机智能(机器学习)的结合。 在此示例中,作者使用了人类专业知识来选择如何构建向量(法语和英语停用词)。然后使用机器学习来训练模型以构建相应的向量(步骤2),最后从更复杂的向量中学习分类(步骤3)。

- 一个更复杂的例子

GitHub:  digital-safe-document-classification。

梳理想法并定义PoC的范围

我们将设计一种用户体验(UX):
用户上传文档,AI为用户提供最佳存放的文件夹路径。此系统要支持以下类型的文件:txt,doc,markdown和pdf。


步骤1:确认输入

首先,我们需要知道用户的文件夹,否则我们将无法回答。有哪些输入,我们可以使用呢?
  • 文档的内容

  • 添加时间:有些文档可能是每月的,有些文档可能大部分在某些时间被上传

  • 文件名和类型:“ energy_invoice_joe_march.pdf”,“ pdf”

在本例中,最可靠的输入可能是文档的内容。最后,确认使用上传的文档和用户的文件夹里的内容进行比较。
让我们专注于此。


步骤2:向量化输入

目前,我们有不同的输入格式:pdf,markdown,txt ...其中pdf是比较麻烦的。我们可以使用pdftotext库,但是它没有OCR功能,为了解决这个问题,可以使用Tesseract之类的替代方法,但是在这个示例中我们暂时不加入OCR功能。
我们想将文本转换为矢量。让我们看看  scikit-learn库,会发现 文本的  特征提取包。这正是我们想要的。它有两个向量化器:  一个基于词计数,另一个将被称为  TfidfVectorizer。

步骤3:处理向量

我们希望将最佳文件夹列表作为最终输出。如果将文件夹名称映射到数字,看起来很简单。但是我们将无法获得简单的标准化输出向量,因为输出向量的大小将发生变化,随着用户的文件夹数量的增加、变动。
因此,我们不能使用具有固定数量类的普通分类算法。我们将需要每次都重新训练模型,并为每个用户构建一个模型,或者为所有用户构建一个巨大的模型。
这个实现方式就显得非常复杂。
于是,需要寻找更为巧妙、简单的实现方式。作者最后采取了一种与搜索引擎相似的方法:
对上传的文档进行向量化处理,然后找到用户所有文档里矢量与上载文档最相似的文档,使用余弦相似度就可以完成这个过程,然后把最相似的文档所在的文件夹推荐给用户。
非常巧妙的处理方式,把分类问题转变成了相似度计算问题。
综上所述,解决AI问题可以简单地分为以下三个步骤:
  • 首先,确认输入

  • First, Browsing the relevant inputs

  • 其次,向量化输入

  • Second, Vectorizing the data

  • 最后,处理向量

  • Third, Processing the vectors

(0)

相关推荐