机器学习基础

基本概念

范数

  • 2范数
    • 矩阵:A的转置乘以A矩阵特征根最大值的开根号
    • 向量:x中各个元素平方之和再开根号
    • 函数:x在区间(a,b)上f(x)的平方的积分再开根号
  • 矩阵范数:
    • 1范数/列和范数:所有矩阵列向量绝对值之和的最大值
    • 2范数:A的转置乘以A矩阵特征根最大值的开根号
    • \(\infty\)范数/行和范数:所有矩阵行向量绝对值之和的最大值
    • F范数/Frobenius范数:矩阵元素绝对值的平方和再开平方
  • 向量范数:
    • 0范数:表示向量中非零元素的个数
    • 1范数:向量元素绝对值之和
    • 2范数:向量元素绝对值的平方和再开方
    • \(\infty\)范数:所有向量元素绝对值中的最大值
    • \(-\infty\)范数:所有向量元素绝对值中的最小值

距离

  • 余弦距离

    • 余弦相似度,就是计算两个向量间的夹角的余弦值
    • 余弦距离就是用1减去这个获得的余弦相似度
    • 余弦距离的取值范围为[0,2],这就满足了非负性的性质
  • 欧式距离

    • 常用的距离计算公式:\(d=\sqrt{\sum_{i=1}^N(x_{1i}-x_{2i})^2}\),即向量差的二范数
  • 欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异

数据集

测试集

  • 为通过实验测试对学习器的泛化误差进行评估并进而做出选择,需使用一个“测试集”来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”作为泛化误差的近似
    • 训练数据集的损失与一般化的数据集的损失之间的差异就叫做泛化误差
    • 泛化误差可以分解为偏差(Bias)、方差(Variance)和噪声(Noise),即泛化误差=\(bias^2(x)+var(x)+\varepsilon^2\)
      • 偏差:用所有可能的训练数据集训练出的所有模型的输出的平均值与真实模型的输出值之间的差异
      • 方差:不同的训练数据集训练出的模型输出值之间的差异
    • 以回归任务为例,学习算法的期望预测为:\(\bar{f}(x)=E_D[f(x;D)]\),其中f是学习得到的模型,x是测试样本,D是数据集
      • 使用样本数相同的不同训练集产生的方差为:\(var(x)=E_D[(f(x;D)-\bar{f}(x))^2]\);方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响
      • 期望输出与真实标记的差别称为偏差:\(bias^2(x)=(\bar{f}(x)-y)^2\);偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力
      • 噪声为:\(\varepsilon^2=E_D[(y_D-y)^2]\),其中\(y_D\)是x在数据集中的标记,y是x的真实标记;噪声表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度
      • 给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小
    • 一般来说,简单的模型会有一个较大的偏差和较小的方差,复杂的模型偏差较小方差较大
      • 偏差与方差是有冲突的,这称为偏差-方差窘境
      • 欠拟合:模型不能适配训练样本(通常是因为模型复杂度低引起的),有一个很大的偏差
      • 过拟合:模型很好的适配训练样本,但在测试集上表现很糟,有一个很大的方差;训练集质量不高就可能导致过拟合,比如样本不足,或者训练数据中的噪声(干扰数据)过多,也有可能因为模型复杂度高于实际问题
    • Bagging算法是对训练样本进行采样,产生出若干不同的子集,再从每个数据子集中训练出一个分类器,取这些分类器的平均,所以是降低模型的方差。Boosting则是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行权重调整,所以随着迭代不断进行,误差会越来越小,所以模型的偏差会不断降低
    • 避免欠拟合(针对偏差):寻找更好的特征;用更多的特征(增加模型复杂度)。避免过拟合(针对方差):使用更多数据;减少数据特征(减少模型复杂度);正则化;交叉验证
  • 划分训练集和测试集的方法
    • 留出法:把数据集随机分成互不相交的两部分(可多次划分取平均),一部分是训练集,一部分是测试集;训练集数据的数量应占2/3到4/5
    • 交叉验证法:将数据集随机分为互斥的k个子集(p次随机划分取平均);将k个子集随机分为k-1个一组剩下一个为另一组,有k种分法;将每一种分组结果中,k-1个子集的组当做训练集,另外一个当做测试集,这样就产生了k次预测,对其取平均;称为p次k折交叉验证,一般取k=10

样本不均衡

  • 当某一类别的数据量远大于另一类别的样本数量时,我们就称其样本不均衡。最常见的例子可能就是异常检测了,在异常检测中绝大部分样本都是正常类型的,只有极少部分属于异常
  • 解决:
    • 欠采样(undersampling)法是去除训练集内一些多数样本,使得两类数据量级接近,然后再正常进行学习
      • 缺点是就是放弃了很多反例,这会导致平衡后的训练集小于初始训练集
      • 将多数样本划分成N个集合,然后将划分过后的集合与少数样本组合,这样就形成了N个训练集合,而且每个训练集合都进行了欠采样,但从全局来看却没有信息丢失
    • 过采样(oversampling)是对训练集内的少数样本进行扩充,即增加少数样本使得两类数据数目接近,然后再进行学习
      • 简单粗暴的方法是复制少数样本,缺点是虽然引入了额外的训练数据,但没有给少数类样本增加任何新的信息,非常容易造成过拟合
      • 在少数类样本中加入白噪声(比如高斯噪声)变成新样本一定程度上可以缓解这个问题
      • 通过对少数样本进行插值来获取新样本的;比如对于每个少数类样本a,从a最邻近的样本中选取样本b,然后在对ab中随机选择一点作为新样本

特征处理

特征预处理

  • 无量纲化:使不同规格的数据转换到同一规格;常见的无量纲化方法有标准化和区间缩放法
    • 标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布
    • 区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等
    • 标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”
      • 归一化后加快了梯度下降求最优解的速度
      • 归一化有可能提高精度
      • 概率模型不需要归一化,如决策树、RF;像adaboost、gbdt、xgboost、svm、lr、KNN、KMeans之类的最优化问题就需要归一化
  • 对定量特征二值化: 核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0
  • 对定性特征哑编码: one_hot
  • 缺失值计算: 以均值填充
  • 数据变换:常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的

特征选择

  • 当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征
    • 特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用
    • 特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择
  • 根据特征选择的形式又可以将特征选择方法分为3种
    • Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征
    • Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征
    • Embedded:集成法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣
  • Filter
    • 方差选择法:先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征
    • 相关系数法:先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的SelectKBest类结合相关系数来选择特征
    • 卡方检验: 经典的卡方检验是检验定性自变量对定性因变量的相关性
    • 互信息法: 经典的互信息也是评价定性自变量对定性因变量的相关性的
  • Wrapper
    • 递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练
  • Embedded
    • 基于惩罚项的特征选择法:使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维
    • 基于树模型的特征选择法:树模型中GBDT也可用来作为基模型进行特征选择

降维/矩阵分解

  • 当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA)
    • SVD直接分解,PCA是对协方差矩阵操作后分解
    • LDA
      • 有监督学习的降维技术,而PCA是不考虑样本类别输出的无监督降维技术
    • PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法

模型

生成模型和判别模型

  • 生成模型:已知输入变量x和目标变量y,先对它们的联合概率分布p(x, y)建模,然后计算样本属于每一个类的条件概率p(y|x)即类后验概率,按照这个值来完成分类,如将样本分到概率p(y|x)最大的那个类
    • 生成模型的典型代表是贝叶斯分类器
    • 生成模型的另外一个典型代表是受限玻尔兹曼机(RBM)
  • 判别模型: 已知输入变量x,它直接对目标变量y的条件概率p(y|x)建模。即计算样本x属于每一类的概率。注意,这里和生成模型有一个本质的区别,那就是没有假设x服从何种概率分布,而是直接估计出条件概率p(y|x)
    • 这类模型的典型代表是logistic回归和softmax回归
  • 第三种做法最直接,分类器根本就不建立概率模型,而是直接得到分类结果,这种是非概率模型,也称为判别模型
    • 这类模型的典型代表是决策树,支持向量机,随机森林,kNN算法,AdaBoost算法,xgboost,标准的人工神经网络(包括全连接神经网络,卷积神经网络,循环神经网络等)。如果神经网络的最后一层是softmax变换,即softmax回归,则可以归到第二种情况里,如果没有使用,则是这第三种情况

集成学习

  • 通过合并多个模型来提升机器学习性能
  • 分为三类
    • 用于减少方差的bagging
    • 用于减少偏差的boosting
    • 用于提升预测结果的stacking
  • 也可分为如下两类
    • 串行集成方法:这种方法串行地生成基础模型(如AdaBoost),串行集成的基本动机是利用基础模型之间的依赖,通过给错分样本一个较大的权重来提升性能
    • 并行集成方法:这种方法并行地生成基础模型(如Random Forest),并行集成的基本动机是利用基础模型的独立性,因为通过平均能够较大地降低误差

bagging

  • 使用装袋采样来获取数据子集训练基础学习器,通常分类任务使用投票的方式集成,而回归任务通过平均的方式集成
  • 代表模型:随机森林

boosting

  • 通过算法集合将弱学习器转换为强学习器,所谓弱学习器是指仅比随机猜测好一点点的模型,训练的方式是利用加权的数据,在训练的早期对于错分数据给予较大的权重
  • 代表模型:AdaBoost
  • 梯度树提升(Gradient Tree Boosting)是一个boosting算法在损失函数上的泛化

stacking

  • 通过一个元分类器或者元回归器来整合多个分类模型或回归模型的集成学习技术
  • 基础模型利用整个训练集做训练,元模型将基础模型的特征作为特征进行训练

线性回归

  • 在线性回归模型中,有两种不同的正则化项
    • 所有参数绝对值之和,即L1范数,对应的回归方法叫做Lasso回归
    • 所有参数的平方和,即L2范数,对应的回归方法叫做Ridge回归,岭回归

逻辑回归LR

  • 主要用于二分类的实现
  • 假设数据服从这个分布,然后使用极大似然估计做参数的估计
  • Logistic的分布函数:\(\frac{1}{1+exp(-(x-\mu)/\gamma)}\)\(\mu\)表示位置参数,\(\gamma\)表示形状参数
    • Logistic分布是由其位置和尺度参数定义的连续分布。Logistic分布的形状与正态分布的形状相似,但是Logistic分布的尾部更长,所以我们可以使用 Logistic 分布来建模比正态分布具有更长尾部和更高波峰的数据分布
    • \(\mu=0,\gamma=1\)时,\(\sigma(a)=\frac{1}{1+exp(-a)}\)是logistic sigmoid函数(sigmoid指S-shaped),其中\(\sigma(-a)=1-\sigma(a)\)
  • \(P(Y=1|x)=p(x),P(Y=0|x)=1-p(x)\),似然函数\(L(w)=\prod[p(x_i)]^{y_i}[1-p(x_i)]^{1-y_i}\)
  • LR是参数模型,参数模型的前提是假设数据服从某一分布,该分布由一些参数确定(比如正态分布由均值和方差确定),在此基础上构建的模型称为参数模型

SVM(support vector machine)

  • 支持向量机,它的目标是确定一个分类超平面,从而将不同的数据分隔开
  • SVM 是非参数模型,非参数模型对于总体的分布不做任何假设,只是知道总体是一个随机变量,其分布是存在的(分布中也可能存在参数),但是无法知道其分布的形式,更不知道分布的相关参数,只有在给定一些样本的条件下,能够依据非参数统计的方法进行推断

树模型

  • 决策树经历了三次改进,ID3、C4.5、CART,主要区别在于一个根据信息增益划分特征、一个根据信息增益率、一个根据基尼指数
    • 剪枝:为了避免决策树模型的过拟合。因为决策树算法在学习的过程中为了尽可能的正确的分类训练样本,不停地对结点进行划分,因此这会导致整棵树的分支过多,也就导致了过拟合。决策树的剪枝策略最基本的有两种:预剪枝(pre-pruning)和后剪枝(post-pruning)
      • 预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若当前结点的划分不能带来决策树模型泛化性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点
      • 后剪枝就是先把整棵决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来泛化性能的提升,则把该子树替换为叶结点
  • 随机森林=决策树+Bagging集成学习
  • GBDT=决策树+AdaBoost集成学习
  • XGBoost是GBDT的优化版,不论是精度还是效率上都有了提升。与GBDT相比,具体的优点有:
    • 支持处理缺失值
    • 损失函数是用泰勒展式二项逼近,而不是像GBDT里的就是一阶导数
    • 对树的结构进行了正则化约束,防止模型过度复杂,降低了过拟合的可能性
    • 节点分裂的方式不同,GBDT是用的基尼系数,XGBoost是经过优化推导后的
  • LGB是对XGB进行了改进,使用单边梯度采样算法减少不必要的样本;在寻找最优分割点时采用直方图算法使计算代价更小;支持类别特征等

无监督

  • k-means: 其认为两个目标的距离越近,相似度越大
    • 算法步骤:
      • 以某种方式初始化k个聚类中心
      • 针对数据集中的每一个样本,计算它到k个聚类中心的距离,并将其分到距离最小的聚类中心所对应的类中
      • 针对每一类重新计算它的聚类中心
      • 重复2、3步骤,直至分配情况不变
  • 在k-means或kNN,我们是用欧氏距离来计算最近的邻居之间的距离。不用曼哈顿距离的原因是曼哈顿距离只计算水平或垂直距离,有维度的限制。另一方面,欧氏距离可用于任何空间的距离计算问题。因为,数据点可以存在于任何空间,欧氏距离是更可行的选择

神经网络

  • NN的参数可随机初始化,但不能均为0(不光是0初始化,将权值初始化为任意相同值,都很有可能使模型失效),因为NN中存在隐含层,会导致后面的激活单元具有相同的值,所有的单元相同意味着它们都在计算同一特征,网络变得跟只有一个隐含层节点一样,这使得神经网络失去了学习不同特征的能力
    • 在线性回归和逻辑回归中参数可初始化为0

多层感知机

  • 如果只使用一个隐层,需要多少隐节点能够实现包含n元输入的任意布尔函数:对于单隐层的MLP,需要\(2^{(n-1)}\)个隐结点可以实现;对于多个隐层,需要3(n-1)
  • dropout防止过拟合:防止参数过分依赖训练数据,增加参数对数据集的泛化能力
    • 丢弃学习:指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃;类似将多个不同网络结构的模型集成起来

激活函数

  • Sigmoid函数(S型函数):\(y=\frac{1}{1+e^{-x}}\)\(\frac{dy}{dx}=y[1-y]\)
  • Tanh函数: \(y=tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}=2sigmoid(2x)-1\)\(\frac{dy}{dx}=1-y^2\)
  • ReLu函数: \(y=max(0,x)\)\(\frac{dy}{dx}=\begin{cases}1,x>0\\ 0,x\le 0 \\ \end{cases}\)
    • 从计算的角度上,Sigmoid和Tanh激活函数均需要计算指数,复杂度高,而ReLU只需要一个阈值即可得到激活值
    • ReLU的非饱和性可以有效地解决梯度消失的问题, 提供相对宽的激活边界
    • ReLU的单侧抑制提供了网络的稀疏表达能力
    • ReLU的局限性在于其训练过程中会导致神经元死亡的问题
  • Leaky ReLu函数: \(y=\begin{cases}x,x>0\\ \alpha ·x,x\le 0 \\ \end{cases}\)\(\frac{dy}{dx}=\begin{cases}1,x>0\\ \alpha,x\le 0 \\ \end{cases}\)
  • Softplus函数: \(y=log(1+e^x)\)\(\frac{dy}{dx}=sigmoid(x)\)

CNN

  • 卷积网络的一个单元只取决于输入的一个区域,即该单元的接受域receptive field;随着层数的增加,接受域的尺寸线性增加(每一层以核尺寸增加接受域)
  • 共享参数:实现平移不变性
  • CNN的两大核心思想:
    • 网络局部连接
    • 卷积核参数共享
    • 两者的一个关键作用就是减少参数数量
  • 池化操作
    • 池化操作通常也叫做子采样(Subsampling)或降采样(Downsampling)
    • 在构建卷积神经网络时,往往会用在卷积层之后,通过池化来降低卷积层输出的特征维度,有效减少网络参数的同时还可以防止过拟合现象
    • 最大池化就是选择图像区域中最大值作为该区域池化以后的值,反向传播的时候,梯度通过前向传播过程的最大值反向传播,其他位置梯度为0;stride=kernel size的情况属于非重叠池化,如果stride<kernel size则属于重叠池化;重叠池化相比于非重叠池化不仅可以提升预测精度,同时在一定程度上可以缓解过拟合
    • 平均池化就是将选择的图像区域中的平均值作为该区域池化以后的值
    • 随机池化:特征区域的大小越大,代表其被选择的概率越高
    • 组合池化是同时利用最大值池化与均值池化两种的优势而引申的一种池化策略,常见组合策略有两种:Cat与Add;maxpool更关注重要的局部特征,而average pooling更关注全局特征
  • 空洞卷积Dilated/Atrous Convolution
    • 卷积核中间填充0
    • 扩大感受野;捕获多尺度上下文信息
    • 广泛应用于语义分割与目标检测等任务中

ResNet

  • CNN随着模型的加深而导致效果退化
  • 残差学习Residual Learning: \(y=F(x,\{W_i\})+x,F=W_2\sigma (W_1x)\)

RNN

  • \(s_t=tanh(Ux_t+Ws_{t-1}),o_t=softmax(Vs_t)\)
  • RNN一个最大的缺陷就是梯度消失与梯度爆炸问题,由于这一缺陷,使得RNN在长文本中难以训练;随着梯度的传导,梯度被近距离梯度主导,模型难以学习到远距离的信息
  • LSTM: 与RNN相比,增加了3个门(gate):input门,forget门和output门,门的作用就是为了控制之前的隐藏状态g/s、当前的输入等各种信息,确定哪些该丢弃,哪些该保留
    • \(i=\sigma(U^ix_t+W^is_{t-1})\)
    • \(f=\sigma(U^fx_t+W^fs_{t-1})\)
    • \(o=\sigma(U^ox_t+W^os_{t-1})\)
    • \(g=tanh(U^gx_t+W^gs_{t-1})\)
    • \(c_t=c_{t-1}\bigodot f+g\bigodot i\)
    • \(s_t=tanh(c_t)\bigodot o\)
    • 门机制的存在,就使得LSTM能够显式地为序列中长距离的依赖建模,通过对门参数的学习,网络能够找到合适的内部存储c(细胞状态)行为
    • sigmoid和tanh这两个激活函数都是饱和的,也就是说在输入达到一定值的情况下,输出就不会发生明显变化了。如果是用非饱和的激活函数,例如ReLU,那么将难以实现门控的效果;使用tanh函数,是因为其输出在-1-1之间,这与大多数场景下特征分布是0中心的吻合。此外,tanh函数在输入为0近相比Sigmoid函数有更大的梯度,通常使模型收敛更快
    • LSTM虽然能够解决梯度消失问题,但并不能够避免梯度爆炸问题,仍有可能发生梯度爆炸。但是,由于LSTM众多门控结构,和普通RNN相比,LSTM发生梯度爆炸的频率要低很多。梯度爆炸可通过梯度裁剪解决
  • GRU具有与LSTM类似的结构,但是更为简化。门数不同:GRU只有两个门reset门r和update门z;r和z共同控制了如何从之前的隐藏状态\(s_{t−1}\)计算获得新的隐藏状态\(s_t\),而取消了LSTM中的output门
    • \(z=\sigma(U^zx_t+W^zs_{t-1})\)
    • \(r=\sigma(U^rx_t+W^rs_{t-1})\)
    • \(h=tanh(U^hx_t+W^h(s_{t-1}\bigodot r))\)
    • \(s_t=(1-z)\bigodot h+z\bigodot s_{t-1}\)
  • LSTM和GRU的比较:一般认为,LSTM和GRU之间并没有明显的优胜者。因为GRU具有较少的参数,所以训练速度快,而且所需要的样本也比较少。而LSTM具有较多的参数,比较适合具有大量样本的情况,可能会获得较优的模型

硬件设备

多线程设备/共享内存设备

  • 多核CPU
  • GPU
    • 基于GPU的系统:如TensorFlow,将整个GPU当作一个worker,所有线程并发执行相同的计算,会导致低的GPU利用率
  • TPU
  • 分布式环境:计算机网络,共享内存

计算系统

  • TensorFlow,MXNet和PyTorch是建立在硬件之上的

TensorFlow

  • TensorFlow使用数据流式图来规划计算流程
    • 一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,TensorFlow中的每一个运算操作都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系
    • 在计算图的边中流动的数据称为张量
  • Session是用户使用tensorflow时的交互式接口;可通过Session的run方法执行计算图

TensorFlow和PyTorch的区别

  • 动态及静态图形定义
    • 两种框架都在张量上运行
    • TensorFlow对于动态输入的支持比较有限,而PyTorch则是默认的支持动态输入
    • 在TensorFlow中,在跑模型之前会静态的定义图形。和外界的所有联系都是通过tf.Session对象和tf.Placeholder,它们都是会在模型运行被外部数据取代的张量

训练

损失函数

  • 损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项

0-1损失函数

  • 预测值和目标值不相等为1, 否则为0
  • 直接对应分类判断错误的个数,但是它是一个非凸函数,不太适用
  • 感知机就是用的这种损失函数。但是相等这个条件太过严格,因此可以放宽条件,即当差小于某个阈值时可置为0

绝对值损失函数

  • 计算预测值与目标值的差的绝对值
  • MAE(Mean Absolute Error)平均绝对误差

对数损失函数

  • 能非常好地表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合
  • 逻辑回归的损失函数就是log对数损失函数

平方损失函数

  • 经常应用于回归问题
  • MSE(Mean Squared Error)均方误差
  • RMSE(Root Mean Squared Error)均方误差根: 对MSE指标求平方根

指数损失函数

  • \(L=exp[-yf(x)]\)
  • 对离群点、噪声非常敏感,经常用在AdaBoost算法中

Hinge损失函数

  • \(L=max(0,1-yf(x))\),如果被分类正确,损失为0,否则损失就为\(1-yf(x)\)\(f(x)\)是预测值,在[-1,1]之间,y是目标值(-1或1)
  • SVM就是使用这个损失函数
    • 感知损失(perceptron loss)函数: \(L=max(0,-f(x))\),是Hinge损失函数的一个变种

交叉熵损失函数

  • \(L=-\frac{1}{n}\sum_x[ylna+(1-y)ln(1-a)]\),其中y表示实际的标签, a表示预测的输出
    • 上述公式是二分类,对于多分类:\(L=-\frac{1}{n}\sum_iy_ilna_i\)
  • 本质上是一种对数似然函数
  • 当使用sigmoid作为激活函数的时候,常用交叉熵损失函数而不用均方误差损失函数,因为前者完美解决平方损失函数权重更新过慢,当误差大的时候,权重更新快,当误差小的时候,权重更新慢

正则

  • 用正则化防止过拟合,在损失函数中加个正则项,来防止参数拟合得过好
  • L1正则(来自L1范数\(||x||_1=\sum_{i=1}^n|x_i|\)):\(\sum_{i=1}^k|w_i|\)
  • L2正则(来自L2范数\(||x||_2=(\sum_{i=1}^n|x_i|^2)^{1/2}\)):\(\sum_{i=1}^kw_i^2\)
  • 这两个正则项最主要的不同
    • L2计算起来更方便,而L1在特别是非稀疏向量上的计算效率就很低
    • L1最重要的一个特点,输出稀疏(考虑导数),会把不重要的特征直接置零,而L2则不会
    • L2有唯一解,而L1不是

优化器

  • 在反向传播过程中需要对激活函数进行求导,如果导数大于1,那么随着网络层数的增加梯度更新将会朝着指数爆炸的方式增加这就是梯度爆炸。同样如果导数小于1,那么随着网络层数的增加梯度更新信息会朝着指数衰减的方式减少这就是梯度消失。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则
    • 解决梯度爆炸:梯度剪切、权重正则化
    • relu、leakrelu、elu等激活函数:解决了梯度消失、爆炸的问题
    • 批标准化:具有加速网络收敛速度,提升训练稳定性的效果;本质上是解决反向传播过程中的梯度问题;通过标准化操作将mini-batch中的数据标准化到均值为0,方差为1,保证网络的稳定性,同时还引入了两个可以学的参数,分别为scale和shift,让模型学习其适合的分布
      • 在mini-batch中计算均值方差,因此会带来一些较小的噪声,在神经网络中添加随机噪声可以带来正则化的效果
    • Layer Normalization: 主要用于解决批标准化不适用于RNN等动态网络和batchsize较小的时候效果不好的问题。LN和BN不同点是归一化的维度是互相垂直的。BN是取不同样本的同一个通道的特征做归一化;LN则取的是同一个样本的不同通道做归一化。BN的两个缺点的产生原因均是因为计算归一化统计量时计算的样本数太少。LN是针对隐含层结点的数量进行均值和方差计算

随机梯度下降SGD

  • \(\theta \leftarrow \theta-\alpha \nabla_{\theta}L\)
  • 收敛分析假设
    • 随机梯度是无偏的
    • 随机梯度的方差是受限的
    • Lipschitz continuity利普希茨连续(梯度是Lipschitzian):\(||\nabla f(x)-\nabla f(y)||\le L||x-y||\)
  • 梯度下降法大家族(BGD,SGD,MBGD)
    • 批量梯度下降法(Batch Gradient Descent): 在更新参数时使用所有的样本来进行更新
    • 随机梯度下降法(Stochastic Gradient Descent): 仅仅选取一个样本来求梯度
    • 小批量梯度下降法(Mini-batch Gradient Descent)
  • 梯度下降法和牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法是用二阶的海森矩阵的逆矩阵求解。相对而言,使用牛顿法收敛更快(迭代更少次数),但是每次迭代的时间比梯度下降法长
    • 梯度下降法: \(x^{(k+1)}=x^{(k)}-\lambda\nabla f(x^{(k)})\)
    • 牛顿法: \(x^{(k+1)}=x^{(k)}-\lambda(H^{(k)})^{-1}\nabla f(x^{(k)})\)
    • 拟牛顿法: 在牛顿法的迭代中,需要计算海森矩阵的逆矩阵,这一计算比较复杂,考虑用一个n阶矩阵来近似代替

Momentum SGD

  • \(\theta \leftarrow \theta+v,v\leftarrow \beta v+\alpha \nabla_{\theta}L\)
  • 动量Momentum SGD与SGD的区别是定义了速度v,使得更新不光取决于当前梯度,而且保持了惯性(来自v的更新)

AdaGrad (adaptive gradient)

  • 通过过往的梯度g累计,自动调节学习率
  • \(\theta \leftarrow \theta-\alpha \odot g,\alpha \leftarrow \frac{\alpha}{\delta+\sqrt(r)},r \leftarrow r+g \odot g\)

RMSProp (root mean square propagation)

  • 与AdaGrad类似,不过把累计梯度加权平均
  • \(r \leftarrow pr+(1-p)g \odot g\)

Adam

  • 结合了动量,自适应学习率这两个特性,而这两个特性也叫一阶和二阶矩估计
  • \(\theta \leftarrow \theta-\epsilon \frac{v}{\sqrt{r}},v\leftarrow (1-\alpha)v+\alpha g,r \leftarrow pr+(1-p)g \odot g\)

分布式训练模式

数据并行

  • 随机梯度下降(SGD)(Mini-batch): 最流行的数据并行优化方法
    • 梯度下降: 沿着函数梯度的反方向走就会使函数值不断减小
      • \(x_{k+1}=x_k-t_k\nabla f(x_k),k=0,1,...\)
    • 多个workers并行计算一批数据上的随机梯度;每次迭代时需要在模型参数更新前进行同步;对于凸优化,收敛率被证明是\(O(\frac{1}{\sqrt{(KM)}})\),K是迭代次数,M是批大小
    • 异步并行(ASP) SGD允许同时执行多个模型更新(所有workers独立重复迭代),而无需等待其他更新,使得ASP系统在同质场景中通常比完全同步的系统更快。但作为一种常用的克服通信瓶颈的方法,它会降低训练精度,引起偶然的发散,影响统计效率(即不能保证训练质量)

模型并行

  • 每个共享内存设备中的大量线程根据反向传播算法逐个地执行操作函数(如矩阵乘法、矩阵逐元素加法);此时模型被划分,每个线程只读取和更新参数的一部分。实际上,每次操作函数完成时,模型并行都会在线程之间产生同步。此外,同步是反向更新和前向计算之间的一个积分。对于深度神经网络,它们还需要在每层之后进行同步。因此,多线程场景下的模型并行仍然存在着同步成本大的问题,严重影响硬件效率(即不能有效利用硬件资源)

评价指标

  • TP(真正类):被模型预测为正的正样本;正确预测为正
  • FP(假正类):被模型预测为正的负样本;错误预测为正
  • TN(真负类):被模型预测为负的负样本;正确预测为负
  • FN(假负类):被模型预测为负的正样本;错误预测为负

accuracy

  • 分类正确的样本占总样本的比例,即\(\frac{TP+TN}{TP+FN+TN+FP}\)
  • 局限性:当正负样本极度不均衡时存在问题

ROC曲线和PR曲线

  • 当正负样本不均衡时,常用的评价指标为ROC曲线和PR曲线
    • ROC接受者操作特征曲线: 显示的是分类器的TPR和FPR之间的关系(兼顾正例和负例的权衡)(纵轴-横轴),其中\(TPR=\frac{TP}{TP+FN}, FPR=\frac{FP}{FP+TN}\),分别对应于在所有实际为正的样本中被正确判断为正的比例以及在所有实际为负的样本中被错误判断为正的比例
      • 在测试样本中正负样本分布不一样的,ROC曲线可以保持不变;准确率会考虑到不均衡的所有数据。但是如果是灵敏度和特异度,它只会考虑到正例或者负例,不考虑整体的数据分布
      • 灵敏度(TPR):本质上是正样本召回率;特异度(TNR=1-FPR):本质上是负样本的召回率
      • 假负率 = 1-灵敏度;假正率= 1-特异度
    • PR(Precision-Recall,纵轴-横轴)曲线:Recall=TPR;Precision为\(\frac{TP}{TP+FP}\),是相对于预测而言的;PR曲线的两个指标都聚焦于正例
    • AUC:曲线下的面积(一般是ROC);只能够用于二分类模型的评价;一种会考虑所有可能分类阈值的评估指标
      • 从所有正样本中随机选取一个样本,从所有负样本中随机选取一个样本,然后根据你的分类器对两个随机样本进行预测,把正样本预测为正的概率为p1,把负样本预测为正的概率为p2,p1>p2的概率就是AUC。所以AUC应该反映的是分类器对样本的排序能力,另外,AUC对样本类别是否均衡并不敏感
      • 总共有M*N个正负样本对,把所有比较中正样本概率大于负样本概率的例子都算上
      • 首先对score从大到小排序,然后令最大score对应的sample的rank值为n,第二大score对应sample的rank值为n-1,以此类推从n到1。然后把所有的正类样本的rank相加,再减去正类样本的score为最小的那M个值的情况。得到的结果就是有多少对正类样本的score值大于负类样本的score值,最后再除以M×N即可。值得注意的是,当存在score相等的时候,对于score相等的样本,需要赋予相同的rank值(无论这个相等的score是出现在同类样本还是不同类的样本之间,都需要这样处理)。具体操作就是再把所有这些score相等的样本的rank取平均。然后再使用上述公式
      • \(AUC=\frac{\sum_{ins_i\in positive}rank_{ins_i}-M*(M+1)/2}{M*N}\)

Precision精确率和Recall召回率

  • Precision:对于所有预测为正的数据中(有预测正确的,也有预测错误的),其中预测正确的比率
  • Recall:对于所有的正样本,其中预测正确的比率
  • F1是精确率和召回率的加权调和平均数,即\(\frac{1}{F_1}=\frac{1}{2}(\frac{1}{P}+\frac{1}{R})\)\(F_1=\frac{2\times P\times R}{P+R}=\frac{2\times TP}{样例总数+TP-TN}\)

A/B 测试 (A/B testing)

  • 一种统计方法,用于将两种或多种技术进行比较,通常是将当前采用的技术与新技术进行比较。A/B 测试不仅旨在确定哪种技术的效果更好,而且还有助于了解相应差异是否具有显著的统计意义。A/B 测试通常是采用一种衡量方式对两种技术进行比较,但也适用于任意有限数量的技术和衡量方式

工具

VScode

  • 在文件内查找:command+f;command+shift+f 跟左上角的放大镜图标功能一样,都是搜工作区

参考资料

posted on 2021-05-10 09:41  锋上磬音  阅读(228)  评论(0编辑  收藏  举报