【机器学习】机器学习阶段四 神经网络与深度学习 - 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的更新方案:W - (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
- 代码风格统一,训练速度快