分类算法
什么是分类
一些常见的概念:
- 训练集(Training data):用于训练模型(的参数,如神经网络的各层权重和偏置,线性回归分析的系数);
- 验证集(Validation data):用于调整超参数(Hyper-Parameters,如神经网络的宽度和深度、学习率等);
- 测试集(Test data):用于评价模型本身的有效性(准确率等)
- 训练误差(Training error):分类器在训练集上的误差。
- 泛化误差(Generalization error,out-of-sample error):分类器在未见样本(不在训练集中的样本)上的误差。
对于数据集的划分
-
划分法: 训练集与测试集
把样本划分成2个独立的数据集合, 如, 训练集 (2/3), 测试集(1/3)。
适用于大规模的数据样本。 -
交叉验证(Cross-validation)
把数据集合划分成k 个子样本;
使用k - 1 个子样本作为训练集,另一个作为测试样本―k-折交叉验证。
适用于中等规模的数据。 -
留一测试(Leave One Out, k = n)
适用于小规模数据。
泛化误差的偏差/方差分解、过拟合、欠拟合
以回归为例
过拟合与欠拟合
-
过拟合:模型过于复杂(模型的表达力或capacity过高:例如神经网络的参数过多,决策树过深、过宽等等,而训练样本相对较少)。
考虑变量数大于方程数的线性方程组。 -
欠拟合:模型过于简单(模型的表达力或capacity不够)
考虑以线性模型去拟合非线性模型。
判别模型与生成模型
关于判别模型:
关于生成模型:
用哪种模型:
- 区分模型推导时更简单;
- 生成模型更加复杂一些:x比w往往高维,因此参数往往更多,训练困难;
- 生成模型反映了数据的实际产生过程,如果想把数据的产生过程集成到模型中,则应该考虑生成模型;(考虑如日中天的生成对抗网络Generative Adversarial Networks, GAN)
- 如果训练数据中有大量的遗失数据,则应该考虑生成模型;
- 生成模型更容易集成背景(专家知识)。
决策树
相关概念
一个例子
不断递归调用,直到所有叶子都是相同属性的。
最近邻分类器
朴素贝页斯分类器
一个例子
深度学习
三层前馈神经网络
- 大致结构:
- 结构设计:
- 神经网络的结构是指它具有多少单元以及它们如何连接:多少层?每层多少节点单元?单元之间如何连接?
- 大多数神经网络被组织成称为层的单元组。大多数神经网络结构将这些层布置成链式结构,其中每一层都是前一层的函数。在这种结构中,第一层由下式给出:
第二层由
给出,以此类推
- 具有一层隐藏层的前馈神经网络足以表示任何函数,但是网络层可能非常大(不可实现)并且可能无法正确地学习和泛化。
但在很多情况下,使用更深的模型能够减少表示期望函数所需的单元的数量,并且可以减少泛化误差。
- 网络结构:
- 输入层节点数:对应样本的维数:有多少个属性,就设置多少个输入节点
- 隐藏层节点数:隐藏层节点数的设置没有很具体的建议(视为超参数),要通过实验验证设置多少为好。
- 输出层节点数:若为2元分类, 可设为1个, 若输出范围为[0,1], 则可采用softmax函数, 若大于0.5,则类标签为1, 否则为0。也可设为2个节点;若是多元分类(标签数C > 2), 则用C个输出节点(对应着C维输出向量), 某个样本标签为i, 则训练时对应的目标向量T为(0,0,…,1,0,…,0), 其中第i个为1,其它为0.
-
深度的影响:
更深的网络能够更好地泛化。 -
参数数量的影响
激活函数
-
为什么要使用非线性激活函数:
线性模型,例如逻辑回归和线性回归,是非常吸引人的,因为无论是封闭形式还是使用凸优化,它们都能高效而可靠地拟合。
线性模型也有明显的缺陷,那就是该模型的能力被局限在线性函数里,所以它无法理解任何两个输入变量间的相互作用。
即使多层的线性函数组合在一起,本质上也只有线性函数的表达能力。在激活函数是线性的情况下,相比于单隐藏层神经网络,包含多隐藏层的深度网络并没有增加表达能力。 -
各种激活函数:
sigmoid:
softmax:
对sigmoid的扩展,常用于预测与多项式分布
ReLU:
tanh:
后向传播算法(BP)
P、NP、NP完全与NP难
- P类问题:存在多项式时间算法的问题。
- NP类问题:能在多项式时间内验证得出一个正确解的问题。(P类问题是NP问题的子集,因为存在多项式时间解法的问题,总能在多项式时间内验证他。)
- NPC问题:是一个NP问题,并且如果所有NP问题都能在多项式时间内转化为他,则称该NP问题为NPC问题。(是一类问题)
- NPH问题:NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条(所有NP问题都能在多项式时间内转化为他)但不一定要满足第一条(是一个NP问题),就是说,NP-Hard问题要比 NPC问题的范围广。即使NPC问题发现了多项式级的算法,NP-Hard问题有可能仍然无法得到多项式级的算法。事实上,由于NP-Hard放宽了限定条件,它将有可能比所有的NPC问题的时间复杂度更高从而更难以解决。
基于梯度的优化算法
-
批量梯度下降(Batch GD,BGD):更新参数时使用所有的样本。训练速度慢,不能以在线的形式更新我们的模型。
-
随机梯度下降(Stochastic GD, SGD):仅仅选取一个样本i来进行梯度更新。能够在线学习,速度快。但是更新值的方差很大,在频繁的更新之下,它的目标函数有着剧烈波动。
-
小批量梯度下降(Mini Batch GD,MBGD):我们采用m (1< m << n)个样本来迭代。收敛过程更为稳定
后向传播算法
实例:
深度网络及其训练
深度网络的优势:
- 高的表达力(Capacity)-使用深度网络最主要的优势在于,它能以更加紧凑简洁的方式来表达比浅层网络大得多的函数集合。
- 深度学习= 学习(特征的)层次化表示。低层特征 → 中层特征 → 高层特征
- 深度网络通常能够获取到输入的“层次型分组”或者“部分-整体分解”结构:第一层会学习得到原始输入的一阶特征,第二层会学习得到二阶特征,该特征对应一阶特征里包含的一些模式。更高层还会学到更高阶的特征。
例如:
对于图像数据,我们能够使用深度网络学习到“部分-整体”的分解关系。
第一层可以学习如何将图像中的像素组合在一起来检测边缘。
第二层可以将边缘组合起来检测更长的轮廓或者简单的“目标的部件”。
在更深的层次上,可以将这些轮廓进一步组合起来以检测更为复杂的特征。
深度网络训练面临的挑战
- 数据获取问题:标记数据少,无标记数据多。
- 局部极值问题:容易陷入局部最优。
- 梯度消失问题:除了最高的几层之外,梯度很小或消失; 如果不进行pretraining,效果有时还不如浅层网络。
- 复杂性太高:如果对所有层同时训练,时间复杂度会太高。训练时间和资源花费非常大。
逐层贪婪预训练
从底层(输入层)开始,一层一层的往顶层(输出层)训练,原始输入作为训练第一个隐藏层的输入;训练好一层后,参数固定,再在其上堆积(Stacking,又称栈化)一层,然后用前一层的输出作为训练该层的输入。
这些各层单独训练所得到的权重被用来初始化最终(或者说全部)的深度网络的权重,然后使用后向传播算法对整个网络进行“微调”(即把所有层放在一起来优化有标签训练集上的训练误差)。
上述训练可以是无监督的或有监督的
-
无监督:如使用受限玻尔兹曼机(Restricted Boltzmann Machines, RBM),自编码器(auto-encoder)等;
-
有监督:直接用训练集的标识作为训练一层时的输出(将每一步的分类误差作为目标函数) 。
无监督:自编码器
- 分类:
欠完备(under complete)自编码器:隐藏编码维数小于输入维数。
过完备(over-complete)自编码器:如果隐藏编码的维数允许与输入相等,或隐藏编码维数大于输入的维数。
深度网络的正则化技术
以增大训练误差为代价来减少测试误差。这些策略统称为正则化。
常见的正则化策略
- 添加额外的约束,如参数的约束(硬约束);
- 有些向目标函数增加额外项,对应于参数值的软约束;
- 提前终止策略;
- Dropout
提前终止
当训练有足够的表示能力甚至会过度拟合的大模型时,我们经常观察到,训练误差会随着时间的推移逐渐降低但验证集的误差会再次上升。
在每次验证集误差有所改善后,我们存储模型参数的副本。当训练算法终止时,我们返回这些参数而不是最新的参数。当验证集上的误差在事先指定的循环内没有进一步改善时,算法就会终止。这种策略被称为提前终止(early stopping)。这可能是深度学习中最常用的正则化形式。
Dropout
dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。
没有免费的午餐定理(NFL定理)
1)对所有可能的的目标函数求平均,所有学习算法的“非训练集误差”的期望值相同;
2)对任意固定的训练集,对所有的目标函数求平均,所有学习算法的“非训练集误差”的期望值也相同;
3)对所有的先验知识求平均,所有学习算法的“非训练集误差”的期望值也相同;
4)对任意固定的训练集,对所有的先验知识求平均,所有学习算法的的“非训练集误差”的期望值也相同;
NFL定理表明没有一个学习算法可以在任何数据集上总是学习到最准确的分类器。