人工智能科普

举报
yd_223472322 发表于 2022/10/12 11:35:51 2022/10/12
【摘要】 1    很高兴今天能有机会和大家讨论我对“AI工程能力”的一些理解。2    这次的分享内容主要包括三部分,首先是举例说明“人工智能是什么?搞人工智能/机器学习/深度学习的人工作都在做什么?”,然后是以高频词举例,从几个方面介绍做人工智能的工程技术能力,最后说明一个牵涉到深度学习网络的算法从提出需求到工程化的过程。我分享的胶片一共有12页,不会牵涉太多技术细节,预计持续30min。3   ...

1    很高兴今天能有机会和大家讨论我对“AI工程能力”的一些理解。

2    这次的分享内容主要包括三部分,首先是举例说明“人工智能是什么?搞人工智能/机器学习/深度学习的人工作都在做什么?”,然后是以高频词举例,从几个方面介绍做人工智能的工程技术能力,最后说明一个牵涉到深度学习网络的算法从提出需求到工程化的过程。
我分享的胶片一共有12页,不会牵涉太多技术细节,预计持续30min。

3    那么我们进入正题。什么是人工智能?本质上说,人工智能是让计算机能够在某些特定场景下,对某些特定刺激做出和人类一致的反应的逻辑程序。我们能够通过状态机实现这点,比如一些游戏的ai就是这样的。在这个阶段,人类通过自己的经验总结出一些有效规则,然后让计算机自动运行这些规则。也就是说,我们设定了可能出现的情况,并且告诉计算机出现这种情况以后该做什么。

但是,现实生活中充满了各种各样的复杂问题,这些问题几乎不可能简化为可以穷举的几种数值输入。然后就出现了机器学习,和它的子类,现在影响更广的深度学习。和传统算法的逻辑不同,深度学习的技术原理跟传统软件的逻辑完全不同:机器学习从特定的大量数据中总结规律,归纳出某些特定的知识,然后将这种知识应用到现实场景中去解决实际问题。

一般地,当输入是简单的字符标签的时候,我们把这个逻辑过程称作机器学习;如果输入是图片、音频、视频、激光点云等等更加复杂的数据时,我们就把这个“从特定的大量数据中总结规律”的过程称作深度学习,这是由深度学习的网络结构而得名的。所以一般做用户

我自己的体会是,深度学习的结果就像工程上常用的经验公式。它有很多参数,有一些适用范围,不是特别能解释清楚具体是怎么得出来的,但在适用场景里确实非常好用,于是工程师们就先这么干。

所以,我们回到标题的第二点:AI工程师这份工作在做什么?
在微博上爬热点控制僵尸粉发言的可以是AI工程师,这种工作一般被称作水军头子
在银行信用卡中心标记风险账户和羊毛党的可以是AI工程师,这种工作招聘网站上叫大数据/数据分析/风控建模
在美图秀秀研究瘦脸滤镜的可以是AI工程师,这种工作专业上叫计算机视觉/图形学/图像处理
像我们组里这样,做数字内容生成,比如单帧建模啦,AR试衣啦,视频人体驱动这些项目的,也是AI工程师。

4    考虑到河图数字内容生成组的工作内容,我们先来看一些做深度学习的时候经常会看到的,也是做工程上比较关心的一些高频词。更完整的高频词链接我列在这一页的标题旁边,有兴趣的同事可以下去自行了解。

左边的这一列高频词分别是我们在数据准备阶段,算法实现阶段和初步测试阶段的一些主要词汇,标红的是重点,一会儿会详细讲。右边这一列高频词不太影响接下来的内容,但这里先作为常识科普。

首先是CNN和GAN。

不牵涉细节,简单地说,CNN是一类可以提取图像特征的运算,其中有一个很关键的运算步骤叫做卷积。CNN的运算会分成几个步骤,每个步骤的所有运算单元被称为一个层。因为有很多层一个接一个放在一起,像生物的神经网一样,所以被称作神经网络。加起来叫做卷积神经网络。

GAN呢,是另一种深度学习模型。这种模型至少有生成器和判别器两个模块,这两个模块呢就好比假货贩子不停地上鉴宝节目。一边是判别器评委要把假古董找出来,一边是上台的生成器假货贩子要把东西做得足够像真的。最后到评委分不出来真假,生成器,也就是假货贩子就可以出师了。

聚类和分类呢,是两类很常见的机器学习问题。其中聚类是无监督学习的一种,分类是监督学习的。简单地举个例子,比如我们要把一群人分成两拨,不告诉你怎么分,这就是聚类问题;告诉你分成戴眼镜和不戴眼镜的,这就是个分类问题。

我们组应该做广义上的分类问题会比较多,比如我在做的Hola自动捏脸,就需要把真实的人脸分类到UCD提供的卡通模型不同的形态键上。这一类项目经常用到两种ai模块:目标检测和语义分割,而且经常是以图像为输入的。

目标检测一般是在输入上检测出某个你需要的东西。比如我们看右上的这个例图,右边的这个小黄框怎么打,上面的标签显示AI觉得框住了什么东西,它多相信自己是对的,也就是置信度是多少,反映到输出上就是图上这样的。

语义分割呢就是说,对输入的每一个单位做一个分类。比如左边这张图,语义分割把它分成前景和背景两个部分。这项技术现在在一些带弹幕的视频网站应用得应该非常成熟了。

5    那么做机器学习/深度学习语言呢,现在应该是用python比较多,主要是pytorch和tensorflow。一些对实时性要求很高的项目会用C/C++,比如一些自动驾驶的项目。

这里我列举了一些常用的python库。
其中numpy被用来做张量计算,和pytorch的tensor很像,前处理和后处理的时候用得更多一点。
Tensorborard可以用来可视化网络训练的过程,loss曲线或者其他指标的曲线之类的。
pandas, scipy和scikit-learn用来做数据挖掘比较多。
Pillow和opencv用来做一些图像操作,matplotlib主要是画图表的。
然后不同的项目可能还会有些常用库,比如处理点云的库,处理mesh的库,这里就不一一赘述了。

除了python和或者c++直接和ai 算法开发有关系,招聘的时候可能还会要求一些别的东西,我们也可以从这些要求里推测工作的内容。比如要Hadoop/Spark/Hive/Scala的职位,一般还要处理比较大批量的数据,做用户画像和广告推荐算法的经常会用到;要Java/C#/Unity的职位,一般会和图形界面/移动端应用有关系。

当然还有一些可能JD上不一定写,默认你会或者工作的碰到再学的东西,比如Linux, git, docker, anaconda/conda的命令,这个其实都可以在做的时候谷歌,或者百度也行。我的经验看,如果同事没遇到过类似问题,那问谷歌效率会相对问百度高一点。

6    那么现在,我们来到这次分享比较技术的两页:数据和算法。

首先是数据集和数据标签。我们在第四页讲聚类和分类的时候提到过无监督学习和监督学习。这里,我们对监督学习的使用的数据集,认为数据集是由多个样本组成的,每个样本包括一个或多个特征,和一个标签。比如右边这张图就是一个十二个样本,由狗和拖把的图片组成的,供深度学习使用的有标签数据集。

一般地,在深度学习的训练过程开始前,我们会把数据集分成训练集和测试集,有的时候还有验证集。可以理解成ai的平时作业,周考考卷和期末考考卷。

比如我们有很多很多像右边这样的图片和答案,要做一个“照片上有没有狗”的图片分类器。训练的时候,Ai 
就会不停地从训练集拿到图片,猜上面有没有狗,然后从数据标签获得反馈这上面真的有狗或者其实没有,以此来训练自己。到AI工程师觉得这个ai学了一段时间了,就会拿测试集里的样本问ai上面有没有狗,来测试ai学得怎么样了。

在这个例子里,目标,也就是对ai算法的需求是比较明确的,也就是“给ai一张图片,判断上面有没有狗”。指标也就可以相应地定为“每猜一百次,看猜对几次”。通常我们确定指标的时候,是希望指标能和目标导向一致的,但现实状况总是会比猜狗复杂很多…比如我的训练集里有一张狗和一百张拖把,那对刚才的指标,ai只要每次都猜图上没有狗,就可以轻松达到很高的准确率。再比如右边第二张图的例子,ai工程师想要设计一个又快又不会撞到东西的扫地机器人寻路算法,因为指标设定考虑得不够周全,就会出现这样,指标很棒但没有实现目标的情况。

总的来说,因为机器学习和深度学习是从大量数据总结规律的算法,数据的质量会直接决定算法的表现。所谓garbage in, garbage out. 所以在开始训练之前,我们需要保证数据和数据标注都是准确的。我们可以通过一些先验来判断数据和数据标注准不准确,在上面我举例的狗狗判别器的例子里,比如我们有一个先验:狗一定不是天蓝色的,那就可以排除掉一些拍的是天空,但标注是狗的错误样本。

另外,如果可以,数据集最好足够分散且有代表性的。举例说,狗狗判别器就需要尽量多不同种类的狗,和尽量多种类没有狗的图片,这样才能尽量避免网络模型过拟合。

7    准备好数据集以后,就可以开始看算法了。这里我们讲一些做深度学习的时候会牵涉到的概念。这些术语平时交流可能直接用英文也比较多,所以我都标在这里。以下讲的是我对这些词的理解,如果哪里讲得不准确,欢迎组里的同事们随时纠正我。

一般呢,对于深度学习的论文,很多会给出一个像这种形式的插图。这样从输入到输出的过程,被称为深度学习网络的pipeline。如果砍掉输入和输出,剩下“网络是有哪些模块拼接在一起”的部分,一般被称作网络结构,也就是architecture。

Encoder-Decoder是一类比较基础的网络结构。其中Encoder可以从复杂的输入,比如图像,点云,音频里提取计算机方便处理的特征,而Decoder可以从这些归纳出的特征里再获取最终需要的信息。
一些作为特征提取的Encoder会被论文撰写者称为Backbone,比如图像处理里常用的ResNet和点云处理里的PointNet。

当我们调研比较了可能解决问题的一系列方法后,圈定了其中的一种,后续所有模型的表现都和它作比较,那么这种调研时被圈出来的方法就被称为baseline。

当我们选择了一种pipeline开始训练,每次训练得到的,对应这个网络结构的网络权重,被称作模型。也就是说,同一个pipieline只会有一种architecture,但用不同的数据集,训练不同的时间,可能会有不同的model。如果网络训练不是从随机值开始,而是载入了一个别人提供的权重文件。那么这个载入的权重文件被称作预训练模型。

如果我拿到了上一张ppt举例的狗狗判别器的模型,想用它作为预训练模型做一个猫猫判别器,那么这个用新的数据库在原来的模型基础上继续训练的过程叫做finetune,这一类的问题叫做transfer-learning。

对于一般的网络模型,我们有一些不是训练过程里获取,而是需要预先人工指定的参数。这些参数被称作hyper-parameter。

网络训练有两种典型的情况,收敛和过拟合,这两种情况的loss曲线在训练集上是差不多的,我们需要比较训练集和测试集的loss曲线。一般网络过拟合的时候,在测试集上的loss会明显高于在训练集上的loss。这种情况经常出现在数据集比较小的时候。
实际上,当网络学到了一些我们不希望它学到的东西的时候,我们也会叫它过拟合。嗯比如右边,这就是典型的过拟合例子。

网络的泛化能力,举例说,如果我训练了狗狗判别器,考虑到猫和狗非常像,它有没有funetune完用来识别猫。

算法的部分,随后巴老师的部分会更详细地讲。我们接下先结束技术的部分,来看工程问题。

8    一般地,工程化使用的ai算法只需要用到推断, 也就是inference模块。用前面的狗狗判别器的例子说,我们会给ai一张照片,然后让它告诉我上面有没有狗。复杂一点的情况里,我们会让ai指出哪里有狗,有几只狗,它有多相信找到的这些图形代表狗。获取这些结果的过程都可以叫做inference。

获取可靠的Inference是ai工程的第一步。有了inference的结果,我们就可以开始做demo了。做demo简单地说,就是把计算机理解但非技术人员不理解的输出,转化成一个一般人能够理解这个ai在做什么事情的过程。
我们组做demo会写ppt,会做一些端侧app。对app比较有信心的时候,也会请不搞技术的人试用,但这样就很有风险,经常出些意料之外的问题…不过工程化的过程,就是不断发现问题,不断解决问题的过程。以下我们用熊猫驱动这个项目解释,一个ai相关的工程项目落地的实际过程是怎么样的,还有碰到了什么问题。

10    整个项目的流程大概是右边这个图这样子,绿色箭头标的是最理想情况的流程。黑色箭头标的是实际上这个项目走的流程。我们可以看到,这个工程里面,除了算法,还会有很多调研分析,需求澄清,开会拉通,工程化接口,还有debug的部分。这些和ai算法不直接相关,和我前面讲的东西没有特别大的关系,但在实际工程上会碰到,花非常非常多时间,非常非常多精力和耐心,非常非常琐碎麻烦,但可能都会影响到最后项目的效果_(:з)∠)_

11    今天科普的内容差不多就到这里了。那么有兴趣想要自己试一试的同事,我这里介绍两个入门项目。介绍它们不是说这两个最好上手,只是它们比较有名。

第一个是MNIST分类,任务是让AI把黑白的手写数字分成0-9十个类,属于深度学习里监督学习的图像分类问题。MNIST是这个数据集的名字。另一个是泰坦尼克的生还者预测问题,应该偏机器学习的特征工程二分类,属于数据分析多一点。

然后也许你能注意到,这两个工程都指向kaggle这个网站。嗯这个网站呢会提供很多类似的项目,各个项目下也经常有不同的人提供的教程,经常是用jupyter notebook写的,可视化都做的很不错。还有比赛。如果对我提到的两个项目不太感兴趣,想看看别的,也可以在这个网站的项目页面上找找。

12    那么我今天的分享就到这里。谢谢大家。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。