注:涉及到的第一章和第二章课后习题的内容分别来自http://t.csdnimg.cn/cgUdh和http://t.csdnimg.cn/CzOZyz除此之外的内容都是个人总结
线性回归不属于神经网络
线性回归的目的是寻找最佳的参数使得损失函数的值最小
智能计算系统的形态:超级计算机、数据中心、智能手机、嵌入式设备
正向传播(推断)是根据输入,经过权重、激活函数计算出隐层,将输入的特征向量从低级特征逐步提取为抽象特征,直到得到最终输出结果的过程。
反向传播是根据正向传播的输出结果和期望值计算出损失函数,再通过链式求导,最终从网络后端逐步修改权重使输出和期望值的差距变到最小的过程。
1. 简述强人工智能和弱人工智能的区别。
强人工智能: 又称通用人工智能,是具备与人类同等智慧,或超越人类的人工智能,能表现出正常人类所具有的所有智能行为。
弱人工智能: 是能够完成某种特定具体任务的人工智能。
它们之间本质的区别就是能否能够解决人类所能解决的各种各样的问题。
2. 简述人工智能研究的三个学派。
人工智能的研究学派主要有三类:行为主义、符号主义、连接主义。
行为主义:基于控制论构建感知-动作型控制系统。
符号主义:基于符号逻辑的方法,用逻辑表示知识和求解问题。
连接主义:借鉴人类大脑中神经元细胞连接的计算模型,用人工神经网络来拟合智能行为。
3. 一个有两个输入的单个神经元构成的感知机能完成什么任务?
单个神经元构成的感知机可以完成简单的线性分类任务。
4. 深度学习的局限性有哪些?
泛化能力有限:深度学习训练需要依靠大量的样本。与人类的学习机理不同。
缺乏推理能力:缺乏推理能力使得深度学习不擅长解决认知类的问题。
缺乏可解释性:在比较重视安全的领域,缺乏可解释性会带来一些问题。
鲁棒性欠佳:加上一些人眼很难注意到的点,可能使深度学习算法产生错误判断。
5. 什么是智能计算系统?
一个完整的智能体需要从外界获取输入,并且能够解决现实中的某种特定问题或者解决各种各样的问题。智能计算系统是智能体的物质载体。
现阶段的智能计算系统,硬件上通常是集成通用CPU和智能芯片的异构系统,软件上通常包括一套面向开发者的智能计算编程环境。
6. 为什么需要智能计算系统?
通用CPU为中心的传统计算系统的速度和能效远远达不到智能应用的需求。因此,人工智能不可能依赖于传统计算系统,必须有自己的核心物质载体,即智能计算系统。
7. 第一代智能计算系统有什么特点?
第一代智能计算系统主要是以面向符号逻辑处理的计算系统。从技术上看,第一代智能计算系统是一种面向高层次语言的计算机体系结构,其编程语言和硬件是高度统一化的,比如LISP和Prolog。
8. 第二代智能计算系统有什么特点?
第二代智能计算系统主要研究面向连接主义处理的计算机或处理器。第二代智能计算系统比第一代智能计算系统有两方面的优势:第一,深度学习有大量实际的工业应用;第二,摩尔定律将要失效,专用智能计算系统的性能优势越来越大。
9. 第三代智能计算系统有什么特点?
第三代智能计算系统将不再单纯追求智能算法的加速,它将通过近乎无限的计算能力,给人类带来前所未有的机器智能。未来的第三代智能计算系统将是一个通用人工智能/强人工智能发育的沙盒虚拟实际,例如美剧《西部世界》,它能够通过近乎无限的计算能力来模拟一个逼近现实的虚拟世界。
1. 多层感知机和感知机的区别是什么?为什么会有这样的区别?
只有一个神经元的单层神经网络,被称为感知机。
多层感知机由一组输入、一个隐层和一个输出层组成。
因为单层感知机只能解决输入数据线性可分的问题,无法解决非线性可分的问题。
2. 假设有一个只有1个隐层的多层感知机,其输入、隐层、输出层的神经元个数分别为33、512、10,那么这个多层感知机中总共有多少个参数是可以被训练的?
weight :33 * 512 + 512* 10
bias :2
3. 反向传播中,神经元的梯度是如何计算的?权重是如何更新的?
首先根据神经网络计算出的值和期望值计算出损失函数的值,
然后计算损失函数对每个权重或偏置的偏导,
最后沿着梯度相反的方向进行权重更新。
通过多次迭代就可以找到使损失函数的值最小的参数。
4. 请在同一个坐标系内画出五种不同的激活函数图像,并比较它们的取值范围。
5. 请简述三种避免过拟合问题的方法。
(1)参数范数惩罚:在损失函数中增加对高次项的惩罚,可以避免过拟合。
(2)稀疏化:稀疏化是在训练时,让神经网络中的很多权重或神经元为0。
(3)Bagging集成学习:基本思想是三个臭皮匠顶个诸葛亮,训练不同的模型来共同决策测试样例的输出。
9. 一种更新权重的方法是引入动量项,即,动量项a的取值范围通常为[0,1],这样取值对于权重更新有什么影响?如果取值范围为[-1,0]呢?
当动量项a的参数范围为 [0,1] 时,权重参数会被同比例缩小。
当动量项a的参数范围为 [-1,0] 时,权重参数会被反向同比例缩小。
10. 反向传播中,采用不同的激活函数对于梯度的计算有什么不同?请设计一个新的激活函数并给出神经元的梯度计算公式。
激活函数的输出决定了下一层神经网络的输入。激活函数会影响特征表示受到有限权重、基于梯度的优化方法、是否可用于非线性可分问题。
激活函数有两个条件:
- 可微(可微性:当优化方法是基于梯度的时候,这个性质是必须的。);
2. 输出值的范围有限。(输出值的范围:当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的学习率。)
sigmoid函数的的缺点:
1 输出的均值不是零。会导致下一层的输入的均值产生偏移,可能会影响神经网络的收敛性
2 计算复杂度高。sigma的函数中有指数运算通用CPU需要数百条加减乘除指令才能支持e的负x次方的运算,计算效率很低
3 饱和性问题。单输入值x是比较大的正数或者比较小的负数时SQL函数提供的梯度或接近零,导致常数更新变得非常缓慢
tanh函数解决了sigma函数非零均值问题,但是当输入很大或很小时tanh函数的输出非常平滑,梯度很小,不利于权重更新
ReLU函数的计算特别简单,在x>0时梯度不衰减,从而缓解了梯度消失
缺点:输出不是零均值
2 对于有限样本会出现relu死掉的现象。在反向传播过程中如果学习率比较大,一个比较大的梯度经过神经元,可能会出现神经元更新后的偏置和权重是负数,当输入为负数时,ReLU是完全不被激活的。
3 ReLU函数的输出范围是无限的。
改进:
过拟合:指模型过度逼近训练数据,影响了模型的泛化能力,具体表现为:在训练数据集上的误差很小,但在验证数据集上的误差很大
(参数范数惩罚、稀疏化、Bagging集成、Dropout、提前终止、数据集扩增等正则化方法可以有效抑制过拟合)
欠拟合:本质原因是训练的特征少,拟合函数无法满足训练集,误差较大。
交叉验证:它要求把机器学习用到的数据分为两部分,一部分是训练集,一部分是测试集(一方面可以避免过拟合,另一方面可以真正判断出模型是不是建的好)
留一法交叉验证:对于一个包含n个数据的数据集S,每次取出一个数据作为测试集的唯一元素剩下的n- 1个数据全部用于训练模型和调参
缺点:计算量过大耗时长
k折叠交叉验证:将整个数据集分成k份,取第i份数据做测试集,取剩下k- 1份数据做训练及训练模型,重复上述操作k次,将k个均方误差取平均值得到的最后的均方误差(可以评估神经网络算法或模型的泛化能力)
只需要训练k个模型相比留一法交叉验证其计算的耗时短
深度学习编程框架:将深度学习算法中的基本操作封装成一系列组件,这一系列深度学习组件,即构成一套深度学习框架
为什么需要编程框架?
算法理论复杂
代码实现工作量大
深度学习的结果具有模糊性
深度学习算法具有多层结构,每层的运算有一些基本操作构成。这些基本操作中存在大量共性运算,如卷积,池化,激活等。将这些共性运算操作封装起来,可以提高编程实现效率。
面向这些封装起来的操作,硬件程序员可以基于硬件特征,有针对性的进行充分优化,使其能充分发挥硬件的效率。
TensorFlow受Google推动,是目前使用人数最多,影响最大的编程框架。应用:AlphaGo
TensorFlow编程模型及基本用法(声明式编程)
命令式编程与声明式编程
命令式编程:关注程序执行的具体步骤,计算机按照代码中的顺序一步一步执行具体的运算,整体优化困难。比如:交互式UI程序,操作系统。
声明式编程:告诉计算机想要达到的目标,不指定具体的实现步骤,而是通过函数,推论规则的描述数据之间的关系,优化较容易。比如:人工智能,深度学习。
TensorFlow:目前社区最受欢迎的框架之一 P171
优点:
功能强大,覆盖面广,支持众多常见的前端语言,覆盖云端到终端几乎所有的平台,同时也有众多的辅助工具来支持多平台多设备使用
社区力量强大,文档完善,对初学者较为友好。提供了丰富的教程和开源模型库帮助用户更好地学习和使用
缺点:
API较为混乱、声明式编程不方便调试
PyTorch:
优点:
小而灵活
前端支持Python和C++
支持动态图命令式的编程模式,在复杂循环网络中更易用及易调试
MXNet:
针对效率和灵活性而设计
支持声明式编程及命令式编程
支持R、Julia和Go等语言
1、使用计算图来表示机器学习算法中所有的计算和状态
2、将所有的数据建模成张量(tensor)(张量并没有实际保存数据,只是对操作结果的引用)
3、将多种类型的计算定义为操作( operation)
4、具体计算操作运行在会话( session)环境中
会话:执行神经网络真正的训练和预测
计算图只是描述了计算执行的过程并没有真正的给输入赋值并进行计算,真正的计算过程需要在会话中定义命执行
变量:对应神经网络参数(trainable:是否在训练时被优化器更新) (stddev:标准差)
- 使用tf.Variable()函数直接定义
- 使用TensorFlow内置的函数来定义变量初值
- 用其他变量的初值来定义新变量
张量两种计算方法:
- 通过定义run()函数求解张量 可以一次处理多个张量或操作
- 使用tensor.eval()函数求解张量 每次只能处理单个张量或操作
占位符:对应神经网络的训练或预测输入(本身没有初值,仅是程序中分配了内存)
使用tf.placeholder()创建
矩阵乘法:matmul(x1,x2)
标量乘法:multiply(a , b)
队列:对应神经网络训练样本的多线程并行计算
基于TensorFlow实现深度学习预测:
- 读取输入样本
- 定义基本运算单元
- 创建神经网络模型
- 计算神经网络模型输出
基于TensorFlow实现深度学习训练:P123
- 加载数据并进行预处理
加载数据的方式:注入、预取、基于队列API、tf.data API
- 对模型进行迭代训练
模型训练过程:在成功读取输入数据之后,首先要构建网络模型,其构建方法和预测所采用的方法一致;然后定义损失函数,并创建优化器(Optimizer),定义模型训练方法;最后迭代地执行模型的训练过程。P129
- 在训练的过程中,可以借助TensorFlow的检查点机制(checkpoint)来实时保存模型结果
图像风格迁移应用的基本过程:
1 准备输入图像和风格图像
2 定义神经网络结构
3 确定损失函数。在风格迁移中,通常会计算两个损失函数:风格损失和内容损失
4 进行训练。通过迭代优化,最小化损失函数,调整生成图像的像素值,使其在风格上接近风格图像,同时保持与输入图像的内容一致
5 生成风格化图像
第五章:
TensorFlow的设计原理主要集中在三方面:高性能、易开发、可移植。
高性能:tensor flow中集成的算子在设计过程中,已经针对底层硬件架构进行了充分的优化,因此能够很好的支持上层用户应用达到较优的运行性能
易开发:tensonflow对现有的各种深度学习算法提取出了大量的共性运算,并将这些运算单元封装成了各种算子,用户在开发的时候可以直接调用这些算子,从而方便地构建神经网络结构实现深度学习算法
可移植:tensorflow通过定义不同设备的通用抽象来实现应用程序的跨平台可移植目标
计算图是TensorFlow运行的核心
求导的方法:
- 手动求导:使用链式法则 缺点:无法通用或复用,每次修改算法模型都需要重新求解梯度公式、重新编写计算代码。
- 数值求导:优点:可以向用户隐藏求解细节 缺点:首先计算量大、运算速度慢;其次会引入舍入误差和截断误差。
- 符号求导:利用求导规则对表达式进行自动操作 缺点:会遇到“表达式膨胀”的问题,导致最终求解速度变慢。
- 自动求导:介于数值求导和符号求导的方法 优点:灵活,可以完全向用户隐藏求导过程,而且天然契合TensorFlow采用的计算图模型
五种控制流算子:
- Switch算子:根据输入条件,选择将输入数据输出到真/假两个不同的端口上
- Merge算子:Merger算子有两个输入,同一时刻最多有一个输入数据为有效,一旦某个输入数据有效,Merger算子便会被执行,将有效输入数据传递到输出端口
- Enter算子:将输入数据传入名为name的执行帧中,格式为Enter,主要用于当前帧向子帧传递输入数据(类比函数传参)
- Exit算子:将其子帧的运算结果返回给父帧(类比函数返回值)
- NextIteration算子:将输入传递给执行帧的迭代器
Tensorflow计算图执行通常包括客户端、主控进程和一个或者多个工作进程
计算图本地执行的步骤:
1 计算图剪枝。
2 计算图分配
3 计算图优化
4 计算图切分
剪枝(Prune):得到本地运行的最小子图
分配(placement):在多设备运行环境下,解决计算图节点分配到哪个设备上执行的问题
优化(optimization):通过图优化,可以调整调度策略,获得更快的计算速度和更高的硬件利用率,同时减少预测过程中所需的峰值内存。包括ConstFold、Arithmetic、Layout、Remapper等
切分 (partition):优化完成后,将计算图放到各个设备运行,每个设备对应一个切分子图
在运行时,Send/Recv节点合作完成跨设备的通信(其中Send/Recv屏蔽了和设备相关的通信细节,简化了运行时的复杂性) (出于性能考虑,限定所有使用目标张量的节点都使用同一个Recv 节点)
分布式通信中并行任务的通信通常可以分为两类:点对点通信和集合通信。
为什么需要深度学习处理器DLP:
1.深度学习应用广泛
2.CPU和GPU等传统芯片很难满足神经网络不断增长的速度和能效需求
(深度学习处理器蓬勃发展主要得益于三个方面:深度学习的广泛应用、集成电路工艺发展缓慢、计算机体系结构技术的发展。)
深度学习网络中访存有两个重要的特征,分别是可解耦性和可重用性
将指令集、流水线、运算部件和访存部件组合起来,就形成了一个简单的但完整的深度学习处理器。
深度学习处理器衡量计算能力的常用指标是TOPS(每秒执行多少万亿次操作)