深度学习到底学的是什么?

2020-07-24 10:13发布

2条回答
卡卡
2楼 · 2020-07-24 10:42




贪婪深度字典学习

原文地址:http://blog.csdn.net/hjimce/article/details/50876891

作者:hjimce

一、相关理论


近几年深度学习声名鹊起,一个又一个AI领域被深度学习攻破,然而现在大部分深度学习所采用的算法都是有监督学习的方法;有监督学习需要大量的标注数据,需要耗费大量的人力物力。因此当有监督学习算法达到瓶颈的时候,无监督学习必将成为未来深度学习领域的研究焦点,使得深度学习更接近于人类;毕竟无标签数据一抓一大把、到处都是,如果我们可以搞好无监督学习,这才是牛逼人工智能。

无监督表征学习,除了自编码、受限玻尔兹曼机之外,k-means、稀疏编码等也是无监督表征学习的重要算法。无监督表征学习算法的应用主要分两种:

(1)用于神经网络的无监督预训练。这个我们在深度学习里面经常遇到,比如自编码、RBM就可以分别用于SAE、DBN深度网络的预训练;

(2)无监督特征抽取,然后用抽取到的特征做分类任务;这个说白了就是先用无监督算法抽取高层特征,然后再用SVM来训练特征分类器,像稀疏编码、k-means表征学习一般是这么使用的,当然AE、RBM也可以这样使用。


本篇博文主要讲解我最近所学的一篇paper:《Greedy Deep Dictionary Learning》。这篇文献主要提出了一个深度字典学习方法,字典学习也可以简单的称之为稀疏编码。文献算法主要是受了栈式自编码、DBN训练方法的启发,提出逐层贪婪深度字典学习。

二、贪婪深层字典学习

之前人们所研究的算法都是针对单层字典学习(浅层字典学习),然而我们知道深层模型具有更抽象、更牛逼的表征能力。既然单层自编码对应的DL模型“栈式自编码”;RBM也有对应的DL模型“深度信念网络”;于是文献借助于这思想,也提出了单层字典学习的对应DL算法:深度字典学习。

1、字典学习相关概念

从矩阵分解角度看字典学习过程:给定样本数据集X,X的每一列表示一个样本;字典学习的目标是把X矩阵分解成D、Z矩阵:

X≈DZ

同时满足约束条件:X尽可能稀疏,同时D的每一列是一个归一化向量。这样就相当于求解目标函数:


D称之为字典,D的每一列称之为原子;Z称之为编码矢量、特征、系数矩阵。除了上面这个损失函数之外,字典学习还有另外两种形式的损失函数,比如k-svd字典学习算法,求解的目标函数就是:

 

具体字典学习相关概念,可以参考我的另外一篇博文《k-svd字典学习》,这边不再啰嗦。

2、深层字典学习

我们前面讲到字典学习说白了就是矩阵分解:

X=DZ

这是一个单层矩阵分解,就相当于单层神经网络一样。而文献所提出的算法是多层字典学习,也就是多层矩阵分解:

X=D1*D2*Z


首先字典学习它是个非凸优化问题,多层字典学习将会变得更加复杂;另外多层字典学习的所要求解的参数大大增加,在有限的训练样本下,容易引起过拟合问题。因此文献提出类似于SAE、DBN一样,采用逐层训练学习的思想,这样可以保证网络的每一层都是收敛的。算法其实非常简单,以双层分解为例进行逐层分解,具体示意图如下:


(1)我们首先训练学习出第一层特征Z1、权重D1:

X=D1*Z1

(2)然后对特征Z1进行分解,求解第二层权重D2、特征Z2:

Z1=D2*Z2

以此类推,就可以实现更深层的字典学习。OK,这就是文献的算法,没了……(感觉啥也没学到的样子,给我的感觉很low,跟文献《Adeepmatrixfactorizationmethodforlearningattributerepresentations》没得比呀,这篇文献至少还有整体微调阶段)

3、paper使用方法

在每一层字典学习的时候,我们可以通过添加约束项,选择稠密特征或者是稀疏特征。

(1)如果要求解稠密特征,那我们就直接求解目标函数:

 

也就是没有了稀疏约束项。求解方法采用类似lasso,即对两个变量Z、D交替迭代的方法:

 

(2)如果要求解稀疏特征,那么我们就用L1正则约束项:

 

然后迭代公式就是:

 

对于第二个公式Dk的求解,也是求解一个最小二乘问题。对于稀疏编码Zk的求解采用ISAT算法,如下公式:


以前字典学习,一般字典的初始化都是从样本中随机抽取的,然而本文采用的是QR分解,从Q矩阵中按顺序,提取出正交向量,作为初始字典。另外文献最后采用的网络模型是,除了最后一层采用稀疏编码之外,其它层都采用的稠密特征。

三、与RBM、自编码的区别、联系

1、与RBM的联系

RBM是损失函数是采用数据分布相似性度量,而字典学习是采用欧式距离损失函数。RBM要求数据介于0~1之间,如果数据超过这个范围,那么就需要做归一化处理。在大部分情况下,归一化对于我们所要的性能可能没啥影响,但是在某些特定的情况下它会抑制一些重要的信息。然而字典学习可以让我们输入任意复杂的数据。

2、与自编码的联系

从我们的分析来看,自编码是学习W,使得W*X=Z,然而字典学习的目标是学习D使得X=DZ。也难怪文献中的字典学习网络的线是画相反的方向。

四、试验结果

1、浅层学习与深层学习对比

文献对比了浅层表征学习和深层表征学习的结果,采用两种方法进行特征Z的学习,然后采用k近邻进行分类测试,结果如表一所示。


2、与SAE、DBN的对比

三个网络模型都采用3层网络,每层网络神经元一次减半。同样的我们利用这两个算法进行表征学习提取高层特征,然后利用高层特征进行分类:KNN,SVM,测试结果得到表格2、3


最后再采用fune-tuning后的DBN、SAE,与本文的算法做出了对比,得到结果表格IV。可以看到,在某些情况下,即使是fine-tuning的DBN、SAE,精度也比不上文献的算法DDL:


个人总结:这篇文献其实非常简单,就仅仅是讲解X=D1*D2*Z的一个求解方法,然而文献竟然啰嗦了将近10页;而我竟让这篇博文也写了这么多,感觉自己快成了说书的了,越来越能扯……不过文献所提出的算法虽然简单,但是作者通过验证对比,确实是非常牛逼的效果,在无监督的条件下,比自编码、RBM都要牛逼,甚至连fine-tuning的自编码、RBM在某些任务下,都无法与之匹敌。不过这个还是比较喜欢另外一篇文献:《A

deepmatrixfactorizationmethodforlearningattributerepresentations》,这篇文献讲的是深度非负矩阵分解,里面的创新点非常多,这样可以学到更多的知识,感觉才比较充实。

参考文献:

1、《Greedy Deep Dictionary Learning》

2、《Adeepmatrixfactorizationmethodforlearningattributerepresentations》

**********************作者:hjimce 时间:2016.3.13 联系QQ:1393852684  原创文章,转载请保留作者、原文地址信息********************


相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问