机器学习基础之模型评估(四)
标题:
损失函数与风险
正则化
这次,我们来介绍一下机器学习模型中常用到的一种对付模型过拟合问题的方法,也是许多模型常用的优化模型的一个方法:正则化。
正则化是一个典型的用于选择模型的方法。它是结构风险最小化策略的实现,是在经验风险上加一个正则化项或罚项。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。
要了解正则化具体是做啥的,我们还得从讨论结构风险最小化开始。下面,我们就来讲讲损失函数与风险。
损失函数与风险
什么是结构风险?我们可以将它看作为是对经验风险的一个优化。经验风险又是啥呢?事实上,在线性回归一章中我们就是通过减少经验风险来实现线性回归模型的。
我们知道,我们之前所讲过的学习模型不论是线性回归是建立在以“误差”最小化为目的的基础上的,而这里的“误差”其实与我们一般所讲的误差是有区别的,将模型应用到测试集中,测试结果与实际情况的误差才是我们通常认为的“误差”,这种误差我们通常称做一般误差,亦被称为期望风险。而我们用于建立模型的,以最小化模型在训练集中的“误差”为目的的算法中的那个“误差”,便是我们所说的经验误差,对应于期望风险,它又被称作经验风险。而用于表示经验风险(也可称经验损失)的函数:
便与我们曾经介绍过的“成本函数”很相似,例如:
另外,计算误差所用的成本函数也可以被称为损失函数,损失函数中常用的形式,除了我们上一章介绍过的均方损失函数(或称平方损失函数)之外,还有:
你可能会想三者似乎没有什么区别,事实上成本函数和损失函数确实没有什么区别。但我们在线性回归中用的J(θ)严格来讲仅仅是一个用于衡量经验误差大小的函数,它与现在我们所讨论的损失函数有一点点区别就是它可以为了方便计算而做出一些修改,也就是说只要它适合我们用于建立模型即可,而目的并不是严格计算出经验风险。
有这么一层理解,我们就可以知道经验风险函数与成本函数的区别了,成本函数仅是为了方便计算而用于表示风险的一个计算式,经验风险函数Remp则更偏向于严格衡量模型的经验风险。也正因此,极大似然估计也可以看作是经验风险最小化的一个策略。
那么,结构化风险又是什么呢?如我们前面所说,一般来说,我们建立模型的基准都是通过最小化经验风险,但经验风险并不代表期望风险,也即测试集中的误差和训练集中的误差是有区别的,这就意味着,当经验风险真的最小化的时候,就会出现过拟合的现象,模型完美贴近训练集,但在测试集中往往会表现不佳。为了避免这一情况出现,也即防止过拟合出现,就有了结构风险最小化,而这个策略,事实上就等价于正则化,下面我们再来讲讲正则化。
正则化
回到正则化,首先,我们知道,结构风险就是在经验风险上加上表示模型复杂度的正则化项或罚项,在假设空间,损失函数以及训练数据集确定的情况下,结构风险的定义是:
前面一项就是我们才介绍过的经验风险,而后一项中的J(f)就表示模型的复杂度,它是定义在假设空间F上的泛函(通常是指一种定义域为函数,而值域为实数的“函数”。换句话说,就是从函数组成的一个向量空间到实数的一个映射。也就是说它的输入为函数,而输出为实数,来自维基百科),模型f越复杂,复杂度J(f)就越大;反之,模型越简单,复杂度J(f)就越小。也就是说,复杂度表示了对复杂模型的惩罚。λ≥是系数,用以权衡经验风险和模型复杂度。结构风险小的模型往往对训练数据以及位置的测试数据都有较好的预测。
贝叶斯估计中的最大化后验概率估计(我们在这章结束后会讨论一点关于朴素贝叶斯分类器的内容,如果这里不了解可以暂时不予理会)就是结构风险最小化的一个例子。当模型是条件概率分布、损失函数是对数损失函数、模型复杂度由模型的先验概率表示时,结构风险最小化就等价于最大化后验概率估计。
因此,结构风险最小化策略就是使结构风险最小化的求解最优化问题的模型:
注意:这个公式同时也是正则化的一般形式。λJ(f)我们就称之为正则化项。
正则化项可以取不同的形式。例如,回归问题中,损失函数是平方损失,正则化项就可以是参数向量的L2范数:
注意:这里w表示参数向量的L2范数:
正则化项也可以是参数向量的L1范数:
其中w1表示参数向量w的L1范数。
这时候,如果第1项的经验的经验风险较小,模型就有可能比较复杂(有多个非零参数),这时第2项的模型复杂度就会较大。正则化的作用就是选择经验风险与模型复杂度同时较小的模型。
L0范数因为优化困难,不常用;L2范数优化简单,因为它假设参数服从了高斯分布,利于防止过拟合;L1范数优化稍复杂一些(一个常用的方法是LASSO),它假设参数服从双指数分布,可以增强得到的问题的解的稀疏性(具体的关于范数应该怎样选取,以及选取之后如何实现问题的优化,会在以后的相关内容中介绍,因为根据目前的文章进度尚不适合在此介绍,不过感兴趣的读者可以自行查阅。)
正则化比较符合我们曾提到过的奥卡姆剃刀原理,它应用于模型选择时变为以下想法:能够很好的解释已知数据,并且在所有可以选择的模型中十分简单的模型,才是好模型。
从贝叶斯估计的角度来看,正则化项对应于模型的先验概率,可以假设复杂的模型有较小的先验概率,简单的模型有较大的先验概率。
资料参考来源:
周志华著.机器学习, 清华大学出版社
李航著.统计学习方法, 清华大学出版社
维基百科. 泛函
- Leetcode-Easy 121. Best Time to Buy and Sell Stock
- MongoDB初识
- Python的md5和sha1加密
- LinkedHashSet 源码分析
- Day2下午解题报告
- python获取打开网站的状态码
- 【关关的刷题日记57】Leetcode 101. Symmetric Tree
- FreeBuf官网发布《简易Python Selenium爬虫实现歌曲免费下载》
- HashSet 源码分析
- Angular开发实践(五):深入解析变化监测
- 【关关的刷题日记58】Leetcode 112 Path Sum
- 学大伟业Day解题报告
- Python数据增强(data augmentation)库--Augmentor 使用介绍
- Leetcode-Easy 101. Symmetric Tree
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TensorFlow2.X学习笔记(4)--TensorFlow低阶API之AutoGraph相关研究
- TensorFlow2.X学习笔记(3)--TensorFlow低阶API之张量
- TensorFlow2.X学习笔记(2)--TensorFlow的层次结构介绍
- 深入浅出 Vue 中的 key 值
- TensorFlow2.X学习笔记(1)--TensorFlow核心概念
- 【项目实战】ODS 层创建&数据接入
- webpack3 升级到 webpack4 小记
- BigData-Apache HBase数据库
- Tungsten Fabric知识库丨这里有18个TF补丁程序,建议收藏
- BigData-消息队列框架Apache Kafka入门、原理解析
- BigData--Apache Flume框架
- 【项目实战】DWS 层创建&数据接入
- BigData--Hive数据仓库工具
- 读书笔记——《深入浅出 Webpack》( 送 XMind导图和电子书)
- BigData--MapReduce进阶(二)之工作机制