机器学习技法 之 神经网络(Neural Network)_FlameAlpha的博客-程序员秘密

技术标签: 机器学习  # 机器学习技法  神经网络  

动机(Motivation)

感知机的线性融合(Linear Aggregation of Perceptrons)

中文中的感知器或感知机均指的是Perceptron 。

将 Perceptrons 作为 Linear Aggregation 的基模型,搭配方式的网络结构图图如下所示:
在这里插入图片描述
可以看出这里使用了两层的权重 w t \mathbf{w}_t wt α \alpha α,和两层的 sign 函数分别在 g t g_t gt G G G。那这个模型 G G G 可以实现什么样子的边界(boundary can G implement)呢。

逻辑操作(Logic Operations with Aggregation)

首先来看一下如何实现逻辑与的操作呢?
在这里插入图片描述
假设负样本对应 FALSE ,同时正样本对应 TRUE。那么在二维平面的与操作对应的图形展示如上图所示,那么实现该功能的感知器的线性融合具体实现网络图为:
在这里插入图片描述
那么该网络实现的功能函数为:

G ( x ) = sign ⁡ ( − 1 + g 1 ( x ) + g 2 ( x ) ) G ( \mathbf { x } ) = \operatorname { sign } \left( - 1 + g _ { 1 } ( \mathbf { x } ) + g _ { 2 } ( \mathbf { x } ) \right) G(x)=sign(1+g1(x)+g2(x))

也就是说当 g 1 ( x ) = g 2 ( x ) = + 1 ( T R U E ) g _ { 1 } ( \mathbf { x } ) = g _ { 2 } ( \mathbf { x } ) = + 1 ( \mathrm { TRUE } ) g1(x)=g2(x)=+1(TRUE) 时, G ( x ) = + 1 ( T R U E ) G ( \mathbf { x } ) = + 1 ( \mathrm { TRUE } ) G(x)=+1(TRUE)。其他情况下: G ( x ) = − 1 ( F A L S E ) G ( \mathbf { x } ) = - 1 ( \mathrm { FALSE } ) G(x)=1(FALSE)

G ≡ AND ⁡ ( g 1 , g 2 ) G \equiv \operatorname { AND } \left( g _ { 1 } , g _ { 2 } \right) GAND(g1,g2),实现了与操作,当然或操作以及非操作也可同理实现。

强大但有局限性(Powerfulness and Limitation)

先说它的 Powerfulness ,以下图为例:

在这里插入图片描述

如果目标边界是一个圆形,园内为正样本,圆外为负样本。当然单个样本是无法实现,这样的样本分类的,但是随着 Perceptrons 的增加,边界越来越光滑并趋于一个目标边界(target boundary 圆形)。

实际上如果有足够多的 Perceptrons ,可以组成任意形状的光滑凸多边形,当然要注意 d v c → ∞ d _ { \mathrm { vc } } \rightarrow \infty dvc,即 Perceptrons 过多导致的模型复杂度过高。

但是这个强大的模型,是无法实现 XOR(Exclusive OR)操作的。

多层感知机(Multi-Layer Perceptrons: Basic Neural Network)

对于不可分的数据一般的操作都是使用多次转换,那么这里如果实现异或操作呢,那就是先使用与操作进行转换,再使用或操作进行转换:

X O R ( g 1 , g 2 ) = OR ⁡ ( AND ⁡ ( − g 1 , g 2 ) , AND ⁡ ( g 1 , − g 2 ) ) \mathrm { XOR } \left( g _ { 1 } , g _ { 2 } \right) = \operatorname { OR } \left( \operatorname { AND } \left( - g _ { 1 } , g _ { 2 } \right) , \operatorname { AND } \left( g _ { 1 } , - g _ { 2 } \right) \right) XOR(g1,g2)=OR(AND(g1,g2),AND(g1,g2))

具体实现的网络结构图如下:

在这里插入图片描述
单个感知机很简单、有局限性,所以使用 aggregation of perceptrons 建立单层的感知机,单层感知机也存在自己的局限性,所以由此提出了多层感知机的概念。

perceptron (simple) ⇒ aggregation of perceptrons (powerful) ⇒ multi-layer perceptrons (more powerful)

多层感知机实际上来源于生物神经元(Biological Neurons),是一个仿生物模型(bio-inspired model),所以也称之为神经网络。

神经网络输出端假设函数(Neural Network Hypothesis: Output)

在这里插入图片描述
对于上述的两层神经网络,可以写出 OUTPUT 端的分数值为:

s = w T ϕ ( 2 ) ( ϕ ( 1 ) ( x ) ) s = \mathbf { w } ^ { T } \phi ^ { ( 2 ) } \left( \phi ^ { ( 1 ) } ( \mathbf { x } ) \right) s=wTϕ(2)(ϕ(1)(x))

可以看出输出端是一个简单的线性模型,所以下面这三种原来学过的线性模型都可以用在这里:
在这里插入图片描述
本文中套用的是 Linear Regression(with squared error),进行讲解的。当然也可以延伸到其他线性模型。

神经网络隐含层假设函数(Neural Network Hypothesis: Transformation)

隐含层实际上就是中间转换层。在前文中,中间转换层均适用的是 Perceptron。但是其使用的 sign 的输出值是一个离散值,难以优化权值 w \mathbf{w} w。同时如果使用 linear,那么整个神经网络也是线性的,那么用处不大(less useful)。

比较流行的是 tanh(Hyperbolic Tangent,双曲正切函数),其数学表达如下:

tanh ⁡ ( s ) = exp ⁡ ( s ) − exp ⁡ ( − s ) exp ⁡ ( s ) + exp ⁡ ( − s ) = 2 θ ( 2 s ) − 1 \begin{aligned} \tanh ( s ) & = \frac { \exp ( s ) - \exp ( - s ) } { \exp ( s ) + \exp ( - s ) } \\ & = 2 \theta ( 2 s ) - 1 \end{aligned} tanh(s)=exp(s)+exp(s)exp(s)exp(s)=2θ(2s)1

三种曲线如下图所示:
在这里插入图片描述
可以看出 tanh 是平滑曲线,易于优化,并且更接近于生物神经元。在本文中便以 tanh 作为 transformation function。

那有了输出端假设函数和隐含层的假设函数,原来的神经网络问题便可以转换为下图的结构:
在这里插入图片描述
那么现在做如下定义:

每一层神经元(Node)的个数由 d ( ℓ ) d ^ { ( \ell ) } d() 表示,那么从输入(0层)到输出(L层)的由个数表达的连接方式为:

d ( 0 ) − d ( 1 ) − d ( 2 ) … − d ( L ) d ^ { ( 0 ) } - d ^ { ( 1 ) } - d ^ { ( 2 ) } \ldots - d ^ { ( L ) } d(0)d(1)d(2)d(L)

权重的表示比较复杂, w i j ( ℓ ) w^{ ( \ell ) }_{ij} wij() 表示的是由第 ℓ − 1 \ell-1 1 层第 i i i 个神经元向第 ℓ \ell 层第 j j j 个神经元进行传输时所乘的权重:

w i j ( ℓ ) : { 1 ≤ ℓ ≤ L  layers  0 ≤ i ≤ d ( ℓ − 1 )  inputs  1 ≤ j ≤ d ( ℓ )  outputs  w^{ ( \ell ) }_{ij} : \left\{ \begin{array} { l l } 1 \leq \ell \leq L & \text { layers } \\ 0 \leq i \leq d ^ { ( \ell - 1 ) } & \text { inputs } \\ 1 \leq j \leq d ^ { ( \ell ) } & \text { outputs } \end{array} \right. wij():1L0id(1)1jd() layers  inputs  outputs 

分数 s j ( ℓ ) s _ { j } ^ { ( \ell ) } sj() 表示的是第 ℓ \ell 层的第 j j j 个神经元的输入值:

 score  s j ( ℓ ) = ∑ i = 0 d ( ℓ − 1 ) w i j ( ℓ ) x i ( ℓ − 1 ) \text { score } s _ { j } ^ { ( \ell ) } = \sum _ { i = 0 } ^ { d ^ { ( \ell - 1 ) } } w _ { i j } ^ { ( \ell ) } x _ { i } ^ { ( \ell - 1 ) }  score sj()=i=0d(1)wij()xi(1)

转换值 x j ( ℓ ) x _ { j } ^ { ( \ell ) } xj() 表示的是第 ℓ \ell 层的第 j j j 个神经元的输出值

 transformed  x j ( ℓ ) = { tanh ⁡ ( s j ( ℓ ) )  if  ℓ < L s j ( ℓ )  if  ℓ = L \text { transformed } x _ { j } ^ { ( \ell ) } = \left\{ \begin{array} { l l } \tanh \left( s _ { j } ^ { ( \ell ) } \right) & \text { if } \ell < L \\ s _ { j } ^ { ( \ell ) } & \text { if } \ell = L \end{array} \right.  transformed xj()={ tanh(sj())sj() if <L if =L

那么现在的特征(属性) x \mathbf{x} x 将被作为 x ( 0 ) \mathbf{x}^{(0)} x(0),通过隐含层(hidden layers)获得 x j ( ℓ ) x _ { j } ^ { ( \ell ) } xj(),最终得到输出层 x 1 ( L ) x _ { 1} ^ { ( L) } x1(L)

实际上每一层都是在从数据中学习转换模式(transformation to be learned from data),将每一层的转换函数写出::

ϕ ( ℓ ) ( x ) = tanh ⁡ ( [ ∑ i = 0 d ( ℓ ) w i 1 ( ℓ ) x i ( ℓ − 1 ) ⋮ ] ) \phi ^ { ( \ell ) } ( \mathbf { x } ) = \tanh \left( \left[ \begin{array} { c } \sum _ { i = 0 } ^ { d^{( \ell )} } w _ { i 1 } ^ { ( \ell ) } x _ { i } ^ { ( \ell - 1 ) } \\ \vdots \end{array} \right] \right) ϕ()(x)=tanhi=0d()wi1()xi(1)

可以看出该转换函数是将输入的 x \mathbf{x} x 与权重向量做内积,然后使用 tanh 函数转换输出,什么时候两者的值最大呢?在机器学习可行性分析时用到过,两个向量在不考虑向量长度时,两个向量越接近,角度越小,那么内积越大。所以这个函数一定程度上表示两者的模式是否匹配或接近(whether x ‘matches’ weight vectors in pattern)。

所以神经网络(NNet)实际上就是通过层间的连接权重来进行模式提取的过程(pattern extraction with layers of connection weights)。

反向传播算法(Backpropagation Algorithm)

那现在的问题是如何学习权重 { w i j ( ℓ ) } \left\{ w _ { i j } ^ { ( \ell ) } \right\} { wij()},使得  minimize  E in  ( { w i j ( ℓ ) } ) \text { minimize } E _ { \text {in } } \left( \left\{ w _ { i j } ^ { ( \ell ) } \right\} \right)  minimize Ein ({ wij()})

因为只有输出端的预测误差,所以基本的思路是,从输出端出发,从输出端向后层层反馈。

输出端的预测误差:

e n = ( y n − NNet ⁡ ( x n ) ) 2 e _ { n } = \left( y _ { n } - \operatorname { NNet } \left( \mathbf { x } _ { n } \right) \right) ^ { 2 } en=(ynNNet(xn))2

最后一层的权值优化怎么实现呢,因为有预测误差,那么通过(随机)梯度下降法便可以实现优化目标。

首先应该求取 ∂ e n ∂ w i j ( l ) \frac { \partial e _ { n } } { \partial w _ { i j } ^ { ( l ) } } wij(l)en,令其为零。求法如下:

先将预测误差展开为显式:

e n = ( y n − N Net ⁡ ( x n ) ) 2 = ( y n − s 1 ( L ) ) 2 = ( y n − ∑ i = 0 d ( L − 1 ) w i 1 ( L ) x i ( L − 1 ) ) 2 e _ { n } = \left( y _ { n } - \mathrm { N } \operatorname { Net } \left( \mathbf { x } _ { n } \right) \right) ^ { 2 } = \left( y _ { n } - s _ { 1 } ^ { ( L ) } \right) ^ { 2 } = \left( y _ { n } - \sum _ { i = 0 } ^ { d ^ { ( L - 1 ) } } w _ { i 1 } ^ { ( L ) } x _ { i } ^ { ( L - 1 ) } \right) ^ { 2 } en=(ynNNet(xn))2=(yns1(L))2=yni=0d(L1)wi1(L)xi(L1)2

对于最后一层(Output Layer)的梯度值求取:

∂ e n ∂ w i 1 ( L ) = ∂ e n ∂ s 1 ( L ) ⋅ ∂ s 1 ( L ) ∂ w i 1 ( L ) = − 2 ( y n − s 1 ( L ) ) ⋅ ( x i ( L − 1 ) ) \begin{aligned} & \frac { \partial e _ { n } } { \partial w _ { i 1 } ^ { ( L ) } } \\ = & \frac { \partial e _ { n } } { \partial s _ { 1 } ^ { ( L ) } } \cdot \frac { \partial s _ { 1 } ^ { ( L ) } } { \partial w _ { i 1 } ^ { ( L ) } } \\ = & - 2 \left( y _ { n } - s _ { 1 } ^ { ( L ) } \right) \cdot \left( x _ { i } ^ { ( L - 1 ) } \right) \end{aligned} ==wi1(L)ens1(L)enwi1(L)s1(L)2(yns1(L))(xi(L1))

对于中间的隐含层的梯度值求取:

∂ e n ∂ w i j ( ℓ ) = ∂ e n ∂ s j ( ℓ ) ⋅ ∂ s j ( ℓ ) ∂ w i j ( ℓ ) = δ j ( ℓ ) ⋅ ( x i ( ℓ − 1 ) ) \begin{aligned} & \frac { \partial e _ { n } } { \partial w _ { i j } ^ { ( \ell ) } } \\ = & \frac { \partial e _ { n } } { \partial s _ { j } ^ { ( \ell ) } } \cdot \frac { \partial s _ { j } ^ { ( \ell ) } } { \partial w _ { i j } ^ { ( \ell ) } } \\ = & \delta _ { j } ^ { ( \ell ) } \cdot \left( x _ { i } ^ { ( \ell - 1 ) } \right) \end{aligned} ==wij()ensj()enwij()sj()δj()(xi(1))

由于这里中间层的 ∂ e n ∂ s j ( ℓ ) \frac { \partial e _ { n } } { \partial s _ { j } ^ { ( \ell ) } } sj()en 不好求取,所以暂时由 δ j ( ℓ ) \delta _ { j } ^ { ( \ell ) } δj() 代替,当然输出层的 δ 1 ( L ) = − 2 ( y n − s 1 ( L ) ) \delta _ { 1 } ^ { ( L) } = - 2 \left( y _ { n } - s _ { 1 } ^ { ( L ) } \right) δ1(L)=2(yns1(L))

下面进行 δ j ( ℓ ) \delta _ { j } ^ { ( \ell ) } δj() 的实际值计算:

根据网络结构的传递,可以写出如下的值传递关系:

s j ( ℓ ) ⟹ tanh ⁡ x j ( ℓ ) ⟹ w j k ( ℓ + 1 ) [ s 1 ( ℓ + 1 ) ⋮ s k ( ℓ + 1 ) ⋮ ] ⟹ ⋯ ⟹ e n s _ { j } ^ { ( \ell ) } \stackrel { \tanh } { \Longrightarrow } x _ { j } ^ { ( \ell ) } \stackrel { w _ { j k } ^ { ( \ell + 1 ) } } { \Longrightarrow } \left[ \begin{array} { c } s _ { 1 } ^ { ( \ell + 1 ) } \\ \vdots \\ s _ { k } ^ { ( \ell + 1 ) } \\ \vdots \end{array} \right] \Longrightarrow \cdots \Longrightarrow e _ { n } sj()tanhxj()wjk(+1)s1(+1)sk(+1)en

这样的话,便可以通过 δ j ( ℓ + 1 ) \delta _ { j } ^ { ( \ell+1 ) } δj(+1) 计算 δ j ( ℓ ) \delta _ { j } ^ { ( \ell) } δj()

δ j ( ℓ ) = ∂ e n ∂ s j ( ℓ ) = ∑ k = 1 d ( ℓ + 1 ) ∂ e n ∂ s k ( ℓ + 1 ) ∂ s k ( ℓ + 1 ) ∂ x j ( ℓ ) ∂ x j ( ℓ ) ∂ s j ( ℓ ) = ∑ k ( δ k ( ℓ + 1 ) ) ( w j k ( ℓ + 1 ) ) ( tanh ⁡ ′ ( s j ( ℓ ) ) ) \begin{aligned} \delta _ { j } ^ { ( \ell ) } = \frac { \partial e _ { n } } { \partial s _ { j } ^ { ( \ell ) } } & = \sum _ { k = 1 } ^ { d ^ { ( \ell + 1 ) } } \frac { \partial e _ { n } } { \partial s _ { k } ^ { ( \ell + 1 ) } } \frac { \partial s _ { k } ^ { ( \ell + 1 ) } } { \partial x _ { j } ^ { ( \ell ) } } \frac { \partial x _ { j } ^ { ( \ell ) } } { \partial s _ { j } ^ { ( \ell ) } } \\ & = \sum _ { k } \left( \delta _ { k } ^ { ( \ell + 1 ) } \right) \left( w _ { j k } ^ { ( \ell + 1 ) } \right) \left( \tanh ^ { \prime } \left( s _ { j } ^ { ( \ell ) } \right) \right) \end{aligned} δj()=sj()en=k=1d(+1)sk(+1)enxj()sk(+1)sj()xj()=k(δk(+1))(wjk(+1))(tanh(sj()))

由于最后一个 δ j ( ℓ ) \delta _ { j } ^ { ( \ell) } δj() 可以求得,即 δ 1 ( L ) \delta _ { 1 } ^ { ( L ) } δ1(L)。那么从后向前可以计算出全部的 δ j ( ℓ ) \delta _ { j } ^ { ( \ell) } δj()

由此得出经典的反向传播算法(Backpropagation (Backprop) Algorithm)。

 initialize all weights  w i j ( ℓ )  for  t = 0 , 1 , … , T  (1)  Stochastic: randomly pick  n ∈ { 1 , 2 , ⋯   , N }  (2)  forward: compute all  x i ( ℓ )  with  x ( 0 ) = x n  (3)  backward: compute all  δ j ( ℓ )  subject to  x ( 0 ) = x n  (4)  gradient descent:  w i j ( ℓ ) ← w i j ( ℓ ) − η x i ( ℓ − 1 ) δ j ( ℓ )  return  g NNET  ( x ) = ( ⋯ tanh ⁡ ( ∑ j w j k ( 2 ) ⋅ tanh ⁡ ( ∑ i w i j ( 1 ) x i ) ) ) \begin{aligned} & \text { initialize all weights } w _ { i j } ^ { ( \ell ) } \\ & \text { for } t = 0,1 , \ldots , T \\ & \qquad\text { (1) } \text { Stochastic: randomly pick } n \in \{ 1,2 , \cdots , N \} \\ & \qquad \text { (2) } \text { forward: compute all } x _ { i } ^ { ( \ell ) } \text { with } \mathbf { x } ^ { ( 0 ) } = \mathbf { x } _ { n } \\ &\qquad \text { (3) } \text { backward: compute all } \delta _ { j } ^ { ( \ell ) } \text { subject to } \mathbf { x } ^ { ( 0 ) } = \mathbf { x } _ { n } \\ &\qquad \text { (4) } \text { gradient descent: } w _ { i j } ^ { ( \ell ) } \leftarrow w _ { i j } ^ { ( \ell ) } - \eta x _ { i } ^ { ( \ell - 1 ) } \delta _ { j } ^ { ( \ell ) } \\ &\text { return } g _ { \text {NNET } } ( \mathbf { x } ) = \left( \cdots \tanh \left( \sum _ { j } w _ { j k } ^ { ( 2 ) } \cdot \tanh \left( \sum _ { i } w _ { i j } ^ { ( 1 ) } x _ { i } \right) \right) \right) \end{aligned}  initialize all weights wij() for t=0,1,,T (1)  Stochastic: randomly pick n{ 1,2,,N} (2)  forward: compute all xi() with x(0)=xn (3)  backward: compute all δj() subject to x(0)=xn (4)  gradient descent: wij()wij()ηxi(1)δj() return gNNET (x)=(tanh(jwjk(2)tanh(iwij(1)xi)))

实际运用中对于 for 循环中的 1,2,3 步,执行很多次,也就是说不只随机选取一个 n n n,而是取多个,计算 x i ( ℓ − 1 ) δ j ( ℓ ) x _ { i } ^ { ( \ell - 1 ) } \delta _ { j } ^ { ( \ell ) } xi(1)δj() 的平均值,用于第 4 步更新梯度,这样的操作叫 小批量梯度下降法(mini-batch GD),跟随机梯度下降法的区别是每次选取不只一个样本点。

基础的神经网络算法(basic NNet algorithm): 使用反向传播算法可以有效的计算梯度值(basic NNet algorithm: backprop to compute the gradient efficiently)。

值得注意的是,当且仅当 s i ( L ) = 0 s _ { i } ^ { ( L ) } = 0 si(L)=0 时有:

x i ( L ) = tanh ⁡ ( s i ( L ) ) = 0 x _ { i } ^ { ( L ) } = \tanh \left( s _ { i } ^ { ( L ) } \right) = 0 xi(L)=tanh(si(L))=0

神经网络的优化(Neural Network Optimization)

局部最优(Local Minimum)

通常多层感知机是凹函数(generally non-convex when multiple hidden layers),那么通过使用梯度下降法实现的反向传播算法很难达到全局最优解(global minimum),常常只停留在局部最优解(local minimum)。

当然不同的初始值对应了不同的局部最优解:

 different initial  w i j ( ℓ ) ⟹  different local minimum  \text { different initial } w _ { i j } ^ { ( \ell ) } \Longrightarrow \text { different local minimum }  different initial wij() different local minimum 

那么便可以通过随机的初始值获取到不同的局部最优点来缓和这一缺陷。同时应当注意,当权值过高时,分数也会很高,这就导致使用 tanh 函数的话,其处于平缓的位置(saturate),梯度很小(small gradient)优化速度会很慢,所以这里建议多尝试几个几个随机的小初始权值

虽然在神经网络的优化很难,但是却很实用。

VC维数(VC Dimension)

神经网络的复杂度如下:

d v c = O ( V D )  where  V = #  of neurons,  D = #  of weights  d _ { \mathrm { vc } } = O ( V D ) \text { where } V = \# \text { of neurons, } D = \# \text { of weights } dvc=O(VD) where V=# of neurons, D=# of weights 

所以其优点是当神经元(neurons)足够多时,也就是说 V V V 很大, d v c d _ { \mathrm { vc } } dvc 很大,那么可以用于解决(拟合)任何线性或非线性问题(函数)。但是 d v c d _ { \mathrm { vc } } dvc 很大时,很可以会出现过拟合问题。

正则化(Regularization)

那么权重衰减(二范数)正则化,也可以用到这里:

 weight-decay (L2) regularizer  Ω ( w ) = ∑ ( w i j ( l ) ) 2 \text { weight-decay (L2) regularizer } \Omega ( \mathbf { w } ) = \sum \left( w _ { i j } ^ { ( l ) } \right) ^ { 2 }  weight-decay (L2) regularizer Ω(w)=(wij(l))2

但是这里有一个问题就是在缩小权重时:

大的权重会缩小比较大,小的权重会缩小比较小,类似于对于任何权重都取一半值,那么这样会导致权重永远不可能为零。

 large weight  →  large shrink; small weight  →  small shrink  \text { large weight } \rightarrow \text { large shrink; small weight } \rightarrow \text { small shrink }  large weight  large shrink; small weight  small shrink 

那么现在想使得权重向量为稀疏(sparse)向量(某些元素值为零)即 w i j ( l ) = 0 w _ { i j } ^ { ( l ) } = 0 wij(l)=0,从而有效的降低 d v c d _ { \mathrm { vc } } dvc,L1 范数正则化是一种解决方案,但是 L1 范数存在不可微的情况,而神经网络又是基于梯度下降法进行优化的,这样的话L1范数不太适合于神经网络。这里提出一种权重消除正则化(weight-elimination regularizer):

∑ ( w i j ( ℓ ) ) 2 1 + ( w i j ( ℓ ) ) 2 \sum \frac { \left( w _ { i j } ^ { ( \ell ) } \right) ^ { 2 } } { 1 + \left( w _ { i j } ^ { ( \ell ) } \right) ^ { 2 } } 1+(wij())2(wij())2

可以看出利用该正则化方法实现稀疏向量。

早停法(Early Stopping)

梯度下降法实际上是在当前位置(当前权重 w i \mathbf{w}_i wi)的周围搜索最优解(优化后权重 w i + 1 \mathbf{w}_{i+1} wi+1),这一过程类似于下图:
在这里插入图片描述
所以随着迭代次数的增加,搜索过的范围越来越广,那么有效的 VC Dimension 也会不断的增加。所以如果迭代次数减少,那么 VC Dimension 也会相应的减小。

回顾一下随着 VC Dimension 增加, E in E_{\text{in}} Ein E out E_{\text{out}} Eout 的变化曲线:
在这里插入图片描述
所以最佳的 VC Dimension 在中间,那么最佳的迭代次数也应该在中间,否则很可能出现过拟合问题。当然最佳的迭代次数可以通过 validation 获得。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Flame_alone/article/details/105786824

智能推荐

ClickHouse MergeTree启动加速--使用篇_liyang910910的博客-程序员秘密

前言MergeTree Family启动慢问题一直是ClickHouse社区的痛点。在完成对所有MergeTree part的加载之前,clickhouse-server实例无法对外提供服务。而在生产环境中,加载过程动辄持续几十分钟,严重影响clickhouse集群的可用性。针对这个痛点,我们开发了MergeTree启动加速特性:通过RocksDB缓存part元数据,将clickhouse-server的启动时间从小时级减少到分钟级。该特性目前已被合入社区,PR见:https://github.com/Cl

ClickHouse MergeTree家族特殊表引擎_大白兔黑又黑的博客-程序员秘密

在前面的文章中,我们详细介绍了ClickHouse MergeTree表引擎的使用场景、原理、数据存储结构、建表语句以及索引优化。详见《ClickHouse MergeTree表引擎和建表语句》、《ClickHouse MergeTree二级索引/跳数索引》。MergeTree引擎表是使用最为广泛的表,除了MergeTree引擎表以外,MergeTree家族还有一些特殊的表引擎,在一些特殊场景中能够表现出更好地性能。例如,统计电商平台每天的销售额等。1. AggregatingMergeTree作为M

shell脚本和python哪个好学_python脚本与shell脚本的区别比较_weixin_39538451的博客-程序员秘密

python脚本与shell脚本的区别比较shell脚本特性shell 应该属于宏语言,顾名思义是系统的壳,方便与系统交互的。shell 简单,开发迅速,专注系统(比如:Linux)管理领域。shell就是和系统结合得比较紧密,其内部数据处理方面,侧重文本(或者说字符串,或字符流)处理,而对运算和其他基本数据结构的原生较弱。下面这几种情况下,不应该使用shell,因为shell对此无能为力;如:跨...

flutter插件汇总2_diaowen8993的博客-程序员秘密

作者:知乎用户链接:https://www.zhihu.com/question/307594373/answer/568969429来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。传感器(官方提供。比如可以用来实现:摇一摇的功能)flutter/plugins国内支付/分享/OAuth。fluwx支持微信系列功能。...

地球坐标系(WGS84),火星坐标系(GCJ02), 百度坐标系(BD09)坐标转换_思维的深度的博客-程序员秘密

[java] view plain copy public class Gps {        private double wgLat;      private double wgLon;        public Gps(double wgLat, double wgLon) {          setWgLat(wgLat); 

VBScript 中的回车换行符_星火191314的博客-程序员秘密_vbscript 换行

常数           值                              描述 vbCr           Chr(13)                    回车符。 vbCrLf        Chr(13) & Chr(10)           回车符与

随便推点

比特币协会于北京举办疫情后首次BSV线下聚会,增强Bitcoin SV生态交流与发展_BSV区块链的博客-程序员秘密

活动时间:2020年8月16日活动主办方:比特币协会2020年8月16日,比特币协会于北京举办了疫情之后的本年度首次BSV线下聚会。本次聚会旨在加强区块链及相关行业人士交流,促进中国本土的Bitcoin SV生态发展。由于疫情期间应保持适当社交距离,本次活动为邀请制,并且选择在798艺术园区内较为宽敞的场地进行。有近40位参会者,其中不乏多位从其他城市特意赶来参加交流会的来宾。比特币协会中国经理Lise Li首先发表了主题演讲,介绍了比特币协会与Bitcoin SV生态发展。通过线上研讨会、BSV

Pytorch基础教程(5):实战案例----手写数字分类任务_废物药浪学代码的博客-程序员秘密

Fashion-mnist分类任务Fashion-mnist经典的MNIST数据集包含了大量的手写数字。十几年来,来自机器学习、机器视觉、人工智能、深度学习领域的研究员们把这个数据集作为衡量算法的基准之一。你会在很多的会议,期刊的论文中发现这个数据集的身影。实际上,MNIST数据集已经成为算法作者的必测的数据集之一。有人曾经调侃道:“如果一个算法在MNIST不work,那么它就根本没法用;而如果它在MNIST上work,它在其它数据上也可能不work!”Fashion-mnist的目的是要成为MNI

XLua使用过程中的异常记录_kuangben2000的博客-程序员秘密

XLua使用过程中的异常记录https://www.jianshu.com/p/cf7a81d8029f记录腾讯的开源Lua计划XLua的使用过程中遇到的各种异常/解决记录1.LuaException: c# exception:Non-static method requires a target.,stack: at System.Reflection.MonoMethod.I...

@JSONField注解的使用_与物为春的博客-程序员秘密[email protected]

FastJson中 的注解@JSONField,一般作用在get/set方法上面,常用的使用场景有下面三个:修改和json字符串的字段映射【name】 格式化数据【format】 过滤掉不需要序列化的字段{serialize】用法:通过用@JSONField注解一个类的属性,我们可以达到以下目标@JSONField(name = “n1”) --- 指定field对应的key名称@JSONField(format = “yyyy-MM-dd HH:mm:ss”) --- 对于时间字段,

Netdata内网离线部署_kar9ook的博客-程序员秘密_netdata 离线安装

介绍Netdata 是一款 Linux 性能实时监测工具。Netdata是Linux系统实时性能监测工具,提供web界面的界面视角。它用可视化的手段,将被监测者最细微的细节,展现了出来。这样,你便可以清晰地了解你的系统和应用程序此时的状况。1.优美的界面:bootstrap框架下的控制界面2.自定义的控制界面:你可以使用简单的HTML代码去自定义控制界面(不需要使用javascript)3.极其的快速而高效:程序使用C进行编写(默认安装下,预计只有2%的单核CPU使用率和少许的内存使用率)4.零

推荐文章

热门文章

相关标签