目录
初试笔记
算法与数据结构基础
密码学和安全基础
机器学习相关课程
吴恩达机器学习系列课程
1、什么是机器学习?
2、监督学习(有导师学习):
3、无监督学习(无导师学习):
4、强化学习(增强学习):
5、问题分类
6、过拟合与欠拟合
7、代表性算法
8、数据挖掘
9、人工智能、机器学习、深度学习三者概念的关系
10、梯度下降(同步更新)法
11、将梯度下降法和代价函数结合,得到线性回归算法,它可以用直线模型来拟合数据。
12、向量一般都为单行(列),而且较长。
13、神经网络
14、神经网络需要实现的步骤
15、效果评估
16、k-means算法
斯坦福李飞飞cs231n计算机视觉课程
1、图像分类-数据驱动方法:
2、损失函数和优化
3.1、神经网络
3.2、反向传播
4、卷积神经网络
卷积:
池化:
5、训练神经网络
6、深度学习软件
7、CNN框架
8、循环神经网络
9、识别和分割
10、图像目标检测和图像分割
11、可视化和理解
12、生成模型
13、深度增强学习
参考文章
报考中科院信工所国重。
过一遍重点知识
括号匹配
表达式求值,中后缀转化
递归改非递归
对称矩阵,哈希表
循环队列满和空
树的遍历、前序、中序、后序
图的遍历、DFS与动态规划
最小生成树、最短路径、拓扑排序、关键路径
KMP算法、next数组
快排堆排归并稳nlog2n,其余n^2
CRC循环冗余码
滑动窗口协议
CSMA/CA/CD协议
子网划分、移动IP
CIDR、ARP、DHCP、VPN、NAT
UDP、TCP、流量控制、拥塞控制
DNS、HTTP
网络安全、非/对称密码、签名认证
体系结构、组成原理、机器字长
小端存储、汉明码、循环冗余码
正反补码、移位、加减法
存取时间、存取周期、虚拟存储器
存储器层次化结构、DRAM刷新、扩展
cache映射方式、替换算法、写策略
指令寻址、数据寻址、CISC、RISC
指令周期、数据流向、流水线、冲突
总线仲裁、定时、标准
IO接口、编址、IO方式、中断优先级
内存分配方式、分配算法、段页式
页面置换算法、页面分配策略
并发、共享、虚拟、异步
单道批、多道批、分时、实时
用户态(目态)
核心态(管态、内核态)
中断、分类、优先级
系统调用、访管、特权、大小内核
进程状态、通信、特征、线程特性
处理机调度、方式、算法、三级调度
进程同步、信号量、管程、经典问题
死锁、原因、条件、预防避免解除
进程状态转换
文件逻辑结构、文件共享、存储空间管理
磁盘管理、访问时间、调度算法
容量=盘片*2*柱面数*扇区数*扇区大小
文件占用空间、混合索引分配
IO方式、驱动、层次结构
用户层、独立性、驱动、中断、硬件
Spooling技术组成、流程
缓存策略、磁盘阵列、RAID
多CPU调度、自、成组、专用、动态
系统安全、访问控制
参考初试王道复习参考书与《算法的乐趣》
参考图书馆借到的《现代密码学教程》 内容
在没有明确设置的情况下,是计算机具有学习能力的研究领域。
充分利用计算机的高速运算能力,获取有效、大量的专门经验。
计算机程序从经验E中学习,解决某一任务T,进行某一性能度量P,通过P测定在T上的表现因为经验E而提高。
输入数据中有导师信号,以概率函数、代数函数或人工神经网络为基函数模型,采用迭代计算方法,学习结果为函数。
输入数据中无导师信号,采用聚类方法,学习结果为类别。典型的无导师学习有发现学习、聚类、竞争学习等。
与监督学习相比,无监督学习的训练集中没有人为的标注的结果,在非监督的学习过程中,数据并不被特别标识,学习模型是为了推断出数据的一些内在结构。
以环境反惯(奖/惩信号)作为输入,以统计和动态规划技术为指导的一种学习方法。
给定一个样本特征 ,希望预测其对应的属性值 , 如果是离散的, 那么这就是一个分类问题,反之,如果 是连续的实数, 这就是一个回归问题。
给定一组样本特征 , 我们没有对应的属性值 , 而是想发掘这组样本在多维空间的分布, 比如分析哪些样本靠的更近,哪些样本之间离得很远, 这就是属于聚类问题。
如果我们想用维数更低的子空间来表示原来高维的特征空间, 那么这就是降维问题。
过拟合:机器学习训练的模型在训练集中表现非常好,但缺少泛化性,导致在测试集中表现不佳。
欠拟合:机器学习训练的模型在训练集中表现就很差。
处理过拟合:1. 添加训练数据 2. 减少特征个数 3. 增加lamda的值 4.正则化L1 L2正则化
处理欠拟合:1. 增加特征个数 2. 降低lamda的值
过拟合(另一个说法是这个算法具有高方差)表示假设函数能拟合几乎所以的数据,这就面临可能的函数太过庞大、变量太多的问题,没有足够的数据来约束它来获得一个好的假设函数
过拟合问题什么时候出现呢?过度拟合的问题将会在变量过多的时候出现,这时训练出的假设能够很好地拟合训练数据,但是却缺少泛化性(泛化是指一个假设模型应用到新样本的能力,新样本数据是指没有出现在训练集的数据),无法预测新的样本;这时代价函数实际上可能非常接近0或者就恰好等于0。
除了过拟合,还有欠拟合。欠拟合的另一种说法是这个算法具有高偏差,表示没有很好地拟合训练数据。
(1)分类:有监督
朴素贝叶斯:贝叶斯分类法是基于贝叶斯公式(先验概率和后验概率的关系)的统计学分类方法。它通过预测一个给定的元组属于一个特定类的概率,来进行分类。
logistic回归(逻辑回归):logistic回归得出预测值后,根据预测值大小进行分类。(通常是二分类)
决策树:基于树的结构来进行决策
KNN算法:监督学习算法,处理分类问题classification
支持向量机(SVM)算法
(2)回归:有监督
线性回归:用直线进行拟合。解决一个最小化问题。
逻辑回归:用logistic函数拟合。
(3)聚类:无监督
K-means算法:注意中心点选取。无监督学习算法。
(4)降维:
主成分分析法
数据挖掘(Data mining)又译为资料探勘、数据采矿。
它是数据库知识发现(英语:Knowledge-Discovery in Databases,简称:KDD)中的一个步骤。数据挖掘一般是指从大量的数据中通过算法搜索隐藏于其中信息的过程。
应用的技术包括:数据库技术、人工智能技术、数理统计、可视化技术、并行计算等方面。
有目的的从现有的信息中提取数据的模式和模型,以用于未来机器学习和人工智能的数据使用。
其核心目的是找到数据变量之间的关系,A和B可能存在相关关系,但是它无法告诉你A和B存在什么相关关系。
数据挖掘不是一种用来证明假说的方法,而是用来构建各种各样的假说的方法。
数据挖掘技术包括关联分析、序列分析、分类、预测、聚类分析及时间序列分析等。
人工智能是追求目标,机器学习是实现手段,深度学习是其中一种方法。
特点:起始点不同,可能会得到完全不同的局部最优解。不断更新,当接近局部最低时,导数值会自动变得越来越小,所以梯度下降将自动采取较小的幅度。
神经网络模仿了大脑中的神经元或者神经网络。
当绘制一个神经网络时,通常只绘制输入节点x1、x2、x3,有必要的时候会增加一个额外的节点x0(这个x0节点有时也被称作偏置单元或偏置神经元),但是因为x0总是等于1,所以有时候会画出它有时候不会画出,这取决于具体的例子中加上x0是不是表示起来更方便。
带有Sigmoid或Logistic激活函数的人工神经元。在神经网络术语中,激活函数是指代非线性函数g(z)的另一个术语,g(z)=1/(1+e^-z)。
神经网络其实就是一组神经元连接在一起的集合。
网络中的第一层也被称为输入层,因为我们在这一层输入特征;最后一层也称为输出层,因为这一层的神经元输出假设的最终计算结果;中间的第二层被称作隐藏层,神经网络可以有不止一个隐藏层,实际上任何非输入层或非输出层的层就被称为隐藏层。
激活项是指由一个具体神经元计算并输出的值。
一般地,如果一个网络在第j层有s(j)个单元,在j+1层有s(j+1)个单元,那么矩阵θ^(j),即控制第j层到第j+1层映射的矩阵,它的维度为s(j+1)*s(j)+1。
计算h(x)的过程也称为前向传播,这样命名是因为我们从输入单元的激活项开始,然后进行前向传播给隐藏层,计算隐藏层的激活项,然后继续向前传播并计算输出层的激活项。这个以此计算激活项,从输入层到隐藏层再到输出层的过程叫做前向传播。
神经网络中神经元的连接方式称为神经网络的架构。架构是指不同的神经元的连接方式。
第一步
构建一个神经网络,然后随机初始化权重(通常我们把权重初始化为很小的值,接近于0)。
第二步
执行前向传播算法,也就是对于该神经网络的任意一个输入x^(i),计算出对应的h( x^(i))值,也就是一个输出值y的向量。
第三步
通过代码计算出代价函数J(θ),
第四步
执行反向传播算法来算出这些偏导数项,也就是J(θ)关于θ的偏导数。具体来说,使用前向传播和反向传播要对所有训练样本使用一个for循环进行遍历(建议在第一次反向传播的时候使用for循环)。具体来说就是把x^(i)喂到输入层,然后执行前向传播和反向传播,这样就能得到神经网络每一层中每一个单元对应的激励值和δ项。
第五步
使用梯度检测来比较这些已经计算得到的偏导数项,把用反向传播算法得到的偏导数值与用数值方法得到的估计值进行比较。因此,通过进行梯度检测来确保两种方法得到基本接近的两个值。通过梯度检测我们能确保我们的反向传播算法得到的结果是正确的。接下来非常重要的一点是要停用梯度检测,因为梯度检测的计算非常慢。
第六步
使用一个最优化算法(比如梯度下降算法或者更加高级的优化算法,比如说LBFGS算法、共轭梯度法或者其它内置到fminunc函数中的方法),将这些优化方法和反向传播算法相结合,反向传播计算出这些偏导数项的值,来最小化关于θ的代价函数J(θ)。
对于神经网络,代价函数J(θ)是一个非凸函数,因此理论上可以停留在局部最小值的位置,实际上,梯度下降算法和其它一些高级优化方法理论上都可能收敛于局部最小值,但一般来讲,在实际操作中这不是大问题,尽管我们不能保证这些优化算法一定会得到全局最优值,但通常来讲,像梯度下降这类的算法在最小化代价函数J(θ)的过程中还是表现的不错的,通常能够得到一个很小的局部最小值,尽管这可能不一定是全局最优值。
假如有一组数据,为了确保可以评价假设函数,可以将这些数据分成两部分,第一部分作为训练集,第二部分作为训练集。将所有数据分成训练集和测试集,其中一种典型的分割方法是按照7:3的比例(注意:在这里是选择了前70%作为训练集,后30%作为测试集,但如果这组数据有某种规律或顺序的话,那么最好是随机选择70%作为训练集,剩下的30%作为测试集。当然,如果数据已经随机分布了,那可以选择前70%和后30%。但如果数据不是随机排列的,最好还是打乱顺序或者使用一种随机的顺序来构建你的数据,然后再取出前70%作为训练集,后30%作为测试集)
K-平均算法,是一种基于划分的聚类算法。
聚类的专业定义:根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,将具有较高相异度的数据对象划分至不同类簇。
聚是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。
将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。“物以类聚,人以群分”,在自然科学和社会科学中,存在着大量的分类问题。比如把环境污染与各种污染物排放量的关系作为数据集进行聚类,把居民人均年收入与政策、当地经济、GDP等联系。
人类认识客观世界的过程就是聚类,比如幼儿时期的看图说话训练,当婴儿再看到实物时,会自动将它们在大脑中归纳分类。人类的总结归纳能力是天生的。
由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。
聚类过程为无监督过程,即待处理数据对象没有任何先验知识,数据集没有标签;而分类过程为有监督过程,即存在有先验知识的训练数据集
聚类既能作为一个单独过程,用于找寻数据内在的分布结构,也可作为分类等其他学习任务的前驱过程。例如,在一些商业应用中需对新用户的类型进行判别,但定义“用户类型”对商家来说却可能不太容易,此时往往可先对用户数据进行聚类,根据聚类结果将每个簇定义为一个类,然后再基于这些类训练分类模型,用于判别新用户的类型。
聚类分析有很多种计算方法,如有基于模型、密度、网格等等的方法,而最简单、基本的方法就是划分。
划分把对象组织成多个互斥的簇,这一方法要求每个对象必须/恰好属于每一个簇。(显然这是不合理的,在模糊划分中适当放宽了这一要求)
性能度量:也称“有效性指标”,对聚类的结果,我们需要通过某种性能度量来判断好坏;另一方面,若明确了最终要使用的性能度量,则可直接将其作为聚类过程的优化目标,从而更好地得到符合要求的聚类结果。
聚类是将样本集D划分为若干互不相交的子集,即样本簇,那么什么样的聚类结果比较好呢,直观上看,我们希望“物以类聚”,即同一簇的样本尽可能彼此相似,不同簇的样本尽可能不同,即簇类结果的“簇内相似度高”且“簇间相似度低”
距离计算:通常我们基于某种形式的距离来定义“相似度度量”。例如,在划分方法中,一般划分的都是球状簇,而我们就把每个球状簇的球心视为簇中心,而簇内所有样本点与球心的距离平方的和就作为相似度性能指标,定义为簇内变差,而K-means算法也正是基于这个思想
划分的基本思想:
给定一个有N个元组或记录的数据集,将构造K个分组,每一个分组就代表一个簇类,显然K
k-means算法中的k代表簇个数,means代表簇内数据对象的均值(这种均值是一种对簇中心的描述),因此,k-means算法又称为k-均值算法,是一种基于划分的聚类算法。
其算法思想大致为:先从样本集中随机选取 k个样本作为簇中心,并计算所有样本与这 k 个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中,当考查完所有数据对象后,一次迭代运算完成,新的簇中心被计算出来,再计算距离,分配样本点。终止条件可以是没有(或最小数目)对象被重新分配给不同的簇,没有(或最小数目)簇中心再发生变化,误差平方和局部最小。算法简略过程如下:
(1)从N个数据文档(样本)随机选取K个数据文档作为簇中心;
(2)对每个数据文档测量其到每个簇中心的距离,并把它归到最近的簇中心的簇;
(3)重新计算已经得到的各个簇的簇中心;
(4)迭代(2)~(3)步直至新的簇中心与原簇中心相等或小于指定阈值,算法结束(为避免运行时间过长,通常设置一个最大运行轮数或最小调整幅度阈值,若达到最大轮数或调整幅度小于阈值,则停止运行)。
由此算法过程来看,实现kmeans算法的主要三点为:
簇个数 k 的选择。k的选择一般是按照实际需求进行决定,或在实现算法时直接给定 k 值。
各个样本点到“簇中心”的距离度量。给定样本x(i)={x(i)1,x(i)2,,...,x(i)n,},x(j)={x(j)1,x(j)2,,...,x(j)n,},其中i,j=1,2,...,m,表示样本数,n表示特征数 。距离的度量方法主要分为以下几种:
根据新划分的簇,更新“簇中心”。 对于划分好的各个簇,计算各个簇中的样本点均值,将其均值作为新的簇中心。
优点:算法简单易实现;算法能根据较少的已知聚类样本的类别对树进行剪枝确定部分样本的分类;为克服少量样本聚类的不准确性,该算法本身具有优化迭代功能,在已经求得的聚类上再次进行迭代修正剪枝确定部分样本的聚类,优化了初始监督学习样本分类不合理的地方;由于只是针对部分小样本,可以降低总的聚类时间复杂度。
缺点:在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适;在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果;该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的;容易陷入局部最优; 只能发现球形类簇。K-means算法对于不同的初始值,可能会导致不同结果。
算法改进:多设置一些不同的初值,对比最后的运算结果,一直到结果趋于稳定结束;很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。通过类的自动合并和分裂,得到较为合理的类型数目 K,例如 ISODATA 算法。
K-means算法的其他改进算法:1. k-modes 算法:实现对离散数据的快速聚类,保留了k-means算法的效率同时将k-means的应用范围扩大到离散数据。2. k-Prototype算法:可以对离散与数值属性两种混合的数据进行聚类,在k-prototype中定义了一个对数值与离散属性都计算的相异性度量标准。
针对几个缺点的优化改进:
(1)对于离群点和孤立点敏感:可用离群点检测的LOF算法,通过去除离群点后再聚类,可以减少离群点和孤立点对于聚类效果的影响。
(2)k值选择:k值的选择问题,在安徽大学李芳的硕士论文中提到了k-Means算法的k值自适应优化方法:可以通过在一开始给定一个适合的数值给k,通过一次K-means算法得到一次聚类中心。对于得到的聚类中心,根据得到的k个聚类的距离情况,合并距离最近的类,因此聚类中心数减小,当将其用于下次聚类时,相应的聚类数目也减小了,最终得到合适数目的聚类数。可以通过一个评判值E来确定聚类数得到一个合适的位置停下来,而不继续合并聚类中心。重复上述循环,直至评判函数收敛为止,最终得到较优聚类数的聚类结果。
(3)初始聚类中心的选择:
①选择批次距离尽可能远的K个点。具体选择步骤如下:首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出K个初始类簇中心点;
②或者先选用层次聚类或者Canopy算法进行初始聚类,然后利用这些类簇的中心点作为KMeans算法初始类簇中心点。该方法对于k值的选择也是十分有效的。
(4)只能发现球状簇:只能获取球状簇的根本原因在于,距离度量的方式。在李荟娆的硕士论文K_means聚类方法的改进及其应用中提到了基于2种测度的改进,改进后,可以去发现非负、类椭圆形的数据。但是对于这一改进,并没有很好的解决K-means在这一缺点的问题,如果数据集中有不规则的数据,往往通过基于密度的聚类算法更加适合,比如DESCAN算法。
基础先修知识:Python、C++、微积分、线性代数矩阵、计算机图像、机器学习。
图像边缘识别。常用曼哈顿距离(L1距离)比较图片。
将整体数据分为三组,大部分数据作为训练集,然后其他数据建立一个验证集、一个测试集(两者一定隔离)。在训练集上用不同的超参来训练算法,在验证集上进行评估,然后用一组超参,选择在验证集上表现最好的分类器,用这个分类器去进行测试。才能告诉你你的算法在未知数据集上表现如何。
通常,先划出一部分,保留为最后的测试集(无标签),剩下的数据分为很多组,分别作为验证集(标签不可见,只用做检测准确性)和训练集(标签可见,用来训练)。
(1)k最近邻方法:训练时间快O(1),测试时间慢O(n)。k=1就是最近邻分类器,不准。k解决了噪声和不准确的问题。k较大可以使分类的决策边界更平滑。kNN是一种基本的分类和回归方法。kNN的输入是测试数据和训练样本数据集,输出是测试样本的类别。kNN没有显示的训练过程,在测试时,计算测试样本和所有训练样本的距离,根据最近的K个训练样本的类别,通过多数投票的方式进行预测。
KNN算法实现基本步骤:计算待分类点与已知类别的点之间的距离;按照距离递增次序排序;选取与待分类点距离最小的k个点;确定前k个点所在类别的出现次数;返回前k个点出现次数最高的类别作为待分类点的预测分类;
(2)线性分类;f(x,w);类似于模板匹配的观点。类似于把图片看做高维空间的点,用线性分类器绘制决策边界。难以解决:奇偶数分类问题,多分类问题。
线性分类属于参数分类的一种,所有的训练数据中的经验知识都体现在参数矩阵W中,而W通过训练过程得到,我们拿到一张照片拉伸成一个长的向量,这里的图片假设叫做X,应该是拉伸成一个三维长向量(32,32,3),一共3个,其中高度和宽度都是32像素。3则代表颜色通道红绿蓝,还存在一个参数矩阵W,把这个代表图片像素的列向量,当作输入,然后转化成10个数字评分。线性分类可以理解为每个种类的学习模板,左下角的图对图里的每个像素,以及10个分类里的每一项,矩阵W里都有一些对应的项。告诉我们那个像素对那个分类有多少影响。也就是说矩阵W里的每一行,都对应一个分类模板。如果我们解开这些行的值(成图片的大小),那么每一行又分别对应一些权重。每个图像像素值和对应那个类别的一些权重,将这行分解回图像的大小。我们就可以可视化学到的每个类的模板。学习像素在高维空间的一个线性决策边界,其中高维空间就对应了图片能取到的像素密度值。
一个只有三张图片的训练集,然后用某个W预测这些图片的所有共10个类别的得分。需要一个度量任意某个W的好坏的方法。可以用一个函数把W当作输入,然后看一下得分,定量地估计W的好坏,这个函数被称为损失函数。
我们要找到一种有效的方式,来从W的可行域里找到W取什么值,是最不坏的情况,这个过程将会是一个优化过程。三个样本对应三个类的例子。
损失函数,有一些训练数据集x和y,通常我们说有N个样本,其中x是算法的输入,在图片分类问题里,x其实是图片每个像素点所构成的数据集,y是你希望算法预测出来的东西,我们称之为标签或者目标。我们把损失函数记做L_i,我们有了这个关于x的预测函数后,这个函数就是通过样本x和权重矩阵W,给出y的预测。
损失函数记L_i的定义为:通过函数f给出预测的分数,和真实的目标或者说标签y,可以定量地描述训练样本预测地好不好。最终地损失函数L是在整个数据集中,N个样本地损失函数总和的平均。
这是个通用的公式,有了x和y你想要用某个损失函数定量地描述出参数W是否令人满意,然后在所有的W中找到在训练集上损失函数极小化的W。
多分类SVM损失函数,单个例子的损失函数L_i,除了真实的分类Y_i以外,对所有的分类Y都做加和,也就是说我们在所有错误的分类上做和,比较正确分类的分数和错误分类的分数,如果正确分类的分数比错误分类的分数高出某个安全的边距,我们把这个边际设为1。如果真实分类的分数很高,比其他任何错误分类的分数都要高很多,那么损失为0。接下来把图片每个错误分类的损失加起来,就得到了数据集中这个样本的最终损失,然后取平均。
缩写成max(0,S_j-S_i)再加上一点东西,这种某个值和0取max的损失函数,可以说成是一个合页损失函数。x轴表示S_Yi,是训练样本真实分类的分数,y轴是损失,可以看到随着真实分类的分数的提升,损失会线性下降,一直到分数超过一个阈值,损失函数就会是0,因为我们已经为这个样本成功地分队了类。
计算多分类SVM损失函数,我们要对所有不正确地分类全都循环一遍。最终我们对于整个训练数据集的损失函数是这些不同的样例的损失函数的平均值。
一般来说,神经网络就是由简单函数构成的一组函数,为了形成一个更复杂的非线性函数,我们用一种层次化的方式将它们在顶层堆叠起来,这就是基本的多阶段分层计算。
单隐藏层、两层神经网络;双隐藏层、三层神经网络。使用向量化代码来计算。
BP算法(即反向传播算法)适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上。BP网络的输入输出关系实质上是一种映射关系:一个n输入m输出的BP神经网络所完成的功能是从n维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。它的信息处理能力来源于简单非线性函数的多次复合,因此具有很强的函数复现能力。这是BP算法得以应用的基础。
反向传播算法主要由两个环节(激励传播、权重更新)反复循环迭代,直到网络的对输入的响应达到预定的目标范围为止。BP算法的学习过程由正向传播过程和反向传播过程组成。在正向传播过程中,输入信息通过输入层经隐含层,逐层处理并传向输出层。如果在输出层得不到期望的输出值,则取输出与期望的误差的平方和作为目标函数,转入反向传播,逐层求出目标函数对各神经元权值的偏导数,构成目标函数对权值向量的梯量,作为修改权值的依据,网络的学习在权值修改过程中完成。误差达到所期望值时,网络学习结束。
激励传播:
每次迭代中的传播环节包含两步:
(前向传播阶段)将训练输入送入网络以获得激励响应;
(反向传播阶段)将激励响应同训练输入对应的目标输出求差,从而获得隐层和输出层的响应误差。
权重更新:
对于每个突触上的权重,按照以下步骤进行更新:
将输入激励和响应误差相乘,从而获得权重的梯度;
将这个梯度乘上一个比例并取反后加到权重上。
这个比例将会影响到训练过程的速度和效果,因此称为“训练因子”。梯度的方向指明了误差扩大的方向,因此在更新权重的时候需要对其取反,从而减小权重引起的误差。
即使因为搭建的神经网络结构形式和使用的神经元都不同,但是大多数情况下,后向计算中的梯度计算可以归到几种常见的模式上。比如,最常见的三种简单运算门(加、乘、最大),他们在反向传播运算中的作用是非常简单和直接的。
加运算门在反向传播运算中,不管输入值是多少,取得它output传回的梯度(gradient)然后均匀地分给两条输入路径。因为加法运算的偏导都是+1.0。
max(取最大)门不像加法门,在反向传播计算中,它只会把传回的梯度回传给一条输入路径。因为max(x,y)只对x和y中较大的那个数,偏导为+1.0,而另一个数上的偏导是0。
乘法门就更好理解了,因为x*y对x的偏导为y,而对y的偏导为x,因此在上图中x的梯度是-8.0,即-4.0*2.0
首先要用计算图来表示一个函数,就可以计算反向传播(链式法则的递归调用)。
已知值:x=-2,y=5,z=-4。
已知计算图:q=x+y,f=q*z。
已知梯度:q对x偏导(梯度)=1,q对y偏导=1。f对q偏导=z,f对z偏导=q。
需求:f对x,y,z的偏导(梯度)。
反向传播求解过程:f对f偏导=1,f对z偏导=3,f对q偏导=4,f对y偏导=f对q偏导*q对y偏导=-4
需要训练卷积层,因为卷积层更能保留输入的空间结构。
卷积和池化
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)”。
对卷积神经网络的研究始于二十世纪80至90年代,时间延迟网络和LeNet-5是最早出现的卷积神经网络;在二十一世纪后,随着深度学习理论的提出和数值计算设备的改进,卷积神经网络得到了快速发展,并被应用于计算机视觉、自然语言处理等领域。
卷积神经网络仿造生物的视知觉(visual perception)机制构建,可以进行监督学习和非监督学习,其隐含层内的卷积核参数共享和层间连接的稀疏性使得卷积神经网络能够以较小的计算量对格点化(grid-like topology)特征,例如像素和音频进行学习、有稳定的效果且对数据没有额外的特征工程(feature engineering)要求。
输入层:
卷积神经网络的输入层可以处理多维数据,常见地,一维卷积神经网络的输入层接收一维或二维数组,其中一维数组通常为时间或频谱采样;二维数组可能包含多个通道;二维卷积神经网络的输入层接收二维或三维数组;三维卷积神经网络的输入层接收四维数组。由于卷积神经网络在计算机视觉领域应用较广,因此许多研究在介绍其结构时预先假设了三维输入数据,即平面上的二维像素点和RGB通道。
与其它神经网络算法类似,由于使用梯度下降算法进行学习,卷积神经网络的输入特征需要进行标准化处理。具体地,在将学习数据输入卷积神经网络前,需在通道或时间/频率维对输入数据进行归一化,若输入数据为像素,也可将分布于 的原始像素值归一化至区间。输入特征的标准化有利于提升卷积神经网络的学习效率和表现。
隐含层:
卷积神经网络的隐含层包含卷积层、池化层和全连接层3类常见构筑,在一些更为现代的算法中可能有Inception模块、残差块(residual block)等复杂构筑。在常见构筑中,卷积层和池化层为卷积神经网络特有。卷积层中的卷积核包含权重系数,而池化层不包含权重系数,因此在文献中,池化层可能不被认为是独立的层。以LeNet-5为例,3类常见构筑在隐含层中的顺序通常为:输入-卷积层-池化层-全连接层-输出。
卷积层(convolutional layer):
1. 卷积核(convolutional kernel)
卷积层的功能是对输入数据进行特征提取,其内部包含多个卷积核,组成卷积核的每个元素都对应一个权重系数和一个偏差量(bias vector),类似于一个前馈神经网络的神经元(neuron)。卷积层内每个神经元都与前一层中位置接近的区域的多个神经元相连,区域的大小取决于卷积核的大小,在文献中被称为“感受野(receptive field)”,其含义可类比视觉皮层细胞的感受野。卷积核在工作时,会有规律地扫过输入特征,在感受野内对输入特征做矩阵元素乘法求和并叠加偏差量
2. 卷积层参数
卷积层参数包括卷积核大小、步长和填充,三者共同决定了卷积层输出特征图的尺寸,是卷积神经网络的超参数。其中卷积核大小可以指定为小于输入图像尺寸的任意值,卷积核越大,可提取的输入特征越复杂。
卷积步长定义了卷积核相邻两次扫过特征图时位置的距离,卷积步长为1时,卷积核会逐个扫过特征图的元素,步长为n时会在下一次扫描跳过n-1个像素。
由卷积核的交叉相关计算可知,随着卷积层的堆叠,特征图的尺寸会逐步减小,例如16×16的输入图像在经过单位步长、无填充的5×5的卷积核后,会输出12×12的特征图。为此,填充是在特征图通过卷积核之前人为增大其尺寸以抵消计算中尺寸收缩影响的方法。常见的填充方法为按0填充和重复边界值填充(replication padding)。填充依据其层数和目的可分为四类 :
有效填充(valid padding):即完全不使用填充,卷积核只允许访问特征图中包含完整感受野的位置。输出的所有像素都是输入中相同数量像素的函数。使用有效填充的卷积被称为“窄卷积(narrow convolution)”,窄卷积输出的特征图尺寸为(L-f)/s+1。
相同填充/半填充(same/half padding):只进行足够的填充来保持输出和输入的特征图尺寸相同。相同填充下特征图的尺寸不会缩减但输入像素中靠近边界的部分相比于中间部分对于特征图的影响更小,即存在边界像素的欠表达。使用相同填充的卷积被称为“等长卷积(equal-width convolution)”。
全填充(full padding):进行足够多的填充使得每个像素在每个方向上被访问的次数相同。步长为1时,全填充输出的特征图尺寸为L+f-1,大于输入值。使用全填充的卷积被称为“宽卷积(wide convolution)”
任意填充(arbitrary padding):介于有效填充和全填充之间,人为设定的填充,较少使用。
带入先前的例子,若16×16的输入图像在经过单位步长的5×5的卷积核之前先进行相同填充,则会在水平和垂直方向填充两层,即两侧各增加2个像素( )变为20×20大小的图像,通过卷积核后,输出的特征图尺寸为16×16,保持了原本的尺寸。
3. 激励函数(activation function)
卷积层中包含激励函数以协助表达复杂特征:
类似于其它深度学习算法,卷积神经网络通常使用线性整流函数(Rectified Linear Unit, ReLU),其它类似ReLU的变体包括有斜率的ReLU(Leaky ReLU, LReLU)、参数化的ReLU(Parametric ReLU, PReLU)、随机化的ReLU(Randomized ReLU, RReLU)、指数线性单元(Exponential Linear Unit, ELU)等。在ReLU出现以前,Sigmoid函数和双曲正切函数(hyperbolic tangent)也有被使用。
激励函数操作通常在卷积核之后,一些使用预激活(preactivation)技术的算法将激励函数置于卷积核之前。在一些早期的卷积神经网络研究,例如LeNet-5中,激励函数在池化层之后。
池化层(pooling layer)
在卷积层进行特征提取后,输出的特征图会被传递至池化层进行特征选择和信息过滤。池化层包含预设定的池化函数,其功能是将特征图中单个点的结果替换为其相邻区域的特征图统计量。池化层选取池化区域与卷积核扫描特征图步骤相同,由池化大小、步长和填充控制。
1. Lp池化(Lp pooling)
Lp池化是一类受视觉皮层内阶层结构启发而建立的池化模型,其一般表示形式为:
式中步长 、像素 的含义与卷积层相同, 是预指定参数。当 时,Lp池化在池化区域内取均值,被称为均值池化(average pooling);当 时,Lp池化在区域内取极大值,被称为极大池化(max pooling)。均值池化和极大池化是在卷积神经网络的设计中被长期使用的池化方法,二者以损失特征图的部分信息或尺寸为代价保留图像的背景和纹理信息。此外 时的L2池化在一些工作中也有使用。
2. 随机/混合池化
混合池化(mixed pooling)和随机池化(stochastic pooling)是Lp池化概念的延伸。随机池化会在其池化区域内按特定的概率分布随机选取一值,以确保部分非极大的激励信号能够进入下一个构筑。混合池化可以表示为均值池化和极大池化的线性组合。
有研究表明,相比于均值和极大池化,混合池化和随机池化具有正则化的功能,有利于避免卷积神经网络出现过拟合。
3. 谱池化(spectral pooling)
谱池化是基于FFT的池化方法,可以和FFT卷积一起被用于构建基于FFT的卷积神经网络。在给定特征图尺寸 ,和池化层输出尺寸时 ,谱池化对特征图的每个通道分别进行DFT变换,并从频谱中心截取n×n大小的序列进行DFT逆变换得到池化结果。谱池化有滤波功能,可以在保存输入特征的低频变化信息的同时,调整特征图的大小。基于成熟的FFT算法,谱池化能够以很小的计算量完成。
Inception模块(Inception module)
Inception模块:原始版本(a),GoogLeNet使用的版本(b-d)
Inception模块:原始版本(a),GoogLeNet使用的版本(b-d)
Inception模块是对多个卷积层和池化层进行堆叠所得的隐含层构筑。具体而言,一个Inception模块会同时包含多个不同类型的卷积和池化操作,并使用相同填充使上述操作得到相同尺寸的特征图,随后在数组中将这些特征图的通道进行叠加并通过激励函数。由于上述做法在一个构筑中引入了多个卷积核,因此为简化计算,Inception模块通常设计了瓶颈层,首先使用单位卷积核,即NIN结构减少特征图的通道数,再进行其它卷积操作。Inception模块最早被应用于GoogLeNet并在ImageNet数据集中取得了成功,并启发了(或推广得到了)基于深度可分卷积(depthwise separable convolution)搭建的一系列轻量级卷积神经网络,包括Xception和MobileNet。
全连接层(fully-connected layer)
卷积神经网络中的全连接层等价于传统前馈神经网络中的隐含层。全连接层位于卷积神经网络隐含层的最后部分,并只向其它全连接层传递信号。特征图在全连接层中会失去空间拓扑结构,被展开为向量并通过激励函数。
按表征学习观点,卷积神经网络中的卷积层和池化层能够对输入数据进行特征提取,全连接层的作用则是对提取的特征进行非线性组合以得到输出,即全连接层本身不被期望具有特征提取能力,而是试图利用现有的高阶特征完成学习目标。
在一些卷积神经网络中,全连接层的功能可由全局均值池化(global average pooling)取代,全局均值池化会将特征图每个通道的所有值取平均,即若有7×7×256的特征图,全局均值池化将返回一个256的向量,其中每个元素都是7×7,步长为7,无填充的均值池化。
输出层
卷积神经网络中输出层的上游通常是全连接层,因此其结构和工作原理与传统前馈神经网络中的输出层相同。对于图像分类问题,输出层使用逻辑函数或归一化指数函数(softmax function)输出分类标签。在物体识别(object detection)问题中,输出层可设计为输出物体的中心坐标、大小和分类。在图像语义分割中,输出层直接输出每个像素的分类结果。
用输出图像中更亮的像素表示原始图像中存在的边缘。
通常,卷积有助于我们找到特定的局部图像特征(如边缘),用在后面的网络中。
例如,索博滤波器(边缘检测器)。卷积核(3*3矩阵)、待卷积图像(一个二维矩阵),依次覆盖每个角落,按位置相乘,乘积相加,生成n*n新矩阵。
在上面的处理过程中,我们用3x3滤波器对4x4输入图像执行卷积,输出了一个2x2图像。通常,我们希望输出图像与输入图像的大小相同。因此需要在图像周围添加零,让我们可以在更多位置叠加过滤器。3x3滤波器需要在边缘多填充1个像素。这种方法称之为“相同”填充,因为输入和输出具有相同的大小。而不使用任何填充称为“有效”填充。
图像中的相邻像素倾向于具有相似的值,因此通常卷积层相邻的输出像素也具有相似的值。这意味着,卷积层输出中包含的大部分信息都是冗余的。如果我们使用边缘检测滤波器并在某个位置找到强边缘,那么我们也可能会在距离这个像素1个偏移的位置找到相对较强的边缘。但是它们都一样是边缘,我们并没有找到任何新东西。池化层解决了这个问题。这个网络层所做的就是通过减小输入的大小降低输出值的数量。
池化一般通过简单的最大值、最小值或平均值操作完成。
激活函数、批量归一化、正则化、迁移学习
TensorFlow、Torch、PyTorch、NumPy
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network) 。
对循环神经网络的研究始于二十世纪80-90年代,并在二十一世纪初发展为深度学习(deep learning)算法之一,其中双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的的循环神经网络 。
循环神经网络具有记忆性、参数共享并且图灵完备(Turing completeness),因此在对序列的非线性特征进行学习时具有一定优势。循环神经网络在自然语言处理(Natural Language Processing, NLP),例如语音识别、语言建模、机器翻译等领域有应用,也被用于各类时间序列预报。引入了卷积神经网络(Convoutional Neural Network,CNN)构筑的循环神经网络可以处理包含序列输入的计算机视觉问题。
内部计算:循环神经网络的核心部分是一个有向图(directed graph)。有向图展开中以链式相连的元素被称为循环单元(RNN cell)。通常地,循环单元构成的链式连接可类比前馈神经网络中的隐含层(hidden layer),但在不同的论述中,循环神经网络的“层”可能指单个时间步的循环单元或所有的循环单元,因此作为一般性介绍,这里避免引入“隐含层”的概念。仅由循环单元构成的循环神经网络在理论上是可行的,但循环神经网络通常另有输出节点,其定义为一个线性函数。
连接性:1. 循环单元-循环单元连接:也被称为“隐含-隐含连接(hidden-hidden connection)”或全连接,此时每个循环单元当前时间步的状态由该时间步的输入和上一个时间步的状态决定。循环单元-循环单元连接可以是双向的,对应双向循环神经网络。2. 输出节点-循环单元连接:该连接方式下循环单元的状态由该时间步的输入和上一个时间步的输出(而不是状态)决定:由于潜在假设了前一个时间步的输出节点能够表征先前所有时间步的状态,输出节点-循环单元连接的循环神经网络不具有图灵完备性,学习能力也低于全连接网络。但其优势是可以使用Teacher Forcing进行快速学习。3. 基于上下文的连接:因为在图网络的观点下呈现闭环结构,该连接方式也被称为闭环连接(closed-loop connection),其中循环单元的系统状态引入了其上一个时间步的真实值。使用基于上下文连接的循环神经网络由于训练时将学习样本的真实值作为输入,因此是一个可以逼近学习目标概率分布的生成模型(generative model)。基于上下文的连接有多种形式,其中常见的一类使用了该时刻的输入、上一时刻的状态和真实值。其它的类型可能使用固定长度的输入,使用上一时刻的输出代替真实值,或不使用该时刻的输入。
我自己总结的另一篇文章https://mp.csdn.net/console/editor/html/104695823
另外,这几篇文章对基础知识总结的也很好
https://blog.csdn.net/weixin_40852935/article/details/105710771
https://blog.csdn.net/qq_30719815/article/details/105316924
对于卷积和池化的概念,在这里
https://www.zhihu.com/question/49376084