其他分享
首页 > 其他分享> > 机器学习(四)

机器学习(四)

作者:互联网

神经网络一种好得多的算法

在复杂的非线性假设上被证明是好得多的算法,n很大也可以解决

神经网络的起源是人们想尝试设计出模仿大脑的算法

神经重接试验:如果一块脑组织可以处理光,声或者触觉信号,也许存在一种学习算法,可以同时处理视觉听觉和触觉

神经网络模仿大脑中的神经元或者神经网络

神经元有细胞体,有树突这样的很多的输入通道接受来自其他神经元的信息,还有一个输出通道轴突用来给其他神经元传到信息

x0==1有时被称作偏置单元或者偏置神经元(有时在神经元中画出,有时不画出)

 

 

神经网络其实是一组神经元连接在一起的集合

 

 

下面的x1,x2,x3,x0属于是输入层(树突,在这一层输入特征);a0a1a2a3是神经元(a0==1)隐藏层,它的值在训练集中是看不到的;最后一层的神经元是输出层(最终结果)。任何非输入层和输出层的都叫做隐藏层

 

 

 ai(j)表示的是在第j层的第i个元素是一个激活项

激活项就是有一个具体的神经元计算并输出的值

神经网络被矩阵参数化θ^j就是权重矩阵,控制从某一层的映射,从j到j+1

θ上标是层级,下标是特性连接相连逻辑单元的组合

如果在第j层有sj个元素,在第j+1层有s(j+1)个元素,那么θj就会有的维度是s(j+1)*(sj+1),上一层要加上一个常量的输入,现在这里是没有x0的

 在这里x0和a0两个偏置单元都存在,只是没有画上,通过式子的形式将前面的等式表示出,来,a和z都是三维向量,这里的z(2)=θ(1)x里的x可以用α(1)来代替,所以以此类推,这里的z(3)=θ(2)α(2)

计算h(x)的过程叫做前向传播,依次计算激活项,从输入项到隐藏层再到输出层

 

 

神经网络计算复杂非线性函数的输入

 

 

 XOR异或  XNOR同或,也就是当这些正样本同时为真或者同时为假时,y=1;只有一个为真,y=0。

我们要拟合一个符合XOR的神经网络,

 这个的-30,20,10都是参数的权重也就是x钱看的系数,+1代表偏置单元也就是1

这里的-30是θ10(1)  ,20是θ11(1) ,10是θ12(1)123

第二幅图是g(z)是一个激活函数,这里的h(x)的值求出来的可以看出来是一个关于逻辑与的结果  

 

 

 在AND NOT OR的组合下,可以实现上图所示的当x1和x2相同输出1,不同输出0,实现同或的逻辑运算

 

 

 

 

 

代价函数

主要是神经网络在分类问题中的应用

 

 

 L表示的是神经网络结构的总层数

s_L表示第L层的单元数,神经元的数量,但是这个里面并不包括偏置单元

 

 

 二元分类的话只需要输出一个就可以,K可以表示输出个数

当时多元分类问题时,如上上图所示,最后的输出是四个,那么就是k维向量

为神经网络定义代价函数

在神经网络中定义的代价函数是逻辑回归中使用的代价函数的一般形式,对于逻辑回归而言,我们需要使代价函数J最小化,要加上额外的正则项

h(x)i表示第i个输出,h(x)是一个k维向量,下标i表示选择输出神经网络输出向量中的第i个元素,第二项的正则项是对这些项θji(l)求和,并且不对θji(l)中i为0的项求和这些相当于偏置单元我们在正则项中是不会加入偏置单元的

 

 

 

 

反向传播算法(让神经网络代价函数最小化的算法)

代价函数最小化J(θ),就是找到一个合适的θ使得代价函数最小

首先利用前向传播的方法,计算在给定输入的时候,假设哈数是否会真的输出结果

 

 

 可以计算神经网络中每一个神经元的激活值,g(z)是激活函数

为了计算导数采用反向传播的算法,δj(l)下标j上标l代表的是第l层第j个节点的误差,aj(l)下标j上标l代表的是第l层第j个元素的激活值,δ是这个点激活值的误差

 

 

 把这三个都看做是向量,其中向量的维数是输出单元的数目

δ(4)=a(4)-y

计算网络中前面几层的误差项δ,点乘.*

第三层的误差是链式求导法则求出来的一文弄懂神经网络中的反向传播法——BackPropagation - Charlotte77 - 博客园 (cnblogs.com)这个里面有详细信息

 

 

 这里的△是大写的δ,用来计算关于θij(l)的J(θ)的偏导数

 

 

 

 

 

 

 

 

 

 首先要做的是设定a(1)输入层的激活函数=x(i),x(i)是我们第i个训练样本的输入值

,接下来运用正向传播,计算第二层的激活值,然后是第三层,第四层,直到最后一层

,利用样本的输出值y(i),计算输出值所对应的误差项δ(L),接下来利用反向传播计算δ(L-1),δ(L-2),一直到δ(2),没有δ(1),用△积累我们在前面写好的偏导数项,最后跳出循环,计算出来的D就是代价函数关于每一个参数的偏导数

 

前向传播的过程

 

 

 反向传播,从右向左计算(20条消息) 吴恩达机器学习(五)神经网络 2/2 —— 反向传播算法(BP-神经网络)_Fun'的博客-CSDN博客

 

 

 

 

把参数从矩阵展开成向量

thetaVec是取出Theta中的所有元素,然后全部展开为一个很长的向量也就是thetaVec

DVec是展开所有的矩阵合成一个新的

如果你想要从合成的中获取第一个元素的话,可以根据元素的个数,第一个矩阵就是前110个元素

 

 

 

梯度检验

在反向传播和优化算法一起运行时会出现一些bug,但是运行结果看起来会不错,但最后的结果的误差会高出一个量级

 

 下面有2的是双侧差分更准确

 

 这些等式可以让你从数值上估计代价函数J所关于的任何参数的偏导数

计算求出的片导师是否近似与反向传播所计算出的导数DVec

 

参数θ的初始化

如果将θ的初始化为0,那么会使从第一层到第二层的权重都为0,这样会导致a1(2)=a2(2),这样的情况下即使通过梯度下降法进行了迭代,但这两个隐藏单元依然以相同的函数作为输入来计算,高度冗余,只能得到一个特征。

再这样的情况下,我们就可以使用实际初始化来解决对称权重问题,我们将每一个θ初始化在一个范围在-ε到ε之间的随机值

 

 这里的rand(10,11)是一个10*11的随机矩阵,矩阵中的值都介于0到1之间,是0到1的连续值,这些数字会与2ε相乘再减去ε,最后得到一个在-ε到ε之间的数,这里的ε与梯度检验使用的ε没有任何关系,区分开,这里进行初始化的其实也就是权重

 

总体回顾

    在训练一个神经网络时,我们要做的第一件事就是选择一种网络架构(神经元之间的连接模式),定义特征集x的维度就是输入单元的数量,如果进行的是多类别分类,那么输出层的单元数目由分类问题中要区分的类别个数确定,而是输出的y如果是5的话是用一个列向量【0,0,0,0,1,0,0.。。0】^T表示的。对于隐藏层单元的数目和层数,合理的默认项是只使用单个隐藏层,如果使用多个隐藏层,那么多个隐藏层的每层的个数可以一致与输入的特征向量的维数相同或者是两倍或是三四倍

 

       神经网络需要实现的步骤

 

 2.执行前向传播算法,对输入x(i)获取输出h(xi)

3.通过代码计算出代价函数J(θ)

4.执行反向传播算法,算出这些偏导数项,使用反向传播,我们要对所有训练样本使用一个for循环进行遍历,对第一个样本进行前向传播和反向传播运算,在第二次循环中对第二个样本执行前向传播和反向传播,并计算△的值(用每个节点输入每个样本之后产生的误差总和,计算最终结果的代价总和的偏导数)

 

 5.使用梯度检测比较已经计算得到的偏导数项把用反向传播算法得到的偏导数值与用数值方法得到的估计值进行比较(确保反向传播得到的数据是正确的)

6使用最优化算法(如梯度下降法),将优化算法与反向传播算法相结合,最小化代价函数

 

 

在开发一个机器学习系统或者改进一个机器学习系统的性能,决定接下来应该选择·哪一条道路 

我们有时优化这个算法的时候可能是需要更多的特征向量,也可能是在这些特征中选择一些更加符合的特征,但是不能凭感觉去决定,有一种简单地方法可以排除很多不必要的选项

 

  机器学习诊断法(测试方法)

    评估假设:将数据分为两部分,第一部分将成为我们的训练集,第二部分将成为我们的测试集,其中一种典型的分割方法是按照7:3的比例进行分割,其中第二部分的下标表示训练集来自测试样本,如果这组数据有某种规则或顺序的话,需要进行随机选择70%和训练集和30%的测试集

 

     首先需要对训练集进行学习得到参数θ,也就是最小化训练误差J(θ),J是通过训练集得到的,接下来得到测试误差J(θ)test,把从训练集中学习得到的参数θ放到J(θ)test中计算测试误差

 

 这里的式子是使用线性回归和品方法误差时测试误差的定义

 

 这里是多分类的逻辑回归问题的测试误差

 

 这里是使用0/1错误分类度量来定义的测试误差

 

    模型选择和训练、验证、测试集

    选择一个合适的模型。合适的多项式的次数,拟合这个模型并且估计这个拟合好的模型假设对新样本的泛化能力。我们的做法就是首先选择第一个模型,然后最小化训练误差,这样就会得到一个参数向量θ,然后再选择第二个模型,得到另一个参数向量θ,从中选择有最小的测试误差的模型,再看模型的泛化能力如何,但是如果分为两个部分,因为用了测试集来选择了多项式的次数,那么我们就不能再根据这个测试集来测试这个模型的泛化能力,那么我们可以进行的修改是进行三次分割,分别为训练集和交叉验证(或验证集)以及测试集,那么分配比例是6:2:2,

 

 这里分别是训练集交叉验证以及测试集的误差计算,交叉验证来寻找合适的多项式的次数,最后通过测试集来验证泛化误差

 

 如果是欠拟合(高偏差)的交叉验证误差和训练误差都会很大

如果是过拟合(高方差)的训练误差会很小但是交叉验证误差会很大远远大于训练误差

 

算法正则化可以有效地防止过拟合,正则化与算法的偏差和方差的关系

  

 

 入过大,对参数θ的惩罚过大就会产生欠拟合,出现高偏差,当入过小的时候就会出现过,拟合的现象要正确的选取入的值

 

 下面的三个式子在代价函数中已有正则项的情况下,表示的是平均的平方和误差,那么选取合适的入的值得方法是选取一系列想要尝试的入的值,首先考虑不使用正则化,将步长以两倍速增长,选取入的值最小化J(θ)得到θ1,以此类推

 

 用所有这些假设所有这些参数用交叉验证集评价他们,计算每一个θ在交叉验证集上的平均的误差平方和选取交叉误差最小的哪一个模型作为最终的选择

 

 

 

使用学习曲线来判断某一个学习算法是否处于偏差方差问题或者二者都有

Jtrain(θ)训练集的平均误差平方和

Jcv(θ)交叉验证集的平均误差平方和

m是训练集总数

使用二次函数进行拟合时,当训练样本容量m很小时,训练误差也会很小,很容易进行拟合,但是随着样本的数量越来越大,训练误差也会随着增大,并不能对所有的样本数据都进行很好的拟合

交叉验证集误差,当训练集很小的时候泛化程度不会很好,当训练集很大的时候交叉验证误差就会很小,因为泛化程度会很好

 

 当h(x)=θ0+θ1x时,是一条斜线,交叉误差一开始因为样本很少,所以误差很大,随着样本数量的增多交叉误差会逐渐降低,直到找到一个最合适的斜线,但是这个斜线毕竟无法很好的对数据进行拟合所以误差是很大的,且训练误差会随着样本数量的增多而组件增大,直到和交叉误差逐渐接近

 如果一个学习算法有高偏差,随着我们增加训练样本,会发现交叉验证误差不会明显下降,基本变成平的,如果学习算法正处于高偏差的情形,选用更多的训练集数据对于改善算法无益,这样的话如果你发现你处于高偏差的时候就不要浪费时间在收集训练集上

 

 

当算法出现高方差的时候,训练误差和交叉验证误差之间有一段很大的差距

如果继续增加训练样本,那么样本误差将会慢慢增大,而交叉验证误差将会慢慢减小,这说明增大样本的数量,对算法的改进是有帮助的,如果你知道现在是处于高方差的话,那么有必要花时间在增加更多的训练集数据上面

 

 所以当我们改进一个算法的时候,就可以进行这一项工作,画出这些学习曲线,可以更好的判断偏差或者方差的问题

 

到底如何判断哪些方法有效

1.收集更多的训练集数据(对于解决高方差问题是有帮助的,这样的情况下我们需要提前画一下曲线)

2.减少特征项(同样是对高方差是有效的)

增加特征项(对高偏差有效)

增大入参数值(修正高方差)

减少入参数(修正高偏差)

使用大型神经网络会出现过拟合的现象,但是这样加上正则项修正就会比小型的神经网络效果更好一些

标签:误差,机器,训练,算法,传播,学习,神经网络,拟合
来源: https://www.cnblogs.com/xxsadd/p/16663648.html