Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

6.1 单元

神经网络的基本构件是单个计算单元(computational unit)。单元接收一组实数,进行某种计算,并产生输出。

神经单元的核心是对输入求加权和,并额外加入一个偏置项(bias term)。给定输入 x1xnx_1\ldots x_n,单元具有相应权重 w1wnw_1\ldots w_n 和偏置 bb,加权和 zz 为:

z=b+iwixi(6.1)z=b+\sum_iw_ix_i\tag{6.1}

用向量记号表示更方便。令 w\mathbf w 为权重向量,bb 为标量偏置,x\mathbf x 为输入向量,并用点积取代求和:

z=wx+b(6.2)z=\mathbf w\cdot\mathbf x+b\tag{6.2}

式 6.2 中的 zz 只是一个实数。神经单元并不直接把输入的线性函数 zz 作为输出,而是对 zz 应用非线性函数 ff。函数输出称为单元的激活值(activation value)aa。这里只建模一个单元,所以该节点的激活值也就是网络最终输出,通常记为 yy

y=a=f(z)y=a=f(z)

后面将讨论三种常见非线性函数:sigmoid、tanh 和修正线性单元(rectified linear unit, ReLU)。为便于教学,先使用第 4 章见过的 sigmoid:

y=σ(z)=11+ez(6.3)y=\sigma(z)=\frac1{1+e^{-z}}\tag{6.3}

sigmoid(图 6.1)把输出映射到 (0,1)(0,1),可将异常值压向 0 或 1;它还可微分,这对第 6.6 节的学习非常有用。

图 6.1 sigmoid 函数把实数映射到 (0,1)(0,1)。它在 0 附近近似线性,但会将异常值压向 0 或 1。

将式 6.2 代入式 6.3,得到神经单元的输出:

y=σ(wx+b)=11+exp[(wx+b)](6.4)y=\sigma(\mathbf w\cdot\mathbf x+b)=\frac1{1+\exp[-(\mathbf w\cdot\mathbf x+b)]}\tag{6.4}

图 6.2 基本神经单元。它接收三个输入 x1,x2,x3x_1,x_2,x_3(以及偏置 bb,图中将其表示为固定为 +1 的输入所对应的权重),产生输出 yy。中间变量 zz 是求和结果,aa 是 sigmoid 输出。在这个单单元网络中 y=ay=a;对更深网络,yy 表示整个网络的最终输出,aa 则表示单个节点的激活值。

举例说明。假设单元的权重向量和偏置为:

w=[0.2,0.3,0.9],b=0.5\mathbf w=[0.2,0.3,0.9],\qquad b=0.5

输入向量为:

x=[0.5,0.6,0.1]\mathbf x=[0.5,0.6,0.1]

则输出为:

y=σ(wx+b)=11+e(.5×.2+.6×.3+.1×.9+.5)=11+e.87=.70y=\sigma(\mathbf w\cdot\mathbf x+b)=\frac1{1+e^{-(.5\times.2+.6\times.3+.1\times.9+.5)}}=\frac1{1+e^{-.87}}=.70

实践中,sigmoid 不常用作隐藏层激活函数。一个非常相似但几乎总是更好的函数是图 6.3a 的 tanh 函数,其范围为 −1 到 +1:

y=tanh(z)=ezezez+ez(6.5)y=\tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}\tag{6.5}

最简单、也可能最常用的激活函数是图 6.3b 的 ReLU。zz 为正时输出等于 zz,否则为 0:

y=ReLU(z)=max(z,0)(6.6)y=\operatorname{ReLU}(z)=\max(z,0)\tag{6.6}

这些激活函数性质不同,适用于不同语言应用或网络架构。tanh 平滑可微,并能将异常值向均值压缩;ReLU 接近线性,因而具有另一些优点。sigmoid 或 tanh 在 zz 很大时会饱和(saturated),即 yy 极接近 1、导数极接近 0。零导数会妨碍学习:第 6.6 节将看到,网络训练通过向后传播误差信号,将各层梯度(偏导数)相乘;近零梯度会使误差信号越来越小,最终小到无法训练,这称为梯度消失问题(vanishing gradient problem)。ReLU 没有这个问题,因为 zz 为较大正值时,其导数为 1 而非接近 0。

(a)

(b)
图 6.3 tanh 和 ReLU 激活函数。