【机器学习】机器学习阶段四 神经网络与深度学习 - hippowc/hippowc.github.io GitHub Wiki

全连接神经网络

  • CNN、RNN、LSTM等神经网络都是基于全连接神经网络
  • 基础学习原理都是由反向传播而来

反向传播(Back Propagation)理解

就是求Loss方程的极值,要求极值,首先求导。但是要求的是多元函数的极值,这就涉及到偏导数的概念,所谓偏导数,就是对不同变量分别求导,把其他未知量当成常数

理解梯度和偏导数

在一元函数中,A点的导数是A点的切线斜率。但是对于二元甚至多元函数会更复杂一点,以二元函数为例(假设是一个碗的形状):在任意带你A,有360度的方向,每个方向都有方向导数,都代表了这个方向切线的斜率

  • 偏导数:多元函数沿着某个坐标轴的切线斜率(变化率)
    • 偏导数的局限:实际情况需要考虑沿着任意方向的变化率,而不是仅仅沿着坐标轴
  • 方向导数
    • 方向导数是一个更一般的概念,是函数沿某个方向的导数
    • 方向:定义为在某个投影平面上的一个向量来表示方向,本质是一个向量
  • 梯度,其方向上的方向导数最大,梯度的值是方向导数的最大值(即:变化率的大小),本质也是一个向量
    • 对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度(这个方式求的值是否是真正最大方向导数?)
    • 负梯度方向是函数值减小最快的方向

梯度求解

需要理解两点:

  • 梯度求解公式:把求得的各个参数的偏导数以向量的形式写出来,就是梯度
  • 链式法则
    • 用于求复合函数的导数:复合函数的导数是构成复合有限个函数在相应点导数的乘积
    • 神经网络中每一层都是一次函数的嵌套

反向传播求解Loss最小值步骤

出发:

  • 求Loss函数最小值,Loss是一个复合函数,参数为W(权重,一定记得W才是变量,求偏导都是对W去求)
    • 正向传播 -- 求预测值
      • 随机初始化所有W,把输入X代入,根据函数求的Y
      • 使用实际Y0 - Y 的到一个损失值 L1
    • 反向传播(Back Propagation) -- 更新W值
      • W的更新方案:W - (lr * 损失函数对于W的偏导数)
        • 理解:以一元函数为例,x要取最小值的点,先求当前点的导数,如果是正的,x需要沿x轴向左移动,即x需要减去一些值,如果是负的,则x需要向右移动,即x需要加上一些值,所以可以使用 (x - 导数值) 来表示移动方向,至于移动多少,可以增加一个参数 lr 学习率 来调节。所以偏导数可以理解为W对整体误差产生的影响
      • 求复合函数偏导(链式法则)
    • 所有W值更新完毕后,再次从头重复,反复迭代

其他神经网络结构介绍

CNN卷积神经网络

全连接神经网络的缺点

随着网络层次加深,为了求解Loss,需要计算的偏导连乘就越多,付出的计算代价越大,全连接层级之间每个节点都是全连接的,网络结构越复杂,整个网络就会收敛的非常慢,对于图像这种冗余信息特别多的输入,使用全连接计算是一场灾难

CNN卷积神经网络原理

一个CNN网络结构包含:

  • 输入层(Input layer)
  • 卷积层(convolutional layer)-- 特征提取(主要针对图像)
  • 池化层(pooling layer) -- 特征选择
  • 输出层(全连接 + softmax)

与全连接的区别

  • 至少有一个卷积层,用于提取特征
  • 卷积层之间的神经元,局部连接并且权值共享,大大减少W和B的数量

RNN循环神经网络

全连接和CNN都只能单独的处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。为了能够更好的处理序列的信息,出现了RNN

RNN原理

RNN会多出一个隐藏层,循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值

RNN的变种

  • LSTM长短期记忆网络(Long-Short Term Memory Networks)
  • GRU 门控循环单元(gated recurrent unit)

搭建神经网络

深度学习框架

  • Tensorflow
    • 适合算法落地,周边生态成熟
  • keras
    • 适合新手入门,但API设计不适合深度定制开发
  • PyTorch
    • 学术界普遍使用,开发新模型简单
  • MxNet
    • 代码风格统一,训练速度快