纯转载文章,旨在便于自己空的时候观看。

一直很好奇,模式识别理论中,常提到的正则化到底是干什么的?在这里真心感谢 迷雾forest 那么费脑组织语言、那么费卡路里打字、那么有责任心的分享!

正则化:

  1. 正则化的目的:防止过拟合!

  2. 正则化的本质:约束(限制)要优化的参数。

关于第1点,过拟合指的是给定一堆数据,这堆数据带有噪声,利用模型去拟合这堆数据,可能会把噪声数据也给拟合了,这点很致命,一方面会造成模型比较复杂(想想看,本来一次函数能够拟合的数据,现在由于数据带有噪声,导致要用五次函数来拟合,多复杂!),另一方面,模型的泛化性能太差了(本来是一次函数生成的数据,结果由于噪声的干扰,得到的模型是五次的),遇到了新的数据让你测试,你所得到的过拟合的模型,正确率是很差的。

关于第2点,本来解空间是全部区域,但通过正则化添加了一些约束,使得解空间变小了,甚至在个别正则化方式下,解变得稀疏了。这一点不得不提到一个图,相信我们都经常看到这个图,但貌似还没有一个特别清晰的解释,这里我尝试解释一下,图如下:


   这里的w1,w2都是模型的参数,要优化的目标参数,那个红色边框包含的区域,其实就是解空间,正如上面所说,这个时候,解空间“缩小了”,你只能在这个缩小了的空间中,寻找使得目标函数最小的w1,w2。左边图的解空间是圆的,是由于采用了L2范数正则化项的缘故,右边的是个四边形,是由于采用了L1范数作为正则化项的缘故,大家可以在纸上画画,L2构成的区域一定是个圆,L1构成的区域一定是个四边形。

再看看那蓝色的圆圈,再次提醒大家,这个坐标轴和特征(数据)没关系,它完全是参数的坐标系,每一个圆圈上,可以取无数个w1,w2,这些w1,w2有个共同的特点,用它们计算的目标函数值是相等的!那个蓝色的圆心,就是实际最优参数,但是由于我们对解空间做了限制,所以最优解只能在“缩小的”解空间中产生。

蓝色的圈圈一圈又一圈,代表着参数w1,w2在不停的变化,并且是在解空间中进行变化(这点注意,图上面没有画出来,估计画出来就不好看了),直到脱离了解空间,也就得到了图上面的那个w*,这便是目标函数的最优参数。

对比一下左右两幅图的w*,我们明显可以发现,右图的w*的w1分量是0,有没有感受到一丝丝凉意?稀疏解诞生了!是的,这就是我们想要的稀疏解,我们想要的简单模型。

还记得模式识别中的剃刀原理不?倾向于简单的模型来处理问题,避免采用复杂的。【剃刀原理:剃刀是一种经验法则,用于允许排除(刮掉)不可能的解释或者情况。另提一句,剃刀是一种有效的思维方式,但事实上并不是严格意义上的“定理”。】

这里必须要强调的是,这两幅图只是一个例子而已,没有说采用L1范数就一定能够得到稀疏解,完全有可能蓝色的圈圈和四边形(右图)的一边相交,得到的就不是稀疏解了,这要看蓝色圈圈的圆心在哪里。

此外,正则化其实和“带约束的目标函数”是等价的,二者可以互相转换。关于这一点,我试着给出公式进行解释:

针对上图(左图),可以建立数学模型如下:

通过熟悉的拉格朗日乘子法(注意这个方法的名字),可以变为如下形式:

这两个等价公式说明了,正则化的本质就是,给优化参数一定约束,所以,正则化与加限制约束,只是变换了一个样子而已。

此外,我们注意,正则化因子,也就是里面的那个lamda,如果它变大了,说明目标函数的作用变小了,正则化项的作用变大了,对参数的限制能力加强了,这会使得参数的变化不那么剧烈(仅对如上数学模型),直接的好处就是避免模型过拟合。反之,自己想想看吧。。。

个人感觉,“正则化”这几个字叫的实在是太抽象了,会吓唬到人,其实真没啥。如果改成“限制化”或者是“约束化”,岂不是更好?

正则化文章来源:关于正则化抽象定义的通俗理解
以下来源:负采样的理解
负采样简单理解:

比如说 love 和me两个单词;

使用特殊思维模式;假设整个词汇表只有100个单词;love 表示成one-hot向量; me表示成one-hot向量;

模型输入为love的one-hot向量;模型输出为me的one-hot向量;

假设模型的神经网络结构为 100∗10∗100100*10*100100∗10∗100;输出层100个;

输出层中除了me对应位置的1外,其他全是0;称这为负样本;参数数量为10∗10010*10010∗100

采样就是从这样负样本中抽样;比如说抽取5个;那么在此次梯度更新中就只更新10*5;更新数量为原来的1/20

负采样的本质:每次让一个训练样本只更新部分权重,其他权重全部固定;减少计算量;(一定程度上还可以增加随机性)

以下来源:神经网络中的负采样
神经网络中的负采样
   对于绝大多数的有监督学习,神经网络的训练过程其实就是不断地调整网络权重的过程。最常用的方法就是 back-propagation。然而,对于庞大的神经网络而言,反向更新权重并不是一件容易的事情,这个时候我们就需要用到负采样(negative sampling)的技术。在这篇博客,我将简单地介绍一下负采样的作用以及两种比较著名的负采样方法。

为什么需要负采样
   当前对于绝大多数的神经网络而言,更新参数使用的都是反向传播(back propagation)的方式。这意味着,对于那些结果与标签值的不一致的节点,都需要做反向传播,更新权重。字面说可能很难理解,这里我使用 Skip-Gram 来做讲解,通过计算来说明负采样的必要性。

Skip-Gram 的输出和输出都是 one-hot 编码的向量,假设我们的词典的 size 是 10000,即输入的向量是 10000 维的向量,然后嵌入成 400 维的向量,这样隐层就有 400 个节点,输出层也是一个 10000 维的向量。我们重点关注隐层 - 输出层这里的权重,这里总共有 400∗10000=4,000,000 个权重。也就是说,如果我们不做任何改进的话,每一次的训练都需要更新 4,000,000 个权重。显然,这样大量的计算会极大地拖慢训练的速度。

为了提升训练的速度,减少更新权重的数量,我们就需要对节点进行负采样。首先来了解两个概念 postive word 和 negative word。positive word 指的是在输出向量中期待为 1 的那个节点,negative word 指的是在输出向量中期待为 0 的节点。在 Skip-Gram 中,输出向量一般只有一个位置为 1,其余的 9999 个位置都为 0。负采样的目的就是在 negative word 中,找出一部分节点进行权重的更新,而不需要全部都更新。比如我们找 5 个 negative word 节点,最后,我们更新的节点就是 1 个 positive word + 5 个 negative word 节点,总共是 6 个节点。在这种情况下,需要更新的权重数量是 6∗400=2400,相比起前面计算的 4,000,000,是不是少了很多!

负采样的方式
   知道了为什么要做负采样之后,我们就要考虑如何去做好这个采样。一般来说采样讲求随机性,尽可能公平地选择每一个节点。同时我们还必须兼顾效率,采样的计算复杂度也是非常重要的。

Unigram Table
核心思想: 某个词被选中的概率和它出现的次数有关。

这个方法非常好理解,非常符合直观逻辑。如果一个词出现的越多,我们就认为它被选择的概率会比较大。在 word2vec 论文中,提出了一个非常神奇的采样公式:
  

Alias Table
   在介绍 Alias Table 前,先来看看 Unigram Table 有什么不足之处。每次取样的时候,先产生一个 [0,1] 的随机数 c,然后顺序遍历 Unigram Table,找到第一个大于 c 的数所对应的下标,即是采样的类别。这种方法的复杂度是 O(N),如果使用二分搜索,复杂度降至 O(logN)。

Alias Table 就是为了继续降低复杂度而引进的方法,它的单次采样复杂度为 O(1)。接下来我们来看一下它是怎么做的。

假设我们有 4 个类别的数据,其概率分布为:[1/2,1/3,1/12,1/12]。
每个类别的概率乘上类别数,使得总和为 4,结果为:[2,4/3,1/3,1/3]。以 1 为分界,划分为两类:一类是大于 1 的,另一类是小于 1 的。
通过拼凑,使得每一个类别都为 1,且每一个类别只能有两种类别,所以我们需要从最少的开始补,保证较少的通过一次拼凑就能满足。
将第 1 列拿 2/3 给第 3 列,结果为:[4/3,4/3,1,13]
将第 1 列拿 2/3 给第 4 列,结果为:[2/3,4/3,1,1]
将第 2 列拿 1/3 给第 1 列,结果为:[1,1,1,1]
完成拼凑
最后,就得到了两个数组:Probability TableAlias Table
Probability Table:指的是某一类落在原类型的概率,即自己类别组成 1 的部分。以上述的为例,应该为: [2/3,1,1/3,1/3]
Alias Table:用于指明某一类别的其他组成类别。前面提到,每一个类别只能有两种类别,一个是自己,另一个则是通过拼凑补过来的类别。所以这个表就是用来指明拼凑过来的那个类别。以上述的为例,应该为:[2,0,1,1]
每一次采样,首先随机选取某一个类别 k,然后随机产生一个 [0,1] 的随机数 c,首先比较 Prob[k] 和 c 的大小,如果 Prob[k]>c,那么说明原有类别所占比例比较大,采样 k,否则,说明拼凑的类别所占比例大,采样 Alias[k]。可以看出,采样过程中全部都是下标访问,复杂度是 O(1),因此这个方法应用很广。

正则化理解+负采样理解以及神经网络中的负采样相关推荐

  1. PNAS | 理解单个神经元在深度神经网络中的作用

    本次报道论文为发表于PNAS的Understanding the role of individual units in a deep neural network.众所周知,深度神经网络擅长查找可解 ...

  2. 深度卷积神经网络_深度卷积神经网络中的降采样

    加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动! 同时提供每月大咖直播分享.真实项目需求对接.干货资讯汇总 ...

  3. pcm 降采样_深度卷积神经网络中的降采样

    降采样指的是成比例缩小特征图宽和高的过程,比如从(W,H)变为(W/2,H/2).深度卷积神经网络中降采样的方法主要有三种: 1.stride大于1的pooling 2.stride大于1的conv ...

  4. 下采样matlab代码,SIFT中的降采样和升采样及其MATLAB实现

    降采样: 对于一幅图像而言的降采样就是每隔几行.几列得到取一点,组成一个新的图像.以比例因子为2(fact of 2)的降采样来说:就是対一幅图像每隔一行一列取一点.对于n×n的图像就变为n/2×n/ ...

  5. matlab 降采样 平均,[转载]SIFT中的降采样和升采样及其MATLAB实现

    降采样: 对于一幅图像而言的降采样就是每隔几行.几列得到取一点,组成一个新的图像.以比例因子为2(fact of 2)的降采样来说:就是対一幅图像每隔一行一列取一点.对于n×n的图像就变为n/2×n/ ...

  6. 神经网络中的过拟合的原因及解决方法、泛化能力、L2正则化

    过拟合:训练好的神经网络对训练数据以及验证数据拟合的很好,accuracy很高,loss很低,但是在测试数据上效果很差,即出现了过拟合现象. 过拟合产生的原因: (1)数据集有噪声 (2)训练数据不足 ...

  7. ssis 列转换_SSIS包中的行采样转换和百分比采样转换

    ssis 列转换 This article explores Row Sampling Transformations in SSIS and Percentage Sampling Transfor ...

  8. 神经网络中的降维和升维方法 (tensorflow pytorch)

    大名鼎鼎的UNet和我们经常看到的编解码器模型,他们的模型都是先将数据下采样,也称为特征提取,然后再将下采样后的特征恢复回原来的维度.这个特征提取的过程我们称为"下采样",这个恢复 ...

  9. KDD 2020 | 理解图表示学习中的负采样

    今天给大家介绍的是清华大学的Zhen Yang等人在KDD 2020发表的文章"Understanding Negative Sampling in Graph Representation ...

最新文章

  1. 海天学院的打造IT人才讲座准备
  2. spring boot2 整合(一)Mybatis (特别完整!)
  3. 滚动到底部或顶部响应的ScrollView使用
  4. 汇编语言 ADC指令和SBB指令
  5. 1.1_SSH项目开发流程
  6. IOS中的懒加载lazyLoad
  7. 树上倍增一些理解和写法
  8. rem、px、em之间的区别以及网页响应式设计写法
  9. CodeForces 841B (B) 博弈
  10. python中的bs4怎么导入_在Python 3.5导入BS4
  11. 【测试】身份证的前世今生
  12. mac os android sd卡,关于 Mac 上的 SD 和 SDXC 卡插槽
  13. 你的烂代码终于有了解决方案
  14. python辅助 sublime_Sublime+python设置
  15. Java HashMap工作原理及实现
  16. android三国2,三国演义安卓单机版
  17. Hexo添加小部件(Butterfly主题) 添加卡通人物(看板娘)
  18. mahout实现协同过滤推荐算法
  19. HTML表格中实现自动换行
  20. 防止进程被任务管理器关掉的办法

热门文章

  1. 在linux下面虚拟多块网卡,在一块物理网卡上配置多个IP地址
  2. CC2538之TinyOS例程实验:3/4-timer nesC编程最难理解部分参数化接口讲解
  3. 大家知道微信被举报以后,多久才恢复正常吗?
  4. 动规(19)-并查集基础题——城镇道路
  5. 算法题解_哥德巴赫曾猜测
  6. vue文件夹目录详解教程
  7. python 曲线平滑滤波
  8. Jetpack Compose自定义绘测 画太阳
  9. c语言 字符指针输出字符串,输出字符指针就是输出字符串
  10. ISE中开发XPS microblaze软核与BootLoader功能的实现