深度学习(DeepLearning)


简介

  • 深度学习是机器学习中的一个分支,它起源于人们对人工神经网络(感知机)的研究,就像生物神经细胞一样,它的状态取决于权重(weight),偏置(bias)以及激活函数(Activation function)(可以采用Sigmoid函数)。人工神经网络中规定神经元函数只能对输入变量线性组合后的结果进行一次非线性变换。
  • 不同的神经元之间的连接方式,构成了不同的网络结构,同时权重和偏置值构成了神经网络的参数$\theta$
  • 神经网络结构,可以看做一个函数集
  • 深度神经网络中分为三个(Input,Hidden,Output)layer,其中,Hidden layer中间有数层layer,每层layer又有多个神经元(Neuron),输出层就是多分类器。
  • 如何对输出结果的好坏进行量化评估以及找到最佳的参数呢?
  • 我们可以通过度量误差,也就是计算实际结果与预测结果之间的距离(交叉验证(CrossEntropy)等),通过使用梯度下降等方法,调整参数,使损失函数的值达到最小,从而确定最佳参数,达到优化神经网络的目的
    [附李宏毅老师的视频]
Tips
  • 测试集上效果不好准确率低并不意味着过拟合,可能模型在训练集上的准确率就不好
  • 过拟合:在训练集上准确率很高,在测试集上准确率很低

所以我们要解决,在训练集\测试机上效果不好的情况:

  1. 训练集
    • 更换激活函数
      • 当激活函数为Sigmoid函数时,会出现layer越多,训练效果越差的情况(梯度消失(Vanishing Gradient Problem)),根据Sigmoid函数的图像我们可以发现,当参数发生很大的变化时,对某一个Neuron的输出产生的影响实际上是比较小的,而且会越来越小(每通过一层Sigmoid函数,对于输出的影响就会不断衰减)
      • 针对上述情况,我们可以使用ReLU(Rectified Linear Unit)
    • 适应性的更改学习率
  2. 测试集
    • 早停(Early Stopping)
      • 随着训练的不断进行,训练集上的Total Loss不断减小,但是在测试集上的Total Loss可能会出现先降低后升高的情况,所以我们常把训练停止在测试集损失最小的位置,因为不知道测试集的损失变化情况,所以用验证集来代替测试集
    • 正则化(Regularization)
      • 重新定义要最小化的损失函数,防止过拟合
      • $L^{‘}(\theta)=L(\theta)+\lambda\frac{1}{2}\lVert\theta\rVert_2$
      • L2正则化$\quad\lVert\theta\rVert_2=(w_1)^2+(w_2)^2+\dots$
        • 对新的损失函数求偏微分 $\dfrac{\partial{L^{‘}}}{\partial{w}}=\dfrac{\partial{L}}{\partial{w}}+\lambda w$
        • $w^{t+1}\leftarrow w^t-\eta\dfrac{\partial{L^{‘}}}{\partial{w}}=(1-\eta\lambda)w^{t}-\eta\dfrac{\partial L}{\partial{w}}\quad$$(\lambda$通常为一个很小的数如0.001$)\leftarrow$Weight Decay
      • L1正则化$\quad\lVert\theta\rVert_1=|w_1|+|w_2|+\dots$
        • $\dfrac{\partial{L^{‘}}}{\partial{w}}=\dfrac{\partial{L}}{\partial{w}}+\lambda sgn(w)$
        • $w^{t+1}\leftarrow w^t-\eta\dfrac{\partial{L^{‘}}}{\partial{w}}=w^{t}-\eta\dfrac{\partial L}{\partial{w}}-\eta\lambda sgn(w^t)\quad$(sgn(x)为符号函数)$\leftarrow$Always delete
    • (Dropout)
      • 在训练过程中每次update参数时对每层的Neuron进行随机抽样,既每个Neuron会有p%的概率会被dropout

BP神经网络(BackPropagation)

BP算法基于梯度下降策略,在每一次迭代中对参数进行更新,既通过误差反向传播来调节参数
应用链式法则(Chain Rule)
对于一个神经网络输入层$x^n$,隐藏层$\theta$,输出层$y^n$,target$\hat y^n$,它的Total loss 为$L(\theta)=\sum\limits^N_{n=1}C^n(\theta)$ ($C^n$为均方误差)
对Total loss 求偏微分$\dfrac{\partial{L(\theta)}}{\partial{w}}=\sum\limits^N_{n=1}\dfrac{\partial{C^n(\theta)}}{\partial{w}}$
假设 $z=x_1w_1+x_2w_2+b$,根据链式法则$\dfrac{\partial{C}}{\partial{w}}=\dfrac{\partial z}{\partial w}\dfrac{\partial C}{\partial z}$

  • Forward pass
    $\dfrac{\partial{z}}{\partial{w_1}}=x_1$
  • Backward pass
    $\dfrac{\partial C}{\partial z}=\sigma^{‘}(z)\bigg[{w_3\dfrac{\partial C}{\partial z^{‘}}+w_4\dfrac{\partial C}{\partial z^{‘’}}}\bigg]$,其中$\sigma^{‘}(z)$是一个常数
    • $\dfrac{\partial C}{\partial z}$的计算方法
      1. 输出层
        $z^{‘}\longrightarrow$激活函数$\longrightarrow y_1$
        $\dfrac{\partial C}{\partial z^{‘}}=\dfrac{\partial y_1}{\partial z^{‘}}\dfrac{\partial C}{\partial y_1}$
      2. Hidden Layer
        从输出层算起

激活函数

  1. Sigmoid函数
    • $f(x)=\dfrac{1}{1+e^{-x}}$
    • $f^{‘}(x)=f(x)(1-f(x))$
  2. ReLU函数
    • 它的运算速度要比Sigmoid函数快
    • 当不改变Neuron的操作域(operation region)时,NN为线性,当对输入做比较大的改变,使Neuron的操作域发生变化,那么这个NN就是非线性的
    • 原本的ReLU在参数小于0时,因为梯度等于0,就停止了更新。为了让参数保持更新,可以适当改变ReLU在负轴的形态,即$ \alpha=\begin{cases}0.01z,\quad z<0\\\alpha z, \quad z<0\end{cases}$
  3. Maxout(ReUL是Maxout的一个特例)
    • Maxout的工作原理就是将Layer的输出进行分组,然后从每个group中选取最大值,未被选中的Neuron贡献值则为零,根据分组中元素个数的不同,会产生不同的激活函数,也可以看做是自适应的激活函数。
    • 不必担心因为某些Neroun没有被选中而没有训练到该参数,因为在大量的训练集的条件下,输出值也会不同,每个Neuron都会被训练到
  4. Logistics函数