iOS 11展示了一个新的特性-机器学习套件,包括Core ML与视觉框架(Vision frameworks)。你可能已经听说过它,包括它的炫酷新特性,比如图片分析,文字检测,目标跟踪等等。Core ML带来了机器学习模型与你app的简单集成。一些开发者知道怎么使用这些机器学习模型,但是很多开发者并不知道这些模型的法则以及它们在后台是怎么运行的。
在这篇文章里,我将试着说明一些机器学习的基本概念,对它的一些范式进行概述,并试着展示在后台的过程以及机器到底是怎么学习的。在第二部分(Part 2),我会介绍Core ML,并把它的特性与本部分内容联系起来。
所有的流行术语
你很可能听过这些流行术语:人工智能,机器学习,深度学习,神经网络…但是它们有什么关联性呢?
人工智能(AI)是最抽象的一个。它是一种研究人类大脑,并把其研究成果作为智能系统研究基础的科学。它不仅和计算机科学相关,也涉及到数学,心理学,哲学等等。
机器学习(ML)是AI的一个子集,它的主要目标是发展预测算法来解决某一系列的问题。机器学习的基本理念是机器(计算机)能够接收一套数据,并且”学习”它。
深度学习(DL)是一项机器学习科目。它代表一些类型的神经网络算法,即使用原始数据来描绘不同抽象程度的复杂神经网络。
人工神经网络(ANN)是一个模仿生物神经网络的系统,用于解决人工智能中一些领域的问题。它使用人脑结构来发展出一套适合的数据分析策略。
自然语言处理(NLP)也是一项AI科目(不仅仅包括AI)。机器学习算法常用于解决NLP任务。它是一台计算机”理解”并生成人类语言的能力。
流行术语领域交集
神经网络
和传统计算机相比,神经网络采用不同的方法解决问题。传统算法遵照一套指令集去解决一个给出的问题。如果没有特定的步骤去遵照,计算机就无法解决问题。如果计算机能够解决那些人们不知道该怎么解决的问题,那么它们将变得更有用处。这个想法引发了人工神经网络的诞生。
人工神经网络基本上是算法系统的一个子部分,它由人工神经元和连接部分建立的模型构成。一些机器学习算法依赖神经网络。ANNs像人脑一样处理信息。这个网络由大量的连接的处理单元(神经元)构成,它们共同工作以解决某个问题。神经元主要按照不同层级分类(见人工神经网络图):输入层,隐藏层(1个或多个)和输出层。输入层接收数据,输出层给出网络计算出的结果。
ANNs按照以下方式解决问题:
输入的数据集在输入层被数值化描述
这些数值乘上用于描述突触(连接)强度的权重值
乘得的信号会被求和,类似于求和身体细胞中的电位
如果得到的值超过定义的阈值,神经元会给出一个输出信号
除了阈函数,神经元也可以有其他函数,类似转移函数或其他相似函数
人工神经网络
只要输出和输出变量之间有联系,神经网络就可以解决分类、回归、预测以及各种问题。
分类过程的输出变量是一个类别,比如“干”或“湿”,“黑”或“白”。
回归是评估变量间关联的进程,它解决那些需要连续输出预测值的问题。比如,通过房屋大小和过去价值的历史数据,去预测房屋价值。
学习范式
学习人工神经网络有3个主要范式
监督式学习
非监督学习
强化学习
学习方法与神经系统的架构没有太大联系,但是一些学习惯例与网络类型有关。每种学习范式都有不同的训练算法。
监督式学习从训练数据集来设定人工神经网络参数。学习人工神经网络的目的是为任何有效的输入值与合适的输出值设定网络参数值。训练数据包括一套输入和输出数据。之所以叫”监督式”是因为你需要给网络提供数据并验证它的工作(训练)。
非监督学习只需要你给出输入变量,不需要输出变量。它会设定基于网络的输入数据参数和一个最小化的成本函数。成本函数可以根据任务要求表现为任何函数形式。学习目标是最小化成本函数。
强化学习与监督式学习的不同在于关于正确的输入-输出对应数据的显示上。特别是在强化学习中数据准确度不再被定义。在第一步,简单暴力算法计算出每个输入数据的价值,并选择最高的价值。
我们将重点关注监督式学习,因为移动平台上大部分机器学习问题都是用这种方式解决的。
要处理监督式学习问题,就需要以下几步:
定义训练样本的类型(输入与输出)
收集可能适合描述问题的训练样本
用人工神经网络理解的形式描述这些收集好的训练数据样本
用收集的数据训练网络
用测试数据集(未参与训练过程的数据)验证训练后的网络
到目前还好…但是网络到底是怎样训练的呢?
反向传播算法
监督式学习的目标是找出能最准确映射出输入集与输出集关系的函数。这就是发展反向传播算法的动机。反向传播是考虑到神经网络分支的权重,计算损失函数的梯度。听起来很复杂,但是让我们来简化它。
训练神经网络包含2步
为每个输入数据计算网络的响应与误差
把误差回传给上一层用以更新网络
在学习开始阶段,计算输出层误差。之后对每个误差的前一层,计算出各自神经元对这些误差产生了多大影响。如果你想输出你训练好的神经网络,你只需要用一个矩阵写出连接权重。这代表了这个著名的单词- 模型(MODEL)。你也许已经听说过,你可以把模型输入到你的iOS app中
那么你应该用哪种机器学习算法和方法解决你的任务呢?这个看情况。用机器学习创造一种解决方式的最复杂部分就是数据表示法。你需要为训练神经网络收集数据集。但是你还需要把这些数据转化为机器能理解的语言。很多任务都很难为机器学习算法选择好的特性。比如,我们想开发一个能从照片中检测车辆的程序。我们知道汽车有轮子,所以我们可以把照片中轮子的出现作为一个特性。然而在像素值中准确描述轮子的样子是很困难的。轮子本身有简单的几何图形,但是图像中也许轮子上有遮挡,或者金属部件的反光,使得在像素的概念中识别轮子变得困难。很多因素都可以影响一些信息,但是人类能够识别它们,而机器不能。这就是把机器学习应用到现实世界的最大问题之一。
如果你想建立训练人工神经网络,你研究神经元激励函数和神经网络架构与类型(前馈,循环,卷积…)。你可以使用现有的机器学习框架像TensorFlow或PyTorch。如果你想更深的理解机器学习,我建议你读一读Machine Learning for Humans.
这篇文章的下部分会涉及iOS上机器学习的更多实际经验,Core ML特性和怎样在你的iOS app上应用模型。
感谢Sinisa Cvahte为本文的贡献