本部分是目前应用比较成熟的深度学习基础方法。推荐李飞飞老师的CS231n课程(网易云课堂有全部视频和课件,建议把编程作业刷了)配合学习~
1、我们最好将前馈神经网络想成是为了实现统计泛化而设计出的函数近似机。
2、线性模型的一个明显缺陷:模型的能力被局限在线性函数里,所以它无法理解任何两个输入变量间的相互作用。
3、基于梯度的学习
代价函数:
(1)最大似然学习条件分布
(2)学习条件统计量
#泛函(函数到实数的映射)
补泛函分析课程(网易云课堂):https://study.163.com/course/courseMain.htm?courseId=1003649100&trace_c_p_k2=741b3cdf91e74b1cbf892e9c53636e2f
#变分法
输出单元
(1)用于高斯输出分布的线性单元;
#仿射变换(不具有非线性),所以基于放射变换的输出单元被直接称为线性单元。
(2)用于伯努利输出分布的sigmoid单元
(3)用于多元输出分布的softmax单元
(4)其他输出类型
#最大似然原则
#混合密度网络:将高斯混合作为输出的神经网络。
#基于梯度的优化方法对于混合条件高斯可能是数值不稳定的。两种解决办法:梯度截断、启发式放缩梯度。
梯度截断参考:https://blog.csdn.net/google19890102/article/details/47422821
隐藏单元
(1)整流线性单元ReLU:g(z)=max{0,z}
#扩展1:h=g(z,a)=max{0,z}+amin{0,z}
绝对值整流:a=-1
渗漏整流线性单元LReLU:a取比较小的值
参数化整流线性单元PReLU:把a作为学习的参数
#扩展2:maxout单元——将z划为每组具有k个值的组,每个单元输出每组中的最大元素。
(maxout单元可视为学习激活函数本身)
(2)logistic sigmoid 和双曲正切函数
(3)其他:用的比较少
余弦函数、单位函数、softmax;
径向基函数
softplus
硬双曲正切函数
4、架构设计
(1)万能近似定理:一个前馈神经网络如果具有线性输出层和至少一层具有任何一种”挤压“性质的激活函数(如sigmoid)的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的Borel可测函数。
#Borel可测函数参考地址:https://baike.baidu.com/item/波莱尔可测函数/18919536?fr=aladdin
5、反向传播算法
#自动微分领域的一种方法,被称为反向模式累加。
#当图的输出数目大于输入数目时,有时更偏向于使用另外一种形式的自动微分——前向模式累加。
6、Krylov方法
参考地址:https://blog.csdn.net/u011898542/article/details/88351493
在网上找到了一篇关于正则化比较好的总结,参考地址:https://www.csdn.net/gather_2f/MtTaggxsNTA1My1ibG9n.html
1、L2参数正则化(岭回归、Tikhonov正则)
#L1正则化
2、作为约束的范数惩罚
3、正则化和欠约束问题
4、数据集增强
#在神经网络的输入层注入噪音也可以看做数据增强的一种方法。
5、噪声鲁棒性
6、半监督学习
7、多任务学习:通过合并几个任务中的样例来提高泛化能力的一种方式。
8、提前终止(正则化的一种方式)
9、参数绑定和参数共享(正则化的一种方法)
10、稀疏表示
#正交匹配追踪
11、Bagging——集成学习方法
#同时训练几个不同的模型,然后选出最好的作为输出。
12、 Boosting
通过对样本集的操作获得样本子集,然后用弱分类算法在样本子集上训练生成一系列的基分类器。(回头复习李航《统计学习》)
13、Dropout
#在训练期间从神经网络中随机丢弃单位(及其连接)
14、对抗训练
15、切面距离算法——一种非参数最近邻算法
参考地址:https://baike.baidu.com/item/切面距离算法/22820112?fr=aladdin
16、正切传播算法
#训练带有额外惩罚的神经网络分类器,使神经网络的每个输出对已知的变化因素是局部不变的。这些变化因素对应于沿着的相同样本聚集的流形的移动。实现局部不变性的方法是要求输出的导数与已知流形正交,或等价地通过正则化惩罚使f在x的v方向上的导数较小。
1、学习和纯优化有什么不同
2、几个相关概念
3、神经网络优化中的挑战
病态(优化凸函数时,有时会遇见Hessian矩阵H的病态问题)
#H条件数越大,病态问题越严重。
神经网络优化中的病态问题参考:https://blog.csdn.net/foolsnowman/article/details/51614862
局部极小值。(个人理解是网络找寻最优点时遇见的局部最优点,如果局部最优点的代价函数值很大的话,则网络可能会陷入局部最优。
#一种能排除局部极小值的是主要问题的检测方法是画出梯度范数随时间的变化。
高原、鞍点和其他平坦区域
(1)鞍点——在鞍点处,Hessian矩阵同时具有正负特征值,位于正特征值对应的特征向量方向的点比鞍点有更大的代价,反的一边代价更小。鞍点有可能会将算法吸引到极大值点。
悬崖和梯度爆炸
#斜率较大区域(因权重相乘产生),会很大程度改变参数值。一个解决方法是梯度截断。
长期依赖:计算图过深导致模型丧失了学习得到先前信息的能力。
非精确梯度
局部核全局结构间的弱对应
优化的理论限制
4、基本算法
随机梯度下降SGD
动量(步长取决于梯度序列的大小和排列)
#一个直观解释参考:https://blog.csdn.net/bvl10101111/article/details/72615621
(参考文章中链接的优化方法可作为花书的补充)
Nesterov动量
#与动量唯一区别就是,计算梯度的不同,Nesterov先用当前的速度v更新一遍参数,在用更新的临时参数计算梯度。相当于添加了矫正因子的Momentum。
参考地址:https://www.jianshu.com/p/a16972924ec4
5、参数初始化策略——随机初始化、初始权重大小控制
#混沌:对于输入中很小的扰动非常敏感,导致确定性前向传播过程表现随机。
6、自适应学习率算法
Delta-bar-delta算法:如果损失对于某个给定模型参数的偏导保持相同的符号,那么学习率应该增加。
AdaGrad算法:独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根。具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。
RMSProp算法: AdaGrad算法的改进,不同于AdaGrad算法里状态变量stst是截至时间步tt所有小批量随机梯度gtgt按元素平方和,RMSProp算法将这些梯度按元素平方做指数加权移动平均。(常用的优化方法之一)
#参考地址:http://zh.gluon.ai/chapter_optimization/rmsprop.html
Adam算法:Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。
#参考地址1:https://www.cnblogs.com/yifdu25/p/8183587.html
#Adam算法 = RMSProp算法 + 动量 + 偏置修正
#目前使用较多的优化算法包括SGD、具动量的SGD、RMSProp、具动量的RMSProp、AdaDelta和Adam。
7、二阶近似方法
牛顿法
#难点在于需要计算Hessian矩阵的逆矩阵。
共轭梯度
#介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点。
BFGS算法(逆秩2拟牛顿法)——拟牛顿法的方法
#引入了Hessian矩阵的近似矩阵。
#L-BFGS:无储存的方法。
8、优化策略和元算法
批标准化
#自适应重参数方法,试图解决训练非常深的模型的困难。
坐标下降:对于某个单一变量进行优化,优化后再对其他变量逐一进行优化。
#块坐标优化:对某一部分变量同时进行优化,再优化其他变量。
Polyak平均
#平均优化算法在参数空间访问轨迹中的几个点。
监督预训练:训练简单模型求解简化问题
#贪心算法、FitNets方法(先训练浅层较宽的教师网络,再用这个网络训练指定的更深更窄的网络(学生网络))。
涉及有助于优化的模型
延拓法和课程学习
#延拓法:构建一系列具有相同参数的目标函数J1、J2…Jn,且其难度逐步提高。代价函数设计为前一个解是下一个解的良好起始点。(延拓法传统用于克服局部极小值的问题,现在仍可用于消除平坦趋于,减少梯度估计的方差,提高Hessian矩阵的条件数,使局部更新更容易计算,或是改进局部更新方向与朝向全局解方向之间的对应关系)
(这部分推荐建议配合李飞飞老师的CS231n课程进行学习)
1、卷积运算
#区别一下,这里的卷积和数学/信息领域的卷积运算是不一样的,可以说是一个简化版本。
#Toeplitz矩阵:对于单变量卷积,矩阵每一行中的元素都与上一行对应位置平移一个单位的元素相同。
2、动机:三个重要思想——稀疏交互、参数共享、等变表示。
3、池化
#常用池化函数:相邻矩形区域内的平均值、L2范数、基于距中心像素距离的加权平均函数。
4、基本卷积函数的变体
1、基于时间的方向传播算法——BPTT算法。(应用于计算图)
#算法推导:如何计算RNN网络各参数梯度。以一个简单的计算图为例。(请原谅我的字…)
2、导师驱动过程:一种训练技术,由输出反馈到模型而产生循环连接的模型可用导师驱动过程进行训练。
#补充优缺点和其余训练方式对比。
3、有向图模型的循环网络
4、基于上下文的RNN序列建模
5、双向RNN:双向RNN结合时间上从序列起点开始移动的RNN和另一个时间上从序列末尾开始移动的RNN。
6、基于编码-解码的序列到序列架构
#编码器输入RNN处理输入序列,输出上下文C;解码器则以固定长度的向量为条件产生输出序列。
#架构的一个缺陷:编码器RNN输出的上下文C的维度太小而难以适当地概括一个长序列。
7、深度循环网络。
8、递归神经网络——树结构、学习推论。
9、长期依赖的挑战。
#循环网络涉及相同函数的多次组合,每个时间步一次,这些组合可以导致极端非线性行为。特征值不断提升的结果可能会导致幅值不到1的特征值衰减到0,而大于1的特征值会发生激增。
10、回声状态网络
11、渗透单元和其他多时间尺度的策略。
时间维度的跳跃连接——增加从遥远过去的变量到目前变量的直接连接是得到粗时间尺度的一种方法。
渗透单元和一系列不同时间尺度
#渗漏单元——模拟滑动平均行为的隐藏单元。
删除连接——主动删除长度为1的连接并用更长的连接替换它们。(信息在较慢的时间尺度上更容易长距离流动)
12、长短期记忆和其他门控RNN
13、优化长期依赖
14、外显记忆——记忆网络。
1、性能度量
2、默认的基准模型
根据数据结构选择适合的模型:
(1)若项目是以固定大小的向量作为输入的监督学习,那么可以使用全连接的前馈网络;
(2)输入已知的拓扑结构(如:图像),那么可以使用卷积网络;
(3)输入输出为序列,则可以使用门控循环网络(LSTM/GPU)
优化算法:具有衰减学习率以及动量的SGD、Adam算法;若优化出现问题,则考虑批标准化。
正则化:提前终止、Droupout、批标准化。
3、决定是否收集更多的数据
(1)确定训练集上的性能是否可以接受;(考虑训练数据的质量和模型本身的问题)
(2)度量测试集的性能;若测试集上的性能比训练集差很多,则收集更多的数据是最有效 的解决方案之一。这时主要考虑收集更多数据的代价和可行性。
(3)确定收集多少数据。
4、选择超参数:手动选择、自动选择。——最终目标:提升测试集性能。
手动选择:了解超参数、训练误差、泛化误差和计算资源(内存和运行时间)之间的关系。
#目标通常是是最小化受限于运行时间和内存预算的泛化误差。主要目标是调整模型的有效容量以匹配任务的复杂性。有效容量受限于模型的表示容量、学习算法成功最小化训练模型代价函数的能力、代价函数和训练过程正则化模型的效果。
#学习率可能是最重要的超参数。调整其他超参数时,需要同时监测训练误差和测试误差以判断模型是都过拟合或欠拟合,然后适当调整其容量。
自动超参数优化算法
(1)网格搜索——超参数小于3个。
对于每个超参数,使用者选择一个较小的有限值集去探索,然后,这些超参数笛卡尔乘积得到一组组超参数,网格搜索使用每组超参数训练模型,挑选验证集误差最小的超参数作为最好的超参数。
#如何选择搜索集合的范围?
答:在超参数时数值(有序)的情况下,每个列表的最小和最大的元素可以基于先前相似实验的经验保守地挑选出来,以确保最优解非常可能在所选范围内。通常,网格搜索大约会在对数尺度下挑选合适的值,如学习率取值集合{0.1,0.01,0.001,0.0001}。
#通常重复进行网格搜索效果会最好。基于前一次搜索进行改进。
(2)随机搜索
随机搜索过程:首先为每个超参数定义一个边缘分布(如,伯努利分布),然后搜索,并每次基于前一次搜索进行改进。
#优于网格搜索:不需要离散化超参数的值、编程简单、使用更方便、能更快的收敛到超参数的良好取值,能更快地减小验证集误差。
(3)基于模型的超参数优化
对验证集误差建模,然后通过优化该模型来提出新的超参数猜想。大部分基于模型的超参数的搜索算法,都是使用贝叶斯回归模型来估计每个超参数的验证集误差期望和该期望的不确定性。因此,优化涉及探索和使用之间的权衡。
5、调试策略
6、示例:多位数字识别——街景转录系统
(1)数据采集:街景车收集原始数据,操作员手动打标,数据处理(包括转录前使用其他机器学习技术探测房屋号码)
(2)性能度量选择:度量要符合项目的业务目标。
#本系统选择的度量为准确率及覆盖率。
(3)快速建立一个合理的基准系统。
#本系统选择带有整流线型单元的卷积网络。
(4)反复细化基准。
#直到没有明显的理论问题。
(5)调试
#综合训练集和测试集性能以确定问题是否欠拟合或过拟合。本系统调试策略之一是可视化模型最糟糕的错误。
(6)超参数调整。
#保持一些计算代价限制的同时加大模型的规模。
1、大规模深度学习
快速的CPU实现:根据不同CPU特性设计特殊的数值运算。
GPU实现:并行、高速,图形任务。
#相比CPU,GPU的一个显著优势是其极高的内存带宽。神经网络不实际大量的分支运算和复杂的控制指令,所以更适合在GPU上训练。
#GPU代码天生多线程的,不同线程间必须仔细协调好。
大规模的分布式实现:数据并行、模型并行
#异步随机梯度下降:几个处理器的核共用存有参数的内存。每一个核在无锁的情况下读取这些参数,并计算对应的梯度,然后在无锁状态下更新这些参数。
模型压缩
#用一个更小的模型代替原始耗时的模型,从而使得用来存储与评估所需的内存与运行时间更少。
动态结构(条件计算)
#加速数据处理系统
(1)级联:模型1—模型2—模型N,每个模型完成特定功能。
#以分类器为例,第一个分类器训练高召回率,第二个分类器训练高精度;
(2)选通器:选择在给定当前输入的情况下将使用几个专家网络中的哪一个来计算输出。
(3)开关:可以理解为注意力机制
#使用动态结构化系统的主要障碍在于系统针对不同输入的不同代码分支导致的并行度降低。由于缺乏高速缓存的一致性,CPU实现会十分缓慢;由于缺乏级联的内存操作以及wrap成员使用不同分支时需要串行化操作,GPU的实现也会很慢。
深度网络专用硬件实现:专用集成电路、FPGA。
2、计算机视觉
一个被大多数视觉研究忽视的一个应用——图像合成(“无中生有”)
预处理
(1)图像标准化
(2)数据集增强——降低泛化误差
(3)其他:去除输入数据中的某种可变性(适用于小型模型)
预处理方法:
(1)对比度归一化
全局对比度归一化(GCN):通过从每个图像中减去其平均值,然后重新缩放其使得其像素上的标准差等于某个常数来防止图像具有变化的对比度。引入一个小的正的正则化参数来平衡估计的标准差,计算方式如下:
从大图像中剪切感兴趣的对象所组成的数据集不可能包含任何强度几乎恒定的图像,在这些情况下,可以设置λ=0来忽略小分母问题,另外,为了避免极端条件下分母为0的情况,参数ε可以设置为一个非常小的值,如0.000000001。尺度参数s通常设置为1。
局部对比度归一化(LCN):突出局部图像特征,如边缘、角。
LCN主要作用于较小的窗口,定义方法有很多。几种计算方法:
(当前像素 - 邻近像素的平均值)/(邻近像素的标准差);
计算以当前像素为中心的矩形串口中的所有像素的平均值和标准差;
以要修改的像素为中心的高斯权重的加权平均和加权标准差;
彩色图像:策略组合。
#LCN通常可以使用可分离卷积来计算特征映射的局部平均值和局部标准差,然后在不同的特征映射上使用逐元素的减法和除法。
(2)数据集增强——对图像中颜色的随机扰动、对输入的非线性几何变形等。
3、语音识别
4、自然语言处理
n-gram——第n个出现的词与前n-1个词相关,而与其他任何词不相关。
参考1:https://blog.csdn.net/songbinxu/article/details/80209197
参考2:https://blog.csdn.net/suibianshen2012/article/details/78158188
n-gram模型最大似然的基本限制:元组(x1,…,xN)可能出现在测试集中。
(1)导致的两个后果:计算式分母为0,模型无法产生有意义的输出;维数灾难。
(2)解决办法:
无意义输出——平滑技术(将概率质量从观察到的元组转移到类似的微观察到的元组、高低阶混合模型——高阶提供容量、低阶避免零计数问题)
维数灾难——执行最近邻查询
基于类的语言模型:n-gram模型统计效率的提高(引入词类别的概念)
神经语言模型
(1)克服维度灾难
(2)使用词的分布式(词嵌入)表示对自然语言序列建模。
#神经语言模型共享一个词(及其上下文)和其他类似词(和上下文之间)的统计强度
(3)one-hot(词间距离均为根号2)——嵌入空间(模型学习词特征(通过上下文))——相似词邻近。
高维输出
对于大词汇表,由于词汇量大,在词选择上表示输出分布的计算成本非常高。
#表示这种分布的朴素方法是应用一个仿射变换,将隐藏表示转换到输出空间,然后应用softmax函数。
解决高维输出的几个办法:
(1)短列表——限制词汇量
将词汇表分为常见词汇列表(由神经网络处理)和较稀有的尾列表(由n-gram模型处理)。
缺点:神经语言模型的潜在泛化优势仅限于最常用的词。
(2)分层softmax
层次结构:先建立词的类别,再建立类别的类别,然后是词类别的类别的类别。这些嵌套类别构成一棵树,其叶子为词。
#平衡树:空树或左右两个子树的高度差的绝对值不超过1.
缺点:在实践中,分层softmax倾向于更差的测试结果。
(3)重要采样
从提议分布中采样以替代从模型中采样,并通过适当的权重校正从错误分布采样引入的偏差。
#有偏重要采样——重要性权重被归一化加和为1;
#重要采样不仅可以加速具有较大softmax输出的模型,还可以加速具有大稀疏输出层的训练。
(4)噪声对比估计和排名损失
排名损失:将神经语言模型每个词的输出视为一个得分,并试图使正确词的得分比其他词排名更高。
噪声对比估计:神经语言模型的训练目标。
n-gram与神经语言模型结合
(增加模型容量)
神经机器翻译
一个方法:先读取整个句子或段落(以获得正在表达的上下文和焦点),然后一次翻译一个词,每次聚焦于输入句子的不同部分来收集产生下一个输出词所需要的语义细节。
#注意力机制,每个时间步关注输入序列的特定部分。(Bahdanau et al. 2015)
注意力机制系统的三个组件:
(1)读取器读取原始数据并将其转换为分布式表示,其中一个特征向量与每个词的位置相关联;
(2)存储器存储读取器输出的特征向量列表。(这可以被理解为包含事实序列的存储器),而之后不必以相同的顺序从中检索,也不必访问全部。
(3)最后一个程序利用存储器的内容顺序地执行任务,每个时间步聚焦于某个存储器元素的内容(或几个,具有不同权重)。
5、其他应用