1. 背景
今年花了一些时间去了解 ML Machine Learning,大概知道它是做什么的,如何做的。而 Google I/O 19 关于 ML 的演讲《Machine Learning Zero to Hero (Google I/O'19)》 毫无疑问,是我见过的关于 ML 最好的科普视频。
这个视频的内容主要包括:
- 什么是 ML,它和我们平时理解的变成有什么不一样?
- ML 的例子
- TF 如何更加有效的解决 ML 领域上的难题?
- 你可以怎么样利用 ML
接下来是关于这个演讲的而一些笔记。我是在 Youtube 上看的,这么有用的视频相信其他的网站也有播放。
2. 什么是 ML?
2.1 什么是我们普通编程所不能做到的?
假设我们企图编写一个程序来玩“石头剪刀布”游戏,步骤非常简单:
- 计算机随机自己的手势,同时通过镜头拍的你的手势
- 识别出你手势属于 “石头剪刀布” 三个其中一种后,通过对比自己的手势,判别胜负
这个游戏中,随机手势,判别胜负是我们普通编程领域,但从 图片中获得手势 该如何编程实现呢?答案是:几乎不可能。计算机拿到的数据仅仅是二进制的像素,这些规则是几乎无法使用普通编程语言所描述的。
假如我们通过分析一张图片的像素布局,终于识别到它是一个剪刀,下一张从像素上几乎完全不一样的图片,也应该被识别成剪刀。因此这个领域上的规则(Rule),是不可编程的。而这些输入数据且不可编程的领域非常多,譬如:计算机视觉、语音识别、自然语言处理等等,基于这几个问题的解决,我们可以创造自动驾驶、机器客服等有价值的应用。
但这个规则是有用的,我们有没有另外的办法获得这个 Rule 数据呢?答案是肯定的,这就是 Machine Learning 的研究范围。
2.2 ML:数据+结果=规则
由上图可见,传统的编程,都是 规则+数据=结果 。而 ML 则是 数据+结果=规则 的工作模式,然后在生产环境中,再使用 规则+数据=结果 的方式进行使用。我们将得到规则的过程称为 训练 training,将 training 得到的规则,称为 model,而 model 加上新数据的过程,成为 预测 predict。
TensorFlow 这个工程,便是我们训练、获得、并使用 Model 的框架。Cool!
2.3 神经网络
上一小节是 ML 的定义及术语,现在我们顺着“剪刀石头布”的游戏,进步解析几个关于图像识别的 ML 概念。
假如计算机仅仅通过一大批 1980x1080 的高清图片去训练得到能够识别手势的 Model,这个过程是非常低效的。我们需要帮助计算机做一些预处理。这些预处理的作用,就是教会计算机发现特征 feature。
所谓的特质,就是一些某些维度数据。这是一个非常容易理解的概念。譬如说人的特征有:皮肤、双眼皮、卷直头发。假如我需要训练一个识别黄种人、黑种人、白种人,那我们认为皮肤是一个重要的特征。
也就是说:特别的问题需要特定的特征去解答。假如我们可以通过数据(图片)获取特别多的特征,我们便可以解决不同类型的问题,甚至通过多个特征共同解决一个问题,是我们的 Rule 更加符合正确答案。(我们通过肤色+卷发,可以更加准确地识别出黑人)
2.3.1 Convolutions 卷积
所谓的特征提取,通过一定的算法忽略一些A维度细节,放大B维度的细节,从而得到一个特征数据。如上图,针对像素间的关系,通过一定的算法计算获得新的像素,并组合成新的照片,便可以得到一个特征值。我们这些算法成为过滤器,如下图,典型的:数据+过滤器=特征数据。我们将这个过程成为卷积,事实上,卷积有更加严谨的数学定义,我仅仅作 ML 上的介绍。
我们通过卷积处理后,数据的一些部分会被特显和强化,我们便称之为特征数据,基于这些数据,ML 便可以获取其中的特征,我们甚至无法理解这些特征是如何帮助计算机完成识别的。
ML 通过卷积获得更多的特征,可能会使一张图片,卷积处理后会有 1000 个特征数据。这些特征数据的高效处理成为了训练的难题。下一小节,我们需要解决这个问题。
2.3.2 Pooling 池化
池化 的作用是为了压缩数据,同时不丢失特征。这个非常容易理解,我们需要在一张图片上辨别“石头”,其实 64x64 的图片就可以足以让我们辨别了,效果和 1980x1080 是一样的。
同样道理,我们需要通过 池化 来更加高效地进行训练。这会让效率提高成千上万倍。
池化的目的是压缩,做法上非常多样,上图直接取四个像素点地最大值即可。事实上,我们基本不会因为池化觉得图片的内容特征改变了,但对计算机来说,计算效率会大大提高。
2.3.3 分层
我们在上面小节上简单地介绍了,卷积、池化地概念,那如何将它们结合组织成一个 Model 呢?
上图就是组建神经网络的一个架构,首先是输入层 Input cell,我们介绍的 卷积&池化 在其中的2、3层,经过特征提取的处理后,我们将得到一些精简的特征数据。这是我们上述几个小节的描述。
最后一个 Hidden cell 和 Output cell,就是标准神经网络的组成,要理解标准神经网络的组成非常简单,是一个高中数学知识,但并不好描述,建议了解一下吴恩达的 ML 教程。
至此我们终于完成了神经网络的概念了解了。那我们应该如何制作我们的神经网络呢?如何训练、保存、应用?这就是 TensorFlow 的工作了。
3 TensorFlow
TensorFlow 是一个机器学习框架,它的价值在于简化 ML 训练、保存、应用的使用。也就是说,我们明白了上文的知识,便可以通过框架和程序来验证和应用了。
当然, TF 只是机器学习框架的一种,同样的 ML 理论在其他框架上同样是适用的,这仅仅是不同的软件有自己的使用方法而已。
我无法展开介绍 TensorFlow 的具体使用方法,仅仅是将演讲中提及到的功能列一下。
3.1 定义神经网络和训练
我们在上文讲述的大量 ML 的概念,你都可以从以下代码中找到。
代码非常简洁
- 通过 tf 定义一个 model
- 里面包含非常多层,首先是一层 卷积,一层 池化(原因大家应该知道了!)
- 后面交给 Dense 层进行处理,最后输出 3 个节点
整个神经网络便定义完成了。Simple!
在训练的时候,我们需要定义 loss 损失函数 和 优化器。这个并不神秘,他们的存在是为了将训练收敛到一个对而合适的状态。一个像严父,一个像慈母,一个告诉模型错的程度,一个建议模型修改的方法。
最后 fit 就是执行训练。
训练完成后,我们发现一些层次的 Param 参数会有数万个,而最后的 dense 层,会达到百万个。我们几乎无法对这些 Param 进行理解,ML 的 Model 就是有用,但无法拆分解释。
下面再简单介绍一下关于 TF 的关键组件和特性,这些组件几乎都是开箱即用的。
3.2 TensorBoard 神经网络训练可视化
TF 提供了神经网络训练的可视化组件。
3.3 分布式并行训练
为了加快训练效率,TF 支持分布式训练。
3.3 部署和应用
我们不能仅仅是训练了一个模型,然后实验完就结束了。Model 训练后如何被序列化保存,如何发布也是框架必须支持的能力。
- TenserFlow Serving 这是 TF 提供的应用程序,它开放 gRPC 和 REST 接口提供模型识别任务。作为一个应用服务,它是高效的、吞吐量巨大的。
- TenserFlow Lite 是 TF 提供的一个库,它可以将 Model 保存再一些可移动设备上,像树莓派之类的。
3.3.1 保存模型和加载
具体如何保存也是非常简单的,如上图。基于这几行代码,应该可以完成训练、保存和发布了。
4 学习资料
至此,对 Google 本次 ML 的演讲笔记就完成了。非常建议大家去看一下原视频,大约40min。我本人并没有很多的 ML 基础,也正在入门,尝试一些新东西。我学习 ML 的课程主要来自以下资料:
-
吴恩达的 ML 课程 这是吴恩达博士为了普及 ML 的教学视频,有高中数学知识就可以理解了。我看了大概前三分之一。
-
深度学习 江湖上称花书,基于吴恩达博士的课程,我借助这本书深入学习 ML 的基础,读完了第一章,大概可以做到基础概念的理解。
-
Siraj Raval Youtuber,专门讲机器学习相关的视频。假如你初步了解了 ML 是什么,迫不及待希望可以知道它能做什么,如何做,强烈建议你看一下 如何模拟无人车。视频会一步步地教你完成数据收集、训练、部署、应用,并且你游戏上的小车自动开了起来。
By the way
非常感谢你能读到这里,方便的话请你点个赞,有什么意见可以留言。Thanks!
我最近在认真地实践一些 idea,基于 raspberry 进行的一些小项目,你点击查看 Github将会见到我如何从一个小白通过搭积木组成一些有意思的工程,当然 ML 也是一块重要的积木。我有认真记录每一个步骤,你会从日志中完全可以复制我所有的工作,同时期待你的 issue,更希望能够得到你的 Star!