多层神经网络的线性与拟合问题

是否线性问题

  • 线性可分 可以用直线分割的方式解决问题,可以说这个问题是线性可分的
  • 非线性问题 非线性问题就是直线分不开的问题。可以利用高维扩展将非线性问题转化为线性问题。

拟合问题

  • 欠拟合定义:没有拟合到想要得到的真实数据情况
  • 欠拟合原因:欠拟合的原因并不是因为模型不行,而是我们的学习方法无法更精准的学习到适合的模型参数。模型越薄弱,对训练的要求就越高。但是可以采用增加节点或者增加层的方式,让模型具有更高的拟合性,从而降低模型的训练难度。
  • 过拟合定义:测试时的loss比训练时显著提高。
  • 避免过拟合的方法:early stopping;数据集扩增;正则化;dropout;
  • early stopping:在发生过拟合之前提前结束训练。理论上是可以的,但这个点不好把握。
  • 数据集扩增:就是让模型见到更多的情况,可以最大化的满足全样本,但实际应用中对未来事件的预测却显得鞭长莫及。
  • 正则化:就是通过引入范数的概念,增强模型的泛化能力,包括L1、L2
  • dropout:是网络模型的一种方法,每次训练时舍去一些节点来增强泛化能力。

正则化

什么是正则化?

所谓的正则化,就是在神经网络计算损失值的过程中,在损失后面再加一项。这样损失值所代表的输出与标准结果间的误差就会受到干扰,导致学习参数w和b无法按照目标方向来调整,实现模型无法与样本完全拟合的结果,从而达到防止过拟合的效果。

如何添加干扰项呢?

干扰项一定有这样的特性。

  • 当表现为欠拟合时,希望它对模型误差的影响越小越好,以便让模型快速拟合实际。
  • 如果为过拟合时,希望它对模型误差的影响越大越好,以便让模型不要产生过拟合的情况。

由此引入了两个范数L1和L2。

  • L1:所有学习参数w的绝对值之和。
  • L2:所有学习参数w的平方和然后求平方根。

tensorflow中有封装好的L2正则化函数tf.nn.l2_loss(w),L1的正则化函数目前没有现成的,可以组合为:

tf.reduce_sum(tf.abs(w))

添加正则化处理:()

reg = 0.01
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=pred)) + tf.nn.l2_loss(W) * reg

dropout——训练过程中,将部分神经元暂时丢弃

dropout原理

在训练过程中,每次随机选择一部分节点不去“学习”。

因为在样本数据的分析来看,数据本身不可能很纯净,即任何一个模型不能百分之百把数据完全分开,在某一类中一定会有一些异常数据,过拟合的问题恰恰是把这些异常数据当成规律来学习了。对于模型来讲,我们希望它能有一定的智商,把异常数据过滤掉,只关心有用的规律数据。

异常数据的特点是,它与主流样本中的规律都不同,但是量非常少,相当于在一个样本中出现的概率比主流数据出现的概率低很多。我们就是利用这个特性,通过在每次模型中忽略一些节点的数据学习,将小概率的异常数据获得学习的机会降低,这样这些异常数据对模型的影响就会更小了。

tips:由于dropout让一部分节点不去学习,所以在增加模型泛化能力的同时,会使学习速度降低,使模型不太容易学成,所以在使用的过程中需要合理的调节到底丢弃多少节点,并不是丢弃的节点越多越好。

函数原型

dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
  • x:输入的模型节点
  • keep_prob:保持率,如果为1,代表全部进行学习,如果为0.8,代表丢弃0.2的节点,让0.8的节点参与学习。
  • noise_shape:代表模型x中,哪些维度可以使用dropout,为None时,表示所有维度都使用,也可以将某个维度标志为1,代表该维度使用。如x的shape为[n, len, w, ch],使用noise_shape为[n, 1, 1, ch]表明对第二第三维度len和w使用。
  • seed:随机选取节点的过程中随机数的种子值。

tip:dropout改变了神经网络的网络结构,它仅仅是属于训练时的方法,所以一般在进行测试时要将dropout的keep_prob变为1,代表不需要进行丢弃,否则会影响模型的正常输出。

发布了267 篇原创文章 · 获赞 51 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/AcSuccess/article/details/89457339