Loading [MathJax]/jax/output/HTML-CSS/jax.js

Deep Learning 学习笔记 02 – Supervised Learning (1)

Deep Learning 学习笔记 02 – Supervised Learning (1)

什么是监督学习(Supervised Learning)?

这一课讲的是监督学习,首先还是先介绍一下什么是监督学习。监督学习是机器学习的一种方法,或者是一种模式,用于与无监督学习区分。监督学习的框架是通过带标记的(labeled)数据集学习。带标记的数据集具体地来讲是一组对应的 {x(i),y(i)}ix(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:=1p0 来得到。)

对于多分类问题,也可以用类似的方法,使用softmax函数,softmax(z)i=eziezierr(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=kj=0xi+jwj


其中 w 是共享的权值,也被成为核(kernel)。这个操作被称为卷积。(实际上这个是corelation,但是机器学习上好像都叫卷积了。其实就是 w 下标顺序反一下。)

利用卷积,我们可以将神经网络的某些层变成卷积层。用不同的卷积核,我们可以得到很多通道(channel)(类似图像的RGB三个通道),同时提取不同的特征。

卷积减小了参数的数量,也加速了计算。同时卷积通过加入先验知识“特征与位置无关”,限制了神经网络的能力,一定程度上减小了过拟合(overfit)。

//省略手动算卷积的例子

填补边界?(Padding) 和 步幅?(stride)

注意之前讲的卷积,我们发现一个长度为 n 的向量x,与一个长度为 k 的卷积核w,卷积之后的长度变成了nk+1。我们希望卷积之后的向量长度不变,那么我们就需要padding,也就是在最初的向量x两端加一些位置。这些位置的值有不同的设置方式,比如填常数,比如重复边界的值,比如镜像边界的值等。

除了padding,卷积的时候还可以调整stride,注意到直接计算,x的同一个位置会被统计很多次,我们可以定义一个stride,s
yi=kj=0xi×s+jwj

这样以=一来,我们成倍减小了向量的长度,也减小了计算的时间空间。

padding和stride也可以应用在二维的图像上。

//省略一些故事

 

点赞 0

No Comments

Add your comment

身为冒险者,如果安静的老死在床上,那简直就是耻辱!