image frame

星际旅行日志

彼汾一曲,言采其藚.彼其之子,美如玉.美如玉,殊异乎公族.

LiteOS-m和LiteOS-a任务调度



任务调度

1.1 LiteOS-m和LiteOS-a的调度对比

项目 LiteOS-m LiteOS-a
调度规则 时间片轮转调度 优先级抢占式,支持FIFO/RR调度
使用中断 PenSV 不使用中断
调度对象 Task Process/Task
多核 不支持 多核

OpenHarmony LiteOS-a内核支持的FIFO/RR调度策略,可以通过编译宏来进行切换。

阅读更多...

Ubuntu20.04+PicGo+gitee配置Typora图床

一、下载Picgo

  1. 下载链接- picgo

    • 打开链接后下载PicGo-2.3.0.AppImage

    image-20211120221439351

    • 右键属性,勾选允许可执行文件

      image-20211120221552416

    • 点击这个文件,右键运行,桌面中间出现一个正方形的蓝色的图标,右键打开详情窗口

    • 点击插件设置 ,搜索gitee ,安装图中的gitee-uploader

      image-20211120222141326

    • 然后在图床设置中,找到gitee

      img

二、Gitee 生成私人令牌

  • 先新建一个图床专用的空仓库
  • 个人设置--私人令牌中,右上角生成新令牌
  • 然后把令牌复制到上面picgo中的token
  • repo设置为刚刚生成的空仓库名,仓库明最好用浏览器链接中的名称,即helloreaper/image-bed

image-20211120222851206

  • 设置为默认图床,然后点击确认

三、设置Typora

  • 文件-偏好设置

image-20211120223514636

  • 填写PicGo 路径为 PicGo-2.3.0.AppImage 的存放路径
  • 严重图片上传选项试试能不能上传成功

FPGA四AD模块使用方法

适用FPGA:AX530

芯片:ALTERA CYCLONE IV EP4CE30F23C8

一、安装Quartus

Quartus 17.1安装包及安装方法:

链接:https://pan.baidu.com/s/16kOmdHmDPsxwJk_1UNiGhA
提取码:v9nb
–来自百度网盘超级会员V6的分享

安装设备,检查环境配置,以及安装USB Blaster驱动:参考AX530使用指南REV1.0.pdf

AX530资料:(可选择下载)

链接:https://pan.baidu.com/s/18ibh30QXaWUe-VkvQIgvsw
提取码:va77
–来自百度网盘超级会员V6的分享

项目代码:

链接:https://pan.baidu.com/s/1km3zHR068v5k8B8F-LZbFA
提取码:1zpo
–来自百度网盘超级会员V6的分享

阅读更多...

FPGA四AD模块使用方法

适用FPGA:AX530

芯片:ALTERA CYCLONE IV EP4CE30F23C8

一、安装Quartus

Quartus 17.1安装包及安装方法:

链接:https://pan.baidu.com/s/16kOmdHmDPsxwJk_1UNiGhA
提取码:v9nb
–来自百度网盘超级会员V6的分享

安装设备,检查环境配置,以及安装USB Blaster驱动:参考AX530使用指南REV1.0.pdf

AX530资料:

链接:https://pan.baidu.com/s/18ibh30QXaWUe-VkvQIgvsw
提取码:va77
–来自百度网盘超级会员V6的分享

阅读更多...

FPGA与神经网络

《深度神经网络 FPGA 设计进展、实现与展望》论文学习

本文内容来源:《深度神经网络 FPGA 设计进展、实现与展望》 焦李成 孙其功 杨育婷 冯雨歆 李秀芳

链接:https://cjc.ict.ac.cn/online/cre/jlc-2021721164800.pdf

神经网络的主流硬件平台

随着硬件技术和深度神经网络的发展,目前形成了以“CPU+GPU”的异构模式服务器为主的深度神经网络的研究平台,如英伟达的 DGX-2,其具有16 块 Tesla V100 GPU,可以提供最高达 2 PFLOPs的计算能力。面对复杂的实际应用需求和不断加深的神经网络结构,多样化的深度神经网络硬件平台也不断发展起来,形成了以通用性芯片(CPU、GPU)半制定化芯片(FPGA)全制定化芯片(ASIC)、集成电路芯片(SoC)和类脑芯片等为主的硬件平台市场。计算性能、灵活性、易用性、成本和功耗等成为评价深度神经网络硬件平台的因素和标准。

FPGA

FPGA(Field Programmable Gate Array)是现场可编程门阵列,它允许无限次的编程,并利用小型查找表来实现组合逻辑。FPGA 可以定制化硬件流水线,可以同时处理多个应用或在不同时刻处理不同应用,具有可编程、高性能、低能耗、高稳定、可并行和安全性的特点,在通信、航空航天、汽车电子、工业控制、测试测量等领域取得了很大应用市场。人工智能产品中往往是针对一些特定应用场景而定制的,定制化芯片的适用性明显比通用芯片的适用性高。FPGA 成本低并且具有较强的可重构性,可进行无限编程。因此,在芯片需求量不大或者算法不稳定的时候,往往使用 FPGA 去实现半定制的人工智能芯片,这样可以大大降低从算法到芯片电路的成本。随着人工智能技术的发展,FPGA在加速数据处理、神经网络推理、并行计算等方面表现突出,并在人脸识别、自然语言处理、网络安全等领域取得了很好的应用。

目前,深度神经网络芯片正在不断研究开发中,每种芯片均是针对一定的问题而设计的,因此,不同的芯片有其独特的优势和不足。通过上述对不同芯片的描述,我们可以了解到相比 GPU,FPGA有更强的计算能力和较低的功耗,相比 ASIC 和SoC,FPGA 具有更低的设计成本和灵活的可编程性,相比类脑芯片,FPGA 的开发设计更简单。综合当前深度神经网络芯片的特性可知,FPGA 的设计性能更适合应用于深度神经网络在普通领域的开发和应用。

FPGA 是基于可编程逻辑器件发展的一种半定制电路,它可以使用硬件描述语言(Verilog 或VHDL)或 C/C++/OpenCL 编程,利用小型查找表来实现组合逻辑,并对 FPGA 上的门电路以及存储器之间的连线进行调整,从而实现程序功能。

随着神经网络的迅速发展,FPGA 做了一系列针对其需求的开发设计,如 Xilinx 推出的 VersalAI Core 系列和 xDNN 处理引擎为深度神经网络推断加速带来突破性的改善。另外,为了促进深度神经网络的发展,不少公司设计提出神经网络编译及框架,如 ALAMO 编译器和 Lattice 公司设计的sensAI 编译器,FP-DNN 框架和 FPGAConvNet 框架。经过 30 多年的发展,FPGA 的制作工艺、逻辑单元和晶体管的封装密度均得到飞速发展。

FPGA 的开发方式及流程

结合 FPGA 自身硬件架构特点,目前其开发主要有两种方式:寄存器传输级(RTL)描述和高层次综合(HLS)描述。

寄存器传输级描述,又称 RTL级描述,是指用寄存器这一级别的描述方式来描述电 路 的 数 据 流 。 开 发 人 员 利 用 硬 件 描 述 语 言(Verilog 和 VHDL)或者 IP 核对硬件结构进行描述。RTL 级开发的主要优势是高稳定性、高资源利用率、高性能等。其劣势也很突出,主要有开发难度大、开发效率低、周期长、成本高等。基于此,利用高级语言实现算法的开发方式应运而生,即HLS 级,开发人员只需要利用高级语言(C、C++)实现算法,而算法程序到 FPGA 硬件结构的映射由编译器自动完成

广义上讲,Xilinx 公司推出了高层次综合 HLS 工具Altera 公司主推的 OpenCL SDK 都属于 HLS 级。HLS 级开发的主要优势是门槛低、开发效率高、周期短,其缺点主要是资源利用率低、性能低、不透明等。

image-20220424140320444

FPGA 的设计流程通常包括设计需求理解、方案评估、芯片理解、详细方案设计、仿真、综合、布局布线、时序优化、芯片编程与调试。神经网络加速设计开始之前,需要先确定神经网络的网络结构和各层级参数,避免因修改而造成的资源浪费和工程延期。在神经网络算法效果符合预期后,需要对神经网络算法进行拆解和分析。通过分析算法所需的计算带宽,存储带宽,存储容量,关键计算瓶颈,计算数据流等,结合 FPGA 芯片的资源特性进行加速效果推算,把适合 FPGA 做加速的算法交给FPGA 来加速,其中需要特别注意的是,FPGA 加速计算推演的数据精度需要和软件验证的数据精度保持一致,否则可能在 FPGA 加速后会有精度损
失而达不到预期的算法效果。

FPGA 深度神经网络相关应用

随着深度神经网络的不断发展,衍生出的智能化产品也越来越多。FPGA 的应用领域已经从原来的通信扩展到消费电子、汽车电子、工业控制、测
试测量等更广泛的领域。在学术界,FPGA 与深度神经网络结合的应用也得到越来越多的关注,成为研究热点。我们以

  • 图像检测与识别
  • 目标跟踪

  • 语音识别

  • 文本处理

  • 网络安全

  • 智能控制

6 个方向来介绍目前 FPGA 与深度神经网络结合的产业应用现状。

图像检测与识别

不管是用于身份核验的人脸识别系统,或是用于植物拍照识别的手机应用系统,这都属于图像检测与识别的过程,是深度神经网络的典型应用场景。而对于商业识别的设备,为了降低产品价格和功耗、提高产品稳定性和速度,大多数企业会选择使用 FPGA 作为图像识别算法的硬件载体。近年来,关于 FPGA 上面部署图像识别的应用越来越多,如人脸识别[118–123]、人手姿态识别[124]、字符识别[125, 126]、车牌识别[127]、交通标志识别[128]、自然场景识别[91] 等等。可以看出,基于图像识别的 FPGA 产品应用场景越来越细化,场景越来越具体化。

目标跟踪

目标跟踪最近几年发展迅速, 不少研究者在研究如何在 FPGA 上实现目标跟踪系统,从而推动产业应用。目标跟踪系统在军事侦察、安防监控等诸多方面均有广泛的应用前景。目前,较多研究主要是将 FPGA 作为协处理器的目标跟踪系统,用于实时视觉跟踪[138–140]。不同的实时视觉跟踪系统设计中使用的方法也不尽相同,如:mean shift 跟踪算法、hausdorff 距离算法、光流法等[138,139,141],计算边缘/角点检测、静止背景和噪声滤波等优化操作也常常在实际中进行应用。近年来,随着深度神经网络模型的不断发展,其跟踪网络性能明显优于传统方法。如:论文[142] 中提出的 MiniTracker,使用的是全卷积的 Siamese 网络,并对其进行了剪枝和量化,使得其在 ZedBoard 上实现并且达到了18.6 帧每秒的跟踪率。

语音识别

目前,深度神经网络除了在图像和视频领域应用越来越广泛以外,基于 FPGA 的语音识别系统也成为研究热点。由于其庞大的市场需求,语音识别发展速度异常迅猛。在智能语音识别产品中,为保证一定的灵活性和移动性,往往在 FPGA 上部署语音识别模型,以满足智能与生产落地的需求。在其相关研究中,语音识别模型主要有连续隐马尔可夫模型,液体状态机以及递归神经网络[144] 等等。

文本处理

自然语言处理主要是研究人与计算机之间通过自然语言的方式进行有效通信的理论和方法。作为人工智能领域的一个重要应用方向,自然处理已经得到了广泛的关注。自然语言处理可以分为文本处理以及语音处理,我们将语音识别应用在上一小节进行了归纳总结。

网络安全

网络安全与入侵检测也是 FPGA 与深度神经网络结合的一个重要应用,主要是对于网络系统中收集的信息进行分析,然后通过某种模型判断是否存在异常的行为。基于 FPGA 的网络安全与入侵检测系统就是为了对于网络进行实时监控,并在网络系统异常时或者对外来攻击进行及时的反应,以保证网络系统的安全性。关于该方面的研究也越来越多[163–166],有降低 FPGA 的计算要求的深度神经网络算法实现在线异常入侵检测系统,也有利用可重构硬件辅助网络入侵检测系统,以及利用 FPGA 搭建了网络传输异常检测体系结构等。这些系统往往都可以被集成在可重构系统中,作为辅助系统使用。

智能控制

将基于 FPGA 的深度神经网络用于实际控制,打破了传统逻辑控制模式,实现了控制系统的自动化和智能化。

FPGA 深度神经网络的加速与优化

深度神经网络往往是在大内存、较强计算力的GPU 上进行训练学习的。但在相关模型进行产品化落地应用时,必须考虑设备资源的尺寸、内存、能耗、带宽和成本等因素。神经网络模型压缩和加速的 提 出 , 让 复 杂 的 深 度 神 经 网 络 在 小 型 设 备(FPGA)上的实现成为了可能。这些实现使得神经网络得以搭载在 FPGA 芯片上,进一步应用到自动驾驶、航天航空以及手机等设备中。本文将从

  • FPGA 神经网络加速器

  • 神经网络压缩与加速技术

  • 计算加速与优化

  • 基于带宽的神经网络加速

  • 基于 FPGA 的神经网络编译器及框架

等五个方面进行总结与归纳。

FPGA 神经网络加速器

随着深度学习的不断发展,神经网络在图像、视频、语音处理等各个领域取得了巨大的成功。
VGGNet、GoogleNet、ResNet 的出现,让我们清楚的看到神经网络正往更深、更复杂的网络设计方向发展。那么,如何将更复杂的神经网络部署到 FPGA
上,并能够满足一定的速度要求,成为研究者们的关注的焦点。

在现有的研究中,涌现出大量的 FPGA深 度 学 习 加 速 器 , 例 如 : DLAU[172], Deep-Burning[173],DeepX[174],BISMO[175],BitFusion[176]与[177]等等。

DLAU[172]

​ 是一种可扩展的加速器架构,主要使用三级流水线处理单元与分片技术去提高吞吐量并对深度学习应用程序的局部性特征进行探索。其中,三级流水线处理单元主要包含分片矩阵乘法单元,部分和累加单元和活化函数加速单元,可以重复使用以实现超大规模的神经网络。分片技术是来分割大规模的输入数据,将输入节点数据转换成更小的集合并重复计算,这样使得 DLAU 加速器可以将处理不同尺寸的分片数据进行灵活配置。经实验验证,与 Intel Core2 处理器相比,DLAU 加速器可以实现 36.1 倍的加速效果。

DeepBurning[173]

​ 是一种自动化神经网络加速器的实现方法。用户只需提供网络拓扑上层描述和硬件资源约束,框架中的神经网络集成器就可以自动分析网络特征,结合硬件约束在由内积单元、累加单元、池化单元等组成的组件库中选出合适组件组成硬件网络,以及对应的控制流、数据流和数据布局方案。

DeepX[174]

​ 是一个用于深度学习执行的软件加速器,可以降低深度学习应用时所需的内存,计算量与功耗。它通过利用移动片上系统的异构处理器(如 GPU,LPU)的混合,降低资源开销。在执行深度模型的不同推理阶段时,每个计算单元提供不同的资源效率。DeepX 在深度学习推理阶段时,通过扩展模型压缩原理,可以扩展单个模型层的复杂度,并以此控制推理过程中层的内存计算和能量消耗。同时,它还可以分解深层模型结构,将各块分配给本地和远程处理器,有效地最大限度地提高资源利用率。实验表明,DeepX 可以让大规模的深度学习模型在移动处理器上高效地执行,其性能显著优于现有的解决方案。

image-20220424144203773

BISMO[175]

是一个可扩展的位串行矩阵乘法覆盖,可以有效地在 FPGA 上实例化。它的核心是一个软件可编程加权二进制矩阵乘法引擎和用于获取数据并存储结果的相关硬件。它的软件可编程性使得可以在任何矩阵大小和任何定点或整数精度上进行操作。

神经网络压缩与加速技术

众所周知,深度神经网络在多个领域上表现出优于传统算法的效果。但在应用过程中,其计算量巨大,占据内存较大。因此,若想真正将神经网络
应用到嵌入式系统中去,就必须对神经网络自身进行处理,以实现神经网络的压缩与加速。FPGA 加速设计中涉及的几种常见的神经网络压缩与加速
方法:包含网络剪枝在内的深度压缩、低秩估计、模型量化以及知识蒸馏方法[178, 179]。

神经网络深度压缩

2015 年,Song Han 等人在论文[180]中提出了,在不损失精度的前提下,深度压缩对于 AlexNet 可以减少 35 倍的内存占用, 对于 VGG-16 的内存占用
可以减少 49 倍,其中网络剪枝就可以实现的模型压缩率就能达到 10 倍以上。2017 年,深鉴科技的语音识别技术成为了在 FPGA 上实现深度压缩应用
的成功典型。

神经网络的深度压缩的过程中包含:模型剪枝、权值量化与共享和霍夫曼编码,它们一起工作大大减少了神经网络的存储需求,在精度几乎无损的情况下,将模型压缩几十倍以上,具体的深度压缩方法的主要流程如图 2 所示。

网络剪枝

的提出可以溯源到 1989 年,由图灵奖获得者 Yann LeCun 在论文[183]中提出来的。其核心思想主要是通过估计每个参数的重要程度,删除不重要的参数,以达到模型压缩的目的,效果示意如图 3 所示。

根据裁剪方式不同,现有的剪枝方法分为阈值裁剪方法动态补救方法Filters 裁剪方法和重要性裁剪方法。在剪枝过程中,可以通过计算损失函数对参数的二阶导数的大小或计算参数的绝对值的大小来衡量网络参数重要程度,数值越小参数越不重要,可以进行删除。

设计者在进行网络裁枝时,需要考虑两个问题:对输出的一个节点进行裁剪是否影响到其他输出节点和如何对于删掉的参数进行彻底清除。针对于以上两个问题,目前提出了 **Filter-level、Group-level 与稀疏卷积方法[185]**。不管使用哪一种剪枝方法,剪枝后的网络需要进行再次参数调优。

image-20220424145704932

模型量化与参数共享

神经网络深度压缩过程的第二阶段是模型量化与参数共享,在这里只介绍参数共享,模型量化将在下一小节进行系统介绍。论文[180, 188]将参数共享归为量化操作中的一小步。不同的研究采用的共享规则也是存在差异的,论文[189]使用了一个低成本的哈希函数将连接权重随机地分配到哈希桶中,然后所有在同一个哈希桶中的连接共享一个参数值,而[190]是对所有权重使用 k-means 聚类操作,聚类完成之后属于同一类的权重将共享一个参数值。它们都是通过共享参数的方法来压缩神经网络模型。其中典型的聚类量化方法是,将训练的每一层的权值参数进行 k-means 聚类,聚类完成之后属于同一类的参数都使用该类聚类中心的数值作为

它们的权值参数数值,然后通过索引矩阵将共享权值一一对应到权值参数的确定位置。通过权值共享,原来的权值矩阵变成了一个查找表与共享权值矩阵,也就是说原来权值矩阵被一个与权值矩阵相同大小的查找表矩阵代替,查找表矩阵上面的索引可以准确找到对应的共享权值,共享权值则只需要存储在一个大小为共享权值总个数的矩阵中即可,如图 4 所述。

image-20220424150141418

哈夫曼编码

神经网络深度压缩过程的第三阶段是哈夫曼编码。哈夫曼编码是 1952 年 David A.Huffman 在论文[191]中提出来的。它是一种可变字长编码的编码方式。哈夫曼编码可以用短的码值来表示更多的数字,提高编码效率,以达到深度压缩的效果。因此,在深度压缩过程中最后保存网络的时候常常使用哈夫曼编码进行进一步的压缩。

低秩估计

低秩估计是利用矩阵分解或者张量分解以及矩阵乘法或者卷积运算这种线性运算的结合律,将原本的参数张量分解成若干个小张量,或将原本的卷积用几个小卷积代替。高维矩阵的运算会采用Tensor 分解方法对神经网络进行加速和压缩,目前的 Tensor 分解方法主要包含了 CP 分解、Tucker 分解、Tensor Train 分解[192] 和 Block Term 分解方法等等。典型的神经网络卷积核是一个四维张量,全连接层可以看作是一个二维矩阵,这些张量中往往存在大量的冗余。我们可以利用低秩估计的方法对于参数矩阵进行分解,减少参数量,达到模型压缩和加速效果。低秩估计是对神经网络的每一层利用低秩滤波器进行逐层逼近,每一层的参数就会被固定后,而对于每一层之前的层会根据重建误差准则进行微调[193–195]。压缩 2D 卷积层的典型低秩方法,如图 5 所示。

image-20220424150643434

模型量化

模型量化可以通过量化函数将全精度的数(激化量,参数,甚至是梯度值)映射到有限的整数空间。模型量化可以减少每个参数的存储空间,降低计算复杂度,因此可以实现神经网络加速。通过量化对神经网络模型进行不同位数的编码,应用少量的乘法与位运算加速了网络模型的运算速度。或者将神经网络中卷积运算中的矩阵乘法变为计算简单的加减法运算,简化了计算量,进而实现神经网络加速。

知识蒸馏

基于 FPGA 的深度神经网络模型的设计一般都趋向于计算复杂度低的小模型,对模型性能有了更高的要求,既要求计算速度快、资源少,又要具有复杂模型的精度性能。因此,对小模型的训练成为一个焦点问题。知识蒸馏[221]是 Hinton 等人在2015 年提出的,它是将训练好的复杂网络模型推广能力“知识”迁移到一个结构简单的网络中。以上提到的网络裁枝、低秩估计以及模型量化,都是对特定网络模型进行压缩和加速。然而知识蒸馏方法直接设计了一个简单结构的小网络,将难点转移成对小网络的训练上。整个思想中最大的难题在于如何有效地表达“知识”,并有效地指导小网络的训练。

知识蒸馏的结构主要由三大部分构成:指导网络、指导损失函数以及学习网络,如图 6 所示。

image-20220424151210338

指导网络又常常被称为“教师网络”,学习网络被常常成为“学生网络”。知识蒸馏的核心思想中使用了软目标辅助硬目标一起训练。其中,软目标指的是教师网络模型输出的预测结果,硬目标指的是样本原始标签,即真实标签。2015 年,Hinton在他的论文[221]中推荐软目标与硬目标经验权重为 9:1。

在现有的神经网络加速的研究中,有一部分工作 是使 用蒸馏 进行 模型优 化训 练的。 相关 研究[222–225]中设计了或者改进了学生模型,在几乎不损失精度的前提下,使用更少的参数,更浅的网络结构提高了网络计算速度。同时,模型蒸馏往往会与模型量化同时进行神经网络的压缩与加速,论文[226,227]中利用知识蒸馏技术,弥补因量化导致的性能下降,提高低精度网络的精度。论文[228]则是使用了在线蒸馏的方法,突破了分布式 SGD 存在的瓶颈,提高了集群上的模型计算效率与精度。

计算加速与优化

矩阵乘法优化矩阵运算在深度神经网络的训练与前向计算中占据主导地位,因此加速矩阵运算具有重大意义。矩阵乘法的优化可以通过减少乘法计算次数和提
高计算速度来实现。矩阵分块技术与 Winograd 转换方法常常作为神经网络中的优化算法。

矩阵分块技术

在深度神经网络中存在大量的矩阵运算,常常会因为矩阵太大而出现高速缓存缺失的情况。循环分块可以将矩阵循环拆分成更小的模块进行计算,这样可以使片上存储数据重复利用,减少访问内存的次数,提高计算的效率。

矩阵 Winograd 转换

Winograd 转换方法的核心思想就是使用更多的加法来代替乘法[229]。因此,我们可以在滤波器的维度较小的情况下使用 Winograd 方法做卷积运算。

因此,我们可以在滤波器的维度较小的情况下使用 Winograd 方法做卷积运算。2016 年,论文[230]是 CVPR 首个将 Winograd 算法引入的研究工作,文中利用 Winograd 算法与傅里叶变换算法分别对卷积神经网络进行剪枝操作,得出 Winograd 算法的剪枝性能优于傅里叶变换算法的结论。

卷积优化

神经网络结构往往是由卷积层,池化层以及全连接层构成的。其中的卷积层和全连接层在硬件结构上,往往是针对于矩阵运算进行设计的。将卷积层和全连接层可以转化为矩阵,然后利用 FPGA 进行计算并加速。如图 7 就是将二维卷积转化为矩阵的示意图:

image-20220424152108290

卷积就是卷积核跟图像矩阵的运算。卷积操作的实现方法主要有滑窗法、傅里叶变换法和 im2col。

频率优化

理论峰值工作频率也是 FPGA 性能指标之一,提高 FPGA 的峰值性能也是目前 FPGA 加速设计中的一个研究方向[85,91,241]。FPGA 能够达到多少工作频率不仅需要考虑 FPGA 芯片自身支持的频率是多少,同时需要考虑如何内部提高时钟频率,即如何对程序优化,来提高多用寄存器工作频率。28nm 的 Altera FPGA 上实现傅里叶变换等简单算法可以达到数百 GFLOPS,QR 与 Cholesky 分解等复杂算法则达到 100 GFLOPS 以上。

基于带宽的神经网络加速

在基于 FPGA 的神经网络加速中,内存带宽也常常是影响计算速度的瓶颈。当模型的计算强度小于计算平台的计算强度上限时,此时模型理论性能的大小完全由计算平台的带宽上限以及模型自身的计算强度所决定。由此可见,在模型处于带宽瓶颈区间的前提下,计算平台的带宽越大,模型的理论性能可呈线性增长。因此,通过提高带宽上限或者减小带宽需求,可以实现对模型的加速。

本节将从三个方面对基于带宽的神经网络加速进行阐述:首先介绍了衡量神经网络模型性能的 Roof-line 模型,其次总结了针对提高带宽上限和减小带宽需求的现有方法。

Roof-line 模型Roof-line 模型就是用来衡量模型在一个计算平台的限制下,所达到的最大浮点计算速度。通常计算平台使用算力π与带宽β这两个指标进行性能衡
算力也称为计算平台的性能上限,指的是一个计算平台倾尽全力每秒钟所能完成的浮点运算数。单位是 FLOP/s。带宽也即计算平台的带宽上限,指的是一个计算平台倾尽全力每秒所能完成的内存交换量。单位是 Byte/s。与此对应的,计算强度上限 Imax 就是算力和带宽相除的结果

基于FPGA的神经网络编译器及框架

FPGA 的价值所在就是高度灵活、快速部署,在这方面涌现出很多针对 FPGA 上的神经网络部署的编译器和框架。例如:sensAI 和 ALAMO 编译器[239],FP-DNN 框架[112], FPGAConvNet 框架[101],Caffeinated FPGAs 框架[231]以及 FINN 框架[110]等等。在论文[87]中,Yufei Ma 等人提出了一个基于库的 RTL 级 CNN 编译器,该编译器可以自动生成用于各种 CNN 推理任务的定制 FPGA 硬件,以便实现 CNN 从软件到 FPGA 的高级快速原型设计。针对 FPGA 部署神经网络,研究者又提出了编译器 ALAMO[239],它使用模块化 RTL 编译器加速深度学习算法,目标是提供一种自动方式,将 CNN推理过程映射到可以使用的高效 RTL 代码。该论文表明,自动编译器解决方案有望实现深度学习的模块化和可扩展硬件加速。

随着神经网络的发展,在 FPGA 上部署神经网络的框架也成为研究热点。针对于神经网络部署在FPGA 上,研究者提出各种不同的框架。例如:Yijin
Guan 等人提出了 FP-DNN 框架[112],该框架可以自动将 DNN 映射到 FPGA 上以加速模型推理。Stylianos I 等人提出了 FPGAConvNet 框架[101],该框架可以将卷积神经网络 CNN 映射到 FPGA 上。Roberto 等人提出了 Caffeinated FPGAs 框架[231],该框架是 CNN 框架 Caffe 的修改版,并带有 FPGA支持,可实现 CNN 模型和专用的 FPGA 实现,并在必要时灵活地对设备进行重新编程。论文[110]中提出了 FINN 框架,主要使用灵活的异构流架构的 FPGA 加速器,通过利用一组新颖的优化可以有效映射二值化神经网络。

大量计算和频繁的内存访问是神经网络在便携式系统上部署的挑战性问题。现有高层适用于FPGA 的综合工具(例如 HLS,OpenCL)大大减少了设计时间,硬件级设计(即 RTL)可以提高效率并实现更大的加速。随着神经网络的不断发展,其在 FPGA 上的部署问题也将成研究者关注的重点。这将进一步促使更多的针对 FPGA 上的神经网络部署的编译器以及框架的出现。

FPGA 深度神经网络的型号选择和性能度量分析

​ 对于基于 FPGA 深度神经网络的研究,器件的选择和实验结果的分析评估是实验过程中不可忽视的两个部分。其中,FPGA 的型号选择是实验顺利进行的先决条件,在此基础上对实验结果进行度量和分析,便可以从多个维度对实验进行分析和把控,从而得到较为全面的实验结果,有助于推进FPGA 深度神经网络的研究进展。

FPGA型号选择

进行 FPGA 选择时,需要根据应用的方向结合 FPGA 器件的特点进行考虑。例如,从器件特色、规模大小、速度需求、功耗、成本、稳定性、安全性等方面进行选择。FPGA 芯片内部资源主要包括 IO 资源、时钟资源、逻辑资源、RAM资源、DSP 资源、高速接口资源、硬核 IP 等,型号选择通常需要平衡各种资源需求并优先考虑关键资源的瓶颈。

例如,在深度神经网络计算加速设计中,通常需要优先考虑 DSP 数量、BRAM 数量以及所支持的外部存储最大带宽等。在选择具体的芯片型号以及封装时,要根据实验的需求与具体情况做出选择。一般来说,可以从芯片特点、规模大小、速度需求、功耗等几个方面做综合的考量。

表 2 FPGA 常用型号

image-20220424162034021

基于网络的 FPGA 型号选择

不同的应用及网络模型常常适合不同的 FPGA型号。目前基于 FPGA 的深度学习实验中,常用的网络模型有 AlexNet、VGG、GoogleNet、ResNet、RNN 等。其中以 AlexNet 为实验模型时常选用Kintex-7、Virtex-7、Stratix-V 系列;以 VGG 为实验模型时常选用 Virtex-7、Stratix-V、Kintex-7、Arria-10 系列;以 GoogleNet 为实验模型时常选用Kintex-7、Arria-10 系列;以 ResNet 为实验模型时常选用 Arria-10、Kintex-7 系列;以 RNN 为实验模型时常选用 Kintex-7、Airtex-7、Arria-10、 Virtex-6系列。具体系列选择如表 3 所示。

表 3 基于网络的 FPGA 型号选择

image-20220424162218037

基于应用的 FPGA 型号选择

对于不同应用领域的深度学习实验,研究者们所选择的 FPGA 型号常常是不同的。深度学习应用中常见的图像识别、目标跟踪、目标检测、语音识别等应用中常常使用 Virtex-5、Virtex-2、Virtex-4系列的 FPGA 芯片,除此之外,在自然语言处理中,研究者们还使用了 Airtex-7 系列;在网络安全与入侵检测和电力应用中,Virtex-2 系列被用的最多。每一种应用所常用的 FPGA 芯片系列具体如表 4 所示。

表 4 基于应用的 FPGA 型号选择

image-20220424162346660

评估指标和度量分析

除了 FPGA 选型之外, 如何衡量基于 FPGA 的深度神经网络的实验效果是另一个需要着重考虑的问题。以实验常用的衡量指标为基础,基于 FPGA 的
深度神经网络的性能衡量指标具体可从速率、能效、资源利用率、深度神经网络的性能和特定应用五个维度进行具体衡量。其中,速率、能效、资源
利用率更侧重于对 FPGA 的性能评估,而后两者则偏向于深度神经网络的性能的衡量。可以看出,对基于 FPGA 的深度神经网络的实验效果进行衡量要
多维度、全方面的考虑,这样才能更加准确的进行性能评估与度量分析。下面将对其进行详细介绍。

基于速度的实验评估指标

在实验的结果评估中,速度是判断实验效果的重要标准之一。论文中常用的速度评估方法有吞吐量和响应时间、CPU 执行时间、MIPS、MFLOPS、GFLOPS 和 TFLOPS 等。

基于能效的实验评估指标

FPGA 具有高性能、低能耗、高并行、较强的灵活性等优点。因此,能源效率是深度 FPGA 实验性 能的 另一个 重要 评估指 标。 论文中 常常 采用GOPS/W 的比值来评价在 1W 功耗的情况下,处理器的运算能力。功率、带宽、能耗等常常作为具体的评估指标。在不同 FPGA 加速平台进行比较时,将功率为比较标准之一。

基于资源利用率的实验评估指标

在 FPGA 的设计中,必须要充分了解各个芯片的内部资源利用情况,包括 FF、DSP、LUT、BRAM等单元,在后续的实验设计中才能使得以上各个单元的利用达到平衡,并最大限度地发挥作用。因此,FPGA 每一个单元的资源使用情况同样可以对实验效果进行评价。论文中常用某一元器件已用资源与可用资源的比值计算资源利用率。因此,FPGA 每一个单元的资源使用情况同样可以成为对实验效果的评估指标。论文中常用某一元器件用的资源与可用的资源的比值作为资源利用率的计算方法。

基于网络结构的实验评价指标

网络结构和数据集是深度学习必不可少的一部分。对于深度 FPGA 实验来说,实验中常用网络结构有 VGG、AlexNet、 GoogleNet、ResNet、NiN、LeNet、PCNN、RNN、 SqueezeNet、SNN、MobileNet等 ; 实 验 常 用 数 据 集 有 MINST 、 CIFAR-10 、ImageNet 、 Kaldi 、 GTSDB 、 Penn Treebank 、TSUKUBA、Venus、Cones、Teddy、 TIMIT、Speaker dependent TI46、INRIA、PPI、 Reddit、Yelp、STL,LIDAR、PTSB、Sports-1M、 Oxford Flowers 102、Birds-200 等。深度神经网络由多层神经网络结构组成,网络层有卷积层、池化层、全连接层等。不同层对实验结果都起着不同的作用。因此,对每一
层进行性能分析,可以得到其对实验性能的影响。

基于应用的实验评价指标

基于 FPGA 的深度神经网络在各个方面均得到了应用。对于不同的应用,其相应的评估指标也应该有所不同。

影响 FPGA 应用于深度神经网络的主要因素

生态环境不完善

编程语言门槛高

数据和模型的复杂化

缺乏专业人才

神经网络与深度学习(邱锡鹏_复旦大学)(二 机器学习概述)

机器学习

机器学习三个基本要素

模型

​ 输入空间 𝒳 和输出空间 𝒴 构成了一个样本空间 . 对于样本空间中的样本样本的特征空间 $(𝒙, 𝑦) ∈ 𝒳 × 𝒴 $, 假定 𝒙 和 𝑦 之间的关系可以通过一个未知的真实映射函数 $𝑦 =𝑔(𝒙) $或真实条件概率分布$ 𝑝_𝑟 (𝑦|𝒙) $来描述 . 机器学习的目标是找到一个模型来近似真实映射函数$ 𝑔(𝒙) $或真实条件概率分布$ 𝑝_𝑟 (𝑦|𝒙)$.

​ 根据经验来假设一个函数集合 ℱ , 称为假设空间( Hypothesis Space ),然后通过观测其在训练集 𝒟 上的特性, 从中选择一个理想的假设( Hypothesis )𝑓 ^∗^ ∈ ℱ.
​ 假设空间 ℱ 通常为一个参数化的函数族

image-20220318152627826

其中 𝑓(𝒙; 𝜃) 是参数为 𝜃 的函数,也称为模型( Model ),𝐷 为参数的数量 .常见的假设空间可以分为线性和非线性两种, 对应的模型 𝑓 也分别称为线性模型非线性模型 .


线性模型

​ 线性模型的假设空间为一个参数化的线性函数族,即:

image-20220318153740836

其中参数 𝜃 包含了权重向量 𝒘偏置 𝑏.

非线性模型

​ 广义的非线性模型可以写为多个非线性基函数 𝜙(𝒙) 的线性组合:

image-20220318154011253

其中$ 𝜙(𝒙) = [𝜙_1 (𝒙), 𝜙_2 (𝒙), ⋯ , 𝜙_𝐾 (𝒙)]^T $为 𝐾 个非线性基函数组成的向量, 参数 𝜃包含了权重向量 𝒘 和偏置 𝑏.
如果 𝜙(𝒙) 本身为可学习的基函数,比如:
$$
𝜙_𝑘 (𝒙) = ℎ(𝒘^T_𝑘 𝜙 ′ (𝒙) + 𝑏_𝑘 ), ∀1 ≤ 𝑘 ≤ 𝐾, (2.8)
$$

其中 ℎ(⋅) 为非线性函数, 𝜙 ′ (𝒙) 为另一组基函数, $𝒘_𝑘 和 𝑏_𝑘 $为可学习的参数,则$𝑓(𝒙;𝜃)$ 就等价于神经网络模型 .

学习准则

​ 令训练集$ 𝒟 = {(𝒙^{(𝑛)} , 𝑦^{(𝑛)} )}^𝑁_𝑛=1 $是由 𝑁 个独立同分布( Identically and Inde-pendently Distributed , IID )的样本组成, 即每个样本 (𝒙, 𝑦) ∈ 𝒳 × 𝒴 是从 𝒳 和 𝒴的联合空间中按照某个未知分布$𝑝_𝑟 (𝒙, 𝑦)$ 独立地随机产生的 . 这里要求样本分布$𝑝_𝑟 (𝒙, 𝑦)$ 必须是固定的(虽然可以是未知的), 不会随时间而变化 . 如果$𝑝_𝑟 (𝒙, 𝑦)$ 本身可变的话,就无法通过这些数据进行学习 .

​ 一个好的模型$ 𝑓(𝒙, 𝜃^∗ ) $应该在所有 (𝒙, 𝑦) 的可能取值上都与真实映射函数𝑦 = 𝑔(𝒙) 一致, 即:

image-20220318163354705

​ 或与真实条件概率分布 $𝑝_𝑟 (𝒙, 𝑦)$ 一致,即:

image-20220318163458314

其中 𝜖 是一个很小的正数,$𝑓_𝑦 (𝒙, 𝜃 ) $为模型预测的条件概率分布中 𝑦 对应的概率 .

模型 𝑓(𝒙; 𝜃) 的好坏可以通过期望风险( Expected Risk ) ℛ(𝜃) 来衡量, 其定义为:

image-20220318164637587

​ 其中 $𝑝_𝑟 (𝒙, 𝑦)$ 为真实的数据分布,$ ℒ(𝑦, 𝑓(𝒙; 𝜃)) $为损失函数, 用来量化两个变量之间的差异 .

损失函数

损失函数是一个非负实数函数, 用来量化模型预测和真实标签之间的差异 .下面介绍几种常用的损失函数 .

  • 0-1 损失函数 最直观的损失函数是模型在训练集上的错误率,即 0-1 损失函数( 0-1 Loss Function ):

image-20220318165528207

其中 𝐼(⋅) 是指示函数 .

虽然 0-1 损失函数能够客观地评价模型的好坏, 但其缺点是数学性质不是很好: 不连续且导数为 0 ,
难以优化 . 因此经常用连续可微的损失函数替代 .

  • 平方损失函数 平方损失函数( Quadratic Loss Function )经常用在预测标签 𝑦为实数值的任务中,
    定义为:

image-20220318165919236

​ 平方损失函数一般不适用于分类问题 .

  • 交叉熵损失函数 交叉熵损失函数( Cross-Entropy Loss Function )一般用于分类问题 . 假设样本的标签 𝑦 ∈ {1, ⋯ 𝐶} 为离散的类别, 模型 $𝑓(𝒙; 𝜃) ∈ [0, 1]^𝐶 $的输出为类别标签的条件概率分布,即:

image-20220318171043548

并满足:

image-20220318171148052

​ 我们可以用一个 𝐶 维的 one-hot 向量 𝒚 来表示样本标签 . 假设样本的标签为𝑘 , 那么标签向量 𝒚 只有第 𝑘 维的值为 1 , 其余元素的值都为 0. 标签向量 𝒚 可以看作是样本标签的真实概率分布, 即第 𝑐 维(记为 $𝑦_𝑐 , 1 ≤ 𝑐 ≤ 𝐶 $)是类别为 𝑐 的真实概率 . 假设样本的类别为 𝑘 , 那么它属于第 𝑘 类的概率为 1 ,其他类的概率为 0.

对于两个概率分布, 一般可以用交叉熵来衡量它们的差异 . 标签的真实分布𝒚 和模型预测分布 𝑓(𝒙; 𝜃) 之间的交叉熵为

image-20220318173649207

比如对于三分类问题,一个样本的标签向量为$ 𝒚 = [0, 0, 1]^T$ ,模型预测的标签分布为$ 𝑓(𝒙; 𝜃) = [0.3, 0.3, 0.4]^T $,则它们的交叉熵为 $−(0 × log(0.3) + 0 ×log(0.3) + 1 × log(0.4)) = − log(0.4).$

因为 𝒚 为 one-hot 向量, 公式 (2.18) 也可以写为:

image-20220318175923831

其中 $𝑓_𝑦 (𝒙; 𝜃) $可以看作真实类别 𝑦 的似然函数 . 因此, 交叉熵损失函数也就是负对数似然函数( Negative Log-Likelihood ) .

  • Hinge 损失函数 对于二分类问题, 假设 𝑦 的取值为$ {−1, +1} , 𝑓(𝒙; 𝜃) ∈ ℝ. Hinge$损失函数( Hinge Loss Function )为

image-20220318182304099

风险最小化准则

​ 一个好的模型 𝑓(𝒙; 𝜃) 应当有一个比较小的期望错误, 但由于不知道真实的数据分布和映射函数, 实际上无法计算其期望风险 ℛ(𝜃). 给定一个训练集 $𝒟 ={(𝒙 (𝑛) , 𝑦 (𝑛) )}^𝑁_{𝑛=1} $, 我们可以计算的是经验风险( Empirical Risk )(经验风险也称为经验错误), 即在训练集上的平均损失:

image-20220318183457429

因此,一个切实可行的学习准则是找到一组参数 $𝜃^∗$ 使得经验风险最小,即

image-20220318183906235

这就是经验风险最小化( Empirical Risk Minimization,ERM )准则 .

过拟合

​ 根据大数定理可知, 当训练集大小 |𝒟| 趋向于无穷大时, 经验风险就趋向于期望风险 . 然而通常情况下, 我们无法获取无限的训练样本, 并且训练样本往往是真实数据的一个很小的子集或者包含一定的噪声数据, 不能很好地反映全部数据的真实分布 . 经验风险最小化原则很容易导致模型在训练集上错误率很低,但是在未知数据上错误率很高 . 这就是所谓的过拟合( Overfitting ) .

定义 2.1 – 过拟合: 给定一个假设空间 ℱ , 一个假设 𝑓 属于 ℱ , 如果存在其他的假设 𝑓 ′ 也属于 ℱ, 使得在训练集上 𝑓 的损失比 𝑓 ′ 小, 但在整个样本空间上 𝑓 ′ 比 𝑓 的损失小,那么就说假设 𝑓 过度拟合训练数据 [Mitchell, 1997].

过拟合问题往往是由于训练数据少和噪声以及模型能力强等原因造成的 .为了解决过拟合问题, 一般在经验风险最小化的基础上再引入参数的正则化( Regularization )来限制模型能力,使其不要过度地最小化经验风险 . 这种准则就是结构风险最小化( Structure Risk Minimization ,SRM )准则:

image-20220318185659111

其中 ‖𝜃‖ 是 $ℓ^2$ 范数的正则化项, 用来减少参数空间, 避免过拟合; 𝜆 用来控制正则化的强度 .

​ 正则化项也可以使用其他函数, 比如$ ℓ_1 $范数 . $ ℓ_1 $范数的引入通常会使得参数有一定稀疏性, 因此在很多算法中也经常使用 . 从贝叶斯学习的角度来讲, 正则化是假设了参数的先验分布,不完全依赖训练数据 .

​ 和过拟合相反的一个概念是欠拟合( Underfitting ), 即模型不能很好地拟合训练数据, 在训练集的错误率比较高 . 欠拟合一般是由于模型能力不足造成的 .图 2.3 给出了欠拟合和过拟合的示例 .

image-20220318190657438

​ 总之, 机器学习中的学习准则并不仅仅是拟合训练集上的数据, 同时也要使得泛化错误最低 . 给定一个训练集, 机器学习的目标是从假设空间中找到一个泛化错误较低的 “理想” 模型, 以便更好地对未知的样本进行预测, 特别是不在训练集中出现的样本 . 因此, 机器学习可以看作是一个从有限、 高维、 有噪声的数据上得到更一般性规律的泛化问题 .

优化算法

​ 在确定了训练集 𝒟 、假设空间 ℱ 以及学习准则后,如何找到最优的模型$𝑓(𝒙, 𝜃^∗ ) $就成了一个最优化( Optimization )问题 . 机器学习的训练过程其实就是最优化问题的求解过程 .

参数与超参数 在机器学习中,优化又可以分为参数优化超参数优化 . 模型𝑓(𝒙; 𝜃) 中的 𝜃 称为模型的参数, 可以通过优化算法进行学习 . 除了可学习的参数𝜃 之外, 还有一类参数是用来定义模型结构或优化策略的, 这类参数叫做超参数( Hyper-Parameter ) .

​ 常见的超参数包括: 聚类算法中的类别个数梯度下降法中的步长正则化项的系数神经网络的层数支持向量机中的核函数等 . 超参数的选取一般都是组合优化问题, 很难通过优化算法来自动学习 . 因此, 超参数优化是机器学习的一个经验性很强的技术, 通常是按照人的经验设定, 或者通过搜索的方法对一组超参

数组合进行不断试错调整 .

梯度下降法

​ 为了充分利用凸优化中一些高效、 成熟的优化方法, 比如共轭梯度、 拟牛顿法等, 很多机器学习方法都倾向于选择合适的模型和损失函数以构造一个凸函数作为优化目标 . 但也有很多模型(比如神经网络)的优化目标是非凸的, 只能退而求其次找到局部最优解 .

​ 在机器学习中, 最简单、 常用的优化算法就是梯度下降法, 即首先初始化参数$𝜃^0$ , 然后按下面的迭代公式来计算训练集 𝒟 上风险函数的最小值:

image-20220319091201879

其中 𝜃 𝑡 为第 𝑡 次迭代时的参数值, 𝛼 为搜索步长 . 在机器学习中, 𝛼 一般称为学习率( Learning Rate ) .

提前停止

​ 针对梯度下降的优化算法, 除了加正则化项之外, 还可以通过提前停止防止过拟合 .

​ 在梯度下降训练的过程中, 由于过拟合的原因, 在训练样本上收敛的参数, 并不一定在测试集上最优 . 因此, 除了训练集和测试集之外, 有时也会使用一个验证集( Validation Set )(验 证 集 也 叫开 发 集)来进行模型选择, 测试模型在验证集上是否最优 . 在每次迭代时, 把新得到的模型 𝑓(𝒙; 𝜃) 在验证集上进行测试, 并计算错误率 . 如果在验证集上的错误率不再下降, 就停止迭代 . 这种策略叫提前停止( Early Stop ) . 如果没有验证集, 可以在训练集上划分出一个小比例的子集作为验证集 . 图 2.4 给出了提前停止的示例 .

image-20220319092654476

随机梯度下降法

​ 在公式 (2.27) 的梯度下降法中, 目标函数是整个训练集上的风险函数, 这种方式称为批量梯度下降法( Batch Gradient Descent ,BGD ) . 批量梯度下降法在每次迭代时需要计算每个样本上损失函数的梯度并求和 . 当训练集中的样本数量𝑁 很大时, 空间复杂度比较高, 每次迭代的计算开销也很大 .

​ 在机器学习中,我们假设每个样本都是独立同分布地从真实数据分布中随机抽取出来的,真正的优化目标是期望风险最小 . 批量梯度下降法相当于是从真实数据分布中采集 𝑁 个样本, 并由它们计算出来的经验风险的梯度来近似期望风险的梯度 .为了减少每次迭代的计算复杂度, 我们也可以在每次迭代时只采集一个样本,计算这个样本损失函数的梯度并更新参数,即随机梯度下降法( Stochastic Gradient Descent ,SGD ) . 当经过足够次数的迭代时, 随机梯度下降也可以收敛到局部最优解 [Nemirovski et al., 2009].

随机梯度下降法的训练过程如算法 2.1 所示 .

​ 批量梯度下降和随机梯度下降之间的区别在于每次迭代的优化目标是对所有样本的平均损失函数还是单个样本的损失函数 . 随机梯度下降因为实现简单,收敛速度也非常快, 因此使用非常广泛 . 随机梯度下降相当于在批量梯度下降的梯度上引入了随机噪声 . 当目标函数非凸时,反而可以使其逃离局部最优点 .

​ 不同机器学习算法的区别在于模型学习准则(损失函数)优化算法的差异 . 相同的模型也可以有不同的学习算法 . 比如线性分类模型有感知器、 Logistic回归和支持向量机。它们之间的差异在于使用了不同的学习准则和优化算法 .

  • 小批量梯度下降法 随机梯度下降法的一个缺点是无法充分利用计算机的并行计算能力 . 小批量梯度下降法( Mini-Batch Gradient Descent )是批量梯度下降和随机梯度下降的折中 . 每次迭代时, 我们随机选取一小部分训练样本来计算梯度并更新参数,这样既可以兼顾随机梯度下降法的优点,也可以提高训练效率 .

第 𝑡 次迭代时, 随机选取一个包含 𝐾 个样本的子集 $S_t$ , 计算这个子集上每个(𝐾通常不会设置很大通常设置
为 2 的幂 $2^𝑛$ .)样本损失函数的梯度并进行平均,然后再进行参数更新:

image-20220319094735549

在实际应用中, 小批量随机梯度下降法有收敛快、 计算开销小的优点, 因此逐渐成为大规模的机器学习中的主要优化算法 [Bottou, 2010].

机器学习的简单示例: 线性回归

在本节中, 我们通过一个简单的模型(线性回归)来具体了解机器学习的一般过程, 以及不同学习准则(经验风险最小化、 结构风险最小化、 最大似然估计、最大后验估计)之间的关系 .

线性回归( Linear Regression )是机器学习和统计学中最基础和广泛应用的模型, 是一种对自变量和因变量之间关系进行建模的回归分析 . 自变量数量为 1时称为简单回归,自变量数量大于 1 时称为多元回归 .

​ 从机器学习的角度来看, 自变量就是样本的特性向量 $𝒙 ∈ ℝ^𝐷 $(每一维对应一个自变量), 因变量是标签 𝑦 , 这里 𝑦 ∈ ℝ 是连续值(实数或连续整数) . 假设空间是一组参数化的线性函数:

image-20220319100356330

其中权重向量 𝒘 ∈ ℝ 𝐷 和偏置 𝑏 ∈ ℝ 都是可学习的参数, 函数 𝑓(𝒙; 𝒘, 𝑏) ∈ ℝ 也称为线性模型 .

为简单起见,我们将公式 (2.30) 写为

image-20220319100603654

其中 𝒘 ̂ 和 𝒙 ̂ 分别称为增广权重向量和增广特征向量

image-20220319100715340

其中 ⊕ 定义为两个向量的拼接操作 .

不失一般性, 在本章后面的描述中我们采用简化的表示方法, 直接用 𝒘 和 𝒙来表示增广权重向量和增广特征向量 . 这样, 线性回归的模型简写为$ 𝑓(𝒙; 𝒘) =𝒘^T 𝒙.$

参数学习

​ 给定一组包含 𝑁 个训练样本的训练集$ 𝒟 = {(𝒙^{(𝑛)} , 𝑦^{(𝑛) })}^𝐷_𝑛=1 ,$ 我们希望能够学习一个最优的线性回归的模型参数 𝒘.我们介绍四种不同的参数估计方法: 经验风险最小化、 结构风险最小化、 最大似然估计、 最大后验估计 .

经验风险最小化

​ 由于线性回归的标签 𝑦 和模型输出都为连续的实数值, 因此平方损失函数非常合适来衡量真实标签和预测标签之间的差异 .

根据经验风险最小化准则,训练集 $D$上的经验风险定义为:

image-20220319104454370

其中$ 𝒚 = [𝑦^{(1)} , ⋯ , 𝑦^{(𝑁)} ]^T ∈ ℝ^𝑁$ 是由所有样本的真实标签组成的列向量,而$𝑿 ∈ ℝ^{ (𝐷+1)×𝑁} $是由所有样本的输入特征$ 𝒙^{(1)} , ⋯ , 𝒙^{(𝑁)}$ 组成的矩阵

image-20220319104946816

风险函数 ℛ(𝒘) 是关于 𝒘 的凸函数, 其对 𝒘 的偏导数为:

image-20220319105048616

image-20220319105108698

​ 这种求解线性回归参数的方法也叫最小二乘法( Least Square Method , LSM ),图 2.5 给出了用最小二乘法来进行线性回归参数学习的示例 .

​ 在最小二乘法中,$ 𝑿𝑿^T ∈ ℝ^{(𝐷+1)×(𝐷+1)}$ 必须存在逆矩阵, 即 $𝑿𝑿^T $是满秩的$( rank(𝑿𝑿^T ) = 𝐷 + 1 )$ . 也就是说, 𝑿 中的行向量之间是线性不相关的, 即每一个特征都和其他特征不相关 . 一种常见的$ 𝑿𝑿^T$ 不可逆情况是样本数量 𝑁 小于特征数量 (𝐷 + 1) ,$𝑿𝑿^T $的秩为 𝑁. 这时会存在很多解 𝒘 ∗ , 可以使得$ ℛ(𝒘^∗ ) = 0.$

​ 当$ 𝑿𝑿^T$ 不可逆时, 可以通过下面两种方法来估计参数:( 1 )先使用主成分分析等方法来预处理数据, 消除不同特征之间的相关性, 然后再使用最小二乘法来估计参数;( 2 )通过用梯度下降法来估计参数 . 先初始化 𝒘 = 0 , 然后通过下面公式进行迭代:

image-20220319111413160

image-20220319111521672

其中 𝛼 是学习率 . 这种利用梯度下降法来求解的方法也称为最小均方( Least Mean Squares , LMS )算法 .

结构风险最小化

​ 最小二乘法的基本要求是各个特征之间要互相独立, 保证$𝑿𝑿^T$ 可逆 . 但即使 $𝑿𝑿^T$可逆, 如果特征之间有较大的多重共线性( Multicollinearity ), 也会使得$𝑿𝑿^T $的逆在数值上无法准确计算 . 数据集 𝑿 上一些小的扰动就会导致 $(𝑿𝑿^T )^{−1}$发生大的改变,进而使得最小二乘法的计算变得很不稳定 . 为了解决这个问题,
[Hoerl et al., 1970] 提出了岭回归( Ridge Regression ), 给 $𝑿𝑿^T$ 的对角线元素都加上一个常数 𝜆 使得 $(𝑿𝑿^T + 𝜆𝐼) $满秩,即其行列式不为 0. 最优的参数 $𝒘^∗$ 为:

image-20220319112900522

其中 𝜆 > 0 为预先设置的超参数, 𝐼 为单位矩阵 .

岭回归的解 $𝒘^∗ $可以看作是结构风险最小化准则下的最小二乘法估计, 其目标函数可以写为

image-20220319113424917

其中 𝜆 > 0 为正则化系数 .

最大似然估计

​ 机器学习任务可以分为两类: 一类是样本的特征向量 𝒙 和标签 𝑦 之间存在未知的函数关系 𝑦 = ℎ(𝒙) , 另一类是条件概率 𝑝(𝑦|𝒙) 服从某个未知分布 .第 2.3.1.1 中介绍的最小二乘法是属于第一类,直接建模 𝒙 和标签 𝑦 之间的函数关系 . 此外,线性回归还可以通过建模条件概率 𝑝(𝑦|𝒙) 的角度来进行参数估计 .

假设标签 𝑦 为一个随机变量, 其服从以均值为$𝑓(𝒙; 𝒘) = 𝒘^T 𝒙 , 方差为 𝜎^2$ 的高斯分布:

image-20220319151238941

参数 𝒘 在训练集 𝒟 上的似然函数( Likelihood )为

image-20220319151659719

其中$ 𝒚 = [𝑦^{(1)} , ⋯ , 𝑦 ^{(𝑁)} ]^ T $为所有样本标签组成的向量,$ 𝑿 = [𝒙 ^{(1)} , ⋯ , 𝒙 ^{(𝑁) }] $为所有样本特征向量组成的矩阵.

为了方便计算,对似然函数取对数得到对数似然函数( Log Likelihood ),

image-20220319152051899

最大似然估计( Maximum Likelihood Estimation , MLE )是指找到一组参数 𝒘 使得似然函数 𝑝(𝒚|𝑿; 𝒘, 𝜎) 最大,等价于对数似然函数 log 𝑝(𝒚|𝑿; 𝒘, 𝜎) 最大 .

image-20220319152157218

可以看出,最大似然估计的解和最小二乘法的解相同 .

最大后验估计

​ 最大似然估计的一个缺点是当训练数据比较少时会发生过拟合, 估计的参数可能不准确 . 为了避免过拟合,我们可以给参数加上一些先验知识 .

​ 假设参数 𝒘 为一个随机向量, 并服从一个先验分布 𝑝(𝒘; 𝜈). 为简单起见, 一般令 𝑝(𝒘; 𝜈) 为各向同性的高斯分布:

image-20220319153003334

其中$𝜈^2$ 为每一维上的方差 .

根据贝叶斯公式,那么参数 𝒘 的后验分布( Posterior Distribution )

image-20220319153139843

其中 𝑝(𝒚|𝑿; 𝒘, 𝜎) 为 𝒘 的似然函数,定义见公式 (2.47) ,𝑝(𝒘; 𝜈) 为 𝒘 的先验 .

​ 这种估计参数 𝒘 的后验概率分布的方法称为贝叶斯估计( Bayesian Estima-tion ), 是一种统计推断问题 . 采用贝叶斯估计的线性回归也称为贝叶斯线性回归( Bayesian Linear Regression ) .

​ 贝叶斯估计是一种参数的区间估计,即参数在一个区间上的分布 . 如果我们希望得到一个最优的参数值(即点估计),可以使用最大后验估计 .最大后验估计( Maximum A Posteriori Estimation , MAP )是指最优参数为后验分布𝑝(𝒘|𝑿, 𝒚; 𝜈, 𝜎) 中概率密度最高的参数

image-20220319154711107

令似然函数 𝑝(𝒚|𝑿, 𝒘; 𝜎) 为公式 (2.48) 中定义的高斯密度函数, 则后验分布𝑝(𝒘|𝑿, 𝒚; 𝜈, 𝜎) 的对数为

image-20220319154842141

可以看出,最大后验概率等价于平方损失的结构方法最小化,其中正则化系数$𝜆 = 𝜎^2 /𝜈^2 .$

​ 最大似然估计和贝叶斯估计可以看作是频率学派和贝叶斯学派对需要估计的参数 𝒘 的不同解释 . 当 𝜈 → ∞ 时, 先验分布 𝑝(𝒘; 𝜈) 退化为均匀分布, 称为无信息先验( Non-Informative Prior ),最大后验估计退化为最大似然估计 .

常用的深度学习框架

深度学习框架

​ 在深度学习中,一般通过误差反向传播算法来进行参数学习. 采用手工方式来计算梯度再写代码实现的方式会非常低效,并且容易出错. 此外,深度学习模型需要的计算机资源比较多,一般需要在CPU 和GPU 之间不断进行切换,开发难度也比较大. 因此,一些支持自动梯度计算、无缝CPU 和GPU 切换等功能的深度学习框架就应运而生. 比较有代表性的框架包括:Theano、Caffe、TensorFlow、Pytorch、飞桨(PaddlePaddle)、Chainer 和MXNet 等.

(1) Theano:由蒙特利尔大学的Python 工具包,.用来高效地定义、优化和计算张量数据的数学表达式. Theano 可以透明地使用GPU 和高效的符号微分.( Theano 项目目前已停止维护)

(2) **Caffe:由加州大学伯克利分校开发的针对卷积神经网络的计算框架,主要用于计算机视觉. Caffe 用C++ 和Python 实现,但可以通过配置文件来实现所要的网络结构,不需要编码。(Caffe2 已经被并入Py-Torch 中.)

(3) TensorFlow:由Google 公司开发的深度学习框架,可以在任意具备CPU或者GPU 的设备上运行. TensorFlow 的计算过程使用数据流图来表示.TensorFlow 的名字来源于其计算过程中的操作对象为多维数组,即张量(Tensor). TensorFlow 1.0 版本采用静态计算图,2.0 版本之后也支持动
态计算图.

(4) PyTorch:由Facebook、NVIDIA、Twitter 等公司开发维护的深度学习框架,其前身为Lua 语言的Torch4. PyTorch 也是基于动态计算图的框架,在需要动态改变神经网络结构的任务中有着明显的优势.

(5) 飞桨(PaddlePaddle):百度开发的一个高效和可扩展的深度学习框架,同时支持动态图和静态图. 飞桨提供强大的深度学习并行技术,可以同时支持稠密参数和稀疏参数场景的超大规模深度学习并行训练,支持千亿规模参数和数百个节点的高效并行训练.

(6) Chainer:一个最早采用动态计算图的深度学习框架,其核心开发团队为来自日本的一家机器学习创业公司Preferred Networks. 和Tensorflow、Theano、Caffe 等框架使用的静态计算图相比,动态计算图可以在运行时动态地构建计算图,因此非常很适合进行一些复杂的决策或推理任务.
(7) MXNet:由亚马逊、华盛顿大学和卡内基梅隆大学等开发维护的深度学习框架. MXNet 支持混合使用符号和命令式编程来最大化效率和生产率,并可以有效地扩展到多个GPU 和多台机器.

​ 在这些基础框架之上,还有一些建立在这些框架之上的高度模块化的神经网络库,使得构建一个神经网络模型就像搭积木一样容易. 其中比较有名的模块化神经网络框架有:(1)基于TensorFlow 和Theano 的Keras和(2)基于Theano的Lasagne.

(目前,Keras 已经被集成到TensorFlow 2.0 版本中.)

​ 要理解深度学习的意义或重要性,就得从机器学习或者是人工智能的更广的视角来分析. 在传统机器学习中,除了模型学习算法外,特征或表示也是影响最终学习效果的重要因素,甚至在很多的任务上比算法更重要. 因此,要开发一个实际的机器学习系统,人们往往需要花费大量的精力去尝试设计不同的特征以及特征组合,来提高最终的系统能力,这就是所谓的特征工程问题.

​ 如何自动学习有效的数据表示成为机器学习中的关键问题. 早期的表示学习方法,比如特征抽取特征选择,都是人工引入一些主观假设来进行学习的. 这种表示学习不是端到端的学习方式,得到的表示不一定对后续的机器学习任务有效. 而深度学习是将表示学习和预测模型的学习进行端到端的学习,中间不需要人工干预. 深度学习所要解决的问题是贡献度分配问题,而神经网络恰好是解决
这个问题的有效模型. 套用马克思的一句名言“金银天然不是货币,但货币天然是金银”,我们可以说,神经网络天然不是深度学习,但深度学习天然是神经网络.目前,深度学习主要以神经网络模型为基础,研究如何设计模型结构,如何有效地学习模型的参数,如何优化模型性能以及在不同任务上的应用等. [Bengioet al., 2013] 给出了一个很好的表示学习综述. 若希望全面了解人工神经网络和深度学习的知识,可以参考《Deep Learning》[Goodfellow et al., 2016] 以及文献[Bengio, 2009]. 关于神经网络的历史可以参考文献[Anderson et al., 2000]. 斯坦福大学的CS231n1 和CS224n2是两门非常好的深度学习入门课程,分别从计算机视觉和自然语言处理两个角度来讲授深度学习的基础知识和最新进展.

学术会议

​ 深度学习的研究进展非常迅速. 因此,最新的文献一般会发表在学术会议上.和深度学习相关的学术会议主要有:

(1) 国际表示学习会议(International Conference on Learning Representations,ICLR):主要聚焦于深度学习.
(2) 神经信息处理系统年会(Annual Conference on Neural Information Processing Systems,NeurIPS):交叉学科会议,但偏重于机器学习. 主要包括神经信息处理,统计方法,学习理论以及应用等.

(3) 国际机器学习会议(International Conference on Machine Learning,ICML):机器学习顶级会议,深度学习作为近年来的热点,也占据了ICML 的很大比例.

(4) 国际人工智能联合会议(International Joint Conference on Artificial Intelligence,IJCAI):人工智能领域最顶尖的综合性会议. 历史悠久,从1969年开始举办.

(5) 美国人工智能协会年会(AAAI Conference on Artificial Intelligence,AAAI):人工智能领域的顶级会议,每年二月份左右召开, 地点一般在北美.

​ 另外,人工智能的很多子领域也都有非常好的专业学术会议. 在计算机视觉领域,有计算机视觉与模式识别大会(IEEE Conference on Computer Visionand Pattern Recognition,CVPR)和国际计算机视觉会议(International Comferenceon Computer Vision,ICCV). 在自然语言处理领域,有计算语言学年会(Annual Meeting of the Association for Computational Linguistics,ACL)和自然语言处理实证方法大会(Conference on Empirical Methods in NaturalLanguage Processing,EMNLP)等.

神经网络与深度学习(邱锡鹏_复旦大学)(一 绪论)

一 绪论

​ 从根源来讲,深度学习是机器学习的一个分支,是指一类问题以及解决这类问题的方法.

​ 首先,深度学习问题是一个机器学习问题,指从有限样例中通过算法总结出一般性的规律,并可以应用到新的未知数据上. 比如,我们可以从一些历史病例的集合中总结出症状和疾病之间的规律. 这样当有新的病人时,我们可以利用总结出来的规律,来判断这个病人得了什么疾病.

​ 其次,深度学习采用的模型一般比较复杂,指样本的原始输入到输出目标之间的数据流经过多个线性或非线性的组件(component). 因为每个组件都会对信息进行加工,并进而影响后续的组件,所以当我们最后得到输出结果时,我们并不清楚其中每个组件的贡献是多少. 这个问题叫做贡献度分配问题(CreditAssignment Problem,CAP)[Minsky, 1961]. 在深度学习中,贡献度分配问题是一个很关键的问题,这关系到如何学习每个组件中的参数.(贡献度分配问题也常翻译为信用分配问题或功劳分配问题)。

​ 目前,一种可以比较好解决贡献度分配问题的模型是人工神经网络(ArtificialNeural Network,ANN). 人工神经网络,也简称神经网络,是一种受人脑神经系统的工作方式启发而构造的数学模型. 和目前计算机的结构不同,人脑神经系统是一个由生物神经元组成的高度复杂网络,是一个并行的非线性信息处理系统. 人脑神经系统可以将声音、视觉等信号经过多层的编码,从最原始的低层特征不断加工、抽象,最终得到原始信号的语义表示. 和人脑神经网络类似,人工神经网络是由人工神经元以及神经元之间的连接构成,其中有两类特殊的神经元:一类是用来接收外部的信息另一类是输出信息. 这样,神经网络可以看作是信息从输入到输出的信息处理系统. 如果我们把神经网络看作是由一组参数控制的复杂函数,并用来处理一些模式识别任务(比如语音识别、人脸识别等),神经网络的参数可以通过机器学习的方式来从数据中学习. 因为神经网络模型一般比较复杂,从输入到输出的信息传递路径一般比较长,所以复杂神经网络的学习可以看成是一种深度的机器学习,即深度学习.

​ 神经网络和深度学习并不等价. 深度学习可以采用神经网络模型,也可以采用其他模型(比如深度信念网络是一种概率图模型). 但是,由于神经网络模型可以比较容易地解决贡献度分配问题,因此神经网络模型成为深度学习中主要采用的模型. 虽然深度学习一开始用来解决机器学习中的表示学习问题,但是由于其强大的能力,深度学习越来越多地用来解决一些通用人工智能问题,比如推理、决策等.

1.1 人工智能

​ 人工智能(Artificial Intelligence,AI)就是让机器具有人类的智能。

图灵测试:“一个人在不接触对方的情况下,通过一种特殊的方式和对方进行一系列的问答. 如果在相当长时间内,他无法根据这些问题判断对方是人还是计算机,那么就可以认为这个计算机是智能的”。

目前,人工智能的主要领域大体上可以分为以下几个方面:

  • 感知 即模拟人的感知能力,对外部刺激信息(视觉和语音等)进行感知和加工.主要研究领域包括语音信息处理和计算机视觉等.
  • 学习 即模拟人的学习能力,主要研究如何从样例或与环境交互中进行学习. 主要研究领域包括监督学习、无监督学习和强化学习等.
  • 认知 即模拟人的认知能力,主要研究领域包括知识表示、自然语言理解、推理、规划、决策等.

专家系统
可以简单理解为“知识库+ 推理机”,是一类具有专门知识和经验的计算机智能程序系统. 专家系统一般采用知识表示和知识推理等技术来完成通常由领域专家才能解决的复杂问题,因此专家系统也被称为基于知识的系统. 一个专家系统必须具备三要素:(1)领域专家级知识;(2)模拟专家思维;(3)达到专家级的水平.

image-20220309153050204

机器学习的主要目的是设计和分析一些学习算法,让计算机可以从数据(经验)中自动分析获得规律,并利用学习到的规律对未知数据进行预测,从而帮助人们完成一些特定任务,提高开发效率.

1.2 机器学习

传统的机器学习主要关注于如何学习一个预测模型. 一般需要首先将数据表示为一组特征(Feature),特征的表示形式可以是连续的数值、离散的符号或其他形式. 然后将这些特征输入到预测模型,并输出预测结果. 这类机器学习可以看作是浅层学习(Shallow Learning). 浅层学习的一个重要特点是不涉及特征学习,其特征主要靠人工经验或特征转换方法来抽取.

在实际任务中使用机器学习模型一般会包含以下几个步骤(如图1.2所示):

image-20220310140549232

(1) 数据预处理:经过数据的预处理,如去除噪声等. 比如在文本分类中,去除停用词等.
(2) 特征提取:从原始数据中提取一些有效的特征. 比如在图像分类中,提取边缘、尺度不变特征变换(Scale Invariant Feature Transform,SIFT)特征等.

(3) 特征转换:对特征进行一定的加工,比如降维和升维. 降维包括特征抽取(Feature Extraction)和特征选择(Feature Selection)两种途径. 常用的特征转换方法有主成分分析(Principal Components Analysis,PCA)线性判别分析(Linear Discriminant Analysis,LDA)等.

(4) 预测:机器学习的核心部分,学习一个函数进行预测。

实际操作过程中,不同预测模型的性能相差不多,而前三步中的特征处理对最终系统的准确性有着十分关键的作用. 特征处理一般都需要人工干预完成,利用人类的经验来选取好的特征,并最终提高机器学习系统的性能. 因此,很多的机器学习问题变成了特征工程(Feature Engineering)问题. 开发一个机器学习系统的主要工作量都消耗在了预处理、特征提取以及特征转换上.

1.3 表示学习

​ 为了提高机器学习系统的准确率,我们就需要将输入信息转换为有效的特征,或者更一般性称为表示(Representation). 如果有一种算法可以自动地学习出有效的特征,并提高最终机器学习模型的性能,那么这种学习就可以叫做表示学习(Representation Learning).

1.3.1 语义鸿沟

​ 表示学习的关键是解决语义鸿沟(Semantic Gap)问题. 语义鸿沟问题是指输入数据的底层特征和高层语义信息之间的不一致性和差异性. 比如给定一些关于“车”的图片,由于图片中每辆车的颜色和形状等属性都不尽相同,因此不同图片在像素级别上的表示(即底层特征)差异性也会非常大。

​ 在表示学习中,有两个核心问题:一是“什么是一个好的表示”;二是“如何学习到好的表示”.

(1) 一个好的表示应该具有很强的表示能力,即同样大小的向量可以表示更多信息.
(2) 一个好的表示应该使后续的学习任务变得简单,即需要包含更高层的语义信息.
(3) 一个好的表示应该具有一般性,是任务或领域独立的. 虽然目前的大部分表示学习方法还是基于某个任务来学习,但我们期望其学到的表示可以比较容易地迁移到其他任务上.

在机器学习中,我们经常使用两种方式来表示特征:局部表示(Local Representation)和分布式表示(Distributed Representation).

​ 以颜色表示为例,我们可以用很多词来形容不同的颜色,除了基本的“红”、“蓝”、“绿”、“白”、“黑”等之外,有很多以地区或物品命名的,比如“中国红”、“天蓝色”、“咖啡色”、“琥珀色”等. 如果要在计算机中表示颜色,一般有两种表示方法.一种表示颜色的方法是以不同名字来命名不同的颜色,这种表示方式叫做局部表示,也称为离散表示或符号表示.

​ 另一种表示颜色的方法是用RGB 值来表示颜色,不同颜色对应到R、G、B 三维空间中一个点,这种表示方式叫做分布式表示.分布式表示通常可以表示为低维的稠密向量.(分布式表示叫做分散式表示可能更容易理解,即一种颜色的语义分散到语义空间中的不同基向量上.)

和局部表示相比,分布式表示的表示能力要强很多,分布式表示的向量维度一般都比较低.

image-20220310153326026

​ 我们可以使用神经网络来将高维的局部表示空间$ℝ^{|𝒱|}$ 映射到一个非常低维的分布式表示空间$ℝ^𝐷, 𝐷 ≪ |𝒱|$. 在这个低维空间中,每个特征不再是坐标轴上的点,而是分散在整个低维空间中. 在机器学习中,这个过程也称为嵌入(Embedding).嵌入通常指将一个度量空间中的一些对象映射到另一个低维的度量空间中,并尽可能保持不同对象之间的拓扑关系. 比如自然语言中词的分布式表
示,也经常叫做词嵌入.

1.3.2 表示学习

​ 要学习到一种好的高层语义表示(一般为分布式表示),通常需要从底层特征开始,经过多步非线性转换才能得到. 一个深层结构的优点是可以增加特征的重用性,从而指数级地增加表示能力. 因此,表示学习的关键是构建具有一定深度的多层次特征表示[Bengio et al., 2013].

1.4 深度学习

​ 为了学习一种好的表示,需要构建具有一定“深度”的模型,并通过学习算法来让模型自动学习出好的特征表示(从底层特征,到中层特征,再到高层特征),从而最终提升预测模型的准确率. 所谓“深度”是指原始数据进行非线性特征转换的次数. 如果把一个表示学习系统看作是一个有向图结构,深度也可以看作是从输入节点到输出节点所经过的最长路径的长度.

​ 这样我们就需要一种学习方法可以从数据中学习一个“深度模型”,这就是深度学习(Deep Learning,DL). 深度学习是机器学习的一个子问题,其主要目的是从数据中自动学习到有效的特征表示.

image-20220317223914338

​ 图1.4给出了深度学习的数据处理流程. 通过多层的特征转换,把原始数据变成更高层次、更抽象的表示. 这些学习到的表示可以替代人工设计的特征,从而避免“特征工程”

​ 深度学习是将原始的数据特征通过多步的特征转换得到一种特征表示,并进一步输入到预测函数得到最终结果.

​ 和“浅层学习”不同,深度学习需要解决的关键问题是贡献度分配问题(Credit Assignment Problem,CAP)[Minsky, 1961],即一个系统中不同的组件(component)或其参数对最终系统输出结果的贡献或影响. 以下围棋为例,每当下完一盘棋,最后的结果要么赢要么输. 我们会思考哪几步棋导致了最后的胜利,或者又是哪几步棋导致了最后的败局. 如何判断每一步棋的贡献就是贡献度分配问题,这是一个非常困难的问题. 从某种意义上讲,深度学习可以看作是一种强化学习(Reinforcement Learning,RL),每个内部组件并不能直接得到监督信息,需要通过整个模型的最终监督信息(奖励)得到,并且有一定的延时性.

​ 目前,深度学习采用的模型主要是神经网络模型,其主要原因是神经网络模型可以使用误差反向传播算法,从而可以比较好地解决贡献度分配问题. 只要是超过一层的神经网络都会存在贡献度分配问题,因此超过一层的神经网络都可以看作是深度学习模型. 随着深度学习的快速发展,模型深度也从早期的5 ∼ 10 层到目前的数百层. 随着模型深度的不断增加,其特征表示的能力也越来越强,从而
使后续的预测更加容易.

1.4.1 端到端学习

​ 在一些复杂任务中,传统机器学习方法需要将一个任务的输入和输出之间人为地切割成很多子模块(或多个阶段),每个子模块分开学习。这种学习方式有两个问题:一是每一个模块都需要单独优化,并且其优化目标和任务总体目标并不能保证一致;二是错误传播,即前一步的错误会对后续的模型造成很大的影响. 这样就增加了机器学习方法在实际应用的难度.

端到端学习(End-to-End Learning),也称端到端训练,是指在学习过程中不进行分模块或分阶段训练,直接优化任务的总体目标. 在端到端学习中,一般不需要明确地给出不同模块或阶段的功能,中间过程不需要人为干预. 端到端学习的训练数据为“输入-输出”对的形式,无需提供其他额外信息. 因此,端到端学习和深度学习一样,都是要解决贡献度分配问题. 目前,大部分采用神经网络模型的深度学习也可以看作是一种端到端的学习.

1.5 神经网络

​ 在机器学习领域,神经网络是指由很多人工神经元构成的网络结构模型,这些人工神经元之间的连接强度是可学习的参数.

1.5.1 人脑神经网络

image-20220317223938827

​ 在人脑神经网络中,每个神经元本身并不重要,重要的是神经元如何组成网络. 不同神经元之间的突触有强有弱,其强度是可以通过学习(训练)来不断改变的,具有一定的可塑性. 不同的连接形成了不同的记忆印痕.

​ 如果两个神经元总是相关联地受到刺激,它们之间的突触强度增加. 这样的学习方法被称为赫布型学习(Hebbian learning). Hebb 认为人脑有两种记忆:长期记忆和短期记忆. 短期记忆持续时间不超过一分钟. 如果一个经验重复足够的次数,此经验就可储存在长期记忆中. 短期记忆转化为长期记忆的过程就称为凝固作用. 人脑中的海马区为大脑结构凝固作用的核心区域.

1.5.2 人工神经网络

​ 人工神经网络是为模拟人脑神经网络而设计的一种计算模型,它从结构、实现机理和功能上模拟人脑神经网络. 人工神经网络与生物神经元类似,由多个节点(人工神经元)互相连接而成,可以用来对数据之间的复杂关系进行建模. 不同节点之间的连接被赋予了不同的权重,每个权重代表了一个节点对另一个节点的影响大小. 每个节点代表一种特定函数,来自其他节点的信息经过其相应的权
重综合计算,输入到一个激活函数中并得到一个新的活性值(兴奋或抑制). 从系统观点看,人工神经元网络是由大量神经元通过极其丰富和完善的连接而构成的自适应非线性动态系统.

​ 虽然我们可以比较容易地构造一个人工神经网络,但是如何让人工神经网络具有学习能力并不是一件容易的事情. 早期的神经网络模型并不具备学习能力. 感知器是最早的具有机器学习思想的神经网络,但其学习方法无法扩展到多层的神经网络上. 直到1980年左右,反向传播算法才有效地解决了多层神经网络的学习问题,并成为最为流行的神经网络学习算法.

​ 人工神经网络诞生之初并不是用来解决机器学习问题. 由于人工神经网络可以看作是一个通用的函数逼近器,一个两层的神经网络可以逼近任意的函数,因此人工神经网络可以看作是一个可学习的函数,并应用到机器学习中. 理论上,只要有足够的训练数据和神经元数量,人工神经网络就可以学到很多复杂的函数. 我们可以把一个人工神经网络塑造复杂函数的能力称为网络容量(Network
Capacity),与可以被储存在网络中的信息的复杂度以及数量相关.

​ [Rosenblatt, 1958] 提出了一种可以模拟人类感知能力的神经网络模型,称为感知器(Perceptron),并提出了一种接近于人类学习过程(迭代、试错)的学习算法.

反向传播算法是迄今最为成功的神经网络学习算法. 目前在深度学习中主要使用的自动微分可以看作是反向传播算法的一种扩展.

​ 然而,梯度消失问题(Vanishing Gradient Problem)阻碍神经网络的进一步发展,特别是循环神经网络. 为了解决这个问题,[Schmidhuber, 1992] 采用两步来训练一个多层的循环神经网络:(1)通过无监督学习的方式来逐层训练每一层循环神经网络,即预测下一个输入;(2)通过反向传播算法进行精调.

​ 1995~2006 年,在此期间,支持向量机和其他更简单的方法(例如线性分类器)在机器学习领域的流行度逐渐超过了神经网络.

深度学习的崛起[Hinton et al., 2006] 通过逐层预训练来学习一个深度信念网络,并将其权重作为一个多层前馈神经网络的初始化权重,再用反向传播算法进行精调. 深度信念网络参见第12.3 节.这种“预训练+ 精调”的方式可以有效地解决深度神经网络难以训练的问题. 随着深度神经网络在语音识别[Hinton et al., 2012] 和图像分类[Krizhevsky et al., 2012] 等任务上的巨大成功,以神经网络为基础的深度学习迅速崛起. 近年来,随着大规模并行计算以及GPU 设备的普及,计算机的计算能力得以大幅提高. 此外,可供机器学习的数据规模也越来越大. 在强大的计算能力和海量的数据规模支持下,计算机已经可以端到端地训练一个大规模神经网络,不再需要借助预训练的方式. 各大科技公司都投入巨资研究深度学习,神经网络迎来第三次高潮.

1.6 本书的知识体系

image-20220317224002604

1.7 常用的深度学习框架

​ 在深度学习中,一般通过误差反向传播算法来进行参数学习. 采用手工方式来计算梯度再写代码实现的方式会非常低效,并且容易出错. 此外,深度学习模型需要的计算机资源比较多,一般需要在CPU 和GPU 之间不断进行切换,开发难度也比较大. 因此,一些支持自动梯度计算、无缝CPU 和GPU 切换等功能的深度学习框架就应运而生. 比较有代表性的框架包括:Theano、Caffe、TensorFlow、Pytorch、飞桨(PaddlePaddle)、Chainer 和MXNet 等.

​ 要理解深度学习的意义或重要性,就得从机器学习或者是人工智能的更广的视角来分析. 在传统机器学习中,除了模型学习算法外,特征或表示也是影响最终学习效果的重要因素,甚至在很多的任务上比算法更重要. 因此,要开发一个实际的机器学习系统,人们往往需要花费大量的精力去尝试设计不同的特征以及特征组合,来提高最终的系统能力,这就是所谓的特征工程问题.

​ 如何自动学习有效的数据表示成为机器学习中的关键问题. 早期的表示学习方法,比如特征抽取特征选择,都是人工引入一些主观假设来进行学习的. 这种表示学习不是端到端的学习方式,得到的表示不一定对后续的机器学习任务有效. 而深度学习是将表示学习和预测模型的学习进行端到端的学习,中间不需要人工干预. 深度学习所要解决的问题是贡献度分配问题,而神经网络恰好是解决这个问题的有效模型. 套用马克思的一句名言“金银天然不是货币,但货币天然是金银”,我们可以说,神经网络天然不是深度学习,但深度学习天然是神经网络.目前,深度学习主要以神经网络模型为基础,研究如何设计模型结构,如何有效地学习模型的参数,如何优化模型性能以及在不同任务上的应用等. [Bengioet al., 2013] 给出了一个很好的表示学习综述. 若希望全面了解人工神经网络和深度学习的知识,可以参考《Deep Learning》[Goodfellow et al., 2016] 以及文献[Bengio, 2009]. 关于神经网络的历史可以参考文献[Anderson et al., 2000]. 斯坦福大学的CS231n1 和CS224n2是两门非常好的深度学习入门课程,分别从计算机视觉和自然语言处理两个角度来讲授深度学习的基础知识和最新进展.

神经网络与深度学习(邱锡鹏_复旦大学)概述

一、概述

从人工智能开始,让机器具有人类的智能:

  • 机器感知:计算机视觉、语音信息处理
  • 学习:模式识别、机器学习、强化学习
  • 语言:自然语言处理
  • 记忆:知识表示
  • 决策:规划、数据挖掘

如何开发一个人工智能系统?

image-20220317224049954

1.1 A Big Picture

image-20220317225211628

1.2 机器学习

机器学习~= 构建一个映射函数:

  • 语音识别
    $$
    f(语音数字信号) = “你好”
    $$
  • 图像识别
    $$
    f(图形像素数据) = “9”
    $$

  • 围棋
    $$
    f(棋盘当前落子情况) = “6-5” (落子位置)
    $$

  • 机器翻译
    $$
    f(“你好”) = “Hello”
    $$
    image-20220317230634949

1.2.1 机器学习的三要素

  • 模型

    • 线性方法:
      $$
      f(x,\theta)=w^T+b
      $$
      广义线性方法:
      $$
      f(x,\theta)=w^T\phi(x)+b
      $$

      • 如果$\phi(x)$为可学习的非线性基函数,$f(x,\theta)$就等价于神经网络
  • 学习准则

    • 期望风险

    image-20220317230648875

  • 优化

    • 梯度下降

1.2.2 常见的机器学习类型

image-20220317230705685

1.2.3 参数学习

  • 期望风险未知,通过经验风险近似

    • 训练数据:$D={x^{(i)},y^{(i)}},i\epsilon[1,N]$

      image-20220317230802198

  • 经验风险最小化

    • 在选择合适的风险函数后,我们寻找一个参数$\theta^*$,使得经验风险函数最小化。
      $$
      \theta^*=arg_\theta minR_{D}^{emp} (\theta)
      $$
  • 机器学习问题转化为一个最优化问题

1.2.4 优化:梯度下降法

image-20220317230839336

随机梯度下降法

image-20220317230900236

机器学习!=优化

image-20220317231034559

1.2.5 泛化错误

image-20220317231052615

1.2.5.1 PAC学习

PAC:Probably Approximately Correct

  • 根据大数定律,当训练集大小|D| 趋于无穷大时,泛化错误趋向于0,即经验风险趋近于期望风险。

    image-20220317231208328

  • PAC学习

image-20220317231228938

样本复杂度

  • 如果固定$\epsilon,\delta$,反过来可以计算出样本复杂度为:

    image-20220317231255425

    • 其中$|F|$为假设空间的大小,可以用Rademacher复杂性或VC维来衡量。
  • PAC学习理论可以帮助分析一个机器学习方法在什么条件下可以学习到一个近似正确的分类器。

  • 如果希望模型的假设空间越大,泛化错误越小,其需要的样本数量越多。


如何减小泛化错误?

image-20220317231312910

正则化(Regularization)

image-20220317231359735

1.3 如何选择一个合适的模型

  • 模型选择

    • 拟合能力强的模型一般复杂度会比较高,容易过拟合。
    • 如果限制模型复杂度,降低拟合能力,可能会欠拟合。
  • 偏差与方差分解

    • 期望错误可以分解为:

      image-20220317232842304

1.3.1 模型选择:偏差与方差

image-20220317232900593

  • 集成模型:有效降低方差的方法

  • 集成模型:

    image-20220317232915981

  • 通过多个高方差模型的平均来降低方差。

  • 集成模型的期望错误大于等于所有模型的平均期望错误的1/M,小于等于所有模型的平均期望错误。

image-20220317232931198

2 线性模型

image-20220318001416397

2.1 应用

  • 图像分类

    image-20220318001435678

  • 文本分类:根据文本内容来判断文本的相应类别

    image-20220318001451168

2.2 感知器

  • 模型

    image-20220318001510056

  • 学习准则

    image-20220318001521143

  • 优化:随机梯度下降

    image-20220318001532660

2.2.1 两类感知器算法

image-20220318001551844

感知器参数学习的更新过程:

image-20220318001605092

image-20220318001618772

image-20220318001633046

Logistic回归

image-20220318001649500

扩展到多类:Softmax函数

image-20220318001701917

Softmax回归:

image-20220318001713067

几种不同的线性模型的比较:

image-20220318001725403

不同损失函数的比较:

image-20220318001800253

如何处理非线性可分问题?

image-20220318001843572

特征工程问题

  • 在实际应用中,特征往往比分类器更重要

    • 预处理:经过数据的预处理,如去除噪声等。比如在文本分类中,去除停用词等。

    • 特征提取:从原始数据中提取出一些有效特征。比如在图像分类中,提取边缘、尺度不变特征变换特征等。

    • 特征转换:对特征进行一定的加工,比如降维和升维。降维包括:

      • 特征提取:PCA、LDA
      • 特征选择:互信息、TF-IDF

      image-20220318001857982

  • Copyrights © 2022-2024 lk
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信