机器学习(十二):人工神经网络(ANN)

一、人工神经元

1. 感知器

    感知器是一种人工神经元,在 20 世纪五、六⼗年代由科学家Frank Rosenblatt发明。⼀个感知器接受⼏个二进制输⼊x1,x2,...x_1, x_2, . . .,并产⽣⼀个二进制输出:
机器学习(十二):人工神经网络(ANN)
    ⽰例中的感知器有三个输⼊:x1,x2,x3x_1, x_2, x_3,引入权重w1,w2,w3w_1, w_2, w_3表⽰相应输⼊对于输出重要性的实数。输出值0或者1,则由分配权重后的总和jwjxj\sum_jw_jx_j小于或者大于一些阈值决定。和权重⼀样,阈值是⼀个实数,⼀个感知器的参数。⽤更精确的代数形式:
机器学习(十二):人工神经网络(ANN)
    把阈值移到不等式的另⼀边,并⽤感知器的偏置 bthresholdb ≡ −threshold 代替。⽤偏置⽽不是阈值,那么感知器的规则可以重写为:
机器学习(十二):人工神经网络(ANN)

2. S型神经元

    S 型神经元和感知器类似,但是被修改为权重和偏置的微⼩改动只引起输出的微⼩变化。正如⼀个感知器,S 型神经元有多个输⼊x1,x2,...x_1, x_2, . . .,但是这些输⼊可以取0和1中的任意值,如0.618…是⼀个 S 型神经元的有效输⼊,⽽不仅仅是二进制输入0或1。同样,S 型神经元对每个输⼊有权重w1,w2,...w_1, w_2, . . .和⼀个总的偏置 bb,但输出不再是0或1,而是 σ(wx+b)σ(w · x+b),这⾥ σσ 被称为S型函数,定义为:
σ(z)11+ezσ(z) ≡ \frac1{1+e^{-z}}
    把它们放在⼀起来更清楚地说明,⼀个具有输⼊x1,x2,...x_1, x_2, . . .,权重w1,w2,...w_1, w_2, . . .和偏置 bb 的S型神经元的输出是:
11+ejwjxjb=11+exp(jwjxjb)\frac1{1+e^{-\sum_jw_jx_j-b}} = \frac1{1+exp(-\sum_jw_jx_j-b)}

3. tanhtanh 神经元

    tanhtanh 函数的定义为:
tanh(z)eze(z)ez+e(z)tanh(z) ≡ \frac{e^z - e^(-z)}{e^z + e^(-z)}     S型神经元和 tanhtanh 神经元之间的⼀个差异就是 tanhtanh 神经元的输出的值域是 (−1, 1) ⽽⾮ (0, 1)。这意味着如果你构建基于 tanhtanh 神经元,你可能需要正规化最终的输出(取决于应⽤的细节,还有你的输⼊),跟S型神经元略微不同。

######4. 修正线性神经元(rectified linear neuron)或者修正线性单元(rectified linear unit),简记为 ReLU
    输⼊为 xx,权重向量为 ww,偏置为 bbReLUReLU 神经元的输出是:
max ( 0,wx+b )max\ (\ 0, w · x + b\ )

二、神经网络

    本文我们讨论的神经⽹络,都是以上⼀层的输出作为下⼀层的输⼊。这种⽹络被称为前馈神经⽹络。这意味着⽹络中是没有回路的,信息总是向前传播,从不反向回馈。

1. 神经网络的架构

机器学习(十二):人工神经网络(ANN)
    上图⽹络中最左边的称为输⼊层,其中的神经元称为输⼊神经元。最右边的称为输出层,其中的神经元称为输出神经元,在本例中,输出层只有⼀个神经元。中间层既不是输⼊也不是输出,被称为隐藏层。

2. 神经网络的代数形式

    我们⾸先给出⽹络中权重的清晰定义。我们使⽤ wjklw_{jk}^l 表⽰从 (l1)th(l − 1)^{th} 层的 kthk^{th} 个神经元到 lthl^{th} 层的 jthj^{th} 个神经元的链接上的权重。例如,下图给出了⽹络中第⼆层的第四个神经元到第三层的第⼆个神经元的链接上的权重:
机器学习(十二):人工神经网络(ANN)
    我们对⽹络的偏置和**值也会使⽤类似的表⽰。显式地,我们使⽤ bjlb_j^{l} 表⽰在 lthl^{th} 层第 jthj^{th} 个神经元的偏置,使⽤ ajla_j^{l} 表⽰ lthl^{th} 层第 jthj^{th} 个神经元的**值(即神经元的输出)。下⾯的图清楚地解释了这样表⽰的含义:
机器学习(十二):人工神经网络(ANN)
    有了这些表⽰,lthl^{th} 层的第 jthj^{th} 个神经元的**值 ajla_j^{l} 就和 (l1)th(l − 1)^{th} 层的**值通过⽅程关联起来了(其中 σσ 称为**函数,本文选用S型神经元进行讨论,即选择**函数为S型函数)
ajl=σ(kwjklakl1+bjl){a_j}^l = σ(\sum_kw_{jk}^la_k^{l-1}+b_j^l)     其中求和是在 (l1)th(l − 1)^{th} 层的所有 kk 个神经元上进⾏的。为了⽤矩阵的形式重写这个表达式,我们对每⼀层 ll 都定义⼀个权重矩阵 wlw^l。权重矩阵 wlw^l 的元素正是连接到 lthl^{th} 层神经元的权重,更确切地说,在第 jthj^{th} ⾏第 kthk^{th} 列的元素是 wjklw_{jk}^l。类似的,对每⼀层 ll,定义⼀个偏置向量,blb^l,偏置向量的每个元素其实就是前⾯给出的 bjlb_j^{l},每个元素对应于 lthl^{th} 层的每个神经元。最后,我们定义**向量 ala^l,其元素是那些**值 ajla_j^{l}。最后引入**函数(如 σ)来按照矩阵形式重写上述公式,得
al=σ(wlal1+bl)a^l = σ(w^la^{l−1} + b^l)     在计算 ala^l 的过程中,我们计算了中间量 zlwlal1+blz^l ≡ w^la^{l−1} + b^l,我们称 zlz^lll 层神经元的带权输⼊。同样要指出的是 zlz^l 的每个元素是 zjlkwjklakl1+bjl{z_j}^l ≡ \sum_kw_{jk}^l{a_k}^{l-1}+b_j^l,其实 zjlz_j^l 就是第 ll 层第 jj 个神经元的**函数的带权输⼊。



三、反向传播算法(backpropagation)

1. Hadamard 乘积

    特别地,假设 sstt 是两个同样维度的向量。那么我们使⽤ sts ⊙ t 来表⽰按元素的乘积。所以 sts ⊙ t 的元素就是$ (s ⊙ t)_j = s_j t_j$。给个例⼦,
机器学习(十二):人工神经网络(ANN)
    这种类型的按元素乘法有时候被称为 Hadamard 乘积,或者 Schur 乘积。我们这⾥取前者。好的矩阵库通常会提供 Hadamard 乘积的快速实现,在实现反向传播的时候⽤起来很⽅便。

2. 代价函数

    在神经网络的代数形式中,我们希望有⼀个算法,能让我们找到权重和偏置,以⾄于⽹络的输出 y(x)y(x) 能够拟合所有的训练输⼊ x。为了量化我们如何实现这个⽬标,在使用神经网络做项目的时候,我们往往需要定义一个代价函数。
    为了便于接下来的讨论,本文定义一个二次代价函数。C(w,b)12nxy(x)aL(x)2 C(w, b) ≡ \frac1{2n}\sum_x||y(x)-a^L(x)||^2 从上式可以看出,训练的⽬的,应该是最⼩化代价函数。我们使⽤梯度下降算法来最小化代价函数。

3. 梯度下降算法

    在线性模型一文已经详细介绍过梯度下降算法,这里只做简单描述。
    梯度下降算法是一种迭代算法,选取适当的初值w和b,不断迭代,更新w和b的值,进行目标函数的极小化,直到收敛。由于负梯度方向是使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新w和b的值,从而达到减少函数值的目的。即每一次迭代,新的w和b都会由旧的w和b减去梯度乘以步长(或称速率eta)得到,代数形式为:
w=wC/weta新w = 旧w - ∂C/∂w*etab=bC/beta新b = 旧b - ∂C/∂b*eta     而反向传播算法,可用于快速计算代价函数C梯度,从而能够更快地更新w和b的值。

4. 关于代价函数的两个假设

    反向传播的⽬标是计算代价函数 CC 分别关于 wwbb 的偏导数 C/w∂C/∂wC/b∂C/∂b。为了让反向传播可⾏,我们需要做出关于代价函数的两个主要假设。
    第一个假设是代价函数可以被写成⼀个在每个训练样本 xx 上的代价函数 CxC_x 的均值 C=1nxCxC = \frac1{n}\sum_xC_x。以⼆次代价函数为例,其中对每个独⽴的训练样本其代价是 Cx=12y(x)aL(x)2C_x = \frac12||y(x)-a^L(x)||^2
    第二个假设是代价可以写成神经⽹络输出的函数。例如对于一个单独的训练样本x,可以写作:
C=12yaL2=12j(yjajL)2C = \frac12||y-a^L||^2 = \frac12\sum_j(y_j-a_j^L)^2

5. 误差

    反向传播其实是对权重和偏置变化影响代价函数过程的理解。最终极的含义其实就是计算偏导数 C/wjkl∂C/∂w_{jk}^lC/bjl∂C/∂b_j^l。但是为了计算这些值,我们⾸先引⼊⼀个中间量,δjlδ_j^l,这个我们称为在 lthl^{th} 层第 jthj^{th} 个神经元上的误差。
    为了理解误差是如何定义的,假设在神经⽹络上有⼀个调⽪⻤:
机器学习(十二):人工神经网络(ANN)
    这个调⽪⻤在 ll 层的第 jthj^{th} 个神经元上。当输⼊进来时,调⽪⻤对神经元的操作进⾏搅局。他会增加很⼩的变化 zjl∆z_j^l 在神经元的带权输⼊上,使得神经元输出由 σ(zjl)σ(z_j^l) 变成 σ(zjl+zjl)σ(z_j^l + ∆z_j^l)。这个变化会向⽹络后⾯的层进⾏传播,最终导致整个代价产⽣ Czjlzjl\frac{∂C}{∂z_j^l}∆z_j^l 的改变。
    现在,这个调⽪⻤变好了,试着帮助你来优化代价,它试着找到可以让代价更⼩的 zjl∆z_j^l。假设 Czjl\frac{∂C}{∂z_j^l}有⼀个很⼤的值(或正或负)。那么这个调⽪⻤可以通过选择与 Czjl\frac{∂C}{∂z_j^l} 相反符号的 zjl∆z_j^l 来降低代价。相反,如果 Czjl\frac{∂C}{∂z_j^l} 接近 0,那么调⽪⻤并不能通过扰动带权输⼊ zjlz_j^l 来改善太多代价。在调⽪⻤看来,这时候神经元已经很接近最优了。所以这⾥有⼀种启发式的认识, Czjl\frac{∂C}{∂z_j^l} 是神经元的误差的度量。
    按照上⾯的描述,我们定义 ll 层的第jthj^{th} 个神经元上的误差 δjlδ_j^l 为:
δjlCzjlδ_j^l ≡ \frac{∂C}{∂z_j^l}
证明:
    代价函数C是关于z的函数,此处不妨假设 C=(1z)2C = (1 - z)^2,函数图像如下图。Cz\frac{∂C}{∂z} 为函数的斜率,则 zz 带来的微小变化 z∆z,会如图中所示,导致整个C产生 Czz\frac{∂C}{∂z}∆z 的变化。

机器学习(十二):人工神经网络(ANN)
    

6. 反向传播的四个方程式

① 输出层误差 δLδ^L 的⽅程
δL=aCσ(zL)δ^L = ∇_aC ⊙ σ′(z^L) 证明:
δjL=CzjL=kCakLakLzjLδ_j^L = \frac{∂C}{∂z_j^L} = \sum_k\frac{∂C}{∂a_k^L}\frac{∂a_k^L}{∂z_j^L} 因为
akL=σ(zkL)a_k^L = σ(z_k^L) kjk ≠ jakLzjL\frac{∂a_k^L}{∂z_j^L} 消失;当 k=jk = jakLzjL=σ(zjL)\frac{∂a_k^L}{∂z_j^L} = σ′(z_j^L)
固输出层 LL 层每个元素定义如下:
δjL=CajLσ(zjL)δ_j^L = \frac{∂C}{∂a_j^L}σ′(z_j^L) 以矩阵形式定义 LL 层误差得:
δL=aCσ(zL)δ^L = ∇_aC ⊙ σ′(z^L)

② 使⽤下⼀层的误差 δl+1δ^{l+1} 来表⽰当前层的误差 δlδ^l
δl=((wl+1)Tδl+1)σ(zl)δ^l = ((w^{l+1})^Tδ^{l+1}) ⊙ σ′(z^l) 证明:
δjl=Czjl=kCzkl+1zkl+1zjl=kzkl+1zjlδkl+1δ_j^l = \frac{∂C}{∂z_j^l} = \sum_k\frac{∂C}{∂z_k^{l+1}}\frac{∂z_k^{l+1}}{∂z_j^l} = \sum_k\frac{∂z_k^{l+1}}{∂z_j^l}δ_k^{l+1} 因为
zkl+1=jwkjl+1ajl+bkl+1=jwkjl+1σ(zjl)+bkl+1z_k^{l+1} = \sum_jw_{kj}^{l+1}a_j^l + b_k^{l+1} = \sum_jw_{kj}^{l+1}σ(z_j^l) + b_k^{l+1} 做微分,得到
zkl+1zjl=wkjl+1σ(zjl)\frac{∂z_k^{l+1}}{∂z_j^l} = w_{kj}^{l+1}σ′(z_j^l) 代入 δjlδ_j^l,得出当前层 ll 层每个元素误差定义如下:
δjl=kwkjl+1δkl+1σ(zjl)δ_j^l = \sum_kw_{kj}^{l+1}δ_k^{l+1}σ′(z_j^l)

③ 代价函数关于⽹络中任意偏置的改变率
Cbjl=δjl\frac{∂C}{∂b_j^l} = δ_j^l 证明:
δjl=Czjl=kCbklbklzjlδ_j^l = \frac{∂C}{∂z_j^l} = \sum_k\frac{∂C}{∂b_k^l}\frac{∂b_k^l}{∂z_j^l} 因为
zjl=kwjklakl1+bjl          bjl=zjlkwjklakl1z_j^l = \sum_kw_{jk}^la_k^{l-1} + b_j^l\ \ \ \ \ \Rightarrow \ \ \ \ \ b_j^l = z_j^l - \sum_kw_{jk}^la_k^{l-1} kjk ≠ jbklzjl\frac{∂b_k^l}{∂z_j^l} 消失;当 k=jk = jbklzjl=1\frac{∂b_k^l}{∂z_j^l} = 1
代入 δjlδ_j^l,得:
δjl=Cbjlδ_j^l = \frac{∂C}{∂b_j^l}

④ 代价函数关于任何⼀个权重的改变率
Cwjkl=akl1δjl\frac{∂C}{∂w_{jk}^l} = a_k^{l-1}δ_j^l 证明:
Cwjkl=iCzilzilwjkl\frac{∂C}{∂w_{jk}^l} = \sum_i\frac{∂C}{∂z_i^l}\frac{∂z_i^l}{∂w_{jk}^l} 因为
zil=kwiklakl1+bilz_i^l = \sum_kw_{ik}^la_k^{l-1} + b_i^l iji ≠ jzilwjkl\frac{∂z_i^l}{∂w_{jk}^l} 消失;当 i=ji = jzilwjkl=akl1\frac{∂z_i^l}{∂w_{jk}^l} = a_k^{l-1}。再将 δjl=Czjlδ_j^l = \frac{∂C}{∂z_j^l}代入得:
Cwjkl=akl1δjl\frac{∂C}{∂w_{jk}^l} = a_k^{l-1}δ_j^l

7. 反向传播算法

算法1 (反向传播算法)
输入:输入层向量 xx
输出:代价函数的梯度 C/wjkl∂C/∂w_{jk}^lC/bjl∂C/∂b_j^l
① 计算各层对应的**值 ala^l
② 前向传播:对每个 l=2,3,...,Ll = 2,3,...,L 计算相应的 zl=wlal1+blz^l = w^la^{l-1} + b^lal=σ(zl)a^l = σ(z^l)
③ 输出层误差δLδ^L:计算向量 δL=aCσ(zL)δ^L = ∇_aC ⊙ σ′(z^L)
④ 反向误差传播:对每一个 l=L1,L2,...,2l = L-1,L-2,...,2,计算 δl=((wl+1)Tδl+1)σ(zl)δ^l = ((w^{l+1})^Tδ^{l+1}) ⊙ σ′(z^l)
⑤ 根据 Cbjl=δjl\frac{∂C}{∂b_j^l} = δ_j^lCwjkl=akl1δjl\frac{∂C}{∂w_{jk}^l} = a_k^{l-1}δ_j^l 计算可得代价函数的梯度



四、过度拟合和规范化

    增加训练样本的数量是⼀种减轻过度拟合的⽅法。另外的,本文要介绍的减轻过度拟合的方法为L1规范化和L2规范化。

1. L2规范化

    L2规范化也叫权重衰减(weight decay)。L2 规范化的想法是增加⼀个额外的项到代价函数上,这个项叫做规范化项。下⾯是规范化的代价函数,其中 C0C_0 是原始代价函数:C=C0+λ2nww2 C = C_0 + \frac{λ}{2n}\sum_ww^2     其中第⼀个项就是原始代价函数的表达式。第⼆个现在加⼊的就是所有权重的平⽅的和。然后使⽤⼀个因⼦ λ/2nλ/2n 进⾏量化调整,其中 λ>0λ > 0 可以称为规范化参数,⽽ nn 就是训练集合的⼤⼩。
    λλ 越小,偏向于最小化原始代价函数,反之,倾向于小的权重。

2. L1规范化

    L1规范化是在未规范化的代价函数上加上⼀个权重绝对值的和:C=C0+λnww C = C_0 + \frac{λ}{n}\sum_w|w|









以上全部内容参考书籍如下:
Michael Nielsen《Neural Networks and Deep Learning》