保姆级基于深度学习的图像处理笔记(
内容为“计算机视觉知识体系的向前延伸 及 机器学习知识体系的向后延伸”的概念性普及
深度学习的研究现状 目前
计算机视觉(CV,computer vision) 自然语言处理(Natural Language Process, NLP) 语音识别(Speech Recognition) 并列为
人工智能(AI,artificial intelligence)- 机器学习(ML,machine learning)- 深度学习(DL,deep learning)方向的三大热点方向,是深度学习算法应用最广泛的三个主要研究领域
图像分类、目标检测、图像分割则是计算机视觉领域的三大任务
深度学习在图像识别领域研究现状 对于图像的处理是深度学习算法最早尝试应用的领域。早在1989年,加拿大多伦多大学教授Yann LeCun(杨立昆)就和他的同事提出了卷积神经网络(Convolutional Neural Networks, CNN)它是一种包含卷积层的深度神经网络模型。通常一个卷机神经网络架构包含两个可以通过训练产生的非线性卷积层,两个固定的子采样层和一个全连接层,隐藏层的数量一般至少在5个以上。CNN的架构设计是受到生物学家Hube和Wiesel的动物视觉模型启发而发明的,尤其是模拟动物视觉皮层的V1层和V2层中简单细胞和复杂细胞在视觉系统的功能。起初卷积神经网络在小规模的问题上取得了当时世界最好成果。但是在很长一段时间里一直没有取得重大突破。主要原因是卷积神经网络应用在大尺寸图像上一直不能取得理想结果,比如对于像素数很大的自然图像内容的理解,这使得它没有引起计算机视觉研究领域足够的重视。2012年10月,Hinton教授以及他的学生采用更深的卷神经网络模型(通过CNN网络架构的AlexNet )在著名的ImageNet问题上取得了世界最好结果,使得对于图像识别的领域研究更进一步
Hinton构建深度神经网络取得惊人成果主要是因为对算法的改进,在网络的训练中引入了权重衰减的概念,有效的减小权重幅度,防止网络过拟合。更关键的是计算机计算能力的提升,GPU加速技术的发展,使得在训练过程中可以产生更多的训练数据,使网络能够更好的拟合训练数据。2012年国内互联网巨头百度公司将相关最新技术成功应用到人脸识别和自然图像识别问题,并推出相应的产品。现在的深度学习网络模型已经能够理解和识别一般的自然图像。深度学习模型不仅大幅提高了图像识别的精度,同时也避免了需要消耗大量时间进行人工特征的提取,使得在线运行效率大大提升
计算机视觉可以解决的问题 如何从图像中解析出可供计算机理解 的信息,是计算机视觉 (Computer Vision) 的中心问题。深度学习模型由于其强大的表示能力,加之数据量的积累和计算力的进步,成为机器视觉的热点研究方向。那么,如何理解一张图片呢?根据任务的需要,有图中所示三个主要的层次(图像分析的三个层次):
分类 分类+定位 目标检测 分割 分类 分类+定位 目标检测 分割 一是分类(Classification) : 即是将图像结构化为某一类别的信息,用事先确定好的类别(category)或实例ID来描述图片。这一任务是最简单、最基础的图像理解任务,也是深度学习模型最先取得突破和实现大规模应用的任务。其中,ImageNet是权威的评测集,每年的ILSVRC催生了大量的优秀深度网络结构,为其他任务提供了基础。在应用领域,人脸、场景的识别等都可以归为分类任务(将整幅图片分成“人”、“动物”、“户外”等类别 ,CAT OR DOG (并不知道位置),输入图像,输出类别 )
分类+定位:可以分类+框框确定位置(检测图像中的目标并在其周围画一个矩形,例如一个人或一只羊)
二是检测(Detection) :分类任务关心整体,给出的是整张图片的内容描述,而检测则关注特定的物体目标,要求同时获得这一目标的类别信息和位置信息(classification + localization)。相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因此检测模型的输出是一个列表,列表的每一项使用一个数组给出检出目标的类别和位置(常用矩形检测框的坐标表示)。(可以对目标分类,可以对目标定位,同时把每一个物体单独拎出来识别,输入图像,输出每一个物体 )
三是分割(Segmentation) :图像分割:把图像抠出来,像素级识别分割
图像分割 分类 目标检测 分割 分类 目标检测 分割 语义分割 (Semantic Segmentation):将图像中的所有像素划分为有意义的对象类。这些类是“语义上可解释的”,并对应于现实世界的类别。例如,可以将与猫相关的所有像素分离出来,并将它们涂成绿色。这也被称为dense预测,因为它预测了每个像素的含义(不管 像素是属于哪几个物体,仅仅是属于什么类别)
实例分割 (Instance Segmentation):标识图像中每个 对象的每个实例。它与语义分割的不同之处在于它不是对每个像素进行分类。如果一幅图像中有三辆车,语义分割将所有的车分类为一个实例,而实例分割则识别每一辆 车(将物体每一个区分,区分同一类别不同物体的像素)
传统的机器视觉图像分割方法 还有一些过去常用的图像分割方式(HOG特征),与其并列的图像增强 ,图像特征提取,图像的几何变换等 可以归结为数字图像处理领域 (机器学习 Machine vision(MV) ),但效率不如深度学习驱动的目标检测 技术,因为它们使用严格的算法,需要人工干预和专业知识
计算机视觉 :属于计算机"科学",从一张图像或一系列图像中自动提取、分析和理解有用信息,研究如何使计算机从数字图像或视频中获得高层次的理解。从工程学的角度来看,它试图自动化人类视觉系统能够完成的任务机器视觉 :一门系统工程"学科",这一领域包括大量的技术、软件和硬件产品、综合系统、行动、方法和专门知识,用于自动从图像中提取信息的技术和方法(每个对象的id、位置和方向)机器视觉 主要是提取信息(高精度信息),计算机视觉 提取并理解信息(视觉理解)这些包括:
阈值 - 将图像分割为前景和背景。指定的阈值将像素分为两个级别之一,以隔离对象。阈值化将灰度图像转换为二值图像或将彩色图像的较亮和较暗像素进行区分K-means聚类 - 算法识别数据中的组,变量K表示组的数量。该算法根据特征相似性将每个数据点(或像素)分配到其中一组。聚类不是分析预定义的组,而是迭代地工作,从而有机地形成组基于直方图的图像分割 - 使用直方图根据“灰度”对像素进行分组。简单的图像由一个对象和一个背景组成。背景通常是一个灰度级,是较大的实体。因此,一个较大的峰值代表了直方图中的背景灰度。一个较小的峰值代表这个物体,是另一个灰色级别边缘检测 - 识别亮度的急剧变化或不连续的地方。边缘检测通常包括将不连续点排列成曲线线段或边缘。例如,一块红色和一块蓝色之间的边界深度学习助力图像分割方法 现代图像分割技术以人工智能-机器学习-深度学习技术为动力,下面从0开始做笔记
(由于其知识体系太过庞大,以下笔记为机器学习与深度学习(神经网络)方向,范围涵盖从人工智能向下拓展的深度学习普及版知识包括但不限于图像处理部分(主要),图像处理的目标检测部分在YOLO项目中着重笔记 ,神经网络部分则在神经网络笔记记录 )
计算机视觉-深度学习所需要的知识体系 数学 编程语言 深度学习框架 硬件 环境等 计算机视觉-深度学习所需要的知识体系 数学 编程语言 深度学习框架 硬件 环境等 人工智能(Artificial Intelligence,AI) 官方概念 人工智能 (Artificial Intelligence,AI) 是计算机科学的一个分支,英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学
通俗解释 是对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。
举例 计算机视觉,自然语言处理,对话式AI(识图,语音转文字,Siri)
平衡野生动物保护和经济发展需求需要准确监测受保护的濒危物种的数量。 依靠人类专家正确识别所涉及的动物或在足够长的时间内监测大片区域以获得准确的计数可能并不可行。 事实上,人类观察员的参与可能会让动物不敢出没,影响监测效果。 在这种情况下,可以训练一个预测模型,用它来分析由分布在远程位置上的运动激活摄像机拍摄的图像数据,预测照片中是否有这种动物出现。 然后,可将该模型用于软件应用程序中,该应用程序可对动物的自动识别做出响应,以跟踪大面积地理区域内的动物出没情况,识别种群密集区域,并可将这些区域列为候选保护区(机翻)
该领域的研究包括 机器人、语言识别、图像识别、自然语言处理和专家系统(智能计算机程序系统)等
功能 说明 (Azure学习文档中概述的人工智能)视觉感知 能够使用计算机视觉功能接受、解释和处理图像、视频流和实时摄像机的输入信息 文本分析 能够使用自然语言处理 (NLP)“读取”基于文本的数据,并可从中提取语义 语音 能够将语音识别为输入,并能合成语音输出。 将语音功能与对文本应用 NLP 分析的功能相结合后,实现了一种称为“对话式 AI”的人机交互形式,在这种形式中,用户可以与 AI 代理(通常称为“机器人”)进行交互,就像与真人交互那样 进行决策 能够利用过去的经验和学习的相关性来评估情况和采取适当措施。 例如,识别传感器读数异常,并采取自动措施防止故障或系统损坏
机器学习(Machine Learning,ML) 机器学习是AI或是人工智能的一个子集,也是世界上最热门的话题之一。传统的智能洗衣机、手机、汽车、电脑、宇宙飞船等这些“智能”设备或机器。虽然有智能,他们的外部行为和内部的逻辑都是预先设计好的,自从它们被生产出来后,他们的行为都是可预期的,直到报废。如果有一天或有一次,它们的行为与预期不一样,我们称之为bug
上面的智能机器没有“学习”能力,它们的智能行为是由软、硬件工程师们赋于的
举个例子,我们需要一个程序来扫描一个图像,让程序判断他是一只猫还是一只狗, 传统的编程会变得过于复杂 ,需要想出很多的规则来制定具体的曲线,判断图像的边缘和颜色,以判断它是一只猫还是一只狗,这时把图片换成黑白的,程序的规则可能就不会奏效,他们可能会崩溃,或者这张猫或狗的照片我们之前没有预测的角度,然后就需要重写他们,所以解决这个问题使用传统的编程技术会变得过于复杂,假如此时我们需要软件支持三种动物,猫狗还有马,之前所有的程序就会行不通
机器学习是一种技术,为了解决这些问题,它的原理是创建一个模型,给他大量的数据
举个例子,我们给他成千上万的图片,猫和狗,我们的模型会发现并学习模式和输入数据,所以我们可以给他一种我们以前没见过猫的新照片,问他,他是一只猫,一只狗,还是一匹马,他会告诉我们一定程度的准确度,我们给他输入的数据越多,准确度就越高,这就是所谓的模型
机器有了“学习”能力之后,人工智能的工程师们,不再需要预先 给机器设计所有场景 下的所有 行为,他们只需要给机器设计好不同场合的“学习”的方法,正所谓“授人以鱼不如授人以渔”
有了学习能力之后,机器就能够通过学习使得自己具备原先不具有的能力
机器学习与人的相似性 机器学习与人的相似性 概念 机器学习(Machine Learning,ML)是一种实现人工智能的方法。是使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测
机器学习除了猫猫狗狗识别,它的其他应用又包括
自动驾驶汽车 Self-driving Cars 机器人技术 Robotics 语言处理 Language Processing 视觉处理 Vision Processing 预测股票市场趋势,天气,游戏等等 这就是机器学习的基本思想
遵循的步骤 机器学习有很多步骤
第一步是导入我们的数据 import the Data ,通常是csv文件或者图片,也就是数据集
需要对数据进行清理,涉及到重复数据之类的任务 ,Clean the Data ,如果数据中有重复或者不完整的我们不希望将其输入到模型中,否则,我们的模型会在我们的数据中学习错误的模式,产生错误的结果,因此我们应该确保数据是良好的,干净的。如果我们的数据是文本,是图片,我们需要把他们转换成数值,所以这一步取决于我们处理的数据类型,每个项目是不同的
现在我们已经有了一个干净的数据集,我们需要把他分割开,分为两个部分,一个用于训练我们的模型,另一个用于验证我们的模型,确保我们的模型产生正确的结果 Split the Data into training / Test Sets ,比如1000张猫和狗的照片,我们可以保留80%用于训练,20%用于测试
下一步是创建一个模型 Create a Model 这涉及到选择一种分析数据的算法,有很多中机器学习的算法,比如决策树,神经网络等等,每个算法在准确性和性能方面都有优点和缺点,所以使用的算法,取决于问题的类型。你正在尝试解决你输入的数据,现在好消息是我们不需要显式的编写一个算法,有一个库提供这些算法,所以我们使用算法来构建一个模型
接下来我们需要训练我们的模型,Train the Model 所以我们给它提供训练数据,然后我们的模型会寻找数据中的模式
所以我们可以让它做出预测 Make Predictions ,回到猫狗的例子中,我们可以询问我们的模型是一只猫还是一只狗,模型会对此做出预测,但是预测并不总是准确的。事实上我们刚开始的时候,预测很有可能是不准确的
因此,我们需要对预测进行评估,并衡量他们的准确性 Evaluate and Improve
然后我们需要回到我们的模型或者选择一个不同的算法,这回为我们所需要解决的这些问题产生更准确的结果,或者通过微调 finetune 我们的模型参数,所以每个算法都有我们可以修改的参数来优化
重点来了:
从预测值的类型上来区分,连续变量的预测称为回归,离散变量的预测称为分类,例如
预测房价的价格是一个 回归任务
预测一张图片是猫还是狗的图片是一个 分类任务
回归和分类是机器学习可以解决两大主要问题
传统的机器学习算法在指纹识别、基于Haar的人脸检测、基于HoG特征的物体检测等领域的应用基本达到了商业化的要求或者特定场景的商业化水平(但每前进一步都异常艰难,直到深度学习算法的出现)
举例 京东,网易云音乐等推荐(无监督学习)
与传统编程的区别 传统的视觉检测是对程序进行硬编码,也就是人工分析图片的特征,通过图像算法提取特征,然后通过特征的数值来区分物品。在分析的时候不需要大量的图片,只需要几种分类的典型图片。写好固定的程序函数。进行计算,人工分析在整个过程当中起到了主导的作用。在机器学习中,是专门研究计算机怎样模拟或实现人类的学习能力,使用数据来训练机器学习模型,这些模型可以根据它们在数据中找到的关系进行预测和推断,留给机器去学习数据
也就是说
程序员无法预先知道输入 和输出 之间的对应的数学模型和相应的参数、逻辑关系的场合 输入与输出之间压根里就没有明确的、单一的数学关系或逻辑关系 机器学习的过程 学习内容:数据集 在当今世界,我们在日常生活中会创建大量数据。 从我们发送的短信、电子邮件和社交媒体帖子,到我们用手机拍摄的照片和视频,我们产生了大量信息。 我们的房屋、汽车、城市、公共交通基础设施和工厂中的数百万个传感器也在创建更多数据
数据科学家可使用所有这些数据来训练机器学习模型,这些模型可以根据它们在数据中找到的关系进行预测和推断
这些素材,在机器学习领域,称它们为“数据集”
而数据集中其中的一部分称为“样本”
数据集可以分为训练集,验证集,测试集
训练集 机器学习中这三种数据集合非常容易弄混,特别是验证集和测试集
训练集是最好理解的,用来训练模型内参数的数据集,迭代优化目标函数,分类器直接根据训练集来调整自身获得更好的分类效果
验证集用于在训练过程中检验模型的状态,收敛情况。验证集通常用于调整超参数 (超 参数是一个参数,其值用于控制学习过程。相比之下,其他参数(通常是节点权重)的值是通过训练得出的 「深度学习-神经网络」学习笔记🎁-3️⃣ ),根据几组模型验证集上的表现决定哪组超参数拥有最好的性能
同时验证集在训练过程中还可以用来监控模型是否发生过拟合 (下文有图非常直观 ),一般来说验证集表现稳定后,若继续训练,训练集表现还会继续上升,但是验证集会出现不升反降的情况,这样一般就发生了过拟合。所以验证集也用来判断何时停止训练
测试集测试集用来评价模型泛化能力( 把学习到的内容,应用到新的领域的能力 ) ,即之前模型使用验证集确定了超参数,使用训练集调整了参数,最后使用一个从没有见过的数据集来判断这个模型是否正常工作
三者区别形象上来说 训练集 就像是学生的课本,学生 根据课本里的内容来掌握知识, 验证集 就像是作业,通过作业可以知道 不同学生学习情况、进步的速度快慢,而最终的 测试集 就像是考试,考的题是平常都没有见过,考察学生举一反三的能力
为什么要测试集训练集直接参与了模型调参的过程,显然不能用来反映模型真实的能力,这样一些 对课本死记硬背的学生(过拟合)将会拥有最好的成绩,显然不对。同理,由于验证集参与了人工调参(超参数)的过程,也不能用来最终评判一个模型,就像刷题库的学生也不能算是学习好的学生是吧。所以要通过最终的考试(测试集)来考察一个学(模)生(型)真正的能力
在这里记录一些数据集获取的途径:
VOC与COCO数据集 同时,深度学习常用的数据集有VOC数据集和COCO数据集两种
PASCAL VOC挑战赛是一个世界级的计算机视觉挑战赛,在VOC数据集中主要有 Object Classification 、Object Detection、Object Segmentation、Human Layout、Action Classification 这几类子任务。PASCAL VOC 2007 和 2012 数据集总共分 4 个大类:vehicle、household、animal、person,总共 20 个小类(加背景 21 类)
MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集,与ImageNet竞赛一样,被视为是计算机视觉领域最受关注和最权威的比赛之一。COCO数据集是一个大型的、丰富的物体检测,分割和字幕数据集。这个数据集以scene understanding为目标,主要从复杂的日常场景中截取,图像中的目标通过精确的segmentation进行位置的标定。图像包括91类目标,328,000影像和2,500,000个label。目前为止有语义分割的最大数据集,提供的类别有80 类 ,有超过33 万张图片,其中20 万张有标注,整个数据集中个体的数目超过150 万个。对于目标检测来讲,常用的COCO数据集版本是2014和2017,其中2017版本的下载链接如下:
train_2017:http://images.cocodataset.org/zips/train2017.zip val_2017:http://images.cocodataset.org/zips/val2017.zip test_2017:http://images.cocodataset.org/zips/test2017.zip 训练集和验证集的标签:
http://images.cocodataset.org/annotations/annotations_trainval2017.zip
学习教材:数据标注 在机器学习领域,数据集对应的标准答案,科学家们称之为“数据标注”
定义这些这些标准答案的过程,称为“打标签”
教学对象:机器的学习模型 学习过程将不断修改建立的数学 模型 ,直到它能够做出高质量的估测。 为了确定模型的表现,模型学习过程将以成本函数(也称为目标函数)的形式运用数学运算。而用数学模型来模拟人的神经网络 ,成为现在机器学习领域的主流的方法
我们想要最小化或最大化的函数称为目标函数。当我们最小化它时,我们也可以将其称为成本函数、损失函数(「深度学习-神经网络」学习笔记🎁-3️⃣)或误差函数——这些术语是同义词
损失函数(Loss Function) :通常是在数据点、预测和标签上定义的函数,并衡量惩罚(针对单个样本,衡量单个样本的 预测值 与 真实值 之间的差距)
代价函数/成本函数(Cost Function) :损失函数加上一些模型复杂度损失(正则化)的总和(针对多个样本,衡量多个样本的 预测值 与 真实值 之间的差距)
目标函数(Objective Function):梯度下降 ( 「深度学习-神经网络」学习笔记🎁-3️⃣ ) 等优化算法就是针对目标函数来进行的。是训练期间优化的任何函数的最通用术语,其实成本函数就可以是一种目标函数,换句话说,目标函数可以直接选用成本函数。通常,我们经常给成本函数添加一个正则化项 ( 「深度学习-神经网络」学习笔记🎁-3️⃣ ) ,最终作为模型的目标函数。目标函数是一个很广泛的称呼,我们一般都是先确定目标函数,然后再去优化它。比如在不同的任务中,目标函数可以是
最大化后验概率MAP(比如朴素贝叶斯) 最大化适应函数(遗传算法) 最大化回报/值函数(增强学习) 最大化信息增益/减小子节点纯度(CART 决策树分类器) 最小化平方差错误成本(或损失)函数(CART,决策树回归,线性回归,线性适应神经元) 最大化log-相似度或者最小化信息熵损失(或者成本)函数 最小化hinge损失函数(支持向量机SVM) 有点混乱的话我们总结一下:
损失函数是成本函数的一部分, 成本函数是 目标函数的一种
话虽如此,这些术语远非严格 ,并且根据上下文,研究小组,背景,可以转移并以不同的含义使用。主要共同点是“损失”和“成本”函数是想要最小化的东西,而目标函数是想要优化的东西(可以是最大化或最小化)
比较两个成本函数 让我们举例比较两个简单常见的成本函数:平方差之和(SSD)和绝对差之和(SAD)。它们都计算每个预测值与期望值之间的差异。区别很简单:
SSD 对差值求平方并对结果求和 SAD 将差异转换为绝对差异(绝对值),然后将它们相加 让我们比较一下两个成本函数如何影响模型拟合
这些成本函数描述了拟合模型的“最佳”方式
其中模型还有优化器的概念,优化器 的作用是通过改进模型性能的方式来对其进行修改。 为此,它会检查模型输出和成本,并为模型推荐新参数
例如,假设一个环境保护组织需要志愿者使用手机应用来对不同种类的野花进行识别和分类。 以下动画展示了如何使用机器学习来实现此方案
一个由植物学家和科学家组成的团队收集有关野花样本的数据(数据) 并对样本的物种进行正确标记(标注,打标签:是用“基本事实”来注释图像的过程) 使用算法对标记的数据进行处理,该算法可以找出样本特征与标记的物种之间的关系(训练,优化迭代目标函数) 该算法的结果内嵌在模型中(模型) 志愿者发现新样本后,该模型可以正确识别物种标记(推理)
学习方式 监督式学习(supervised learning) 监督学习有四个关键组成部分:数据、模型、成本函数和优化器 监督学习有四个关键组成部分:数据、模型、成本函数和优化器 监督式:有标签数据,(用人为确定的基本事实)输入模型,并增强泛化能力(模型对新鲜样本的适应能力)
学习:用大量参数对数据集进行非线性拟合的过程
可以将监督式学习看作是根据示例进行学习。输入数据被称为“训练数据”,每组训练数据有一个明确的标识或结果, 监督式学习建立一个学习过程,将预测结果与“训练数据”的实际结果进行比较,优化器 不断的调整预测模型,直到模型的预测结果达到一个预期的准确率
特征,作为输入提供给模型 (邮件,数字,电脑) 标签,即希望模型能够生成的正确答案 (垃圾邮件,3,联想电脑) 常见算法 监督式学习的常见应用场景是分类问题 (猫还是狗)和回归问题 (天气预测) ,常见算法有:
决策树和随机森林 K-邻近算法(KNN) 支持向量机(SVM) 逻辑回归(Logistic Regression) 朴素贝叶斯 集成学习 LSTM BP神经网络(Back Propagation Neural Network) CNN模型 线性回归(Linear Regression) 非监督式学习(unsupervised learning) 在非监督式学习中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构
我们训练模型来解决我们并不知道正确答案的问题。 事实上,非监督式学习通常用于那种没有正确答案而只论解决方案好坏的问题
假设我们想让机器学习模型画出逼真的雪崩救援犬图片。 无法画出一张“正确”的图。 只要图像看起来有点像狗,我们就会感到满意。 但如果生成的图像是一只猫,则这是一个更糟糕的解决方案
在非监督式学习中,目标函数仅根据模型的估计值做出判断。 这意味着目标函数通常相对复杂。 例如,目标函数可能需要包含“小狗检测程序”,用于评估模型绘制的图像看起来是否逼真
无监督学习处理的是无标签或结构未知的数据 。用无监督学习技术,可以在没有已知结果变量或奖励函数的指导下,探索数据结构来提取有意义的信息。例如无监督学习应该能在不给任何额外提示的情况下,仅依据所有“猫”的图片的特征,将“猫”的图片从大量的各种各样的图片中将区分出来
(举例)在猫的识别中,我们来尝试提取猫的特征:皮毛、四肢、耳朵、眼睛、胡须、牙齿、舌头等等。通过对特征相同的动物的聚类,可以将猫或者猫科动物聚成一类。但是此时,我们不知道这群毛茸茸的东西是什么,我们只知道,这团东西属于一类,兔子不在这个类(耳朵不符合),飞机也不在这个类(有翅膀)
(举例)有很多违法行为都需要”洗钱”,这些洗钱行为跟普通用户的行为是不一样的,到底哪里不一样? 如果通过人为去分析是一件成本很高很复杂的事情,我们可以通过这些行为的特征对用户进行分类,就更容易找到那些行为异常的用户,然后再深入分析他们的行为到底哪里不一样,是否属于违法洗钱的范畴
常见算法 非监督式学习常见的应用场景包括关联规则的学习以及聚类等 ,常用算法有
Apriori算法 k均值聚类算法(k-Means算法) 高斯混合模型(GMM) 层次聚类 密度聚类 谱聚类 监督式学习和非监督式学习之间的唯一区别在于目标函数的工作方式
半监督式学习 在此学习方式下,输入数据部分被标识,部分没有被标识,这种学习模型可以用来进行预测,但是模型首先需要学习数据的内在结构以便合理的组织数据来进行预测。应用场景包括分类和回归 ,算法包括一些对常用监督式学习算法的延伸,这些算法首先试图对未标识数据进行建模,在此基础上再对标识的数据进行预测。
假设上图中红点和蓝点表示两类数据class1,class2。绿点表示没有被标记的数据。如果现在我们用支持向量机(SVM),仅对有标记的数据分类,那么分割线如左图所示。但是其实真是情况是,如果我们不忽略为做标记的数据,数据的分布其实是如右图所示的。那么一个更好的划分线也应该是如右图所示的垂直线。这就是半监督学习的基本原理
常见算法 图论推理算法(Graph Inference) 拉普拉斯支持向量机(Laplacian SVM.)等 强化学习(Reinforcement Learning) 灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预期,产生能获得最大利益的习惯性行为
在这种学习模式下,输入数据作为对模型的反馈,不像监督模型那样,输入数据仅仅是作为一个检查模型对错的方式,(强化学习的反馈并非标定过的正确标签或数值,而是奖励函数对行动度量的结果。智能体可以与环境交互完成强化学习,并通过探索性的试错或深思熟虑的规划来最大化这种奖励)在强化学习下,输入数据直接反馈到模型,模型必须对此立刻作出调整
(举例)计算机实现从一开始什么都不懂,脑袋里没有一点想法,通过不断地尝试, 从错误中学习,最后找到规律,学会了达到目的的方法。这就是一个完整的强化学习过程。实际中的强化学习例子有很多,比如有名的 Alpha go,机器头一次在围棋场上战胜人类高手,让计算机自己学着玩经典游戏 Atari,这些都是让计算机在不断的尝试中更新自己的行为准则,从而一步步学会如何下好围棋,如何操控游戏得到高分
(补充)采用的是边获得样例边学习的方式,在获得样例之后更新自己的模型,利用当前的模型来指导下一步的行动,下一步的行动获得reward之后再更新模型,不断迭代重复直到模型收敛。在这个过程中,非常重要的一点在于“在已有当前模型的情况下,如果选择下一步的行动才对完善当前的模型最有利”,这就涉及到了两个非常重要的概念:探索(exploration)和开发(exploitation),exploration是指选择之前未执行过的actions,从而探索更多的可能性,exploitation是指选择已执行过的actions,从而对已知的actions的模型进行完善
强化学习作为一个序列决策(Sequential Decision Making)问题,它需要连续选择一些行为,就是代理(Agent)和环境(Environment)在一个时间序列的循环里相互作用的过程。 从这些行为完成后得到最大的收益作为最好的结果。代理会通过当时所处的环境和奖励[State,Reward]来采取行动。生成下一个阶段的状态(state)并反馈奖励(Reward)。代理的终极目标(Goal of Agent)是所有未来奖励之和最大化 (maximize Expected Sum of all future Rewards)。 它在没有任何label告诉算法应该怎么做的情况下,通过先尝试做出一些行为——然后得到一个结果,通过判断这个结果是对还是错来对之前的行为进行反馈
智能体(Agent): 强化学习的本体,作为学习者或者决策者。执行命令的个体 环境(Environment): 强化学习智能体以外的一切,主要由状态集组成。个体执行命令所在的物理世界 状态(States): 表示环境的数据。状态集是环境中所有可能的状态。个体当前所处的环境 动作(Actions): 智能体可以做出的动作。动作集是智能体可以做出的所有动作。代理采取的行动 奖励(Rewards): 智能体在执行一个动作后,获得的正/负奖励信号。奖励集是智能体可以获得的所有反馈信息,正/负奖励信号亦可称作正/负反馈信号。每个行动,环境反馈给的奖励(有正奖励和负奖励) 策略(Policy) : 强化学习是从环境状态到动作的映射学习,该映射关系称为策略。通俗地说,智能体选择动作的思考过程即为策略。 如果让代理根据不同的环境采取不同的行动 目标(Value) : 智能体自动寻找在连续时间序列里的最优策略,而最优策略通常指最大化长期累积奖励。 在某个环境下采取某种行动带来的未来价值 P = 一个由状态 - 行动的函数,意即:这函数对给定的每一个状态,都会给出一个行动
可以把强化学习看作一个与监督学习相关的领域
常见算法 强化学习常见的应用场景包括动态系统以及机器人控制等,算法包括
Q-Learning 时间差学习(Temporal difference learning) 总结 监督学习 vs 无监督学习 最普遍的一类机器学习算法就是分类(classification),对于分类,输入的训练数据有特征(feature),有标签(label)
学习的本质就是找到特征和标签间的关系(mapping)。这样当有特征而无标签的未知数据输入时,我们就可以通过已有的关系得到未知数据标签
在上述的分类过程中,如果所有训练数据都有标签,则为有监督学习(supervised learning)。如果数据没有标签,显然就是无监督学习(unsupervised learning),如聚类(clustering)
强化学习 vs 监督学习 强化学习和有监督学习的主要区别在于:
有监督学习的训练样本是有标签的,强化学习的训练是没有标签的,它是通过环境给出的奖惩来学习 有监督学习的学习过程是静态的,强化学习的学习过程是动态的。这里静态与动态的区别在于是否会与环境进行交互,有监督学习是给什么样本就学什么,而强化学习是要和环境进行交互,再通过环境给出的奖惩来学习 有监督学习解决的更多是感知问题,尤其是深度学习,强化学习解决的主要是决策问题。因此有监督学习更像是五官,而强化学习更像大脑 举例
有监督学习:分类器 无监督学习:自动聚类 增强学习:学下棋 实际运用 在企业数据应用的场景下, 大家最常用的可能就是监督式学习和无监督式学习的模型。 在图像识别等领域,由于存在大量的非标识的数据和少量的可标识数据, 目前半监督式学习是一个很热的话题。 而强化学习更多的应用在机器人控制及其他需要进行系统控制的领域
算法分类 根据算法的功能和形式的类似性,我们可以把算法分类,比如说基于树的算法,基于神经网络的算法等等。当然,机器学习的范围非常庞大,有些算法很难明确归类到某一类。而对于有些分类来说,同一分类的算法可以针对不同类型的问题。 这里,尽量把常用的算法按照最容易理解的方式进行分类,先介绍一些概念
回归算法 回归算法是试图采用对误差的衡量来探索变量之间的关系的一类算法 。回归算法是统计机器学习的利器。在机器学习领域,人们说起回归,有时候是指一类问题,有时候是指一类算法
最小二乘法(Ordinary Least Square) 逻辑回归(Logistic Regression) 逐步式回归(Stepwise Regression) 多元自适应回归样条(Multivariate Adaptive Regression Splines) 本地散点平滑估计(Locally Estimated Scatterplot Smoothing) 基于实例的算法 基于实例的算法常常用来对决策问题建立模型,这样的模型常常先选取一批样本数据,然后根据某些近似性把新数据与样本数据进行比较。通过这种方式来寻找最佳的匹配。因此,基于实例的算法常常也被称为“赢家通吃”学习或者“基于记忆的学习”
k-Nearest Neighbor(KNN), 学习矢量量化(Learning Vector Quantization, LVQ) 以及自组织映射算法(Self-Organizing Map , SOM) 正则化方法 正则化方法是其他算法(通常是回归算法)的延伸,根据算法的复杂度对算法进行调整。正则化 (「深度学习-神经网络」学习笔记🎁-3️⃣) 方法通常对简单模型予以奖励而对复杂算法予以惩罚
Ridge Regression Least Absolute Shrinkage and Selection Operator(LASSO) 以及弹性网络(Elastic Net) 决策树 决策树算法根据数据的属性采用树状结构建立决策模型, 决策树模型常常用来解决分类和回归问题。
分类及回归树(Classification And Regression Tree, CART) ID3 (Iterative Dichotomiser 3) C4.5 Chi-squared Automatic Interaction Detection(CHAID) Decision Stump 随机森林(Random Forest) 多元自适应回归样条(MARS) 梯度推进机(Gradient Boosting Machine, GBM) 贝叶斯方法 贝叶斯方法算法是基于贝叶斯定理的一类算法,主要用来解决分类和回归问题
朴素贝叶斯算法 平均单依赖估计(Averaged One-Dependence Estimators, AODE) Bayesian Belief Network(BBN) 基于核的算法 基于核的算法中最著名的莫过于支持向量机(SVM)了。基于核的算法把输入数据映射到一个高阶的向量空间, 在这些高阶向量空间里, 有些分类或者回归问题能够更容易的解决
支持向量机(Support Vector Machine, SVM) 径向基函数(Radial Basis Function ,RBF) 以及线性判别分析(Linear Discriminate Analysis ,LDA)等 聚类算法 聚类,就像回归一样,有时候人们描述的是一类问题,有时候描述的是一类算法。聚类算法通常按照中心点或者分层的方式对输入数据进行归并。所以的聚类算法都试图找到数据的内在结构,以便按照最大的共同点将数据进行归类
k-Means算法 期望最大化算法(Expectation Maximization, EM) 关联规则学习 关联规则学习通过寻找最能够解释数据变量之间关系的规则,来找出大量多元数据集中有用的关联规则
集成算法 集成算法用一些相对较弱的学习模型独立地就同样的样本进行训练,然后把结果整合起来进行整体预测。集成算法的主要难点在于究竟集成哪些独立的较弱的学习模型以及如何把学习结果整合起来。这是一类非常强大的算法,同时也非常流行
Boosting Bootstrapped Aggregation(Bagging) AdaBoost 堆叠泛化(Stacked Generalization, Blending) 梯度推进机(Gradient Boosting Machine, GBM) 随机森林(Random Forest) 降低维度算法 像聚类算法一样,降低维度算法试图分析数据的内在结构,不过降低维度算法是以非监督学习的方式试图利用较少的信息来归纳或者解释数据。这类算法可以用于高维数据的可视化或者用来简化数据以便监督式学习使用
主成份分析(Principle Component Analysis, PCA) 偏最小二乘回归(Partial Least Square Regression,PLS) Sammon映射 多维尺度(Multi-Dimensional Scaling, MDS) 投影追踪(Projection Pursuit)等 人工神经网络 (「深度学习-神经网络」学习笔记🎁-3️⃣) 人工神经网络算法模拟生物神经网络,是一类模式匹配算法。通常用于解决分类和回归问题。人工神经网络是机器学习的一个庞大的分支,有几百种不同的算法
感知器神经网络(Perceptron Neural Network) 反向传递(Back Propagation) Hopfield网络,自组织映射(Self-Organizing Map, SOM) 学习矢量量化(Learning Vector Quantization, LVQ) 深度学习 随着人工神经网络层数增加,从数层到几十层,甚至上百层,称为深层神经网络
为了区分浅层的人工神经网络,便取了一个更响亮的名字:深度学习
深度学习算法是人工神经网络的发展。在近期赢得了很多关注, 特别是百度也开始发力深度学习后, 更是在国内引起了很多关注。 在计算能力变得日益廉价的今天,深度学习试图建立大得多也复杂得多的神经网络。很多深度学习的算法是半监督式学习算法,用来处理存在少量未标识数据的大数据集(比如PaddleOCR中打标签)(下面单独介绍了深度学习相关网络概念,但还不够详细,详细内容在 「深度学习-神经网络」学习笔记🎁-3️⃣ 笔记中)
受限波尔兹曼机(Restricted Boltzmann Machine, RBM) 深度置信网络(Deep Belief Networks,DBN) 卷积网络(Convolutional Network) 堆栈式自动编码器(Stacked Auto-encoders)等 监督式学习 算法简介 k-近邻算法(KNN) (k-Nearest Neighbers) 通过测量不同特征值之间的距离进行分类 当输入没有标签的新数据时 将新数据的每个特征与样本集中数据对应的特征进行比较 然后算法提取样本集中特征最相似(最近邻)数据的分类标签 决策树和随机森林 (Decision Tree ) (Random Forests) Lasso最小回归系数估计 原理类似于“20个问题“游戏 参与游戏的一方在脑海里想某个事物 其他参与者向他提问题,只允许提20个问题,问题的答案也只能用对或错回答 问问题的人通过推断分解,逐步缩小待猜测事物的范围 在决策树算法中,用户输入一系列数据,然后给出决策 支持向量机 (Support Vector Machines)(SVM) Ridge回归,一种快速可靠的分类算法 可以在数据量有限的情况下很好地完成任务 线性回归 (Linear Regression) 线性回归 假设因变量 y 服从高斯分布 逻辑回归 (Logistic Regression) 逻辑回归 假设因变量 y 服从伯努利分布 朴素贝叶斯 (Naive Bayes model) 局部加权线性回归 一种基于概率论的算法 在做决策时要求分类器给出一个最优的类别猜测结果 同时给出这个猜测的概率估计值
无监督式学习 算法简介 k均值聚类算法 (K-Means) 最大期望算法 一种比较常用的聚类方法。首先,确定k个初始点作为质心 然后将数据集中的每个点分配到一个簇中 具体来讲,为每个点找距其最近的质心,并将其分配给该质心所对应的簇 这一步完成之后,每个簇的质心更新为该簇所有点的平均值 层次聚类 (Hierarchical Clustering) 顾名思义,层次聚类就是一层一层地进行聚类 既可以由下向上对小的类别进行聚合(凝聚法) 也可以由上向下对大的类别进行分割(分裂法) 在应用中,使用较多的是凝聚法。 高斯混合模型 (GMM) 是一种业界广泛使用的聚类算法,该方法使用了高斯分布作为参数模型,并使用了期望最大(Expectation Maximization,简称EM)算法进行训练
深度学习(Deep Learning,DL)(大概介绍) 深度学习(Deep Learning,DL)是机器学习(ML, Machine Learning,ML)领域中一个新的研究方向,是一种实现机器学习的技术 ,深度学习本来并不是一种独立的学习方法,其本身也会用到有监督和无监督的学习方法来训练深度神经网络。但由于近几年该领域发展迅猛,一些特有的学习手段相继被提出(如残差网络),因此越来越多的人将其单独看作一种学习的方法
深度学习与机器学习中的“神经网络”是强相关,“神经网络”也是其主要的算法和手段。深度学习又分为卷积神经网络(Convolutional neural networks,简称CNN) 和深度置信网络(Deep Belief Nets,简称DBN) 。其主要的思想就是模拟人的神经元,每个神经元接受到信息,处理完后传递给与之相邻的所有神经元即可
Google的TensorFlow是开源深度学习系统一个比较好的实现,支持CNN、RNN和LSTM算法,是目前在图像识别、自然语言处理方面流行的深度神经网络模型。事实上,提出“深度学习”概念的Hinton教授加入了google,而Alpha go也是google家的
有监督的神经网络(Supervised Neural Networks) 神经网络(Artificial Neural Networks)和深度神经网络(Deep Neural Networks) 追根溯源的话,神经网络的基础模型是感知机(Perceptron),因此神经网络也可以叫做多层感知机(Multi-layer Perceptron),简称MLP。单层感知机叫做感知机,多层感知机(MLP)≈人工神经网络(Artificial Neural Networks,ANN)
那么多层到底是几层?一般来说有1-2个隐藏层的神经网络就可以叫做多层,准确的说是(浅层)神经网络(Shallow Neural Networks)。随着隐藏层的增多,更深的神经网络(一般来说超过5层)就都叫做深度学习(DNN)
然而,“深度”只是一个商业概念,很多时候工业界把3层隐藏层也叫做“深度学习”,所以不要在层数上太较真。在机器学习领域的约定俗成是,名字中有深度(Deep)的网络仅代表其有超过5-7层的隐藏层
神经网络的结构指的是“神经元”之间如何连接,它可以是任意深度。以下图的3种不同结构为例,我们可以看到连接结构是非常灵活多样的
需要特别指出的是,卷积神经网络(CNN)和循环神经网络(RNN)一般不加Deep在名字中的原因是:它们的结构一般都较深,因此不需要特别指明深度。想对比的,自编码器(Auto Encoder)可以是很浅的网络,也可以很深。所以你会看到人们用Deep Auto Encoder来特别指明其深度
应用场景:全连接的前馈深度神经网络(Fully Connected Feed Forward Neural Networks),也就是DNN适用于大部分分类(Classification)任务,比如数字识别等 。但一般的现实场景中我们很少有那么大的数据量来支持DNN,所以纯粹的全连接网络应用性并不是很强
循环神经网络(Recurrent Neural Networks)和递归神经网络(Recursive Neural Networks) 虽然很多时候我们把这两种网络都叫做RNN,但事实上这两种网路的结构事实上是不同的。而我们常常把两个网络放在一起的原因是:它们都可以处理有序列的问题,比如时间序列等
举例:我 昨天 上学 迟到 了,老师 批评 了____
我们给电脑展示了这句话前面这些词,然后,让电脑写下接下来的一个词。在这个例子中,接下来的这个词最有可能是『我』,而不太可能是『小明』,甚至是『吃饭』。
语言模型就是这样的东西:给定一个一句话前面的部分,预测接下来最有可能的一个词是什么
语言模型是对一种语言的特征进行建模,它有很多很多用处。比如在语音转文本(STT)的应用中,声学模型输出的结果,往往是若干个可能的候选词,这时候就需要语言模型来从这些候选词中选择一个最可能的。当然,它同样也可以用在图像到文本的识别中(OCR)
RNN理论上可以往前看(往后看)任意多个词
举个最简单的例子,我们预测股票走势用RNN就比普通的DNN效果要好,原因是股票走势和时间相关,今天的价格和昨天、上周、上个月都有关系。而RNN有“记忆”能力,可以“模拟”数据间的依赖关系(Dependency)
为了加强这种“记忆能力”,人们开发各种各样的变形体,如非常著名的Long Short-term Memory(LSTM),用于解决“长期及远距离的依赖关系”。如下图所示,左边的小图是最简单版本的循环网络,而右边是人们为了增强记忆能力而开发的LSTM
同理,另一个循环网络的变种:双向循环网络(Bi-directional RNN)也是现阶段自然语言处理和语音分析中的重要模型。开发双向循环网络的原因是语言/语音的构成取决于上下文,即“现在”依托于“过去”和“未来”。单向的循环网络仅着重于从“过去”推出“现在”,而无法对“未来”的依赖性有效的建模
举例:我的手机坏了,我打算____一部新手机
可以想象,如果我们只看横线前面的词,手机坏了,那么我是打算修一修?换一部新的?还是大哭一场?这些都是无法确定的。但如果我们也看到了横线后面的词是『一部新手机』,那么,横线上的词填『买』的概率就大得多了
因为神经网络的输入层单元个数是固定的,因此必须用循环或者递归的方式来处理长度可变的输入。循环神经网络实现了前者,通过将长度不定的输入分割为等长度的小块,然后再依次的输入到网络中,从而实现了神经网络对变长输入的处理。一个典型的例子是,当我们处理一句话的时候,我们可以把一句话看作是词组成的序列,然后,每次向循环神经网络输入一个词,如此循环直至整句话输入完毕,循环神经网络将产生对应的输出。如此,我们就能处理任意长度的句子了
然而,有时候把句子看做是词的序列是不够的,比如下面这句话『两个外语学院的学生』:
上图显示了这句话的两个不同的语法解析树。可以看出来这句话有歧义,不同的语法解析树则对应了不同的意思。一个是『两个外语学院的/学生』,也就是学生可能有许多,但他们来自于两所外语学校;另一个是『两个/外语学院的学生』,也就是只有两个学生,他们是外语学院的。为了能够让模型区分出两个不同的意思,我们的模型必须能够按照树结构去处理信息,而不是序列,这就是递归神经网络 的作用。当面对按照树/图结构处理信息更有效的任务时,递归神经网络 通常都会获得不错的结果
所以递归神经网络和循环神经网络不同,它的计算图结构是树状结构而不是网状结构。递归循环网络的目标和循环网络相似,也是希望解决数据之间的长期依赖问题。而且其比较好的特点是用树状可以降低序列的长度,从O(n)降低到O(log(n))
应用场景:语音分析,文字分析,时间序列分析。主要的重点就是数据之间存在前后依赖关系,有序列关系。一般首选LSTM,如果预测对象同时取决于过去和未来,可以选择双向结构,如双向LSTM
卷积网络(Convolutional Neural Networks) 卷积网络早已大名鼎鼎,从某种意义上也是为深度学习打下良好口碑的功臣。不仅如此,卷积网络也是一个很好的计算机科学借鉴神经科学的例子。卷积网络的精髓其实就是在多个空间位置上共享参数,据说我们的视觉系统也有相类似的模式
首先简单说什么是卷积。卷积运算是一种数学计算,和矩阵相乘不同,卷积运算可以实现稀疏相乘和参数共享,可以压缩输入端的维度。和普通DNN不同,CNN并不需要为每一个神经元所对应的每一个输入数据提供单独的权重
与池化(pooling)相结合,CNN可以被理解为一种公共特征的提取过程,不仅是CNN大部分神经网络都可以近似的认为大部分神经元都被用于特征提取
以上图为例,卷积、池化的过程将一张图片的维度进行了压缩。从图示上我们不难看出卷积网络的精髓就是适合处理结构化数据,而该数据在跨区域上依然有关联。
应用场景:虽然我们一般都把CNN和图片联系在一起,但事实上CNN可以处理大部分格状结构化数据(Grid-like Data)。举个例子,图片的像素是二维的格状数据 ,时间序列在等时间上抽取相当于一维的的格状数据,而视频数据可以理解为对应视频帧宽度、高度、时间的三维数据。
CNN(左)和RNN(右)的结构区别, 注意右图中输出和隐变量网络间的双向箭头不一定存在,往往只有隐变量到输出的箭头 CNN(左)和RNN(右)的结构区别, 注意右图中输出和隐变量网络间的双向箭头不一定存在,往往只有隐变量到输出的箭头 无监督的预训练网络(Unsupervised Pre-trained Neural Networks) 深度生成模型(Deep Generative Models) 深度生成模型基本都是以某种方式寻找并表达(多变量)数据的概率分布。有基于无向图模型(马尔可夫模型)的联合概率分布模型,另外就是基于有向图模型(贝叶斯模型)的条件概率分布。前者的模型是构建隐含层(latent)和显示层(visible)的联合概率,然后去采样。基于有向图的则是寻找latent和visible之间的条件概率分布,也就是给定一个随机采样的隐含层,模型可以生成数据。
生成模型的训练是一个非监督过程,输入只需要无标签的数据。除了可以生成数据,还可以用于半监督的学习。比如,先利用大量无标签数据训练好模型,然后利用模型去提取数据特征(即从数据层到隐含层的编码过程),之后用数据特征结合标签去训练最终的网络模型。另一种方法是利用生成模型网络中的参数去初始化监督训练中的网络模型,当然,两个模型需要结构一致。
由于实际中,更多的数据是无标签的,因此非监督和半监督学习非常重要,生成模型也非常重要
具体的(深度)生成模型有:
玻尔兹曼机(Boltzmann Machines) 受限玻尔兹曼机Restricted Boltzmann Machines) 深度信念网络(Deep Belief Networks,DBNs) 深度玻尔兹曼机(Deep Boltzmann Machines,DBM) sigmoid信念网络(Sigmoid Belief Networks) 可微生成器网络(Differentiable Generator Networks) 变分自编码器(Variational Autoencoders,VAE) 生成式对抗网络(Generative Adversarial Networks,GANs) 生成矩匹配网络(Generative Moment Matching Networks) 卷积生成网络(Convolutional Generative Networks) 自回归网络(Auto-Regressive Networks) 线性自回归网络(Linear Auto-Regressive Networks) 神经自回归网络(Neural Auto-Regressive Network) 神经自回归密度估计(neural auto-regressive density estimator,NADE) 生成随机网络(Generative stochastic networks, or GSN)等 玻尔兹曼机(Boltzmann Machines)和受限玻尔兹曼机(Restricted Boltzmann Machines) 简单的说,玻尔兹曼机是一个很漂亮的基于能量的模型,一般用最大似然法进行学习,而且还符合Hebb’s Rule这个生物规律。但更多的是适合理论推演,有相当多的实际操作难度
而受限玻尔兹曼机更加实际,它限定了其结构必须是二分图(Biparitite Graph)且隐藏层和可观测层之间不可以相连接。此处提及RBM的原因是因为它是深度置信网络的构成要素之一
应用场景:实际工作中一般不推荐单独使用RBM…
深度置信网络(Deep Belief Neural Networks) DBN是祖师爷Hinton在06年提出的,主要有两个部分: 1. 堆叠的受限玻尔兹曼机(Stacked RBM) 2. 一层普通的前馈网络。
DBN最主要的特色可以理解为两阶段学习,阶段1用堆叠的RBM通过无监督学习进行预训练(Pre-train),阶段2用普通的前馈网络进行微调。
就像我上文提到的,神经网络的精髓就是进行特征提取。和后文将提到的自动编码器相似,我们期待堆叠的RBF有数据重建能力,及输入一些数据经过RBF我们还可以重建这些数据,这代表我们学到了这些数据的重要特征。
将RBF堆叠的原因就是将底层RBF学到的特征逐渐传递的上层的RBF上,逐渐抽取复杂的特征。比如下图从左到右就可以是低层RBF学到的特征到高层RBF学到的复杂特征。在得到这些良好的特征后就可以用第二部分的传统神经网络进行学习。
多说一句,特征抽取并重建的过程不仅可以用堆叠的RBM,也可以用后文介绍的自编码器 应用场景:现在来说DBN更多是了解深度学习“哲学”和“思维模式”的一个手段,在实际应用中还是推荐CNN/RNN等,类似的深度玻尔兹曼机也有类似的特性但工业界使用较少
生成式对抗网络(Generative Adversarial Networks) 生成式对抗网络用无监督学习同时训练两个模型,内核哲学取自于博弈论…
简单的说,GAN训练两个网络:1. 生成网络用于生成图片使其与训练数据相似 2. 判别式网络用于判断生成网络中得到的图片是否是真的是训练数据还是伪装的数据。生成网络一般有逆卷积层(deconvolutional layer)而判别网络一般就是上文介绍的CNN。自古红蓝出CP,下图左边是生成网络,右边是判别网络,相爱相杀。
熟悉博弈论的朋友都知道零和游戏(zero-sum game )会很难得到优化方程,或很难优化,GAN也不可避免这个问题。但有趣的是,GAN的实际表现比我们预期的要好,而且所需的参数也远远按照正常方法训练神经网络,可以更加有效率的学到数据的分布。
另一个常常被放在GAN一起讨论的模型叫做变分自编码器(Variational Auto-encoder),有兴趣的读者可以自己搜索。
应用场景:现阶段的GAN还主要是在图像领域比较流行,但很多人都认为它有很大的潜力大规模推广到声音、视频领域。
自编码器(Auto-encoder) 自编码器是一种从名字上完全看不出和神经网络有什么关系的无监督神经网络,而且从名字上看也很难猜测其作用。让我们看一幅图了解它的工作原理…
如上图所示,Autoencoder主要有2个部分:1. 编码器(Encoder) 2. 解码器(Decoder)。我们将输入(图片2)从左端输入后,经过了编码器和解码器,我们得到了输出….一个2。但事实上我们真正学习到是中间的用红色标注的部分,即数在低维度的压缩表示。评估自编码器的方法是重建误差,即输出的那个数字2和原始输入的数字2之间的差别,当然越小越好。
和主成分分析(PCA)类似,自编码器也可以用来进行数据压缩(Data Compression),从原始数据中提取最重要的特征。认真的读者应该已经发现输入的那个数字2和输出的数字2略有不同,这是因为数据压缩中的损失,非常正常。
应用场景:主要用于降维(Dimension Reduction),这点和PCA比较类似。同时也有专门用于去除噪音还原原始数据的去噪编码器(Denoising Auto-encoder)。
常用评价指标( evaluation metric ) 机器学习的结果有如下几个评估标准
准确率:考试成绩,有100道题,能做对多少。分数越高,预测准确率越高 误差、偏差:偏差是指偏离真实值的程度和大小。由于分类是离散的,而不是连续量,准确率高,并不代表误差小 泛化能力:泛化能力,把学习到的内容,应用到新的领域的能力,泛化能力差有两个主要表现:欠拟合与过拟合 评价指标:
准确率 (Accuracy) 精确率(Precision)与召回率(Recall) F1-score PR曲线(precision recall curve) 混淆矩阵 (Confusion Matrix) 平均正确率(AP) mean Average Precision(mAP) 交并比(IoU) ROC + AUC 非极大值抑制(NMS) 与偏差与方差 准确率 (Accuracy) 首先,Accuracy是最常见也是最基本的评价指标。但在二分类(binary classification)且正反例不平衡的情况下,尤其是我们对少数类(minority class)更感兴趣的时候,Accuracy评价基本没有参考价值。 什么fraud detection(欺诈检测),癌症检测,都符合这种情况。举个栗子:
在测试集里,有100个sample,99个反例,只有1个正例。如果我的模型不分青红皂白对任意一个sample都预测是反例,那么我的模型的accuracy是 正确的个数/总个数 = 99/100 = 99%
拿着这个Accuracy高达99%的模型屁颠儿屁颠儿的去预测新sample了,而它一个正例都分不出来,有意思么。。。
也有人管这叫accuracy paradox(准确性驳论)
Accuracy分对的样本数除以所有的样本数 ,即:准确(分类)率 = 正确预测的正反例数 / 总数
准确率一般用来评估模型的全局准确程度,不能包含太多信息,无法全面评价一个模型性能
精确率(Precision)与召回率(Recall) 假设现在有这样一个测试集,测试集中的图片只由大雁和飞机两种图片组成,假设你的分类系统最终的目的 是:能取出测试集中所有飞机的图片,而不是大雁的图片
Precision 其实就是在识别出来的图片中,True positives所占的比率。 也就是本假设中,所有被识别出来的飞机中,真正的飞机所占的比例。假设你的模型一共预测了100个大雁,而其中80个是对的大雁,那么你的Precision就是80%。我们可以把Precision也理解为,当你的模型作出一个新的预测时,它的 confidence score 是多少,或者它做的这个预测是对的的可能性是多少
Recall 是测试集中所有正样本样例中,被正确识别为正样本的比例 。也就是本假设中,被正确识别出来的飞机个数与测试集中所有真实飞机的个数的比值。假设测试集里面有100个飞机,你的模型能预测覆盖到多少,如果你的模型预测到了40个飞机,那你的Recall就是40%
一般来说呢,鱼与熊掌不可兼得。如果你的模型很贪婪,想要覆盖更多的sample,那么它就更有可能犯错。在这种情况下,你会有很高的Recall,但是较低的Precision。如果你的模型很保守,只对它很确定的sample作出预测,那么你的Precision会很高,但是Recall会相对低
Precision 将所有搜索到的目标都考虑在内,但也可以在给定的截止等级(cut-off rank)上进行评估,只考虑系统返回的最高结果。这种度量称为n或P@n处的精度
F1-score F1 score(均衡平均数)是围绕Recall和Precision衍生出来的一个参考值,是综合考虑了模型查准率和查全率的计算结果,取值更偏向于取值较小的那个指标。F1-score越大自然说明模型质量更高。但是还要考虑模型的泛化能力,F1-score过高但不能造成过拟合,影响模型的泛化能力。公式 = Precision和Recall的调和平均值( harmonic mean of the precision and recall.)
其数值大小通常接近二者中的较小数、当recall = precision时,F1 = recall = precision,如果F1值较高,说明recall和precision都较高,我们希望取到较高的F1值
PR曲线(precision recall curve) Precision-recall 曲线: 改变识别阈值,使得系统依次能够识别前K张图片,阈值的变化同时会导致Precision与Recall值发生变化,从而得到曲线
如果一个分类器的性能比较好,那么它应该有如下的表现:在Recall值增长的同时,Precision的值保持在一个很高的水平。而性能比较差的分类器可能会损失很多Precision值才能换来Recall值的提高。通常情况下,文章中都会使用Precision-recall曲线,来显示出分类器在Precision与Recall之间的权衡
也就是说曲线下的面积(AUC)越大,或者说曲线更接近右上角(precision=1, recall=1),那么模型就越理想,越好
如果在我们所说的 fraud detection 或者癌症检测这一类应用中,我们的倾向肯定是“宁可错杀一千,不可放过一个 ”,所以我们可以设定在合理的precision下,最高的recall作为最优点,找到这个对应的threshold点
混淆矩阵 (Confusion Matrix) 混淆矩阵是对分类问题的预测结果的总结。使用计数值汇总正确和不正确预测的数量,并按每个类进行细分,这是混淆矩阵的关键所在。混淆矩阵显示了分类模型的在进行预测时会对哪一部分产生混淆。它不仅可以让我们了解分类模型所犯的错误,更重要的是可以了解哪些错误类型正在发生。正是这种对结果的分解克服了仅使用分类准确率所带来的局限性
混淆矩阵是分类情况下常用的一个指标
把所有类别的预测结果与真实结果按类别放置到了同一个表里,在这个表格中我们可以清楚看到每个类别正确识别的数量和错误识别的数量
混淆矩阵中的横轴是模型预测的类别数量统计 ,纵轴是数据真实标签的数量统计
TP = True Postive = 正样本被正确识别为正样本 FP = False Positive = 假的正样本,即负样本被错误识别为正样本 FN = False Negative = 假的负样本,即正样本被错误识别为负样本 TN = True Negative = 负样本被正确识别为负样本 对角线 ,表示模型预测和数据标签一致的数目, 所以对角线之和除以测试集总数就是准确率 。对角线上数字越大越好,在可视化结果中颜色越深,说明模型在该类的预测准确率越高。如果按行来看,每行不在对角线位置的就是错误预测的类别。总的来说,我们希望对角线越高越好,非对角线越低越好
平均精度(Average-Precision,AP)与 mean Average Precision(mAP) 以分类器为例,精度和召回率一般是无法同时满足的,精度高那么召回率便会降低 假设将所有的样本都划分为正样本,此时精度会很低,而召回率为1,即所有的正样本都被正确划分。单纯使用精度或者召回率是很难完整地度量一个模型的性能的,为了解决这一问题,便提出了AP(average precision)的概念
AP 就是Precision-recall 曲线下面的面积 ,通常来说一个越好的分类器,AP值越高
mAP 是多个类别AP的平均值。
是不同精度与不同召回率组成图形与X,Y轴围成的区域的面积
理想情况下,任何召回率的情况下,精度都是1,这面积为1
这个mean的意思是对每个类的AP再求平均,得到的就是mAP的值,mAP的大小一定在[0,1]区间,越大越好。该指标是目标检测算法中最重要的一个,有些时候会乘100
在正样本非常少的情况下,PR表现的效果会更好。
交并比(Intersection over Union,IoU) IoU这一值,可以理解为系统预测出来的框与原来图片中标记的框的重合程度。 计算方法即检测结果Detection Result与 Ground Truth 的交集比上它们的并集,即为检测的准确率
IOU正是表达这种bounding box和groundtruth的差异的指标:
ROC(Receiver Operating Characteristic)曲线与AUC(Area Under Curve) ROC曲线:
横坐标:假正率(False positive rate, FPR),FPR = FP / [ FP + TN] ,代表所有负样本中错误预测为正样本的概率,假警报率 纵坐标:真正率(True positive rate, TPR),TPR = TP / [ TP + FN] ,代表所有正样本中预测正确的概率,命中率 对角线对应于随机猜测模型 ,而(0,1)对应于所有整理排在所有反例之前的理想模型。曲线越接近左上角,分类器的性能越好
ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变 。在实际的数据集中经常会出现类不平衡 (class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化
ROC曲线绘制:
根据每个测试样本属于正样本的概率值从大到小排序 从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本 每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点 当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。
AUC(Area Under Curve)即为ROC曲线下的面积。AUC越接近于1,分类器性能越好。
物理意义: 首先AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值。当然,AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。
计算公式:就是求曲线下矩形面积。
PR曲线和ROC曲线比较
ROC曲线特点:
优点:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变 。因为TPR聚焦于正例,FPR聚焦于与负例,使其成为一个比较均衡的评估方法。在实际的数据集中经常会出现类不平衡 (class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化
缺点:上文提到ROC曲线的优点是不会随着类别分布的改变而改变,但这在某种程度上也是其缺点 。因为负例N增加了很多,而曲线却没变,这等于产生了大量FP。像信息检索中如果主要关心正例的预测准确性的话,这就不可接受了 。在类别不平衡的背景下,负例的数目众多致使FPR的增长不明显,导致ROC曲线呈现一个过分乐观的效果估计。ROC曲线的横轴采用FPR,根据FPR ,当负例N的数量远超正例P时,FP的大幅增长只能换来FPR的微小改变。结果是虽然大量负例被错判成正例,在ROC曲线上却无法直观地看出来。(当然也可以只分析ROC曲线左边一小段)
PR曲线:
PR曲线使用了Precision,因此PR曲线的两个指标都聚焦于正例 。类别不平衡问题中由于主要关心正例 ,所以在此情况下PR曲线被广泛认为优于ROC曲线
使用场景
ROC曲线由于兼顾正例与负例,所以适用于评估分类器的整体性能,相比而言PR曲线完全聚焦于正例 如果有多份数据且存在不同的类别分布,比如信用卡欺诈问题中每个月正例和负例的比例可能都不相同,这时候如果只想单纯地比较分类器的性能且剔除类别分布改变的影响,则ROC曲线比较适合,因为类别分布改变可能使得PR曲线发生变化时好时坏,这种时候难以进行模型比较;反之,如果想测试不同类别分布下对分类器的性能的影响,则PR曲线比较适合 如果想要评估在相同的类别分布下正例的预测情况,则宜选PR曲线 类别不平衡问题中,ROC曲线通常会给出一个乐观的效果估计,所以大部分时候还是PR曲线更好 最后可以根据具体的应用,在曲线上找到最优的点,得到相对应的precision,recall,f1 score等指标,去调整模型的阈值,从而得到一个符合具体应用的模型 非极大值抑制(NMS) Non-Maximum Suppression就是需要根据score矩阵和region的坐标信息,从中找到置信度比较高的bounding box。对于有重叠在一起的预测框,只保留得分最高的那个
NMS计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为队列中首个要比较的对象 计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box,保留小的IoU得预测框 然后重复上面的过程,直至候选bounding box为空 最终,检测了bounding box的过程中有两个阈值,一个就是IoU,另一个是在过程之后,从候选的bounding box中剔除score小于阈值的bounding box。需要注意的是:Non-Maximum Suppression一次处理一个类别 ,如果有N个类别,Non-Maximum Suppression就需要执行N次
一句话总结:当多个不同中心点的框标注到同一个物体时。把符合交并比门限的框,按照置信度排序,抑制掉置信度为非极大值的框
过拟合(Overfitting)与欠拟合(underfitting) 与偏差与方差 一般来说,深度学习所要做的事情是用已有的训练集训练一个网络模型,然后针对新的数据给出预测,我们期望我们的模型在训练集和测试集上都有良好的表现,但是有的时候两者不可兼得。一种情况是在训练集上表现很好,在测试集上表现不好或表现一般。另一种情况是在训练集上表现不好或表现一般,在测试集上表现很好。相比较而言我们更倾向于后者,因为这是我们训练模型的目的
为什么会出现这种情况,难道不是应该训练集上表现的越好在测试集上表现越好吗?不是的,过度的拟合一个训练集往往会放大哪些没有那么重要的向量或因素(参数拟合的太好以致于超过了训练曲线的最低泛化误差临界点,究其根本原因是模型的表达能力足够强大到过拟合数据集 )
过拟合 的解决办法:
增加训练集的数据量 :over-fitting的一个形成原因就是训练集的数据太少导致无法学习到想要的模型,因此当发生over-fitting时首先应该考虑的就应该是增加训练集的数据量,理论上来说只要数据集足够大就不会发生over-fitting和under-fitting,但是很明显数据集的收集和制作是个很大的工作量,因此就需要下面的几个常用办法。正则化方法 :正则化方法是指在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,一般有L1正则与L2正则等偏差描述的是根据样本拟合出的模型输出结果与真实结果的差距,损失函数就是依据模型偏差的大小进行反向传播的。降低偏差,就需要复杂化模型,增加模型参数,但容易造成过拟合。方差描述的是样本上训练出的模型在测试集上的表现,降低方差,继续要简化模型,减少模型的参数,但容易造成欠拟合。根本原因是,我们总是希望用有限的训练样本去估计无限的真实数据。假定我们可以获得所有可能的数据集合,并在这个数据集上将损失函数最小化,则这样的模型称之为“真实模型”。但实际应用中,并不能获得且训练所有可能的数据,所以真实模型一定存在,但无法获得
若模型在训练集表现差,在验证数据集和测试集表现同样会很差,这可能是欠拟合 导致
欠拟合 的情况比较容易克服, 常见解决方法有:
增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间;(增加输入数据的维度) 添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强(用更高阶的函数进行拟合) 减少正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数 使用非线性模型,比如核SVM 、决策树、深度学习等模型(新模型) 调整模型的容量(capacity),通俗地,模型的容量是指其拟合各种函数的能力 容量低的模型可能很难拟合训练集;使用集成学习方法,如Bagging,将多个弱学习器Bagging 增加样本的数量 增加训练的次数 减少学习率,减少学习的步长,增加学习的精度 番外篇 迁移学习 (Transfer learning) 概念 迁移学习迁移学习(Transfer learning) 顾名思义就是把已训练好的模型(预训练模型)(预训练模型的概念在神经网络笔记里有介绍)参数迁移到新的模型来帮助新模型训练。考虑到大部分数据或任务都是存在相关性的,所以通过迁移学习我们可以将已经学到的模型参数(也可理解为模型学到的知识)通过某种方式来分享给新模型从而加快并优化模型的学习效率不用像大多数网络那样从零学习。其中,实现迁移学习有以下三种手段:Transfer Learning:冻结预训练模型的全部卷积层,只训练自己定制的全连接层。Extract Feature Vector:先计算出预训练模型的卷积层对所有训练和测试数据的特征向量,然后抛开预训练模型,只训练自己定制的简配版全连接网络。Fine-tuning:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层,因为这些层保留了大量底层信息)甚至不冻结任何网络层,训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层
举例 举个例子,假如你要建立一个猫咪检测器,用来检测自己的宠物猫。如网络上的Tigger,是一个常见的猫的名字,Misty也是比较常见的猫名字。假设你的两只猫叫Tigger和Misty,或者两者都不是,这是一个三分类问题。忽略两只猫同时出现在一张图片里的情况。如果没有足够的Tigger和 Misty的图片(即训练集很小),我们可以从网上下载一些神经网络的开源实现,同时把权重下下来去掉原有的Softmax层,创建自己Softmax单元用来输出三个类别
通过使用其他人预训练的权重,即使只有一个小的数据集,很可能得到很好的性能
优势 理想情况下,在一个成功的迁移学习应用中,将会获得以下益处:
更高的起点:在微调之前,源模型的初始性能要比不使用迁移学习来的高 更高的斜率:在训练的过程中源模型提升的速率要比不使用迁移学习来得快 更高的渐进:训练得到的模型的收敛性能“要比不使用迁移学习更好 遗传算法 (Genetic Algorithm,GA) 梯度下降和遗传算法都是优化算法,而梯度下降只是其中最基础的那一个,它依靠梯度与方向导数的关系计算出最优值。遗传算法则是优化算法中的启发式算法中的一种,启发式算法的意思就是先需要提供至少一个初始可行解,然后在预定义的搜索空间高效搜索用以迭代地改进解,最后得到一个次优解或者满意解。遗传算法则是基于群体的启发式算法。
遗传算法和梯度下降的区别是:
梯度下降使用误差函数决定梯度下降的方向,遗传算法使用目标函数评估个体的适应度 梯度下降是有每一步都是基于学习率下降的并且大部分情况下都是朝着优化方向迭代更新,容易达到局部最优解出不来。而遗传算法是使用选择、交叉和变异因子迭代更新的,可以有效跳出局部最优解 概念 遗传算法(Genetic Algorithm,GA)是模拟达尔文 生物进化论的自然选择 和遗传学机理 的生物进化过程的计算模型,是一种 通过模拟自然进化过程搜索最优解的方法。遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一定数目的个体(individual)组成
每个个体实际上是染色体(chromosome)带有特征的实体。染色体作为遗传物质的主要载体,即多个基因的集合,其内部表现(即基因型)是某种基因组合,它决定了个体的形状的外部表现,如黑头发的特征是由染色体中控制这一特征的某种基因组合决定的。因此,在一开始需要实现从表现型到基因型的映射即编码工作
由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度(fitness)大小选择(selection)个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉 (crossover)和变异 (mutation),产生出代表新的解集的种群。这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码(decoding),可以作为问题近似最优解
其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解, GA 应用的一些示例包括优化决策树 为了获得更好的性能,解决数独难题 ,超参数优化 等
由于整个逻辑比较复杂,可以看看《超详细的遗传算法(Genetic Algorithm)解析 》
举例 首先有一个种小东西,它们都生活在大草原上,跑的快的就不会被吃掉,就可以生存下来
这个东西的一般是长这样的:
它由几个元素组成:
Node,暂且把它叫做腿 ,也就是上图圆圆的东西 颜色越深表示和地面的摩擦力越大 Muscal,肌肉 ,连接圆圈的粗线 ,颜色越深越粗的肌肉表示更有力量,而且每一条肌肉都有不同的原始长度。肌肉越强,他就越有能力拉动连接的两个Node 还有最重要的下图:时钟 。也就是这些肌肉有拉长的时间和收缩的时间。在拉长时间,肌肉总想让两腿之间距离变远,收缩时间肌肉又想让腿之间距离近 是不是很复杂?
其实就可以想象一下:几个铁球被几根橡皮筋连接在一起,橡皮筋在有规律的抽动,然后这个东西随着抽动会向前跑
所以然后我们的目标来了:什么样的这样的东西(几个球,几根皮筋,强度多少 )可以跑的最快?
就是遗传算法发挥作用的时候到了
第一步:种群 遗传算法首先要有父本。也就是初始的一些这样的小东西
一般来说要是我们知道一些知识,比如大概知道什么样子的东西可以跑的快的话,可以挑一些出来作为父本
但是我们现在连这些东西怎么跑都不知道,怎么会知道哪个跑的快?
于是最粗暴的就是:随便来1000个!
100个随机生成的小东西。有三条腿的,也有四条五条六条七条的,肌肉也有多有少。然后我们看看他们跑的怎么样
第一位选手:
怎么说呢,在一阵蠕动当中,一号选手竟然可以在15秒跑出差不多1米的距离。表现非常不错!
你以为这个不够快?
看看比如2号选手:
“请不要躺在地上”
还有其他选手
总体来说,因为是全部随机生成的选手,很多都只能留在原地,而且有一半选手选择了向后退而不是向前
第二步:生存
“适者生存”
第一代的父本,按照在15秒之内跑的距离排序。跑的慢的就会被淘汰掉
但是,并不一定是所有跑的慢的都会大自然就一定会被淘汰掉。只是说,跑的快的更容易保留 下来,跑的慢的更容易死掉
大自然就是这么神奇,会允许一些幸运的弱者 生存下来。说不定会在下一代表现出不一样的特点
第一代的1000个,淘汰掉一半,剩下的才有资格作为下一代的父本,留下基因。下图黑色的代表被淘汰了
第三步:产生后代 就像两个黑头发生下来有大概率是黑头发,父母都1米9生下孩子大概率都也会很高。但是也会有两个父母都不聪明生的天才小孩
遗传算法里也是一样,两个父亲(不要在意这些细节)结合产生的后代,有可能“腿”会不一样粗:
也很有可能“肌肉”会不一样强壮:
但是也会相对比较少见 的:
腿不一样多。当然都是大自然的力量,和隔壁住了谁关系不大
于是我们又有了下一代:上一代500个样本的孩子-->1000个新的样本
第三步:迭代 我们已经有了完整的过程
有一个群体
群体根据成绩(目标函数)随机淘汰
交叉产生新的群体
群体再次淘汰
不断的重复3和4,直到找到满足条件的样本(达到要求),或者群体不能再显著的进化
最终效果 到第10代的时候,跑的最快的一个已经可以在15秒跑到快3米。跑起来是这个样子的
这个小东西有5条腿,已经可以稳定向前蠕动
到了第30代:
感觉已经要快飞起来了。还是5条腿
30代的时候,跑的最快的一个已经可以在15秒内跑到6米,而中间值(千人马拉松 第500名)也可以跑到3米。整个群体都在飞快的进步
这个图显示了进化中每一代跑的最快的(上边黑线)和群体中位数 (红线)的成绩
然后到了62代,一个有4条腿的家伙成为了新的冠军:
看来是进化的力量发挥了作用。有4条腿的族群中进化出现了一个非常利于跑步的结构:后边一条黑色腿,前边一条白色腿,中间两条相似的腿
而且在整个群体中,4条腿6根肌肉的生物也占据了大部分,其他3条腿,5条腿的大多慢慢都被淘汰了
结果
到了300代的时候,增长速度变得非常缓慢,停止模拟
这一代里有个叫博尔特的跑的简直要飞起来了,我们欣赏一下:
遗传算法和梯度类算法(数学优化)对比 求解效果 对问题结构明确能够容易获得目标梯度的优化问题,有充分的关于优化问题的信息来利用的时候梯度类算法一般来说有优势,例如梯度类算法,线性规划,二次规划,凸优化等等在业界的应用都非常广泛。反之,可能使用遗传算法就会有优势。对于一些传统数学优化目前不能彻底解决的问题例如NP hard问题,遗传算法也有一定的应用前景。此时遗传算法也需要更多的利用特定问题的结构去设计特定的算法才能够提升算法的能力
求解速率 遗传算法的计算速度比较慢这一点也很好理解,每迭代一次都需要计算M次目标函数,M是种群规模一般是30-50左右。遗传算法的前沿的研究方向其中一个就是针对大规模优化问题的(large-scale),我也曾查阅过相关顶级期刊的论文发现进化算法里的large-scale的规模,一般决策变量几千维就是large-scale的了。对数学优化算法来讲可能根本构不成large-scale。而实际问题中经常决策变量达到几百万以上的规模,此时遗传算法的缺点就被暴露了。所以侧面反应出了遗传算法在计算速度的瓶颈限制了其在大规模优化问题上的应用
理论性保证 目前对于遗传算法的理论性分析还停留在一个很初级的阶段,虽然有用随机过程(马尔科夫性)的方法来证明进化算法依概率收敛到最优解,但一般而言这类理论分析停留在 马尔可夫链证明的全局收敛性,当算法运行时间趋于无穷的时候,依概率1趋于全局最优。这个理论分析的结果聊胜于无吧。因为实际上在运行算法的时候没有人把运行时间设置为无穷大,而且何时停止搜索也不知道(因为缺乏最优性判定准则)。同时依概率1收敛的条件本身就非常弱,哪怕是完全随机搜索其实也都一样可以满足上面的收敛性条件。所以很多时候遗传算法说自己能收敛到全局最优也就成了一个美好的梦想
遗传算法等进化计算方法主要适应场景 我列了一下目前以遗传算法为代表的进化算法方法主要的适用场景:
场景1: 神经网络超参数优化 场景2: 一部分结构和特性固定的组合优化问题 场景3: 一部分机理模型难以建立的黑箱优化问题 场景4: 多目标优化问题 除了以上场景你可以认为基本上就是数学优化(梯度类)算法的天下了。以上场景大致有两种情况一种是优化问题的模型是黑箱,梯度难以求得,例如场景1,场景2,场景3都属于这种情况。另外一种就是目前传统数学优化还不能很好解决的问题,例如场景 2,场景4 都属于这种情况。所以总得来说目前遗传算法为代表的进化计算方法主要还是捡数学优化的漏。一般我们会优先考虑数学优化方法,当数学优化解决不了的时候再考虑遗传算法。当一类问题采用遗传算法时基本上代表这是没有办法的办法了。
综上所述,进化算法也好,数学优化也好都只是认识问题解决问题的工具之一,工具本身并不存在绝对的优劣之分,每种工具都有其适用的场景,辨别它们的长短,找到它们合适的应用场景是我们这些用工具的人应该做的
Comments | NOTHING