深度学习中损失函数之RMS和MES
学校给我们一人赞助了100美元购买英文原版图书,几方打听后选择了PRML 即Pattern Recognition and Machine Learning。自从拆封这本书开始慢慢的品读,经常会有相见恨晚之感。虽然目前我只是慢慢地阅读了前几个小节,也知道后面的章节会越来越晦涩,但是还是下定决心一定要把这本书弄透彻。这篇文章是在阅读引章:曲线拟合时发现的问题。想记录下来学到的两个点,并对一道课后习题作解析。
第一节是曲线拟合,曲线拟合是深度学习问题中的regression问题,即回归问题。其他的问题据我了解还有classification问题,即分类问题和clustering问题,即聚类问题。regression问题很显然是一个有监督学习。给你一系列点x,再给你一系列这些点对应的target,我们的目标是找到一个函数使得target和我们预测的x之间的误差最小。
在这一节是以一个正弦函数为例,给出正弦曲线上加上了随机误差的一系列点。我们选择多项式拟合polynomial fitting:$$y(x,\textbf{w})=w_0+w_{1}x+w_{2}x^{2}+\cdots+w_{M}x^{M}=\sum_{j=0}^M w_j x^j$$
现在我们要解决的问题有三个:
1.什么叫误差?既然我们的目标是让误差最小,那么误差函数error function(或者是loss function?)应该长什么样?
2.有了误差函数,怎么样确定多项式的系数coefficients来使得误差函数最小。
3.多项式的次数order应该怎么选择?
下面一一进行解答:
1.首先我们选用了一类简单而且广泛被使用的error function--SSE,即和方差。我们的目标是最小化以下的目标error function(SSE):$$E(\textbf{w})=\frac{1}{2} \sum_{n=1}^{N} \left\{y(x_n ,\textbf{w})-t_n \right\}^2$$从直观上可以看到,这个损失函数是正定的,而且它的值越小,预测值和target值间的差距就越小,相应的,拟合效果就越好。其中$\frac{1}{2}$是为了方便计算,还可以选为其他值。我们的问题转化为了最小化误差函数。
2.已经交代过,我们采用多项式拟合,那么模型的参数就是多项式的系数$w_{0}~w_{M}$。怎样确定模型参数使得error function最小呢?这里的解法很特殊。我们使用的是最小平方误差,那么对误差函数关于多项式系数进行求导,得到的结果将是关于系数$\textbf{w}$的线性函数(我有一个理解,其实就是让loss对w向量求梯度,是不是呢?以后应该能回答)。为了求取极小值,在这里我们是可以让这个导数为$\textbf{0}$,从而获得解析形式的解$w^{*}$,(这里和之前模式识别课上学的那个什么伪逆解是不是有些关系?也是解析解)。具体细节在PRML中体现在课后习题,在后面讲。
3.现在我们能够对一个给定次数的多项式求出使error function最小的参数了,还没有解决的问题是,多项式的order应该如何选择?将这个问题推广就变成了一个模型选择的问题,使用更高次数的多项式一定能对样本点进行最好的拟合,进而获得最佳的泛化性能吗?下面的的几张图能够说明问题。
我们看到,当M比较小时,拟合效果很差,随着M增加(如M=3),能够进行较好的拟合。但是当M达到9时,因为对十个样本点,9次多项式能够唯一确定。拟合曲线却在样本点之间发生了剧烈的振荡,不能够获得很好的泛化性能。原因是出现了over-fitting过拟合。此时的曲线对随机的噪声非常敏感,且不具有任何的灵活性。当样本点增加后,这种过拟合现象得到了极大的缓解。此时为了让不同大小的数据集产生的误差函数的有相同的比例和单位。我们选用RMS error function:$$E_{RMS} = \sqrt{2E(\textbf{w* })/N}$$
深度学习中损失函数之RMS和MES的更多相关文章
- 【转载】深度学习中softmax交叉熵损失函数的理解
深度学习中softmax交叉熵损失函数的理解 2018-08-11 23:49:43 lilong117194 阅读数 5198更多 分类专栏: Deep learning 版权声明:本文为博主原 ...
- 深度学习中交叉熵和KL散度和最大似然估计之间的关系
机器学习的面试题中经常会被问到交叉熵(cross entropy)和最大似然估计(MLE)或者KL散度有什么关系,查了一些资料发现优化这3个东西其实是等价的. 熵和交叉熵 提到交叉熵就需要了解下信息论 ...
- 深度学习中Dropout原理解析
1. Dropout简介 1.1 Dropout出现的原因 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象. 在训练神经网络的时候经常会遇到过拟合的问题 ...
- 深度学习中的Normalization模型
Batch Normalization(简称 BN)自从提出之后,因为效果特别好,很快被作为深度学习的标准工具应用在了各种场合.BN 大法虽然好,但是也存在一些局限和问题,诸如当 BatchSize ...
- [优化]深度学习中的 Normalization 模型
来源:https://www.chainnews.com/articles/504060702149.htm 机器之心专栏 作者:张俊林 Batch Normalization (简称 BN)自从提出 ...
- Hebye 深度学习中Dropout原理解析
1. Dropout简介 1.1 Dropout出现的原因 在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象. 在训练神经网络的时候经常会遇到过拟合的问题 ...
- 深度学习中的batch、epoch、iteration的含义
深度学习的优化算法,说白了就是梯度下降.每次的参数更新有两种方式. 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种方法每更新一次参数都要把数据集里的所有样本都看一遍, ...
- 深度学习中的Data Augmentation方法(转)基于keras
在深度学习中,当数据量不够大时候,常常采用下面4中方法: 1. 人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data Augm ...
- 深度学习中优化【Normalization】
深度学习中优化操作: dropout l1, l2正则化 momentum normalization 1.为什么Normalization? 深度神经网络模型的训练为什么会很困难?其中一个重 ...
随机推荐
- 统计元音(hdu20)
输入格式:输入一个整型,再循环输入带空格的字符串. 思考:先用scanf()函数输入一个整型,后面直接来个大循环,带空格字符串输入直接用gets()函数. 注意:由于scanf()里面多加了%c,&a ...
- CSS实现漂亮的小水球效果
先看效果图: 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> ...
- {dede:channelartlist} 改变偶数的class
{dede:channelartlist} <div {dede:global.itemindex runphp='yes'} if((@me %2) == 0){ @me = 'class=& ...
- Nginx是如何处理一个请求
首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到 ...
- cp: 无法创建普通文件 : 文件已存在
背景 碰到一个偶现的编译出错问题,如图 报错的信息是 cp: 无法创建普通文件"xxx": 文件已存在 排查原因 看了下 Makefile,这句非常简单,就是 cp ./xxx . ...
- SpringCloud Alibaba 简介
SpringCloud Aliababa简介 SpringCloud Alibaba是阿里巴巴集团开源的一套微服务架构解决方案. 微服务架构是为了更好的分布式系统开发,将一个应用拆分成多个子应用,每一 ...
- (三)vue数据绑定及相应的命令
vue数据绑定及相应的命令 {{ Text }} 双括号进行数据渲染 动态绑定数据 例如:{{message}} data: { return{ message: 'Hello Vue!' } } 2 ...
- C#中方法的静态和非静态
在代码中,给方法加上static就成为了一个静态的方法,然而静态方法是隶属于类的,由类名点出来! 不给方法加static就是一个非静态方法,非静态的方法,是隶属于对象的,需要把类实例化之后,用对象名去 ...
- RabbitMQ安装(centos7)
本文是作者原创,版权归作者所有.若要转载,请注明出处. 本文RabbitMQ版本为rabbitmq-server-3.7.17,erlang为erlang-22.0.7.请各位去官网查看版本匹配和下载 ...
- raw_input和input
昨天在OJ上做CTF的题目,发现有道python的题目很有意思,让我知道了raw_input和input的区别,并且能干一些别的事情. 官方文档上说,input()相当于eval(raw_input( ...