zoukankan      html  css  js  c++  java
  • 人工智能算法要略

    ==================
    人工智能算法

    Artificial Neural Network 人工神经网络ANN: (有向弧)
    以数学模型模拟神经元活动,是基于模仿大脑神经网络结构和功能而建立的一种信息处理系统。
    人工神经网络有多层和单层之分,每一层包含若干神经元,各神经元之间用带可变权重的有向弧连接,网络通过对已知信息的反复学*训练,通过逐步调整改变神经元连接权重的方法,达到处理信息、模拟输入输出之间关系的目的。它不需要知道输入输出之间的确切关系,不需大量参数,只需要知道引起输出变化的非恒定因素,即非常量性参数, 能进行聚类分析、特征提取、缺损模式复原等模式信息处理工作。
    与传统的数据处理方法相比,神经网络技术在处理模糊数据、随机性数据、非线性数据方面具有明显优势,对规模大、结构复杂、信息不明确的系统尤为适用。
    (1) 高度的并行性
    (2) 高度的非线性全局作用
    (3) 良好的容错性与联想记忆功能

    由Minsley和Papert提出的多层前向神经元网络(也称多层感知器)是目前最为常用的网络结构。
    

    卷积神经网络CNN(过滤器,感受野,反向传播,学*速率)

    CNN 工作概述指的是你挑一张图像,让它历经一系列卷积层、非线性层、池化(下采样(downsampling))层和完全连接层,最终得到输出。
    输出可以是最好地描述了图像内容的一个单独分类或一组分类的概率。
    CNN 的第一层通常是卷积层(Convolutional Layer)。用过滤器/特征标识符(一组数值)和对输入层的数据做卷积扫描,得到新的隐藏层数据。效果是,如果输入层的局部特征与过滤器特征越相符,卷积得到的数值越大。否则越小。从而完成特征扫描提取。它们检测边缘和曲线一类的低级特征。
    输入层→卷积→ReLU修正线性单元→卷积→ReLU→池化→ReLU→卷积→ReLU→池化→完全连接层
    第一层的输入是原始图像,而第二卷积层的输入正是第一层输出的激活映射。寻找更高级别的特征。越深入网络,过滤器的感受野越大,意味着它们能够处理更大范围的原始输入内容(或者说它们可以对更大区域的像素空间产生反应)。

    ReLU(修正线性单元)层
    在每个卷积层之后,通常会立即应用一个非线性层(或激活层)。ReLU 层对输入内容的所有值都应用了函数 f(x) = max(0, x)。这一层把所有的负激活(negative activation)都变为零。它可以在准确度不发生明显改变的情况下把训练速度提高很多(由于计算效率增加)。它同样能帮助减轻梯度消失的问题—由于梯度以指数方式在层中消失,导致网络较底层的训练速度非常慢。会增加模型乃至整个神经网络的非线性特征,而且不会影响卷积层的感受野。

    池化层
    采用了一个过滤器(通常是 2x2 的)和一个同样长度的步幅。然后把它应用到输入内容上,输出过滤器卷积计算的每个子区域中的最大数字。
    一旦我们知道了原始输入(这里会有一个高激活值)中一个特定的特征,它与其它特征的相对位置就比它的绝对位置更重要。
    这一层大幅减小了输入卷的空间维度(长度和宽度改变了,但深度没变)。这到达了两个主要目的。第一个是权重参数的数目减少到了75%,因此降低了计算成本。第二是它可以控制过拟合(overfitting)。

    完全连接层-给每个类一个概率,从而进行分类,概率最大的分到那一类。
    这一层处理输入内容(该输入可能是卷积层、ReLU 层或是池化层的输出)后会输出一个 N 维向量,N 是该程序必须选择的分类数量。这个 N 维向量中的每一数字都代表某一特定类别的概率。

    反向传播
    这里需要通过反向传播的训练来调整过滤器的值或者权重。
    反向传播分为四个部分:前向传导、损失函数、后向传导,以及权重更新,这是一个完整的学*周期,学*速率的设定越快,权重更新幅度越大,更快收敛,但是过高会导致跳动太大,不够准确以致于达不到最优点。

    步幅:过滤器每次移动多少的值,越大,最后生成的结果数组值尺寸小。
    填充:结果图和原图比较,外面部分填充固定值
    选择超参数:多少层,多少卷积层,过滤器尺寸,步幅,填充值等参数选择。
    过拟合:指一个模型与训练样本太过匹配了,以至于用于验证和检测组时无法产生出好的结果。出现过拟合的表现是一个模型在训练集能达到 100% 或 99% 的准确度,而在测试数据上却只有50%。
    Dropout 层:将「丢弃(drop out)」该层中一个随机的激活参数集,即在前向通过(forward pass)中将这些激活参数集设置为 0。此机制将保证神经网络不会对训练样本「过于匹配」,这将帮助缓解过拟合问题。另外,Dropout 层只能在训练中使用,而不能用于测试过程,这是很重要的一点。

    https://www.zhihu.com/question/52668301
    https://www.zhihu.com/question/22553761/answer/126474394

    Multi-Layer Perceptron多层感知器MLP(隐藏层/反向传播BP/梯度下降法/训练检验测试三样本/过拟合)

    属于非参数估计,可以用于解决分类和回归问题
    感知器(Perception):基本的处理元素,它具有输入、输出,每个输入关联一个连接权重(connection weight),然后输出是输入的加权和。 只能解决所谓一阶谓词逻辑问题:与(AND),或(OR)等,而不能解决异或(XOR)等高阶谓词罗辑问题。 将两层感知器按照一定的结构和系数进行组合,第一层感知器实现两个线性分类器,把特征空间分割,而在这两个感知器的输出之上再加一层感知器,就可以实现异或运算。
    多层感知机层与层之间是全连接的(全连接的意思就是:上一层的任何一个神经元与下一层的所有神经元都有连接)。多层感知机最底层是输入层,中间是隐藏层,最后是输出层。 MLP的输入层X其实就是我们的训练数据,所以输入层不用实现,剩下的就是“输入层到隐含层”,“隐含层到输出层”这两部分。上面介绍原理时已经说到了,“输入层到隐含层”就是一个全连接的层,在下面的代码中我们把这一部分定义为HiddenLayer。“隐含层到输出层”就是一个分类器softmax回归(也有人叫逻辑回归 LogisticRegression)
    正向传播其实就是预测过程,就是由输入到输出的过程。 MLP的反向传播过就是对于神经网络的训练过程。在这里,我们训练的是之前各条边上的权值。求解最佳的参数是一个最优化问题,解决最优化问题,最简单的就是梯度下降法了(sgd):首先随机初始化所有参数,然后迭代地训练,不断地计算梯度和更新参数,直到满足某个条件为止(比如误差足够小、迭代次数足够多时)。这个过程涉及到代价函数、规则化(Regularization)、学*速率(learning rate)、梯度计算等。

    误差反向传播(back-propagation,BP)
    训练MLP常用的是向后传播(backpropagation),这主要是因为在我们收敛误差函数的时候,使用链接规则计算梯度:
    BP算法就是通过迭代优化网络的权值使得输出与输入之间的实际映射关系与所期望的映射关系一致,采用梯度下降算法通过调整各层权值求目标函数最小化。网络在某个或所有训练样本上的预测输出和期望输出的误差平方和:

    采用BP神经网络方法建模的首要和前提条件是有足够多典型性好和精度高的样本。而且,为监控训练(学*)过程使之不发生“过拟合”和评价建立的网络模型的性能和泛化能力,必须将收集到的数据随机分成训练样本、检验样本(10%以上)和测试样本(10%以上)3部分。此外,数据分组时还应尽可能考虑样本模式间的平衡。
    BP网络的训练就是通过应用误差反传原理不断调整网络权值使网络模型输出值与已知的训练样本输出值之间的误差平方和达到最小或小于某一期望值。虽然理论上早已经证明:具有1个隐层( 最常用的激活函数Sigmoid转换函数, 激活函数还有tanh和ReLU等函数)的BP网络可实现对任意函数的任意逼*。但遗憾的是,迄今为止还没有构造性结论,即在给定有限个(训练)样本的情况下,如何设计一个合理的BP网络模型并通过向所给的有限个样本的学*(训练)来满意地逼*样本所蕴含的规律(函数关系,不仅仅是使训练样本的误差达到很小)的问题,目前在很大程度上还需要依靠经验知识和设计者的经验。

    support vector machines 支持向量机SVM(超平面/支持向量/核函数)

    将实例的特征向量(以二维为例)映射为空间中的一些点,就是如下图的实心点和空心点,它们属于不同的两类。 在线性不可分的情况下,数据集在空间中对应的向量无法被一个超平面区分开, 利用一个非线性的映射把原数据集中的向量点转化到一个更高维度的空间中, 找一个线性的超平面来根据线性可分的情况处理。
    那么 SVM 的目的就是想要画出一条线,以“最好地”区分这两类点,以至如果以后有了新的点,这条线也能做出很好的分类。
    SVM 将会寻找可以区分两个类别并且能使边际(margin)最大的超平面(hyper plane),即划分超平面 Max Margin Hyperplane,简称 MMH
    边际(margin):某一条线距离它两侧最*的点的距离之和。
    支持向量(support vector)就是刚好贴在边际所在的平面上的点,它们是用来定义边际的,是距离划分超平面最*的点。
    作用: 支持向量因为支撑了边际区域,并且用于建立划分超平面。
    注意: 支持向量可能不止一侧一个,有可能一侧有多个点都贴在边际平面上。
    SVM 算法特性
    训练好的模型的算法复杂度是由支持向量的个数决定的,而不是由数据的维度决定的。所以 SVM 不太容易产生 overfitting。
    SVM 训练出来的模型完全依赖于支持向量,即使训练集里面所有非支持向量的点都被去除,重复训练过程,结果仍然会得到完全一样的模型。
    一个 SVM 如果训练得出的支持向量个数比较少,那么SVM 训练出的模型比较容易被泛化。

    核方法(kernel trick)
    使用核方法的动机
    在线性 SVM 中转化为最优化问题时求解的公式计算都是以内积(dot product)形式出现的,其中 ϕ(X)phi(X)ϕ(X) 是把训练集中的向量点转化到高维的非线性映射函数,因为内积的算法复杂度非常大,所以我们利用核函数来取代计算非线性映射函数的内积。
    h 度多项式核函数(polynomial kernel of degree h):
    高斯径向基核函数(Gaussian radial basis function kernel):
    S 型核函数(Sigmoid function kernel):
    根据先验知识,比如图像分类,通常使用 RBF(高斯径向基核函数),文字不使用 RBF。尝试不同的 kernel,根据结果准确度而定尝试不同的 kernel,根据结果准确度而定。

    以下核函数和非线性映射函数的内积等同,但核函数 K 的运算量要远少于求内积。

    这些球叫做 「data」,把棍子 叫做 「classifier」, 最大间隙trick 叫做「optimization」, 拍桌子叫做「kernelling」, 那张纸叫做「hyperplane」。
    深度学*(2012)出现之前,SVM 被认为机器学*中*十几年来最成功,表现最好的算法

    k-Nearest Neighbor: K最*邻KNN(多分类)

    K最*邻,就是k个最*的邻居的意思,说的是每个样本都可以用它最接*的k个邻*值来代表。
    核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻*的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻*的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

    1. 准备数据,对数据进行预处理。
    2. 选用合适的数据结构存储训练数据和测试元组。
    3. 设定参数,如k。
      4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最*邻训练元组。
    4. 进行遍历,得到距离最小的7个元组,计算优先级队列中k个元组的多数类,并将其作为测试元组的类别。
    5. 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k 值。
      优点:
      1.简单,易于理解,易于实现,无需估计参数
    6. 适合对稀有事件进行分类
      3.特别适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。
      模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
      预测效果好。
      对异常值不敏感

    缺点:
    对内存要求较高,因为该算法存储了所有训练数据
    预测阶段可能很慢
    对不相关的功能和数据规模敏感
    当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最*的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接*目标样本,或者这类样本很靠*目标样本。无论怎样,数量并不能影响运行结果。
    该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最*邻点。
    可理解性差,无法给出像决策树那样的规则。
    当需要使用分类算法,且数据比较大的时候就可以尝试使用KNN算法进行分类了。

    Gaussian Mixture Model:高斯混合模型GMM

    GMM,高斯混合模型,也可以简写为MOG。高斯模型就是用高斯概率密度函数(正态分布曲线)精确地量化事物,将一个事物分解为若干的基于高斯概率密度函数(正态分布曲线)形成的模型。
    正态分布的一个背景知识点是,95%的数据分布在均值周围2个标准差的范围内
    混合高斯模型使用K(基本为3到5个)个高斯模型来表征图像中各个像素点的特征,在新一帧图像获得后更新混合高斯模型, 用当前图像中的每个像素点与混合高斯模型匹配,如果成功则判定该点为背景点, 否则为前景点。 通观整个高斯模型,主要是有方差和均值两个参数决定,对均值和方差的学*,采取不同的学*机制,将直接影响到模型的稳定性、精确性和收敛性 。
    这里插一句,为什么是“高斯混合模型”,而不是别的混合模型,因为从中心极限定理知,只要K足够大,模型足够复杂,样本量足够多,每一块小区域就可以用高斯分布描述。而且高斯函数具有良好的计算性能,所GMM被广泛地应用。

    由于我们是对运动目标的背景提取建模,因此需要对高斯模型中方差和均值两个参数实时更新。为提高模型的学*能力,改进方法对均值和方差的更新采用不同的学*率;为提高在繁忙的场景下,大而慢的运动目标的检测效果,引入权值均值的概念,建立背景图像并实时更新,然后结合权值、权值均值和背景图像对像素点进行前景和背景的分类。
    高斯分布的形状同绝大多数数据的分布形状相似,能够很好地刻画参数空间中数据的空间分布及其特性,而且高斯密度函数具有易于进行参数估计等优点,因此高斯混合模型广泛应用于模式识别和数据分析等领域
    GMMs已经在数值逼*、语音识别、图像分类、图像去噪、图像重构、故障诊断、视频分析、邮件过滤、密度估计、目标识别与跟踪等领域取得了良好的效果

    1、为图像的每个像素点指定一个初始的均值、标准差以及权重。
    2、收集N(一般取200以上,否则很难得到像样的结果)帧图像利用在线EM算法得到每个像素点的均值、标准差以及权重)。
    3、从N+1帧开始检测,检测的方法:
    对每个像素点:
    1)将所有的高斯核按照 ω / σ 降序排序
    2)选择满足公式的前M个高斯核:M = arg min(ω / σ > T)
    3)如果当前像素点的像素值在中有一个满足:就可以认为其为背景点。
    4、 更新背景图像,用在线EM算法。
    EM (Expectation Maximization)算法是由Dempster、Laind和Rubin在1977年提出的一种求参数的极大似然估计方法,可以广泛地应用于处理缺损数据、截尾数据等带有噪声的不完整数据。针对不完整数据集,EM算法主要应用于以下两种情况的参数估计:第一,由于观测过程中本身的错误或局限性导致的观测数据自身不完整;第二,数据没有缺失,但是无法得到似然函数的解析解,或似然函数过于复杂,难以直接优化分析,而引入额外的缺失参数能使得简化后的似然函数便于参数估计。


    看了感觉怎么样?来说说吧。。。
    喜欢记得关注起来!赶紧的。


  • 相关阅读:
    php实现中文反转字符串的方法
    冒泡排序
    mac 安装ngnix
    二维数组排序可以用php内置函数
    mysql 利用explain 优化
    Jquery Datatable
    SSL证书(HTTPS)背后的加密算法
    HTTPS的误解(二)
    HTTPS的误解(一)
    电子商务信息安全与信任解决方案
  • 原文地址:https://www.cnblogs.com/eyesonchip/p/13698186.html
Copyright © 2011-2022 走看看