这是HInton的第16课,也是最后一课。
一、学习一个图像和标题的联合模型
在这部分,会介绍一些最近的在学习标题和描述图片的特征向量的联合模型上面的工作。在之前的lecture中,介绍了如何从图像中提取语义有意义的特征。不过那是在没有从标题中得到帮助的情况下做的。显然在标题中的单词应该有助于从图片中提取合适的语义类型。类似的,图片也应该有助于在区分标题中的单词的意思是什么。所以idea就是我们要在一个很大的网络上,给他输入然后计算图像上提取的视觉特征向量,然后学习标题的单词表征,然后学着将这两个输入表征之间互相关联。在这部分的最后,会有一段电影有关最终的网络使用单词来生成图像的特征向量,然后得到数据库中最接近的图片。同样的使用图像来生成单词字节。
现在来介绍下一些由natish Rivastiva(他是这个课程的一个助教)和Roslyn Salakutinov的工作,目标就是建立一个有关标题和从真实图像中提取的标准计算机视觉的特征向量的联合密度模型。这需要比建立一个标签和数字图像(之前看到的手写数字)的联合密度模型更多的计算量。所以他们首先要做的就是单独的训练一个图像的多层模型。这是一个从图像中使用标准计算机视觉特征提取的特征的多层模型。然后分别训练一个从标题中得到的单词计数向量的多层模型。一旦他们训练好了这两个模型,他们有一个新的顶层,也就是将两个模型的顶层连接在一起。之后,他们更进一步的对整个系统进行联合训练从而每个模态可以提升早期其他模态的层。
这里不使用DBN,这也许是你期望的,他们使用DBM,在DBM的所有的层对中有着对称的连接。更进一步的对整个DBM的联合训练就是允许每个模态改变其他模态的早期层中的特征提取器。这就是他们使用DBM的原因。他们同样可以使用DBN,然后用对比CD做生成式的微调。不过对DBM的微调算法也许可以更好的work。这留下了一个问题,如何对一个DBM进行预训练他的隐藏层。因为到目前为止,我们在课程中看到的是如果你训练一个堆叠RBM,你可以将它们结合起来到一个单一的模型中,不过你得到的是一个DBN而不是一个DBM。
所以现在来解释在不管课中之前说过的那些,你实际上可以预训练一个堆叠RBM到这样一种方法,这样你可以随后结合他们成一个DBM。技巧就是这个堆叠RBM中顶层和底层的RBM需要在一个方向上两倍大小于另一个方向上来预训练权重,。所以(看上图左边的模型的底部那个模型),这个底部的玻尔兹曼机,观察他的可是单元是用自底向上的权重两倍于自顶向下的权重的,不过权重是对称的,所以这里称之为缩放对称,不过自底向上的权重总是两倍于自顶向下的权重的。这是有道理的,会在稍后介绍理由。堆叠中的下一个RBM(中间那个模型),是用对称权重来训练的。这里都是2W,而不是W,可以保持用RBM来像这样真正的对称权重来训练。不过在堆叠的顶部这个RBM被用自底向上的权重是自顶向下权重一半的方式来训练的。所以再说明一次,这些是缩放对称权重,不过现在,自顶向下的权重是两倍于自底向上的权重。这就是与我们训练第一个RBM相反的。在训练好这三个RBM之后,我们就可以将它们结合起来生成一个综合模型,而这个综合模型就像上图右边那个。对于中间这个RBM,我们简单的减半他的权重,这就是为什么开始的时候用2W2。对于底部这个,我们减半上行的权重,不过还是保留下行的权重不变。对于顶部这个,我们减半下行的权重,保持上行的权重不变。现在 问题是:外什么我们要做这样的减半权重的操作?解释是相当复杂的,不过这里粗略的介绍下:如果看到左边那个堆叠的RBM的层h1部分,我们有两个不同的方式来推论h1中的单元的状态,我们可以推论h1 的状态来自自底向上的v 或者我们推论h1的状态来自于自顶向下的h2.当我们急哦按这些玻尔兹曼机结合起来的时候,我们要做的就是均化这两种推论h1的方式。为了得到一个几何均化,我们要做的就是减半这些权重,所以我们使用一半自底向上的模型,也就是一半的2w1,然后我们使用一半自顶向下的模型,也就是一半的2w2.如果你看右边这个DBM,这就是用来推论h1 的,换句话说,如果你在给定h2中的状态的时候,然后给定v 中的状态,这些权重就是你需要用来推论h1的状态的。我们需要减半这些权重的原因是因为我们无需进行两次计算。你看,在右边这个玻尔兹曼机中,h2的状态是依赖于v的,至少在我们做了一些让玻尔兹曼机稳定下来的工作之后是这样。所以如果我们使用来自第一个RBM的自底向上的输入,然后使用来自第二个RBM的自顶向下的输入,我们就可以计算这个证据(evidence)两次,因为我们需要从v中推论h1,而且还需要从h2(而这个仍然还是由v决定的)中推论h1,为了不要计算两次证据,我们需要减半这些权重。这是一个高度抽象,也许不是那么完全清楚解释为什么需要减半权重的原因。如果想要知道数学上的详细解释,你可以读读论文。
所以中间层可以使用那层的来自原始堆叠中两个不同的RBM表示的两个不同模型的几何均化:下面是来自长达1分24秒的视频的部分截图:
上图应该是从step 1开始计算,然后几个模型的黑白点会不断的变化
可以看到白点在不断的变化,这是因为给他的右下角的标题也变了
下面是另一个例子,上面的是图片不变,标题在变,下面是标题不变,图片在变:
二、分层坐标系
在这部分,将会介绍如何通过使用介于部分之间的关系的对象识别和使用DNN的对象识别结合起来。在现在的计算机视觉中,广泛的使用三种方法来识别对象。不论是使用深度CNN,虽然这个在当前是效果最好的;还是使用一个基于部分的方法,这个Hinton认为长远的看,这个是最好的;或者使用现有的特征,也就是那些计算机视觉的人们知道如何从图像中提取的特征,然后用他们的直方图,接着使用一些手工的方法来完成,这就是CNN最近打败的方法。这部分的重点在于我们如何将一个基于部分的方法和使用CNN的早期阶段结合起来。
即使CNN对于对象识别和图像识别来说已经效果很好了。不过Hinton还是它丢失了一些东西。当我们池化来自一群重复的特征检测器的激活值的时候,我们丢失了那些大多数激活的特征检测器的准确位置。意思就是我们没法知道他们的位置在哪,这对于高度抽象的部分(parts)的来说是很致命的,例如鼻子、嘴巴。为了识别这些人脸是谁的,你就需要在这些高度抽象的部分中使用准确的空间相关性,例如鼻子和嘴巴。如果你重叠这些池化就能让每个特征出现在不同池化中。你保留了更多关于他的位置的信息,这会让事情work的更好,不过Hinton不认为这个答案是正确的。一个相关的问题是CNN使用重复的特征检测器来达到平移的目的没法推断从几何关系到像不同方向或者不同尺度这样的根本的新viewpointd的理解。当然我们可以交叉于方向或者尺度上来重复,不过这样我们就得到了巨多的重复的特征检测器。人类非常擅长推断,在看到一个新的形状后,他们能从一个非常不同的viewpoint上进行识别它。目前来看,我们处理CNN的方法是在转换后的数据上训练的。所以这会导致有个巨大的训练集合,也就是通过不同的方向、尺度和光照以及其他东西来转换数据使得网络可以处理这些变化。不过这对于处理这些变化来说是一个非常笨拙的方法。
Hinton想出了一个更好的方法通过使用具有层次关系的坐标系然后使用一组神经元来表示一个特征形状的关联,它的姿势是相对于视网膜来说的。所以当这些神经元是激活的,它会告诉你那种特征是哪种,例如一个鼻子。这些神经元的准确的激活值或者相对的激活值会告诉你鼻子的姿势。如果你思考有关表示某些东西的姿势时,这就是介于坐标系之间的关系。所以这是介于基于东西的坐标系和照相机或者视网膜的坐标系之间的关系。所以为了表示东西的姿势,我们需要嵌入一个坐标系到它里面去。一旦完成之后,我们就有相对于计算者来说对象想法的姿势的表示,这很容易使用路径到识别更大对象之间的关系来完成。所以我们使用部分的姿势的一致性来作为识别更大形状的线索。
如果你看上图右下角的图的竖线左边,有鼻子和嘴巴,然后有着相互正确的空间关系。一种对这种情况的思考的方法是,如果通过嘴巴去预测整个人脸的姿势,或者通过鼻子来预测整个人脸的姿势,他们会得到相似的预测结果。如果看上图右下角的右边的图,有着一样的鼻子和嘴巴,不过现在他们在错误的空间关系上,这就意味这如果他们分别进行预测关于人脸的姿势,他们的预测结果就完全不一样了。
这里是在层级部分中的两层,其中更大的部分可以通过更小的部分的一致性预测来进行识别。让我们假设我们在找一张脸(上图上面一行三个小圆加椭圆),在中间部分上那个有着Tj的椭圆是一个神经元的集合,用来作为识别人脸的姿势。隔壁小圆中的Pj是一个单一的逻辑神经元,用来作为表示是否那是一张人脸。(这时候下面的三个对应部分也有了)在上图下面的部分中我们有一个相似的表示,这里有用嘴巴和鼻子表示的姿势。我们可以通过注意这两个表征是否得到一致性的预测来进行识别人脸。所以需要用于表示嘴巴姿势的激活向量,然后用矩阵Tij进行相乘,这个矩阵表示嘴巴和人脸的空间关系,然后得到一个预测,关于人脸姿势的结果Ti×Tij;接着在鼻子上也这样做,用表示鼻子姿势的激活向量,然后用矩阵Th进行相乘,这个矩阵表示鼻子和人脸的空间关系,然后得到一个预测,关于人脸姿势的结果。如果两个预测结果一样,那么就判断那里有个人脸,因为鼻子和嘴巴都在正确的空间关系上。
这里做的就是逆向计算机图形学。在计算机图形学中,如果你知道人脸的姿势,你就可以通过Tij的逆运算计算鼻子和嘴巴的相似性。所以在计算机图像学中,是从更大的东西的姿势到他们更小的东西的姿势上的。在计算机视觉中,你需要从小的东西的姿势到更大东西的姿势上,你需要检查一致性。
现在,如果我们可以得到一个NN来表示这些姿势向量(也就是神经元激活的向量),然后得到一个非常好的特性。空间关系可以建模成线性操作。这使得学习层级可视实体变得非常容易,同样的他也让生成交叉的viewpoints的时候变得很容易。所以这就是当我们在viewpoint中有着很小的变化的时候得到的就是姿势向量,这些神经元激活值的向量都会变化。
不变的是权重,那些表示来自整体的部分之间关系的权重,就想上一个ppt中的Tij,这些不是依赖viewpoint的,所以我们想要在权重中得到不变的形状的特性,而且想要激活值中的姿势向量。因为当我们改变viewpoint的时候,所有的这些姿势向量都会变化。所以不是得到那些对于viewpoint是不变的神经元的激活值,这就是在CNN的池化中做的(个人:也就是池化的缺点,把这些信息丢失了)。我们目标在于得到哪些与viewpoint的同变性的激活值,使得对象的姿势随着神经元的激活值的变化而变化。这就意味着对象的知觉(percept)不是他的标签,而是它看起来像什么,是随着viewpoint的改变而改变的。
这里介绍给出一些证据(evidence)关于在可视系统上加入坐标系来表示形状。这在很长一段时间以前就被一个伟大的心理学家Irvin Rock指出。如果你看到这个形状(上图左边那个形状),然后告诉你这是一个国家,大多数人不知道这是哪个国家,他们认为这有点像澳大利亚,不过他完全不是。如果告诉你他的上方是什么地理位置(红线箭头),他们立马就能识别出这是非洲,如果他们知道加入的坐标系,他立马就变成一个相似的形状。
相似的,如果给你一个形状像上图右边那个,你可以感知到这是一个方形,或者是一个钻石。这是两个完全不同的概念,你所知道关于这个形状的信息是取决于你对他的感知。例如,如果你感知他是一个斜平方,你可以敏感的知道这个角是否是直角。如果你感知到她是一个直立的钻石,你就完全不会对他敏感了,当这个角度有5度的偏差的时候,你就完全不会注意到了,不过你会敏感到其他东西。如果你感知它作为一个直立的钻石,那么就会敏感于这个左角和右角是否有着一样的高度。现在你可能会注意到在这个图中,他们有些轻微不同的高度差。这种现象就是证据,用来表示我们会在形状上面加上坐标系,因为不论将它作为一个方形还是钻石,这是你同时会做的事情(个人:就是加坐标系),不过这个感知的不同完全在于你加入的坐标系的不同。
三、神经网络超参数的贝叶斯优化
在这部分中,会介绍一些最近令人兴奋的工作,Hinton认为这会在回答关于如何在神经网络中解决超参数的问题上前进一大步的。近来的工作使用一个不同类项的机器方法来帮助我们决定对超参数使用什么值。换句话说,他使用机器学习来代替那些用所有的这些不同的超参数配置来找到如何让系统最好工作的研究生们。它依赖于对对平滑函数的建模方法,叫做高斯过程,之前Hinton总认为相比较于语音和视觉来说是微不足道的,不过当你在那些没有许多先验知识的领域,而你唯一能做的事情就是你期望相似的输入有相似的输出,然后高斯过程是完美的。这个领域是当Hinton他们在鼓捣超参数的向量并希望找到一个最好的超参数向量使得可以很好的work的时候接触的。所以例如隐藏单元的数量、层的数量、权重的惩罚项、是否需要使用dropout。这下都是超参数,而且不同的超参数组合可以work的很好,所以这对于手动寻找来说是一个非常困难的空间。当手动探索的时候,这些就会非常容易被忽视掉。高斯过程(Gaussian Processes)很擅长注意数据中的倾向性而且当你有足够的计算机的时候,会提供一个非常好的方式去寻找好的超参数集合。
最常见的一个人们不使用NN的原因是因为他需要大量的技巧来调整超参数,这事实上是一个非常好的原因。如果你没有任何经验的话,它很容易陷入使用一个完全错误的超参数值,然后没有任何效果。你需要设置的有层数,每一层的单元数,单元的类型,权重惩罚项,学习率,动量等等。如果你使用的学习率100倍太大,或者100倍太小,你的网络当然也就没法work。
一个解决这种方法就是做一个朴素网格搜索。也就是对任何超参数,你需要一个可替代值的列表,然后将所有的可能的组合值用来训练,你可以想象这工作量,如果你有许多超参数的话,你最后会发现你会有比你可能要用的组合多得多。结果显示有一些东西明显会好于朴素网格搜索(naive grid search)。我们只需要随机采样组合,也就是说对于每个超参数来说,我们先列一个可代替值的表,然后随机挑一个组合。这样更好的原因是因为许多超参数没有任何效果,其他会非常有用。我们不想要重复超参数的配置,特别是那些几乎没有效果的配置组合。我们对这种方法了解不多。在一个网格搜索中,你需要沿着每个轴设置好几个点,对于所有的其他参数来说,它们都是一样的。所以如果沿着那个网格轴移动没有任何意义,你会总是在多次重复一样的实验,而且没有学到任何有关其他参数的东西。
不过还是有一些方法可以比随机组合要好。基本上等于说,让我们使用机器学习来模拟硕士生来决定超参数应该是什么。所以不采用随机组合的方法,我们看看目前为止得到的结果,然后试着预测什么样的组合可以更好的工作。也就是我们需要预测超参数空间的区域,我们期望得到好结果的区域。不过只说我们期望如何做还是不够的,我们同样需要有一个关于不确定性的idea。例如我们也许需要一个区域,在这个区域中我们期望做一些和我们当前做的差不多的,不过也许可以做的更好。在这种情况下,就值得来搜索这个区域了。甚至在我们认为做的更差的区域上也值得探索,因为我们有可能做的更好。现在我们假设评估一个超参数配置的计算量特别的大。他涉及到在一个巨大数据集上训练一个大NN,而且他有可能会在一个大计算机上花费好几天的时间。与这些工作相关的,建立一个模型在给定所有我们实验过的less work的配置来预测一个超参数集合有多好,所以会需要比运行单次实验更少的计算量来用这个预测模型来拟合到目前为止的实验的结果。所以什么类型的模型可以用来预测未来实验的结果?
结果显示有一种模型,这是在之前都没说过的,叫做高斯过程模型。基本上,所有的这些模型都是假设相似的输入得到相似的输出,它们没有任何更复杂的先验,不过他们非常擅长以一种高效的形式来使用这个先验。所以如果你不知道太多有关你期望超参数做的,一个像这样的弱先验也许是你最能做到的。高斯过程可以对每个输入维度进行学习,在这个维度上合适的缩放可以用来测量相似性。所以例如,如果隐藏单元是200或者200,问题就是这些是相似的数量还是非常不同的数量?我们期望我们用200得到的结果于用300得到的结果非常相似,还是期望它们非常不同?如果不知道任何有关NN,开始我们就没有任何想法,不过我们可以看看到目前为止的实验的结果。如果在考虑到其他实验之间的不同的时候(也就是单一变量原则)用200的实验和300的实验倾向得到非常相似的答案,那么300就可能是相似于300.所以我们对这个维度设置一个缩放因子,这样你需要更多的实验的差异性来得到非常不同的结果。
现在,重要的是使用GP(gaussian processes)模型可以做不仅仅是预测特定实验的预期结果。也就是我们训练的NN在一个验证集上会有多好。除了预测一个有关他们期望这个NN做的多好的平均值,它们还会预测分布,他们预测方差。他们称这个为GP是因为他们的预测结果是高斯的。当他们对新的超参数配置(这些配置都很接近我们已经运行过的几个一致的配置)进行预测的时候,我们知道结果。这个预测结果将会倾向于相当尖锐,也就是它有一个低方差(想想高斯图形就知道),不过当他们是用非常不同于之前实验过的超参数的配置的话,由GP得到的预测结果就会有非常高的方差。
所以这里是一个相当好的策略,通过使用GP来决定下一个该试什么。记得,我们有一种学习模型,它是一个非常大的NN,他需要很长的时间来训练,我们可以指出下一个要使用的超参数配置。我们有一种不同的机器学习方法,叫做GP,它会 通过观察到目前为止实验的结果,然后对一些提出的新的超参数集合来预测NN的结果有多好和预测结果有多少程度的不确定性。所以我们可以追踪到目前为止work的最好的超参数的足迹。这是对于所有的超参数配置来说是单一的配置,可以给我们到目前为止NN最好的效果。
现在当我们运行下一个实验的时候,我们目前最好的配置也许会被新的实验代替,因为他会在NN中给出更好的结果或者还是老样子。所以当我们打算替换性实验的结果(是目前为止最好的结果),我们目前为止最好的配置还是可以提升的。所以这是一个有关下一个可以使用的超参数配置的好策略。我们挑选一个超参数配置,使得在我们最佳配置中的期望的提升是很大的。我们不关心我们也许会使得实验得到一个坏结果的事实,因为如果得到了一个坏结果,我们就不会在新实验上替换我们目前最好的配置了。这是一个对冲基金经理人知道的现象,他们经常告诉客户如果基金上升的话,就会需要你利益的3%,如果基金下降的话,你就输了。现在这对于客户来说,这种协议很疯狂,因为这会让对冲经理人冒着巨大的风险情况下有着巨大的激励,因为他没有明显的答案。不过对于寻找那些work的超参数,这是一个明智的策略。所以考虑这三个预测结果(上图右边三个)A,B,C。我们假设A,B,C是没有试过的超参数的不同的配置,这些绿色的高斯都是我们GP模型的预测结果,关于这些配置的结果。对于配置A,均值是非常低于我们目前为止最好的结果的,而且是温和的方差。对于配置B,均值非常接近目前为止最好的结果,不过因为没有太多的方差,所以也没太多的上涨空间。对于配置C,均值事实上低于配置B,不过因为他的高方差,所以它有很大的上涨空间。我们会采用高斯C的区域中在红线上面的部分,然后采用基于红线上面的区域的时刻(moment),这就是我们寻找的匹配边界,你可以发现C有着一个比B和A更大的moment。他也许和B在红线上部分一样的区域面积,不过这个区域是针对红线来说跨度更大。所以我们在使用配置C的时候也许会得到一个非常大的飞跃。所以这是我们的策略关于挑选的位置的。A是最坏的部分,B是适中的,C是最好的。
所以它们的效果如何呢?如果你得到了资源来做许多实验,这会比一个人来寻找好的超参数组合更好。这里目前为止的策略是一个严格的顺序策略,需要假设它能看到目前为止运行的所有实验,不过没有理由关于为什么不让它更复杂一点,然后以并行的方式运行一大堆的实验。使用一个GP模型来预测一个具体的超参数配置有多好的效果是明智的,因为这不是我们擅长的任务。这不像视觉或者语音,而且也不清楚数据中可以有哪些复杂的结构。也许唯一真实的结构就是事物是平滑的,而且它们有许多尺度(scale)。所以一个人类没法记住50个不同实验的结果,然后来进行预测。如果你都是靠手动的,你也许会没注意到所有你的好的结果有着非常小的学习率,所有你的真正坏的结果有着非常大的学习率。,因为你参与了许多其他的操作。一个高斯模型不会丢失那样的趋势。一个最终的原因关于为什么GP是超参数配置的好方法是因为它们不太可能像人一样作弊。通常来说,当我们做研究的时候,我们想要将一个新的方法与旧的方法做比较,你也许会想到会需要更努力的对新的方法找到好的超参数。这就是为什么当你对比方法的时候,你应该通过不同的组来对比结果,对于每个方法,结果是由相信那个方法的组产生的。如果我们使用GP来搜索好的超参数配置,他们要做的就像是研究我们相信的模型类型那样研究我们不相信的模型类型。
四、前行的迷雾
在这个最终的部分上,会介绍Hinton关于NN研究上的预测(记得这个视频是12年的,所以所谓的预测,其实现在就可以看看是否实现了)。会先介绍为什么Hinton认为做许多研究在长时预测是极端愚蠢的。
先介绍为什么我们没法通过使用一个类比(analogy)来预测长时的未来。想象下你在晚上开一辆车,然后你在看着前面车的车尾灯。你从前车的车尾灯接收到的光子(photons)数量会随着1/d^2而下降,这里d 就是你与前车的距离,这是假设空气是很透明的,不过现在假设在雾天。在经过很短的范围后,你从前车的车尾灯收到的光子的数量仍然按照1/d^2而下降。因为在一个很短的范围内,雾几乎不会影响任何灯光。不过在一段长距离来说,他下降的是按照e(-d) 的,因为雾是一个指数级的影响。雾会在每个单位距离上吸收一定部分的光子。所以对于短距离来说,雾看上去是透明的,不过对于长远距离来说,它看上去非常的不透明。所以在前面的车在我们之前认为非常可见的短距离模型中变成了完全不可见的。这使得人们会将后面的车也开进雾中,这会导致交通事故。
不过技术的发展同样是指数级的。所以在短时上,事情看上去变得会非常缓慢,所以也很容易预测。例如我们所有的人可以很容易的猜测到Iphone 6是什么样子的。不过在长时上,我们对未来的感知就像撞到了墙,就像是雾一样。所以对于机器学习和NN的长时未来真的是一个谜。我们没法知道在今后的30年时间中会变得怎样。也就是没法基于现在知道的基础上来预测,因为我们处在指数级的发展中。然而在短期内,例如3年或者10年,我们可以很好的预测。在今后的5年内你会惊讶大的DNN所做的事情。Hinton这里祝贺那些坚持看到现在的人们,希望你们能够enjoy这门课,然后在最后的期末考试中得到好成绩(个人:当然和咱没关系:))。