机器学习笔记-Neural Network

林轩田机器学习技法关于特征学习系列,其中涉及到 Neural Network Backpropagation Algorithm Deep Learning Autoencoder
PCA Radial Basis Function Network K -Means Matrix Factorization 等。

Motivation

从我们熟悉的 perceptron 说起, 在 perceptron 算法中,通过比较权重和特征的乘积与 0 的大小关系来对样本进行分类。如果我们现在将一堆的perceptron linear aggregation 的方式组合起来的话,我们可以使用如下的图示来表示:


这里写图片描述

对于一个输入 X ,和第一个perceptron g1的权重 w1 的乘积然后取 sign 可以得到 g1 的分类结果;和第二个 perceptron g2 的权重 w2 的乘积然后取 sign 可以得到 g2 的分类结果; 。然后对所有这些 g1,g2,,gT 的结果利用权重 α1,α2,α3,,αT 做一个线性的组合得到最后的模型 G 。该模型的数学表达式如下:

G(x)=sign(t=1Tαtsign(wTtx)gt(x))

通过上述的计算过程就可以得到一个样本 x 的输出G(x)

可以看到在这个模型中有

  • 两组权重,第一组 w1,w2,,wT 是每一个 perceptron 的权重,第二组 α1,α2,,αT 用来表示每一个 g 的“票数”或者说是权重。
  • 在这个模型中除了有两层权重之外,还有两层sign函数。也就是在每一个神经元中都有一个 sign 函数,将权重和特征的乘积映射到 {+1,1} 然后输出。使用阶梯状来表示得到下图。
    这里写图片描述

这就是一个利用 linear aggregation 将多个 perceptron 集成起来的模型,我们可以调节所有的参数 w α这样的模型有什么用呢?或者说通过这样的模型我们可以得到什么样的边界呢?


这里写图片描述

假设我们有两个 perceptron 分别是 g1 g2 ,现在我们看看当我们使用 linear aggregation 的方式将两个感知器或者说两条线合起来也就是得到一个 aggregation of perceptron 模型的时候,这个模型可以做到一个怎么样的边界呢?可能这个模型可以做到如右图所示的逻辑操作 AND 。也就是只有当两个 g 的结果都输出+1的时候, aggregation of perceptron 的输出为 +1 ,否则为 1 。下面我们来分析一下 linear aggregation of perceptron 是怎么做到 AND(g1,g2) 的。

一种可能的方式是:将第二层的权重值设置为 α0=1,α1=+1,α2=+1 ,也就是两个 perceptron g1 g2 的权重都是 +1 ,另外假设还有一个 perceptron g0 ,它的输出是 +1 (其实是偏置 b 的角色), 它的权重是1。那么 linear aggregation of perceptron 的数学表达式为: G(x)=sign(1+g1(x)+g2(x)) ,通过这样的设置 G(x) 就能做到如上图中的 AND 操作。事实上:如果 g1(x)=g2(x)=+1G(x)=sign(1+1+1)=sign(1)=1 ;如果 g1 g2 中至少有一个是 1 ,那么 G(x)=1 。这样我们可以得到, perceptron 通过 linear aggregation 的方式集成起来就可以得到一些比较复杂的非线性的边界。


这里写图片描述

这样的模型其实是非常有能力的,例如对于下图所示的数据来说,使用任意一个单一的 perceptron 都不能将数据划分的很好,但是当使用8个不同的 perceptron 的时候可以得到一个差不多的分类边界,当使用16个不同的 perceptron 的时候就能得到一个更为平滑的分类边界。


这里写图片描述

Multi-Layer Perceptrons: Basic Neural Network

尽管这样的模型非常的 powerful ,但是仍然有些事情是做不到的, 例如同样使用上文提到的两个 perceptron g1,g2 , 想要使用上文中的模型 G(x) 做逻辑操作 XOR(g1,g2) 是不可能的。 XOR(g1,g2) 当且仅当 g1 g2 中只有一个为 TRUE 时,结果为 TRUE ,否则为 FALSE 。我们注意到 XOR(g1,g2)=OR(AND(g1,g2),AND(g1,g2)) 。即其实我们需要先经过对 g1 g2 的两个 AND 操作,然后再将 AND 的结果做 OR 就可以得到 XOR 。其模型的示意图如下,通过这样的模型得到的结果就和 XOR(g1,g2) 的结果是一致的。


这里写图片描述

现在从单一的 perceptron 延伸到 linear aggregation of perceptron ,然后又延伸到 Multi Layer perceptron ,这样的模型其实就是神经网络最基本的结构。需要说明的是, 虽然 Neuron Network 跟生物体中的神经网络有一定的关系,做了一定的借鉴,但是从工程学来说我们处理的是一个数学模型,不需要受到生物体的神经网络的机制的影响,就像飞机是参考鸟制造的,但却不是通过摆动机翼来飞行的。


这里写图片描述

Neural Network Hypothesis

上一小节给出了神经网络的基本长相:


这里写图片描述

如果将每一层的计算当成是一个转化的话,那么上图中节点 OUTPUT 可以理解为输入是其上一层转换结果的一个线性模型: s=wTϕ(2)(ϕ(1)(x)) 。我们之前学习过的每一个线性模型都可以用在这里:如果我们想要做分类,那么就对 s 加一个sign函数;如果要做回归分析的话, s 直接作为最终的结果进行输出;如果要做soft分类的话,那么对 s 加一个logistic函数作为结果输出。在以后的讲解中,我们将线性回归模型作为神经网络最后一层所使用的模型,也就是关心神经网络最终的输出和真实输出的 square error


这里写图片描述

除了输出神经元部分,再来看看中间的其他神经元在做什么,通常每一个神经元会将上一层的输出(作为这个神经元的输入)和该神经元的权重的乘积 s 喂给一个函数做运算作为该神经元的输出,我们将这个函数称之为激活函数,常用的激活函数是tanh(s)。为什么不使用如上图中所示的 sign 函数, 或使用线性函数,即直接将 s 输出呢?原因是sign函数不是连续的,难以最佳化;如果每一个神经元都使用线性函数的话,那么整个模型仍然是一个简单的线性的模型,其表达能力和使用 perceptron 并没有区别。

tanh 函数的长相如下图:


这里写图片描述

可以看到它和阶梯函数 sign 长的有点像,又比 sign 容易做最佳化,并且和我们熟悉的 logistic 函数 θ 有很大的关系。其函数的表达式为:

tanh(s)=exp(s)exp(s)exp(s)+exp(s)=2θ(2s)1

在以后的讲解中,每一个中间层的神经元的激活函数都默认使用 tanh 函数。

Neural Network Hypothesis

一个简单的神经网络的结构如下:


这里写图片描述

该神经网络共有 3 层,为了描述方便,我们将输入层规定为第0层,第一层和第二层为 hidden layer ,每一层分别有 2 个神经元和3个神经元,第三层为输出层只有一个神经元。所以该神经网络的层数 L=3 , 每一层的神经元的个数为 d(1)=2, d(2)=3, d(3)=1

网络中的权重表示为 w(l)ij 。首先: w(l) 表示第 l1 层到第 l 层的权重,即w(2)表示第 1 层到第2层的权重; w(l)ij 表示第 l1 层中第 i 个神经元到第l层中第 j 个神经元的权重, 即w(2)23表示第 1 层中第2个神经元到第 2 层中第3个神经元的权重。其中:

  • 1lL
  • 0id(l1)
  • 1jd(l)

l1 层中由于会多一个偏置项,所以 i 的起始值为 0 而不是 1

定义了这些权重之后,我们就可以通过这些权重来计算每一个神经元的输入 s输出 x
l 层第 j 个神经元的输入为 s(l)j

s(l)j=i=1d(l1)w(l)ij x(l1)i

l 层第 j 个神经元的输出为 x(l)j

x(l)j=tanh(s(l)j)if l<Ls(l)jif l=L

s(l)j x(l)j 的关系是: s(l)jtanh(s)x(l)j

通过上面的计算方法,给定一个样本 x ,我们将其作为输入层x(0),依次计算每一层的输出 x(l) ,最终在 L 层给出预测值x(L)1
通常我们可以神经网络中每一层的神经元的个数来描述一个神经网络的架构,例如 3 -5- 1 NNet 表示的是一个 3 层神经网络,其输入层有 3 个神经元,隐藏层有 5 个神经元,输出层有 1 个神经元。这样我们也可以得知这个网络中所有的权重的个数为 (3+1)×5+(5+1)=26 个。

Neural Network Learning


这里写图片描述

现在我们已经对神经网络的基本工作方式有了直观上的了解:将输入 x 经过与第1层的权重计算得到第 1 层神经元的输入, 经过hyperbolic tangent转换为第 1 层的输出, 。现在我们要解决的问题是如何从资料 data 中学习到这些权重,使得改模型的 Ein 最低。当只有一个神经元的时候,这个模型退化为 Perceptron ,那么我们可以通过 PLA 算法来得到最终的权重;如果有多个神经元,也就是有了一层隐藏层的时候,这个模型其实就是 aggregation of perceptron ,这个时候可以通过 gradient boosting 的方式学习得到其中的权重,即每一次加一个神经元到网络中,直到达到满意的结果为止。

当有多个隐藏层的时候,该如何计算其中的权重呢?在 regression 的设定下,我们希望对于某一个样本点 (xn,yn) 来说, 该模型的输出 h(xn) target value yn 之间的 squared error 最小,即对于一个样本点来说, 我们想要最小化 en=(ynh(xn))2=(ynNNet(xn))2 。如果我们知道 en 关于每一个变量 w(l)ij 的变动是如果变化的, 那么我们就可以更新 w(l)ij 来最小化 en , 而梯度 enw(l)ij 正好告诉了我们这件事情, 当我们知道了 en 关于每一个变量的 w(l)ij 的梯度之后, 就可以使用 gradient descent(GD) 或者 stochastic gradient descent(SGD) 来找到一步一步的更新 w(l)ij 最后找到最佳的权重。所以现在的问题只剩下如何计算 enw(l)ij

从简单的开始算起, 首先我们计算 enw(L)i1 , 也就是 en 对于最后一层权重的偏导数。 en w(L)i1 的关系如下:

en=(ynNNet(xn))2=(yns(L)1)2=(yni=1L1wLi1x(L1)i)2

根据求导的链式法则可以得到:
enw(L)i1=ens(L)1s(L)1w(L)i1=2(yns(L)1)(x(L1)i)here 0id(L1)(1)

那么现在对于 L 中的每一个权重,我们都已经可以通过上式进行计算了。
那么en对于一般的第 l (1l<L)中的权重 w(l)ij(0id(l1);1jd(l)) 的偏导仿照 (1) 式可以得到:
enw(l)ij=ens(l)js(l)jw(l)ij=δ(l)j(x(l1)i)(2)

其中 δ(l)j 使我们目前算不出来的, δ(l)j=ens(l)j , 表示 en 对于第 l 层第j个神经元的偏导。

所以现在的问题剩下如何求解 δ(l)j=ens(l)j

现在我们来分析下 s(l)j 是如何影响到 en 的,

s(l)jtan hx(l)jw(l+1)jks(l+1)1s(l+1)2s(l+1)ken

同样使用求导的链式法则:

δ(l)j=enslj=k=1d(l+1)ens(l+1)ks(l+1)kxljxljslj=k=1d(l+1)(δ(l+1)k)(w(l+1)jk)(tanh(s(l)j))

根据这样的推导我们发现,如果我们知道了 δ(L) ,就能计算出 δ(L1) ,就能计算得到 δ(1) , 而根据前面的计算可以知道 δ(L)=2(yns(L)1)
另外根据

tanh(s)=exp(s)exp(s)exp(s)+exp(s)
可以很轻易的求出 tanh(s)
至此我们就得到了计算梯度 (2) 的方法。有了计算梯度的方法,那么我们就可以利用梯度下降类方法最小化 en 并确定最终的权重 w(l)ij 。通过上面的推导得到了一个很著名的算法: Backpropagation Algorithm

Backpropagation Algorithm

initialize all weights w(l)ij
for t=0,1,2,,T

  1. stochastic:randomly pick n{1,2,,N}
  2. forward: compute all x(l)i with x(0)=xn
  3. backward: compute all δ(l)j
  4. gradient descent: w(l)ijw(l)ijηx(l1)iδ(l)j

return gNNET=(tanh(jw(2)jktanh(iw(1)ijxi)))

即首先初始化所有的权重 w(l)ij ,在每一轮更新中任取一个样本点 (xn,yn) (步骤 1 。计算梯度 x(l1)iδ(l)j 并且更新(步骤 4 。要完成步骤4,就需要知道所有的 x(l1)i 和所有的 δ(l)j ,其中所有的 x(l1)i 通过前向传播(步骤 2 得到所有的δ(l)j通过反向传播(步骤 3 得到。

考虑上面的过程我们发现,由于使用的是随机梯度下降算法, 对于仅仅一个样本点, 我们就要计算进行一次前向传播得到所有的 x(l1)i, 完了之后进行一次反向传播得到所有的 δ(l)j , 计算完了之后也只能向着梯度下降的方向走一点, 并且还有可能走向的是局部最优解。所以为了解决这样的问题,通常使用的方法是 mini - batch SGD ,这种方法介于 SGD GD 之间。一种做法是, 每次不再只是选取一个样本点, 而是选取多个,并行的计算这些样本点各自的 x(l1)i δ(l)j ,最后沿着所有这些点的梯度方向进行参数 w(l)ij 的更新。

考虑一个问题:
根据以上的计算可以得到 enw(L)i1=2(yns(L)1)(x(L1)i) , 当什么时候 enw(L)i1=0 呢?

  • yn=s(L)1
  • x(L1)i=0
  • s(L1)i=0

Optimization and Regularization

Neural network optimization

上一小节介绍了训练一个神经网络的基本方法,即通过 GD 类的算法来最小化 Ein 。需要注意的是, 由于包含了很多层的转换 tanh ,所以最终的目标函数很有可能不是 w 的凸函数,也就是说这些函数是non- convex 的,有多个局部最优值。这样使用上一小节中给出的梯度下降的方法就会最终找到 local minimum ,而不一定是 global minimum
实际应用中我们通常使用一些技巧来得到比较好的结果, 例如,如果在初始化的时候将权重设置的过大,那么 tanh(wx) 的偏导就会很小,这样导致权重的更新会非常的缓慢,所以通常会初始化一些比较小的, 并且是随机的权重。 通过在不同的初始权重下进行更新,可能会得到不同的 local minimum ,这样可能会得到不错的结果。

Regularization for neural network

有理论证明在使用 tanh 作为神经网络的激活函数时, 该模型的 dvc=O(VD) ,其中 V 表示神经元的数量,D表示权重的数量。这表明可以通过增加神经元的个数来增强模型的复杂度,当然这样就有可能会 overfitting 。为了避免过拟合通常我们使用的方法是添加正则化项。例如可以在目标函数中添加 L2 regularizer Ω(w)=(w(l)ij)2 。但是这样的正则化项的一个缺点是会等比的将原始的权重缩小。我们希望得到一些 w=0 ,虽然 L1 regularizer |w(l)ij| 可以做到, 但是却难以微分导致无法最优化。所以通常在神经网络中使用的是 weight elimination regularizer(scaled L2)(w(l)ij)2((w(l)ij)2+1 ,通过这样的正则化项,可以得到比较稀疏的权重。为什么呢?

除了 weight elimination regularizer 之外, 在神经网络中还有另一个经常使用的用于 regularization 的机制: early stopping 简单的说,通过提前终止权重的更新,可以减少 w 的搜索范围从而做到降低模型的复杂度。提前终止这样的机制可以通用于所有使用梯度的方法中来做regularization, 至于要在何时停止,即更新多少步,那么可以使用 validation 的机制来进行确定。

Other

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值