【MindSpore:跟着小Mi一起深度学习吧】深度神经网络
好久不见,甚是想念!小Mi最近一直在忙着消化深度学习的各种知识点,这不就马不停蹄地就给大家安排上啦!今天小Mi给大家介绍简单的深度学习网络(Deep Neural Networks, DNN),废话不多说,赶紧开始吧~
感知机
首先隆重介绍下神经网络的基础单元——感知机,整体过程就是对若干输入进行加权求和,再加上偏置值,最后通过激活函数得到神经元的输出:
中间输出结果:
最后通过某一种神经元激活函数,如:
该模型的输出结果只能为1或-1,可用于简单二元分类。
DNN基本结构
在介绍深度学习的过程中其实小Mi已经跟大家介绍过深度学习网络的大致模型,分别由输入层、隐藏层和输出层,而DNN简单来说就是拥有很多隐藏层的神经网络。
深度神经网络中层与层是全连接的关系,即,第i层的任意神经元一定与第i+1层的任意一个神经元相连。
前向传播算法
假设激活函数,下图中的DNN前向传播算法公式可以直接求得:
第二层输出:
第三层输出:
最后根据数学归纳法(这个很重要,本文中运用到好几次),可以得出,假设第层有m个神经元,则第层的第j个神经元的输出为:
这个时候矩阵也可以发挥巨大的作用啦~用矩阵法表示(所有的都可以看成是一个矩阵),第层的输出为:
代码思想
简单来说,前向传播算法就是对若干输入进行加权求和,再加上偏置值,最后通过激活函数,进行线性运算和激活运算,从第一层开始一层层向后计算。
输入: 总层数L,隐藏层、输出层的对应矩阵W,偏倚向量b,输入向量x
输出:输出层输出
1)初始化
2)for ,计算并输出:
反向传播
之前小Mi给大家介绍过机器学习算法,用一个合适的损失函数来度量训练样本的输出损失,接着对这个损失函数进行优化求最小化的极值,大家是不是对这个并不陌生?!对DNN的损失函数用梯度下降法进行迭代优化求极小值的过程就是反向传播算法。
在进行DNN反向传播算法前,需要选择一个损失函数,来度量训练样本计算出的输出和真实的训练样本输出之间的损失。
这里选用最常见的均方差来度量损失。即对于每个样本,期望最小化:
和y均为向量,而为S的L2范数。
那么便可以用梯度下降法迭代求解每一层的W,b啦。
输出层第L层,输出层的W,b满足:
对于输出层的参数,损失函数为:
求解W,b的梯度:
符号⊙表示Hadamard积,对于两个维度相同的向量A和B,则A⊙B=。
先对进行计算:
计算出输出层的梯度,然后一层一层递推,第层的未激活输出梯度可以表示为:
根据前向传播算法,第层的关系可以知道:
而第层的梯度如下:
接着求出,又一次采用数学归纳法,假设第层的已知,那么我们如何求出第层的呢?
可见,现在关键在于求解。
而和的关系其实很容易找出:
这样很容易求出:
将上式带入上面和关系式得到:
得到了的递推关系式,只要求出了某一层的,求解的对应梯度就很简单啦。
代码思路
由于梯度下降法有批量(Batch),小批量(mini-Batch),随机三个变种,这里小Mi选用最基本的批量梯度下降法来描述反向传播算法。
输入: 总层数L,各隐藏层与输出层的神经元个数,激活函数,损失函数,迭代步长,最大迭代次数MAX与停止迭代阈值,输入的m个训练样本
输出:各隐藏层与输出层的线性关系系数矩阵和偏倚向量
1.初始化各隐藏层与输出层的线性关系系数矩阵和偏倚向量的值为一个随机值。
2.for iter to 1 to MAX:
1) for i =1 to m:
a) 将DNN输入设置为
b) for=2 to L,进行前向传播算法计算
c) 通过损失函数计算输出层的
d) for = L-1 to 2, 进行反向传播算法计算
2) for = 2 to L,更新第层的:
3) 如果所有W,b的变化值都小于停止迭代阈值,则跳出迭代循环到步骤3。
输出各隐藏层与输出层的线性关系系数矩阵W和偏倚向量b。
好啦,今天小Mi的讲解就到这里啦,主要介绍了深度神经网络的前向传播和反向传播,还是稍微有点难度的,不过没难度咱们如何提高呢?下期给大家介绍深度神经网络的正则化!我们下期再见呦~