编者按:Dave Smith使用Excel电子表格深入浅出地讲解了卷积神经网络(CNN)是如何识别人脸的。
当你入门的时候,可能觉得机器学习很复杂……甚至很可怕。另一方面,电子表格却很简单。电子表格并不酷炫,但却能避免分散你的注意力,同时帮助你以直观的方式可视化代码后面发生的事情。
我将循序渐进地通过电子表格(你可以通过下面的链接下载)向你展示卷积神经网络(CNN)是如何应用于计算机视觉任务的。其中包括一些数学,不过电子表格中包含了所有的公式。
https://drive.google.com/open?id=1TJXPPQ6Cz-4kVRXTSrbj4u4orcaamtpGvY58yuJbzHk
如果无法访问Google网盘,可以在论智公众号(ID: jqr_AI)后台留言excel获取替代下载地址。
这一电子表格模型查看一幅图像,分析它的像素,并预测是否是Elon Musk、Jeff Bezos、Jon Snow……显然这三位是天网的最大威胁。
终结者视觉——在电子表格中创建卷积神经网络
本文将介绍上图中的9个步骤,每个步骤都会使用类比的方法给你的直觉增压。
本文的目标是使用容易操作的电子表格,提供入门机器学习的简单路径,并向充满好奇心的读者展示尖端AI技术的奥秘。如果本文对你有帮助,请注册我创建的邮件列表,注册后可以收到更多后续的电子表格,帮助你入门机器学习和创建神经网络。
Facebook面部识别系统、某国奥威尔式的大规模监控系统、你的汽车(不久的将来)背后的基础都是计算机视觉。
让我们假装终结者的头脑里住着一个特别的侦探,名叫“夏洛克·卷积·福尔摩斯”。他的工作是仔细查看证据(输入图像),使用敏锐的眼神和推理能力(特征检测),预测图像中的人是谁,从而破案(正确分类图像)。
卷积网络架构
你将学习:
输入:计算机如何看
特征检测:像福尔摩斯一样思考
卷积数学:福尔摩斯的侦探工具
ReLU:非线性模式识别
最大池化:保留最重要的线索
扁平化:排列所有线索
全连接:完成案件拼图
Logit + Softmax:破案
交叉熵损失:福尔摩斯的“正/误”
天网的最大威胁——Elon Musk
我从上面的图像中看到了一个有远见的人。他一方面不断改善地球这颗星球,另一方面创建逃离地球的火箭,以防终结者试图摧毁地球。和计算机不同,我看不到像素值,也无法辨认出一张图像不过是红光、绿光、蓝光的堆叠:
另一方面,一台计算机(比如天网)是瞎的……它只能看到数字。
想象一下由3张电子表格(红、绿、蓝)堆叠构成的电子图像,每张表格是一个数字矩阵。拍照的时候,相机测量到达每个像素的红光、绿光、蓝光的量。接着它在0-255的范围内评估每个像素,然后将其记录到电子表格中。
计算机看到电子表格
上为一张28x28的图像,每个像素由三行(红、蓝、绿)表示,取值范围0-255. 每个像素的颜色对应其数值。
终结者没有看到眼睛,他看到的是一串数字
将每种颜色单独放到一个矩阵中,我们得到了3个28x28矩阵,也就是我们之后用来训练神经网络的输入:
模型输入
如果你想知道如何将任意图像转换成电子表格,请访问以下网址:
http://think-maths.co.uk/spreadsheet
你将学到如何得到一张“Ex拍”,你的Excel迷朋友们会喜欢的……相信我,在电子表格中找到你的马克杯(或者他们的)会让他们捧腹大笑的🤳 (小图效果最佳)。
你刚出生的时候知道狗是什么样的吗?当然不知道。但随着时间的推移,你的父母会给你看书中、动画片中、真实生活中的狗的图像,渐渐地,你可以指着那些4条腿、毛茸茸的动物说“狗”。你的大脑中数亿神经元间的连接变得足够强,所以你可以识别狗。
终结者以同样的方式学习识别Elon。在一个被称为监督训练的过程中,人们给终结者看数千张Elon Musk、Jeff Bezos、Jon Snow的图像。刚开始,它只能随便乱猜(1/3的几率猜对),渐渐地,就像小孩一样,随着它在训练过程中看到越来越多的图像,它猜得越来越准。网络的连接(也就是“权重/偏置”)随着时间的推移而更新,使得它可以基于像素输入预测输出。这是我上一篇文章中讨论过的学习过程(梯度下降)。
CNN训练周期
用两个词概括:平移不变性。
不知所云?让我们解构一下:
平移 = 将某物从一个地方移动到另一个地方
不变性 = 没有改变
在计算机视觉中,这意味着,不管对象移动到图像中的何处(平移),不会改变对象是什么(不变性)。
平移不变性(以及缩放不变性)
这需要训练卷积神经网络识别Elon的特征,不管Elon在图像中的位置在哪里(平移),也不管Elon在图像中的大小(缩放不变性)。
在普通神经网络中,我们本来会将每个像素作为模型的一个输入(而不是3个矩阵),但这忽略了相近的像素具有特别的意义和结构这一事实。在CNN中,我们查看像素组,这允许模型学习形状、线条等局部模式。比方说,如果CNN看到许多白像素包围一个黑圆圈,它会识别出眼睛这一模式。
为了达到平移不变性,CNN需要依靠它的特征侦探夏洛克·卷积·福尔摩斯的服务。
类比: 图像就像由像素组成的电子表格。
寻找特征的夏洛克
夏洛克住在终结者的头脑中。他每次使用放大镜仔细检查一小片图像,寻找图像的重要特征(“线索”)。在收集到简单的线条和形状之类的线索后,他将它们堆叠起来,开始看到眼睛或鼻子之类的面部特征。
每个卷积层储存基于另一层构建的一组特征映射。最后,夏洛克组合所有线索,这样他就可以破案了(识别目标)。
每个特征映射就像一条线索
网络的每个卷积层都包含一组特征映射,这些映射能够以下图所示的层次化的方式识别越来越复杂的模式/形状。
CNN基于数字的模式识别找到任意图像的最重要特征。随着CNN以更多的网络层不断堆叠这些模式,它可以创建非常复杂的特征映射。
特征层次
真实生活中的CNN和夏洛克做一样的事情:
CNN的奇妙之处在于可以自行学习这些特征……工程师不用编写寻找一双眼睛、一个鼻子、一张嘴的集合这样的代码。
以这种方式工作的工程师更像架构师,他们告诉夏洛克:“我给你两叠(‘卷积层’)空白特征映射(‘线索’),你的工作是分析图像,找出最重要的线索。第一叠有16个特征映射(‘线索’),第2叠有64个特征映射……现在发挥你的侦探技能,解决这个案件!”
类比: 每个特征映射就像案件中的一条线索。
为了查明案件中的“线索”(即计算特征映射),夏洛克需要依靠他的侦探工具箱中的一些工具,我们会逐一介绍:
过滤器 —— 夏洛克的放大镜 🔍
卷积数学 —— 过滤器权重 x 输入图像像素
步进 —— 沿着输入图像移动过滤器 🔍 ➡️ 🔍 ➡️
补齐 —— 保护线索的犯罪现场隔离胶带 🚧
毫无疑问,夏洛克非常敏锐,具备出色的观察技能,但是,如果没有那些特制的放大镜(过滤器),夏洛克没法完成他的工作。他使用不同的放大镜帮助填充每张空白特征映射的细节。所以,如果他有16个特征映射……他会有16块放大镜。
每块放大镜由多层玻璃组成,而每层玻璃由不同的权重组成。玻璃的层数,也就是过滤器深度,总是等于输入层的深度。
刚开始,夏洛克看到的输入图像有3层——红、绿、蓝。所以,放大镜也有3层。
随着我们进一步创建CNN,层的深度会增加,相应地,放大镜也会变厚。
为了创建1个特征映射(一条线索),夏洛克从取出一个放大镜,并置于输入图像的左上角开始。红层玻璃只能看到红输入图像,绿层玻璃只能看到绿图,而蓝层玻璃只能看到蓝图。
现在是数学部分。
特征映射中的每个像素是线索的一部分。为了计算每个像素,夏洛克需要进行一些基本的乘法和加法。
在下面的例子中,我们使用5x5x3的输入图像和3x3x3的过滤器,每个像素需要进行以下计算:
3x3x3过滤器每层的卷积乘法 = 27
将27个数字加起来
再加上1个数字——偏置
让我们仔细看下数学。一个像素需要27次乘法(3层,每层9次乘法),下面的截图显示了27次乘法中的9次:
分素相乘
至于偏置,你可以把它想象成放大镜的把手。像权重一样,它是模型的另一个参数,在训练过程中自动调整,以提高模型的精确度,并更新特征映射细节。
过滤器权重——在上面的例子中,我为了简化数学,将权重的值设为-1、0、1;然而,一般而言,你需要用较小的值随机初始化权重……比如0.01到0.1之间的值,基于钟形曲线或正态分布取样。想要了解更多权重初始化的知识,可以看这篇入门。
计算特征映射的第1个像素之后,夏洛克将把放大镜往哪移呢?
步进:每次移动放大镜1像素
答案取决于步进参数。作为架构师/工程师,我们需要告诉夏洛克,他应该将他的放大镜向右移动(步进)多少像素。实践中最常见的步长值为2或3,但出于简单性,这里我们将步长设为1. 这意味着夏洛克将放大镜向右移动1像素,然后进行和之前一样的卷积运算。
当他的放大镜到达输入图像的最右边时,他将放大镜移到最左,然后往下移动1像素。
步长为何大于1?
优点:更少运算,内存中储存的运算结果更少,从而使模型更快。
缺点:由于跳过像素有错过模式的潜在可能性,损失了关于图像的数据。
2或3步长通常是合理的,因为紧跟着一个像素的像素通常具有相似的值,而隔着2-3个像素的像素,更可能具有不同的值,这样的值对特征映射/模式而言可能很重要。
为了破案,夏洛克刚开始接触案件的时候需要大量线索。在我们上面的例子中,我们的输入为一张5x5x3的图像,或者75像素信息(75 = 5 x 5 x3),在第一个卷积层后,我们得到了一张3x3x2的图像,或者18像素(18 = 3 x 3 x 2)。这意味着我们损失了证据,这让夏洛克的搭档约翰·华生非常反感。
在CNN的刚开始几层,夏洛克倾向于查看大量细微模式(更多线索)。在靠后的卷积层中,随着夏洛克堆叠细微的线索,查看较大的模式,“降采样”也就是降低像素的总量(更少线索)没什么问题。
那么,在CNN刚开始的时候,我们如何预防这样的信息损失呢?
一、补齐——通过补齐图像保护犯罪现场
在上面的例子中,我们在撞上右边缘前,只能移动过滤器3次……从上往下同样如此。这意味着我们所得输出的高/宽为3x3,从左往右,损失了2像素,而从上往下又损失了2像素。
为了预防这种信息损失,常见的做法是用零“补齐”原始图像(称为全零补齐(zero padding或same padding))……有点类似用犯罪现场隔离胶带确保没人破坏证据。
补齐之后,如果夏洛克再次使用相同的放大镜,他的两个特征映射的大小会是5x5而不是3x3.
这意味着我们最终得到了50像素的信息(5x5x2=50)。
50像素比18要好。不过别忘了……我们刚开始有75像素,所以我们仍然错过了一些线索。
所以我们还能做什么让夏洛克和约翰·华生满意?
二、更多过滤器——至少在我们的卷积层中加上一个特征映射,给夏洛克更多线索
模型对特征映射(“线索”)的数量并没有限制……这是我们可以控制的超参数。
如果我们至少将特征映射从2增加到3(5x5x2到5x5x3),那么总输出像素(75)就和输入像素(75)相等了。如果我们将映射增加到10,那么我们会有更多信息供夏洛克探究(5x5x10 = 250)。
事情变得越来越有趣了
总结一下,刚开始几层的信息像素总数一般高于输入图像,因为我们想要给夏洛克尽可能多的细微模式/线索。在网络的最后几层,我们常常进行降采样,信息像素变少,这是因为这些层识别图像中较大的模式。
类比: 过滤器就像放大镜,而补齐就像犯罪现场隔离胶带。
给夏洛克足够的案件信息很重要,但现在到了进行真正的侦探工作的时候了——非线性模式识别!比如耳廓和鼻洞。
到目前为止,夏洛克进行了大量数学运算以构建特征映射,但所有运算都是线性的(在每个输入像素上进行一些乘法和加法操作),因此,他只能识别像素的线性模式。
为了给CNN引入非线性,我们将使用一种称为修正线性单元(Rectified Linear Unit)的激活函数,简称ReLU。在我们初次进行卷积运算得出特征映射后,每个值都通过这一函数,看看是否点亮/激活。
如果输入值是负数,那么输出将为零。如果输入值是正数,那么输出将和输入一样。ReLU就像一个开关,让特征映射的每个值通过ReLU之后,就创建了非线性模式识别。
回到我们原本的CNN例子,我们在卷积之后马上应用ReLU:
尽管有许多非线性激活函数可以为神经网络引入非线性(Sigmoid、Tanh、Leaky ReLU等),ReLU是CNN中目前最流行的激活函数,因为ReLU在算力上很高效,能加快训练。你可以参阅Andrej Karpathy的overview on non-linear activation functions了解每种函数的优劣(译者注:也可以参考理解神经网络的激活函数,同样比较了不同激活函数的优劣)。
类比: ReLU就像开关。
现在夏洛克有一些特征映射(“线索”)要查看,如何确定哪些信息是关键的,哪些信息是无关的细节?最大池化。
夏洛克认为人类的大脑就像一个空阁楼。傻瓜会在里面存放各种各样的家具和物品,让有用的信息在一堆杂物中不知所踪。而智者仅仅储存最重要的信息,从而在需要的时候可以快速做出决定。从这个意义上说,最大池化是夏洛克版的大脑阁楼。为了更快地做出决定,他只保留最重要的信息。
通过最大池化,夏洛克在相邻的像素中仅仅保留最大值,证据中最重要的部分。
例如,如果他查看一个2x2区域(4像素),他仅仅保留其中值最高的像素,丢弃其余3个像素。这一技术让他可以快速地学习,同时也有助于他概括(而不是“记忆”)可用于未来图像的线索。
和之前的放大镜过滤器类似,我们同样可以控制最大池化的步长和大小。在下面的例子中,我们将步长设为1,池化尺寸设为2x2:
最大池化之后,我们完成了1回合卷积/ReLU/最大池化。
典型的CNN在分类器之前会有若干回合卷积/ReLU/池化。在每一回合中,我们将在增加深度的同时挤压高/宽,这样我们不会在此过程中遗失证据。
第一步至第五步,我们专注于收集证据,现在是时候让夏洛克查看所有线索,侦破案件了:
现在我们已经有了证据,让我们开始挖掘证据的意义……
类比: 最大池化就像夏洛克的阁楼理论,保留关键信息,抛弃驳杂无用的信息。
在训练周期的末尾,夏洛克得到了堆积如山的线索,需要找到一下子查看所有线索的方式。每条线索不过是一个2维矩阵,但我们有堆叠在一起的数以千计的矩阵。
作为一名私家侦探,夏洛克很擅长应付这样的混沌,但他需要将证据呈上法庭,整理证据以供陪审团查看。
扁平化之前的特征映射
他通过一种简单的转换技术(称为扁平化)做到了这一点:
将每个由像素组成的2维矩阵转换为一列像素
将原本的二维矩阵(现在的一列像素)一个接一个地排列起来
在人类的眼睛看来,变换是这样的:
而在计算机看来,是这样的:
现在夏洛克已经整理好证据了,是时候说服陪审团证据清楚地指向一个嫌疑人。
类比:扁平化就像把证据呈上法庭。
在全连接层中,我们将方方面面的证据连接起来。某种意义上,我们完成案件的拼图,向评审团表明证据和每个嫌疑人之间的联系:
在计算机看来,全连接层是这样的:
在扁平层的每份证据和3个输出之前是一组权重和偏置。类似网络中的其他权重,这些值会在刚开始训练CNN的时候随机初始化,而随着时间的推移,CNN将“学习”如何调整这些权重/偏置以得到更精确的预测。
现在,到了夏洛克揭晓谜底的时间了!
类比:全连接层就像说服陪审团下决定。
在CNN的图像分类器阶段,模型的预测为得分最高的输出。模型的目标是让正确的输出得分最高,而让错误的输出得分较低。
评分分为两部分:
Logit分数——原始得分
Softmax——每个输出的概率(0-1之间)。所有输出得分之和等于1.
每个输出的Logit得分是一个基本的线性函数:
Logit得分 = (证据 x 权重) + 偏置
每片证据乘以连接证据至输出的权重。所有乘积相加,最后加上偏置项,得分最高的为模型的猜测。
所以,为什么不到此为止?直观地说,有两个原因:
夏洛克的置信度——我们想要知道夏洛克对结果有多自信,这样,当夏洛克的置信度很高同时他是正确的时候,我们会奖励他,而在夏洛克的置信度很高同时他是错误的时候,我们会惩罚他。我们在下一部分计算损失(“夏洛克的精确度”)时会具体讨论奖励/惩罚。
夏洛克的置信度加权概率——我们想要能够方便地解释这些0到1之间的概率,并且我们想要预测得分和实际输出(0或1)处于同一尺度。实际正确的结果(Elon)的概率为1,其他错误的结果(Jeff和Jon)的概率为0. 将正确输出转为一,错误输出转为零的过程称为独热编码。
夏洛克的目标是让他对正确输出的预测尽可能接近1.
2.1 夏洛克的置信度
为了得出夏洛克的置信度,我们以e(等于2.71828…)为底数,以logit得分为指数。这样,一个较高的得分将变为非常高的置信度,而一个较低的得分将变为非常低的置信度。
这番指数运算同时也确保了我们不会有任何负分(logit得分“可能”是负数)。
2.2 夏洛克置信度加权概率
为了得出置信度加权概率,我们将每个输出置信度除以所有置信度得分之和,这就确保了所有概率之和为1.
softmax分类器很直观。夏洛克认为有97%(置信度加权)的几率终结者查看的图像是Elon Musk.
模型的最后一步是计算损失。损失告诉我们侦探夏洛克到底有多棒(或者到底有多糟)。
类比:Logit + Softmax就像查看一排嫌疑人,并指出罪犯
所有神经网络都有一个损失函数,用来比较预测和实际值。在CNN训练的过程中,随着网络权重/偏置的调整,预测改进了(夏洛克的侦探技能变得更厉害了)。
CNN最常用的损失函数是交叉熵。用Google搜索交叉熵出现的一些解释都涉及大量希腊字母,很容易让人困惑。尽管这些描述各不相同,在机器学习的语境下它们都意味着一样东西,我们下面将介绍最常见的3种解释,便于你理解。
在描述每种公式变体之前,先概括一下它们的共同点:
比较正确分类的概率(Elon,1.00)和CNN的预测(Elon的softmax得分,0.97)。
当夏洛克对正确分类的预测接近1时(低损失),奖励他👏
当夏洛克对正确分类的预测接近0时(高损失),惩罚他👎
结果是一样的!3种不同的解释……
距离捕捉了以下直觉:如果对正确标签的预测接近1,那么损失接近0. 如果对正确标签的预测接近0,那么将受到严厉的惩罚。目标是最小化正确分类的预测(Elon,0.97)和正确分类的实际概率(1.00)的距离。
赏罚“对数”公式背后的直觉将在2号解释中讨论。
在CNN中,“对数”实际上指“自然对数(ln)”,它是softmax中以自然对数为底的指数的逆运算。
对夏洛克远离1.00的预测而言,相比直接从实际概率(1.00)中减去预测概率(0.97)来计算损失,对数运算将惩罚以指数级别加重了。
最小化负对数似然和最大化对数似然均导向softmax预测趋向1.0,损失趋向0.0的结果。
KL(Kullback-Leibler)散度衡量预测概率(softmax得分)和实际概率的差异。
KL散度的公式包括两部分:
实际概率的不确定性。
使用预测概率损失的信息量。
在监督学习分类问题的模型训练中,实际概率的不确定性总是等于0. 我们百分之百确定训练图像的分类无误。此时,最小化预测概率分布和实际概率分布之间的KL散度等价于最小化交叉熵。
类比:交叉熵损失就像评估夏洛克的侦探技能。
在夏洛克·卷积·福尔摩斯这位特别的侦探的帮助下,终结者有了一对能够搜索并摧毁自由世界的保护者Elon Musk的眼睛(对不住了,Elon!)。
虽然我们仅仅训练了终结者识别Elon、Jeff、Jon……天网有无穷多的资源,可以随意训练图像,因此天网可以利用我们创建的模型训练终结者识别任何人类和物体。
如果你喜欢本文,并想收到更多通过Excel进行机器学习的内容,可以访问excelwithml.com免费订阅邮件列表。
你也可以在Twitter上关注ExcelwithML。
画一个数字,查看CNN如何预测它:http://scs.ryerson.ca/~aharley/vis/conv/flat.html
用Google和你的摄像头训练自己的CNN: https://experiments.withgoogle.com/teachable-machine
Andreij Karpathy的实时图像分类模型:https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html
Fast.AI讲解CNN的视频(不可交互,不过是一个很好的讲座):https://www.youtube.com/watch?time_continue=2548&v=9C06ZPF8Uuc
在未来与机器的战争中,我们的命运就在你的手中😜
原文地址:https://towardsdatascience.com/cutting-edge-face-recognition-is-complicated-these-spreadsheets-make-it-easier-e7864dbf0e1a