前面留下关于智能网联汽车环境感知部分基于深度学习的目标检测的坑还没填,接下来两篇推送就来梳理一下基于深度学习的目标检测的具体实现,顺便再介绍下深度学习的发展历程。当然,这一切得先从人工智能开始谈起。
1)人工智能是研究模拟和扩展人类智能的理论、方法、技术及应用系统的一门交叉学科(学术角度)。
2)人工智能是智能机器执行的、与人类智能有关的智能行为,如感知、识别、判断、理解、设计、思考、学习和问题求解等思维活动(应用角度)。
3)近期目标:研究如问使系统能够胜任一些通常需要人类智能才能完成的复杂工作。
4)最终目标:探讨智能形成的基本机理,研究利用智能机器模拟人的思维过程。
机器学习是在人工智能的基础上发展起来,而深度学习又是在机器学习的基础上发展起来的。
1)弱人工智能:也称“专用人工智能”或限定领域人工智能",是指专注于某个特定领域,只能解决单一问题的人工智能,例如语音识别、图像识别、翻译等。
2)强人工智能:也称“通用人工智能”,是指能胜任人类所有工作的人工智能,有知觉,有自我意识,既可下棋、又可驾驶、考试、翻译、玩游戏等。
3)超人工智能:几乎所有领域都比最聪明的人类大脑聪明很多,包括科学创新、通识和社交技能。达到这个阶段的人工智能的计算和思维能力远超人脑。
在早期,许多专家认为只要程序员精心编写足够多的明确规则来处理知识,就可以实现与人类相当的人工智能。这一方法被称为符号主义人工智能,在20世纪80年代的专家系统热潮中,这一方法的热度达到了顶峰。
虽然符号主义人工智能适合用来解决定义明确的逻辑问题,比如下国际象棋,但它难以给出明确的规则来解决更加复杂、模糊的问题,比如图像分类、语音识别和语言翻译。于是出现了一种新的方法来代替符号主义人工智能,这就是机器学习。
虽然机器学习在20世纪90年代才开始蓬勃发展,但它迅速成为人工智能最受欢迎且最成功的分支领域。这一发展的驱动力来自于速度更快的硬件与更大的数据集。
计算机程序从经验E(程序与自己下几万次跳棋)中学习,解决某一任务T(下跳棋),进行某一性能度量P(与新对手玩跳棋时赢得概率),通过P测定在T上的表现因经验E而提高。
监督学习是目前最常见的机器学习类型。给定一组样本(通常由人工标注),它可以学会将输入数据映射到已知目标。比如手写体数字识别、分类问题、回归问题。一般来说,深度学习应用几乎都属于监督学习,比如光学字符识别、语音识别、图像分类和语言翻译。
虽然监督学习主要包括分类和回归,但还有其他主要包括:
序列生成。给定一张图像,预测描述图像的文字。序列有时生成有时可以被重新表示为一系列分类问题,比如反复预测序列中的单词或标记。
语法树预测。给定一个句子,预测其分解生成的语法树。
目标检测。给定一张图像,在图中特定目标的周围画一个边界框。这个问题也可以表示为分类问题。(给定多个候选边界框,对每个框内的目标进行分类)或分类与回归联合问题(用向量回归来预测边界框的坐标)。
无人驾驶环境感知可以根据这一原理来检测车辆、行人、交通标志等目标。
图像分割。给定一张图像,在特定物体上画一个像素级的掩模。
无人驾驶环境感知可以根据这一原理来检测车辆、行人、交通标志等目标。
注:分类包括二分类(比如电影评论的分类,经过训练的模型可以对一条新的评论给出是好评还是差评的预测。)和多分类(比如手写数字识别,经过训练的模型可以对一张新的手写体数字图像给出0-9之一的数字的预测。)
回归问题:比如现有某一处房价受面积、房间数和地理位置、年限等因素影响,待预测参数是房屋售价。根据现有的数据可以训练模型并预测出该处某个影响因素变化时对应房屋价格的具体变化值。
无监督序学习是指在没有目标的情况下寻找输入数据的有趣变换,其目的在于数据可视化、数据压缩、数据去躁或更好得理解数据中的相关性。无监督学习是数据分析的必备技能,在解决监督学习问题之前,为了更好地了解数据集,它通常是一个必要步骤。降维和聚类都是众所周知的无监督学习方法。
在强化学习中,智能体接收有关其环境的信息,并学会选择使某种奖励最大化的行动。例如,神经网络会“观察”视频游戏的屏幕并输出游戏操作,目的是尽可能得高分,这种神经网络可以通过强化学习来训练。
机器学习,特殊在学习。经典的程序设计往往是给定规则和数据得出预期的结果(比如给定变量a=1和变量b=1以及规则f(x)= a+b就可以得出预期的结果为2),而机器学习的编程范式则是给定数据和预期的结果,通过学习习得表示。
通常需要以下三个要素来进行机器学习。
1)输入数据点。例如你的任务是为图像添加标签(这张图像表示一只猫),那么这些数据点就是图像以及对应的标签(猫)。(今天新学了两节数学课)
2)预期输出的示例。对于图像标记任务来说,预期输出结果可能就是“猫”、“狗”之类的标签。(自己做数学作业的答案)
3)衡量算法好坏的方法。这一衡量方法为计算算法的正确输出与预期输出的差距。当然我们的目的是为了最小化差距。对于图像标记任务来说,机器学习模型预测输出的结果(标签)与正确结果(标签)一致所占总数的比例越高越好。(自己的答案与标准答案相比较)
机器学习的目的是得到可以泛化的模型,即在前所未见的数据上表现很好的模型。讨论机器学习模型学习和泛化的好坏时,通常使用术语:过拟合和欠拟合。(平时通过上课学习并做作业,目的是看考试结果如何)
过拟合是指在训练数据上表现良好,在未知数据上表现差。——高考复习太死,改一个数就不会做。
欠拟合在训练数据和未知数据上表现都很差。——高考复习不充分,啥也不会。
除模型评估外,我们还必须解决另一个重要问题:将数据输入神经网络之前,如何准备输入数据和目标?(必要的学习方法,听课更有效率、做作业效果更好)
1)向量化
神经网络的所有输入和目标都必须是浮点数张量。无论处理什么数据(声音、图像还是文本),都必须先将其转换为张量,这一步叫做数据向量化。
可以通过one-hot编码实现。
2)值标准化
一般来说,将取值相对较大的数据(比如多位整数,比网络权重的初始值大的多)或异质数据(比如数据的一个特征在0-1范围内,另一个特征在100-200范围内)。输入到神经网络中是不安全的。这么做可能导致较大的梯度更新,进而导致网络无法收敛。
可以通过对每个特征分别做标准化,使其均值为0、标准差为1。
特征工程是指将数据输入模型之前,利用你自己关于数据和机器学习算法的知识对数据进行硬编码的变换,以改善模型的效果。多数情况下,一个机器学习模型无法从完全任意的数据中进行学习。呈现给模型的数据应该便于模型进行学习。比如如何识别钟表时间?(每个学生对老师教授的内容理解程度不同,就会有不同的学习效果)
很明显第三种特征使问题变得非常简单,根本不需要机器学习,因为简单的舍入运算和字典查找就可以给出大致的时间。
这就是特征工程的本质:用更简单的方式表述问题,从而使问题变得更容易。它通常需要深入理解问题。
深度学习出现之前,特征工程曾经非常重要,因为经典的浅层算法没有足够大的假设空间来自己学习有用的表示。将数据呈现给算法的方式对解决问题至关重要。例如,卷积神经在MNIST数字分类问题上取得成功之前,其解决方法通常是基于硬编码的特征,比如数字图像中的圆圈个数、图像中每个数字的高度、像素值的直方图等。
幸运的是,对于现代深度学习,大部分特征工程都是不需要的,因为神经网络能够从原数据中自动提取有用的特征。这是否意味着,只要使用深度神经网络,就无须担心特征工程呢?并不是这样,原因有两点。
浏览器网页排序
过滤垃圾邮件
Facebook 或苹果的图片分类程序能认出你朋友的照片
浏览器开发者收集 web 上的单击数据,也称为点击流数据,并尝试使用机器学习算法来分析数据,
更好的了解用户,并为用户提供更好的服务
电子医疗记录。我们可以把医疗记录变成医学知识,我们就可以更好地理解疾病
计算生物学。生物学家们收集的大量基因数据序列、DNA 序列等,机器运行算法让我们更好地了解人类基因组
自然语言处理
计算机视觉
每次你去亚马逊或 Netflix 或 iTunes Genius,它都会给出其他电影或产品或
音乐的建议
有限样本和计算单元情况下对复杂函数的表示能力有限,针对复杂分类问题其泛化能力受限。
深度学习是机器学习的一个分支领域,它是从数据中学习的一种新方法,强调从连续的层中进行学习,这些层对应于越来越有意义的表示。“深度学习”中的“深度“指的并不是利用这种方法所获取的更深层次的理解,而是指一系列连续的表示层。数据模型中包含多少层,这被称为模型的深度。现代深度学习通常包含数十个甚至上百个连续的表示层,这些表示层全都是从训练数据中自动学习的。与此相反,其他机器学习的重点往往是仅仅学习一两层的数据表示,故有时也被称为浅层学习。
在深度学习中,这些不同层所学习到的表示总是通过叫做神经网络的模型来学习得到的。上图所示的深度神经网络将数字图像转换成与原始图像差异越来越大的表示 ,而其中关于最终结果的信息却越来越丰富。
神经网络中每层对输入数据所做的具体操作保存在该层的权重中,其本质是一串数字。用术语来说,每层实现的变换由其权重来参数化。权重有时也被称为该层的参数。在这种语境下,学习的意思是为神经网络的所有层找到一组权重值,使得该网络能够将每个示例输入与其目标正确的一一对应。(通过做查看例题并去尝试做一些课后习题)
想要控制一件事物,首先需要能够观察它。想要控制神经网络的输出,就需要能够衡量该输出与预期值之间的距离。这是神经网络损失函数的任务,该函数也叫目标函数。损失函数的输入是网络预测值与真实目标值,然后计算一个距离值,衡量该网络在这个示例上的效果好坏。(将自己课后习题的答案与标准答案作比较,得出准确率)
利用这个距离作为反馈信号对权重值进行微调,以降低当前示例对应的损失值。这种调节由优化器来完成,它实现了所谓的反向传播算法,这是深度学习的核心算法。(通过多做题,多请教别人等方法是自己的正确率越来越高)
一开始对神经网络的权重随机赋值,因此网络知识实现了一系列随机变换。其输出结果自然也和理想值相去甚远,相应地,损失值也很高。但随着网络处理的示例越来越多,权重值也在向正确的方向逐步微调,损失值也逐渐降低。这就是训练循环,将这种循环重复足够多的次数,得到的权重值可以使损失函数最小。具有最小损失的函数,其输出值与目标值尽可能的接近,这就是训练好的网络。也就是完成了所谓深度学习的过程。(最终达到能应付考试的能力)
先前的机器学习技术仅包含将输入数据变换到一两个连续的表示空间,通常使用简单的变换,比如SVM和或决策树。但这些技术无法得到复杂问题所需要的精确表示。因此,人们必须竭尽全力让初始数据更适合用这些方法来处理,也必须手动为数据设计好的表示层。这叫做特征工程。与此相反,深度学习完全将这个步骤自动化:利用深度学习,你可以一次性学习所有特征,而无需自己动手设计。这将原本复杂的多阶段流程替换为一个简单的、端到端的深度学习模型。
在实践中,如果想要通过重复连续应用浅层学习方法来达到多个连续表示层的效果,其收益会随着层数增加迅速降低。因为三层模型中最优的第一表示层并不是单层或双层模型中最优的第一表示层。深度学习的变革在于,模型可以在同一时间共同学习所有表示层,而不是依次连续学习。通过共同的特征学习,一旦模型修改某个内部特征,所有依赖于该特征的其他特征值都会相应地自动调节适应,无须人为干扰。
在带来第三次人工智能热潮,深度学习功不可没。总的来说,有这么几方面。
在21世纪前十年里,NVIDIA和AMD等公司投资数十亿美元来开发快速的大规模并行芯片(GPU),以便为越来越逼真的视频游戏提供图形显示支持。2007年,NVIDIA推出了CUDA,作为其GPU系列的编程接口。今天,NVIDIA TITAN X可以实现每秒进行6.6万亿次float32运算。这比一台现代笔记本电脑的速度快约350倍。
就数据而言,除了过去20年里存储硬件的指数级增长,最大的变革来自于互联网的兴起,它使得收集和分发用于机器学习的超大型数据集变得可行。
到21世纪前十年的末期,神经网络仍然很浅,仅使用一两个表示层,无法超越更为精确的浅层方法,比如SVM和随机森林。关键问题在于通过多层叠加的梯度传播。随着层数的增加,用于训练神经网络的反馈信号会消失。
这一情况在2009-2010年左右发生了变化,当时出现了几个很简单但很重要的算法改进,可以实现更好的梯度传播。
1)在早期,从事深度学习需要精通C++和CUDA,而他们只有少数人才能掌握。如今,具有基本的Python脚本技能,就可以从事高级的深度学习研究。这主要得益于TensorFlow的开发,以及Keras等用户友好型库的兴起。TensorFlow是符号式的张量运算的Python框架,支持自动求微分,这极大地简化了新模型的实现过程。Keras等用户友好型库则使深度学习变得像操纵乐高积木一样简单。
2)在Kaggle上,有一系列不断更新的数据科学竞赛,其中许多都涉及深度学习。公开竞赛是激励研究人员和工程师挑战极限的极好方法。研究人员通过通过竞争来挑战共同基准,这极大地促进了深度学习的兴起。
每种类型的网络都针对于特定的输入模式,某种架构能否解决某个问题,这完全取决于数据结构与网络架构的假设之间的匹配度。(比如有的知识点需要理解,有的知识点需要熟记,有的知识点了解就行)
向量数据:全连接层
图像数据:二维卷积神经网络
声音数据(比如波形):一维卷积神经网络(首选)或循环神经网络
文本数据:一维卷积神经网络(首选)或循环神经网络
时间序列数据:一维卷积神经网络或循环神经网络(首选)
其他类型的序列数据:循环神经网络或一维卷积神经网络。如果数据顺序非常重要(比如时间序列,但文本不是),那么首选循环神经网络。
视频数据:三维卷积神经网络(如果你需要捕捉运动物体),或者帧级的二维神经网络(用于特征提取)+循环神经网络或一维卷积神经网络(用于处理得到的序列)。
立体数据:三维卷积神经网络
密集连接网络是Dense层的堆叠,它用于处理向量数据(向量批量)。这种网络假设输入特征中没有特定结构:之所以叫密集连接,是因为Dense层的每个单元都和其他所有单元相连接。
密集连接网络最常用于分类数据,比如房价预测。它还用于大多数网络最终分类或回归的阶段。例如卷积神经网络最后通常是一两个Dense层,循环神经网络也是如此。
卷积神经网络能够查看空间局部模式,其方法是对输入张量的不同空间位置应用相同的几何变换。这样得到的表示具有平移不变性,这使得卷机层能够高效利用数据,并且能够高度模块化。
循环神经网络对输入序列每次处理一个时间步,并且自始至终保存一个状态。如果序列中的模式不具有时间平移不变性,(比如时间序列数据,最近的过去比遥远的过去更加重要),那么应该优先使用循环神经网络,而不是一维卷积神经网络。
深度学习已经取得了一下突破,它们都是机器学习历史上非常困难的领域。
深度学习模型并不理解它们的输入,至少不是人类所说的理解。我们自己对图像、声音和语言的理解是基于我们作为人类的感觉运动体验。机器学习模型无法获得这些体验。如果向神经网络展示与训练数据不一样的数据,它们可能会给出荒缪的结果。下图是一个基于深度学习的图像描述系统的失败案例。
极端泛化:人类只用很少的数据,甚至没有新数据,凭借自己的抽象和推理能力就可以适应从未体验过的新情况。我们可以将已知的概念融合在一起,来表示之前从未体验过的事物,比如绘制一匹穿着牛仔裤的马,或者想象我们中了彩票会做什么。
局部泛化:深度网络执行从输入到输出的映射,如果新的输入与网络训练时所见到的输入稍有不同,这种映射就会变得没有意义。
给出本文的思维导图,回忆一下~