
Deep Learning 学习笔记 02 – Supervised Learning (1)
什么是监督学习(Supervised Learning)?
这一课讲的是监督学习,首先还是先介绍一下什么是监督学习。监督学习是机器学习的一种方法,或者是一种模式,用于与无监督学习区分。监督学习的框架是通过带标记的(labeled)数据集学习。带标记的数据集具体地来讲是一组对应的 {x(i),y(i)}i,x(i) 是一个输入,y(i) 是对应的输出。一般来讲,监督学习是通过SGD用一个网络来拟合一个数据集,使得给出 x(i),网络的输出 f(x(i)) 和 y(i) 比较接近(loss小)。
但是需要注意的是,我们训练网络的目的并非让它在训练集上的loss最小。这块大概有这样的逻辑:
1. 我有一个总分布(population distribution)D,这是一个在自然界中真实存在的分布。我可以从中随机取出 (x,y)∼D。我希望能够通过 x 预测出 y。也就是说,我需要拟合 D。
2. 但是由于我并不能直接获得 D,所以我只能从随机采样出一个数据集 S={x(i),y(i)}Ni=1, (x(i),y(i))i.i.d.∼D。我定义实验分布(empirical distribution),Pr[(x(i),y(i))]=1/N。 我至少希望我的模型很好的拟合了实验分布。
3. 为了明确我的目的,我们引入损失函数,希望我的模型最小化一个分布上的损失函数
4. 但是拟合了实验分布并不代表拟合了总分布,比如 f(x)={y(i),∃x(i)∈S,x=x(i)anything,otherwise。为此,我把数据集分成两部分,训练集(training set)和验证集(validation set),如果我的模型从训练集上学到的东西在验证集上拟合得很好,那么我可以认为他在总分布上也拟合的很好。
5. 请避免利用验证集进行大量微调(fine-tune),如果需要,请再分出一个验证集(
有几个重点:目的是总分布,用损失函数作为目标,只能在训练集上训。,
分类问题(Classification)
监督学习里有主要有两种类型:分类问题和回归问题(Regularization)。分类问题就是给你一些类型,你的网络能够对输入分类。一般来说你的网络输出是一个概率分布。
对于分类问题,我们一般希望找到
θ∗=argminθ∈ΘLossS(θ)=argminθ∈Θ∑(x,y)∈Serr(f(x;θ),y)PrS[(x,y)].
这里 err 是一个判断模型输出与 y 的符合程度的东西,对于二分类问题(y∈{0,1}),可以定义 err(p,y)=−logpy,其中 p0+p1=1。(p0+p1=1这个限制可以让单个标量输出先过一个sigmoid得到 p0∈[0,1],然后 p1:=1−p0 来得到。)
对于多分类问题,也可以用类似的方法,使用softmax函数,softmax(z)i=ezi∑ezi。err(p,y)=−logpy。
这样算出来的东西正好是交叉熵(cross-entropy)。这个损失函数被成为NLL(negative log-likelihood) loss或cross-entropy loss。Softmax函数在分类问题中被广泛使用,一般来说,效果比L2-norm或者L1-norm好?。
//省略一些计算梯度的细节
越深越好?
考虑计算梯度的时候每一层都会乘上一个 σ′(x),但是注意到sigmoid和tanh在 |x| 较大的时候,导数几乎为0,容易发生梯度消失。(具体可能之后讲?)
处理这个问题可以考虑ReLU。
ReLU
ReLU也有一些问题,比如ReLU在 x=0 导数无定义。一个解决方法是使用次梯度(subgradients),用任意一个0 ~ 1之间的数作为ReLU在 x=0 的导数。但是实际上由于x是实数,这种情况几乎不会发生。类似的,我们可以处理maxpooling的梯度。
ReLU另一个问题是当 x<0,导数全为0。如果对数据集中所有数据,某个神经元的输出都是负数,经过ReLU就都是0,导数反向传递回来也都是0。这时候这个神经元的参数很难再变化了,这就是“神经元死亡”。有时候学习率太大,也很可能引发这样的现象。一个好处是,这自动压缩了网络的大小,我们可以在训练结束后手动删除死亡的神经元。但是这个问题还是存在。对此人们想出了Leaky ReLU、ExponentialLU等解决方案,大概是把ReLU负数的那段稍微做一点变化。
//省略 http://playground.tensorflow.org/
卷积(convolution)
神经网络可以理解成对某种特征的提取。在用神经网络处理音频序列或者图像时,我们认为同样的一小段音频或者图案,无论在什么位置,应当都是一样的特征,于是我们想要把网络的一部分应用到图像的每个位置上。
具体来讲,我们希望某一层的一些神经元共享同样的参数但是作用的位置不同。用一维的输入,或者说一段音频为例,输入是 x1,…,xn。
yi=k∑j=0xi+jwj
其中 w 是共享的权值,也被成为核(kernel)。这个操作被称为卷积。(实际上这个是corelation,但是机器学习上好像都叫卷积了。其实就是 w 下标顺序反一下。)
利用卷积,我们可以将神经网络的某些层变成卷积层。用不同的卷积核,我们可以得到很多通道(channel)(类似图像的RGB三个通道),同时提取不同的特征。
卷积减小了参数的数量,也加速了计算。同时卷积通过加入先验知识“特征与位置无关”,限制了神经网络的能力,一定程度上减小了过拟合(overfit)。
//省略手动算卷积的例子
填补边界?(Padding) 和 步幅?(stride)
注意之前讲的卷积,我们发现一个长度为 n 的向量x,与一个长度为 k 的卷积核w,卷积之后的长度变成了n−k+1。我们希望卷积之后的向量长度不变,那么我们就需要padding,也就是在最初的向量x两端加一些位置。这些位置的值有不同的设置方式,比如填常数,比如重复边界的值,比如镜像边界的值等。
除了padding,卷积的时候还可以调整stride,注意到直接计算,x的同一个位置会被统计很多次,我们可以定义一个stride,s。
yi=k∑j=0xi×s+jwj
这样以=一来,我们成倍减小了向量的长度,也减小了计算的时间空间。
padding和stride也可以应用在二维的图像上。
//省略一些故事
No Comments