神经网络

对一个神经元建模

人工智能导论复习整理(三)

对于一个神经元而言,图中x0,x1,x2x_0,x_1,x_2是输入,w0,w1,w2w_0,w_1,w_2是输入对应的权重(反映了输入刺激的强度),胞体求得输入的加权和,并加上一个偏置bb,再对其作用函数ff,得到输出f(iwixi+b)f(\sum_iw_ix_i+b)

对于一个神经元的输出,给定一个合适的损失函数,这个神经元就可以作为一个线性分类器。同样,一个神经元也可以用来实现二分类

Binary Softmax classifier

单个神经元的输出可以转换成概率:
P(yi=1xi;w)=σ(iwixi+b) P(y_i=1|x_i;w) = \sigma(\sum_iw_ix_i+b)
其中,σ\sigma是**函数。

此时,另一类别的概率为
P(yi=0xi;w)=1P(yi=1xi;w) P(y_i=0|x_i;w)=1-P(y_i=1|x_i;w)
计算出两个类别的概率,就能计算交叉熵损失(cross-entropy loss),进而优化它,使这个神经元成为一个二分Softmax分类器。

Binary Support Vector Machine

同样,将max-margin hinge loss作用在神经元的输出上,也能将其训练成Binary SVM。

**函数

**函数相当于神经元对输入信息的处理。

神经网络可以实现很复杂的功能,非线性的**函数可以近似

几乎所有的复杂功能。但是并非神经网络层数越多,能实现的功能越复杂。如果神经元的**函数是线性函数,那么对于任意一一个多层的神经网络,都有一个与之等价的单层神经网络。

输入层、输出层、隐层(隐层是位于输入层和输出层之间的一层)

常用的**函数

  • Sigmoidσ(x)=11+ex\sigma(x)=\dfrac{1}{1+e^{-x}}

    • 值域:[0,1][0,1]
    • 历史上很常用,“**率”恰到好处(符合人类的感觉阈限特性)
    • 问题
      • 梯度下降过快
      • 关于00不对称
      • exp()计算代价昂贵
  • Tanhtanhx=sinhxcoshx=exexex+ex=2σ(2x)1\tanh x=\dfrac{\sinh x}{\cosh x}=\dfrac{e^x-e^{-x}}{e^x+e^{-x}}=2\sigma(2x)-1

    • 值域:[1,1][-1,1]
    • 关于00对称
    • 问题饱和时,梯度会消失
  • ReLU(Rectified Linear Unit):f(x)=max(0,x)f(x)=\max(0,x)

    • 大于00的区域不会饱和
    • 计算简单
    • 收敛速度快,约为Sigmoid和Tanh的6倍
    • 比Sigmoid更接近生物学的**特点
    • 问题不以零为中心
  • Leaky ReLUf(x)=max(0.01x,x)f(x)=\max(0.01x,x)

  • Parametric Rectifier (PReLU)f(x)=max(αx,x)f(x)=\max(\alpha x,x)

    • 拥有ReLU的全部优点
    • 不会饱和
  • Exponential Linear Units(ELU)
    f(x)={xifx>0α(ex1)ifx0 f(x)=\left\{ \begin{aligned} & x &\text{if}\quad x>0\\ & \alpha(e^x-1)&\text{if}\quad x\leq 0 \\ \end{aligned} \right.

    • 拥有ReLU的全部优点
    • 对噪声有鲁棒性
  • Maxoutmax(w1Tx+b1,w2Tx+b2)\max(w_1^Tx+b_1,w_2^Tx+b_2)

    • 不完全是线性的
    • ReLU和Leaky ReLU的综合
    • 不会饱和,梯度不会消失
    • 问题变量数增多

**函数的选择

  • 倾向于选择能更快收敛的**函数
  • 分类时,倾向于使用Sigmoid函数和Tanh函数。但如果梯度消失了,则会避免使用这两个**函数。
  • ReLU函数一般用在隐层里,但是要小心它的学习率(learning rates)。
  • 如果网络中有些神经元死了(即梯度消失了),则可以试试Leaky ReLU、Maxout或者ELU。
  • 一般首选ReLU,如果效果不好,再尝试别的**函数。

全连接前向网络

人工智能导论复习整理(三)

全连接:相邻层之间,每个神经元都和相邻层的每一个神经元相连接。

前向网络:上一层的输出作为下一层的输入,层层传递下去,且这样的网络没有反馈。

这样的网络实质上定义了一个函数,给定输入,得到输出。即,给定一个网络结构,实际上就定义了一组函数。函数具体的参数由网络的参数决定,网络的参数则是通过学习、训练得到的。

网络的计算可以用矩阵表示。对于上图的那个神经网络,其输入输出的关系为:y=f(x)y=f(x),具体表示为y=f(x)=σ(WLσ(W2σ(W1x+b1)+b2)+bL)y=f(x)=\sigma(W^L\cdots\sigma(W^2\sigma(W^1x+b^1)+b^2)\cdots+b^L),其中Wi,i=1,2,,LW^i,i =1,2,\cdots, L为第ii层的权重,bi,i=1,2,,Lb^i,i =1,2,\cdots, L为第ii层的偏置。这样的过程可以通过并行计算技术来加速矩阵的计算。

对于分类问题而言,隐层完成特征提取和分类,输出层一般选用Softmax,直接给出分类的结果。

对于神经网络而言,层数超过三层就算是深度神经网络。层与层之间是流水线的形式,即上一层的输入作为下一层的输出。每一层的抽象级别不同,越靠近输入越具体,越靠近输出越抽象。每一层的参数通过联合训练得到。

如何训练一个多层的神经网络

神经网络训练的目的是调整各层的参数(如W,bW,b),使得神经网络计算出来的结果和真实情况尽可能的接近。训练过程主要包括:信息的正向传播和误差的反向传播。(误差由loss函数提供)

基于链式法则的反向传播,用以更新wk,wkwkηewkw_k,\quad w_k \leftarrow w_k-\eta\dfrac{\partial e}{\partial w_k}
ewi=ehkhkhk1hi+1hihiwi \dfrac{\partial e}{\partial w_i} = \dfrac{\partial e}{\partial h_k} \dfrac{\partial h_k}{\partial h_{k-1}}\cdots\dfrac{\partial h_{i+1}}{\partial h_i}\dfrac{\partial h_i}{\partial w_i}
其中,ee是误差。Upstream gradient为:
ehi=ehkhkhk1hi+1hi \dfrac{\partial e}{\partial h_i}=\dfrac{\partial e}{\partial h_k} \dfrac{\partial h_k}{\partial h_{k-1}}\cdots\dfrac{\partial h_{i+1}}{\partial h_i}
Local gradient为:hiwi\dfrac{\partial h_i}{\partial w_i}

神经网络的表达能力

Universality Theorem:如果一个NN包含一个隐层,那它能近似任意一个连续函数。

为了防止过拟合,可以选择一个强大的NN,在带上适当的正则化。

假设有两个神经网络,一个层数少,每层神经元数量多;另一个层数多,每层神经元数量少。这两个网络的参数数量相同,但解决不同问题的时候性能不同。因此如何设计一个网络,需要多少层、每层多少神经元值得思考。

相关文章: