深层神经网络参数调优(一) ——方差、偏差与正则化

深层神经网络参数调优(一)——方差、偏差与正则化

(原创内容,转载请注明来源,谢谢)

一、概述

现在来到ng【深层神经网络参数调优】专题的学习,这部分主要是对深度学习过程中,需要涉及到的参数、超参数的调优的方法与技巧。

二、样本集的使用

1、三个集

在深度学习中,为了检验算法的效果,通常会设置训练集、验证集和测试集。

训练集用来训练分类器,得到最低代价函数情况下,各层网络对应的w、b。

验证集用来调试的,目的是为了获得最优的超参数,如学习速率α、正则化因子λ等。

测试集用来验证训练集得到的结果,确认错误率、召回率、查准率都在正常水平。

2、样本集使用

通常,如果数据量不大(如万级别),一般来说,分成三个集的比例训练:验证:测试 = 6:2:2。

当数据量非常大的时候(如百万以上),则并不需要那么多的数据进行验证和测试,反而会大量的进行训练,有可能会到99.5:0.25:0.25。

3、数据源

有时候,测试需要在app之类的地方,而这类地方不容易拿到大量数据,会造成训练和测试的数据源不同。这种情况下,至少需要保证测试和验证集是同一个数据源。

三、方差与偏差

1、直观判断

以下图为例,蓝线是拟合出来的分类线,左边高偏差/欠拟合,中间正常,右边高方差/过拟合。

高偏差表示拟合程度不够,会导致训练误差很大;高方差表示训练集过拟合,但是这样会导致验证集无法正常拟合。

2、判别方差和偏差

当测试集的测试结果,不满足情况,就需要判断是过拟合还是欠拟合引起的。首先,假设给定的最终结果的错误率是0%,即所有样本给出的分类结果都是正确的。这个样本分类结果的错误率,称为贝叶斯错误率。下面考虑几种情况:

1)高方差过拟合

当训练集错误率很低,如1%,而验证集错误率比训练集的错误率高得多,如11%,则此时样本很好的被训练,但是过度训练,导致无法很好的对验证集进行判别,此时就成为过拟合。

2)高偏差欠拟合

当训练集错误率较高(这里的较高是相对于贝叶斯错误率),如15%,而验证集错误率和训练集差不多,如16%,则可以看出此时欠拟合,训练集都没有被拟合好。

3)高方差+高偏差

当计算出的错误率,训练集的比贝叶斯错误率高得多(高偏差),验证集的比训练集的还要高得多(高方差),则此时既高方差,又高偏差,如下图所示:

4)正常情况

训练集、验证集错误率相近,且都和贝叶斯错误率相近。

3、调试过程

1)当完成一个模型后,首先会计算训练集的错误率,以判断是否存在高偏差。如果是,则通常会加大神经网络的深度、神经元数量等,再次验证,直到没有了高偏差。

2)没有高偏差后,会计算验证集的错误率,以判断是否存在高方差。如果是,则会拿更多的数据参与训练,或者调整正则化参数,并且重新回到第一步,验证偏差。

3)通常方差和偏差存在一个均衡,很可能一个调整降低了另一个就升高了。但是通常深层的神经网络,可以同时降低两者。

四、正则化

1、概述

正则化,即在代价函数的公式,后面加上一个式子,是对w的计算,目的是为了解决过拟合。正则化通常分为两种——L1正则化和L2正则化,区别在于||w||是否平方。L2用的更频繁。

另外,由于b只是一组数,而w是一个矩阵,印象更大,因此通常正则化项不用考虑b。

2、梯度下降

正则化项加入代价函数后,也要参与梯度下降的计算,经过计算dJ/dw,可以看出加入正则化项后,这个值变大了。即后面调参的时候w=w-αdw的值更小了,因此正则化项的加入,也被称为权重衰减。

3、正则化解决过拟合的原因

1)直观了解

当正则化项的值比较大,而我们对代价函数的优化是让其尽量小,因此也就导致w的值会普遍减小,影响力会逐渐降低,让式子趋于线性。且每层神经元的影响,会被调整成1个神经元的影响,相当于深层单神经元的网络。当λ太大,还有可能出现欠拟合的情况。

2)数学推导

从前面的说明中,已知λ增大会导致正则化的值增大,进而导致w减小。而根据z的计算公式,z=wx+b,w减少会造成z减少。假设激活函数是tanh,则其图像在z很小时,是一个近似线性的图像,即结果趋于线性。

五、总结

本文主要是讨论样本的使用与正则化项,这些是在实际进行深度学习较为实用的内容。

另:已经开通博客园,方便我自己随时复习,朋友们如果想更方便的看历史文章,也欢迎到博客园 http://www.cnblogs.com/linhxx ,不过我比较懒。。两边一起编辑真的好麻烦,我主要还是会在这边发文章,然后阶段性的把文章同步过去。

——written by linhxx 2018.02.04

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2018-02-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

422
来自专栏ml

朴素贝叶斯分类器(离散型)算法实现(一)

1. 贝叶斯定理:        (1)   P(A^B) = P(A|B)P(B) = P(B|A)P(A)   由(1)得    P(A|B) = P(B|...

3437
来自专栏赵俊的Java专栏

从源码上分析 ArrayList

1171
来自专栏后端之路

LinkedList源码解读

List中除了ArrayList我们最常用的就是LinkedList了。 LInkedList与ArrayList的最大区别在于元素的插入效率和随机访问效率 ...

19510
来自专栏项勇

笔记68 | 切换fragmengt的replace和add方法笔记

1444
来自专栏Hongten

ArrayList VS Vector(ArrayList和Vector的区别)_面试的时候经常出现

1692
来自专栏计算机视觉与深度学习基础

Leetcode 114 Flatten Binary Tree to Linked List

Given a binary tree, flatten it to a linked list in-place. For example, Given...

1938
来自专栏xingoo, 一个梦想做发明家的程序员

20120918-向量实现《数据结构与算法分析》

#include <iostream> #include <list> #include <string> #include <vector> #include...

1716
来自专栏java闲聊

JDK1.8 ArrayList 源码解析

当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造

1192
来自专栏聊聊技术

原 初学图论-Kahn拓扑排序算法(Kah

2878

扫码关注云+社区