这是DL的发明人Hinton在多伦多大学的2013年冬季教授de课程,并将视频分享到coursera网站上。其中不但有视频,也有课件,但是Hinton主页上还有他上课的课后问题,Hinton告诉学生这些视频作为课前看看,课中在讨论和上课,其实这种方法很好。可惜估计一辈子也看不到大牛了,只能沾沾他的放到万里的光了,不过Hinton的课程的确每节课包含的信息太多了,还是较为难消化的,不如ng说的通俗易懂,看来传道授业上还是ng更胜一筹。Hinton针对研究生的课程是很大的贴近DL的,但是没有视频,只有课件,可惜了。
一、我们为什么需要机器学习
要回答这个问题首先要知道什么是机器学习。Hinton认为对于很多问题来说,例如:在一个混乱的场景中通过不同的光照条件下如何用一种新颖的观点去正确的识别一个3D对象,计算一个信用卡的交易是否是诈骗等问题的程序是很难写的。因为我们不知道我们的大脑是如何处理这些问题的,即使我们知道原理,这个程序也是相当,相当复杂的。而且对于第二个问题,没有任何的规则既能够很简单而且很可靠。我们需要计算大量的弱规则(weak rules),而且诈骗是个动态的目标,我们没法将程序进行固定,这个程序需要一直的学习保持changing。
个人观点:Hinton认为的机器学习其实就是在模拟人脑的情况下如何让程序简单,可靠。
不同于以前针对每个具体的任务我们去写一个单独的程序,我们通过收集大量的样本,然后在给定输入的情况下指定正确的输出,一个机器学习算法就是通过在这些样本的基础上通过生成一个程序来完成这个工作。这个程序是通过学习算法生成的,看上去是不同于手写的程序,例如它有可能会包含着百万级别关于如何衡量证据的参数(其实就是权重)。如果我们的工作是正确的,那么这个程序在新情况下工作的将和我们之前训练情况下的一样好。如果数据集更换了,那么这个程序也能够很容易的改变并在新的数据集上进行训练。而且现在这种时代,数据的计算所花的代价比支付一个人去写一个具体任务的代价要低好多(机器成本和人工成本)。所以现在能够提供一个大而复杂的程序去处理这些不同的任务。
很多任务可以通过学习来完美的解决,比如:一、模式识别:真实场景中的对象识别、人脸验证或者人脸表情识别、口语识别;二、异常识别:信用卡交易中不寻常的序列、核能发电站的传感器读数的不寻常模式;三:预测:未来股票的价格或者货币交易率、一个人喜欢什么样的电影等。
在生物实验中,果蝇因为获取方便而且繁殖迅速加上人类对果蝇已经了解很多,所以它是生物实验的标准数据,而对于ML来说,MNIST也是这样一个数据库,首先是这个数据的公开性,而且可以通过一个适中大小的NN来快速的学习,而且因为有各种ML方法在这个数据上实验,使得我们可以很容易的相互之间进行比较。所以这里将MNIST作为一个标准任务数据集。
这个数据集已经成功的被NN征服了,但是其中具体的原理却有些不是很明朗。假设上图中绿色框框中的数字2,给你一串阿拉伯数字,你能猜得出这是2,但是到底是什么让他成为2,这个就不知道了。如果说将其中的一个重叠到另一个,会发现是不完全匹配(不重合),如果稍微的倾斜一下,那么就更不可能重合了,所以这里不是用简单的模板 去套,这就是为什么MNIST对于ML来说是个好数据集。相对于现在来说,MNIST是已经轻松的被ML解决了,所以朝着更宏大的目标看去,ImageNet任务。现在可以创建有着100百万个参数的NN,从1.3百万个高分辨率的训练图像中区分1k个目标类别。在2010年的挑战赛中top 1上获得了47%的错误率,在top 5上获得了25%的错误率。在2012年Krizhevsky创建了一个非常深的NN,并在top1 上获得了低于40%的错误率,在top 5上获得了少于20%的错误率。(在lecture 5中详细说明)。
如上两个图,第一个图是为了说明在很多情况下,我们在这个数据集上获得的效果还是可以的,但是因为单独的图片上很多信息的缺失,比如第一个和鸡头一样的图片,那个你完全肉眼猜不出是鹰还是水獭什么的,其实觉得这个可以接受吧,因为我们人类可以看到整个图像,这里是数据不充分的情况下的;第二幅图是为了说明我们的NN可以用在很广泛的对象识别中,但是也因为如上图中的信息缺失或者与其他对象超相近而识别错误。
NN应用的另一个广泛的任务是:语音识别,一个语音识别包含着差不多3个阶段:
预处理:先将这个声波转换成声音系数。然后差不多每10毫秒提取一个新的向量。
声音模型:通过获得一些声音系数的相邻向量,并用他们去对那些被使用的音素进行下赌注。就像一个小窗口,我们去猜测这里面的音素是什么,音素的哪部分在里面。一个很好的语音识别系统,需要对一个音素有很多可选的模型,每个模型都有这三个部分。所以会有成千的部分去需要猜测这是什么(这段Hinton说的 不懂啊,我不是做语音识别的,所以挺迷糊的),所以需要对这成千以上的进行下赌注。
解码:一旦对上面的都进行下赌注了,就可以进入到解码阶段的工作,它可以将找到合理的猜测,然后拼接称成对应于各种各样的事情,即序列的下赌注。
多伦多大学的DNN的先驱Geroge Dahl和Abdel-rahman Mohamed现在将之前的ML方法来放在声音模型上,现在都开始用在实际的系统上。
这两个先驱采用了许多二值神经元,采用许多声音帧,然后在标签上进行下赌注。他们使用的是小型的数据库,而且183个可选的标签,并做了一些预训练,在最后获得了20.7%的错误率。这个数据集在语音识别中就和MNIST一样的地位。
上图就是12年的结果图,来自于微软研究院,IBM和谷歌的。比如微软的,从之前最好的27.4%的错误率改成现在18.5%的错误率,而且之前想有更好的效果还得训练2000个小时,现在只要训练309个小时就能达到相似的结果。
二、什么是神经网络
研究神经计算的原因是为了:理解大脑是怎样工作的;为了从神经元获得如何并行计算的灵感和他们之间自适应的连接(比如大脑对于视觉识别等来说是轻松应对,但是对于乘法计算等并行却不是很好);从大脑中获得新颖的学习算法去解决实际的问题,如果我们知道大脑实际是怎样工作的,那么学习算法将会变得很有用,这也是这个课程的目的所在。这部分主要说的就是生物上的神经网络,就是给个直观的理解(对于高中生物联赛二等奖的来说,轻松应对,所以这部分就不说明了,直接贴slides)。
下面这个slide就是为什么很多人觉得可以做一个通用的模型去应对所有的任务,就像人一样:
三、神经元的一些简单模型
虽然现在使用的神经网络模型没有上面说的那么复杂,但是也足够复杂了,对于现在的我们来说。我们现在的模型都可以称之为理想化的神经元模型,是移除了一些具体的条件,但是可以实质上的反映真实的神经元的本质的,这也允许我们能够利用数学去对它和与它相似的系统进行分析,而且一旦我们懂得了基本的原理,那么就可以一点点的把它变得更复杂,使这个模型更真实。但是要时刻记得,这个模型其实还是错的,不是真正的神经元模型,比如真实的神经元之间的联系是实值(应该说的是连续的意思吧)的而不是现在这种离散的激活值,但是采用离散的这种想法仍然有助于ML的发展。
线性神经元是现今最简单的了,他通过限制计算部分来让我们懂得一些最基本的情况,然后在进行复杂的扩展。
上图就是线性神经元的计算函数。
早在1943年受冯诺依曼的影响McCulloch-Pitts等有了新的想法,首先通过对输入进行权重计算和,然后当这个权重和超过了一个阈值,那么就会输出一个激活脉冲。McCulloch和Pitts 认为,每个脉冲就像是计算一个命题的真值,并将每个神经元的真值结合起来来计算的另一个命题的真值。这是1940年代的想法。
上图就是1940年代的感知机所干的事情。
对于如何写这个线性神经元函数,其实下面的两种方法都是可以的,只是在不同场合考虑不同的计算方便:
将线性神经元和二值阈值神经元(上面的感知算法)结合起来的就是修正线性神经元,有时候也叫做线性阈值神经元。首先计算输入的线性权重和,然后在输出的时候是非线性的,遵照下面的函数来进行:
上图中的函数图好像SVM的原理图啊(我之前写的svm简介中的逼近图)
个人认为:这种神经元的计算方法是离真实的又靠近了一步,因为在当超过阈值的时候那么激活的强度不应该被限制,而是随着计算结果的变化,激活强度有所变化,而当被抑制的时候,那么就是一直处于抑制状态(这里不考虑真实神经元的反馈和强抑制情况)。
但是在现在这个时代使用的最频繁的还是sigmoid神经元,他是有着一个实值(看来real-valued,应该就是连续的意思吧)输出,而且很平滑,并在输出上还有所界限:sigmoid函数使用的是逻辑函数,而且有着很简单的导数,利于学习。
sigmoid神经元
随机二值神经元采用的计算方法和sigmoid神经元是一样的,但是他是将输出的 y看成概率,因为概率的总和为1,所以看上去理所当然,随机在于输入是随机的(随机变量),但是输出是通过sigmoid函数决定的。(说的烦了点,其实就是个简单的用概率的观点来解释罢了)。
四、一个学习的简单例子
这里举得例子是如何去识别手写形状(其实就是用的MNIST)。考虑一个有着两层神经元的NN,底层神经元表现像素的强度,顶层神经元表现已知的形状。当一个像素是黑色的,那么他就有资格投票自己属于什么样的形状(即这个像素是属于0的 还是1的这种),当所有的像素都投票之后,获得最多得分的就是所猜测的数字的形状(Hinton这里说的就是集体专家系统的思想)。
上图就是,考虑一个像素他到底投给哪个形状的票。
很自然的权重就是介于输入和输出之间的边的值,对于权重都在干森么,我们不知道,所以可视化也是个很好的任务(这里举得例子是第一层权重的可视化,高层权重的可视化是更加麻烦的,参考: visualizing higher layer features of a deep network),有利于知道他们是怎么工作的。所以,针对每个输出单元,我们都建立一个他们对应的输入图像的“map”,去显示从输入像素到输出图像中对应的像素的强度。上图中,输入图像是任意的(这里举个例子是2),然后往上的那个是个映射,是每个像素对应输出的权重映射,这里的权重都是初始化为随机值的,然后不断的通过给定一个图像,就通过已激活的像素进行递增这个当前正确类别的像素强度,但数量多了,就会造成失控,所以需要从所有的激活像素中进行递减。(其实说的这么多就是简单的BP算法,先前向传播,然后后向传播)
上图就是经过很多的样本的训练之后所获得的结果图。并可以看出,其实这不是模版的嵌套,因为仔细观察上图中7和9,他们下半部分都是没有正权值的,因为他们两个来说,下面的部分是相同的,没有决定性,所以权值显示的都是具有决定性的信息。但是这个学习算法是很简单的,所以学到的决策信息不多,相反他的确学到一些形状模版的东西,最后的结果其实是通过这些模版进行比对,重合最多的数字就是所训练的结果。但是对于这种想法来说,因为手写数字是比较复杂的,所以没法匹配。为了获得一个数字的所有可能的变形,需要学习他们所有的特征,这量还是有些大的,因为变形是无止境的。
五、三种学习的方法
无监督学习;增强学习;有监督学习。Hinton说这个课程的上部分是有监督学习,下部分是无监督学习,增强学习他不打算讲。
对于有监督学习来说:每个样本都包含着输入向量和一个目标输出(其实就是标签)。他有着回归和分类两钟。回归:就是目标输出是一个实数或者是一个完整的实数向量,例如接下来6个月的股票价格或者明天中午的温度等等;而分类的目标输出是一个类别标签,最简单的标签就是1和0,当然也有很多可选的标签。
有监督学习的典型工作方式:首先从许多的模型中选择一个模型,这里可以看作是一个模型函数 ,通过使用有着许多数值参数的W,来将输入向量 X,映射到输出向量 Y上。这里的拟合就是通过模型的猜测输出能够和给定的标签之间的差距最小。最常用的回归上的损失函数就是 1/2 (y-t)^2。
增强学习:(这是ng的拿手好戏,他做无人直升机可是做了好久)增强学习的输出是一个动作或者一系列的动作,通过与实际的场合下的环境互动来决定动作,增强学习的目标就是使得选择的每个动作都能够最大化对未来的期望,而且使用一个折扣因子来计算未来的期望,所以可以不用看的太远,而且增强学习很难,因为未来的期望是很难去知道是对还是错的,而且一个标量的期望也给不了太多有用的信息。所以没法使用百万级别的参数去学习增强学习,其他两个可以,而且增强学习的参数一般也就是100或者1k的级别。
无监督学习:在接近40多年中,无监督学习一直被ML社区的人所忽略,大家一直以为无监督学习就是聚类。一个重要的原因是因为大家不知道无监督学习的目标是什么,一个主要的目标其实是产生输入的内部表征,然后将他用在后续的有监督或者增强学习上;(后一个例子 不知道怎么理解,理解不了Hinton说的是什么)你能够用双眼去观察物体表面的距离,而不需要脚踩的一步一步的去量。
其他无监督学习的目标就是:他能提供关于输入数据的一个紧凑的,低纬度的表征:高维度输入通常都可以基于一个(或几个)低维度输入()参考线性代数中的基向量表示法,PCA就是广泛的用来查找一个低纬度表征的线性方法;能够提供关于输入数据的具有经济性的高维度表征,例如特征提取:二值特征通常来说是很经济的,因为只需要一位就能表达,而且对于高维的来说,因为是实值特征,所以很多值是接近于0(稀疏的原理);第三个目标就是找到输入的一个合理的聚类,聚类可以被视为一个非常典型的稀疏编码,因为差不多所有的特征中只有一个是非0的(这里暂时理解无能,估计看了后面的,回头看就好多了)。