Deep Learning Notebook 2:单隐藏层神经网络搭建
“ 本篇主要介绍从零开始搭建一个具有单隐藏层的神经网络结构”
在笔记1中我们搭建了一个不含隐藏层的简单神经网络模型,本节我们将搭建一个包含单个隐藏层的神经网络模型,神经网络模型搭建的基本思路如下:
定义网络结构(指定输入层、隐藏层和输出层的大小)
初始化模型参数
循环操作:执行前向传播、计算损失、执行反向传播、权值更新
01
—
定义网络结构
假设 x 为神经网络的输入特征矩阵, y 为标签向量,则含有单个隐藏层的神经网络结构如下图所示:
网络结构的函数定义如下:
其中,输入层和输出层的大小分别与 X 和 Y 的shape有关,而隐藏层的大小可以通过我们手动指定,这里我们指定隐藏层的大小为4。
02
—
初始化模型参数
假设 W1 为输入层到隐藏层的权重数组,b1 为输入层到隐藏层的偏置数组,W2 为隐藏层到输出层的权重数组, b2 为隐藏层到输出层的偏置数组。参数初始化函数可以按如下方式定义:
其中对权值的初始化我们利用了numpy中的生成随机数的模块 np.random.randn ,偏置的初始化则使用了 np.zeros 模块。通过设置一个字典进行封装并返回包含初始化参数之后的结果。
03
—
前向传播
在定义好网络结构并初始化参数完成之后,就要开始执行神经网络的训练过程了。而训练的第一步则是执行前向传播计算。假设隐藏层的**函数为tan函数,输入层的**函数为 sigmoid 函数。则前向传播计算表示为:
定义前向传播函数为:
从参数初始化结果字典中取到各自的参数,然后执行一次前向传播计算,将前向传播计算的结果保存到 cache 字典中,其中 A2 为经过Sigmoid**函数**后的输出层的结果。
04
—
计算当前训练损失
前向传播计算完成后我们需要确定当前参数执行计算后的输出与标签值间的损失大小,计算损失采用交叉熵损失:
定义计算损失函数为:
05
—
执行反向传播
当前向传播和当前损失确定以后,就需要继续执行反向传播过程来调整权值,中间涉及到的各个参数的梯度计算,具体如下图所示:
根据上述梯度计算公式定义反向传播函数:
将各参数的求导计算结果放入字典 grad 进行返回。
在机器学习中,当所学问题有了具体的形式之后,机器学习就会形式化为一个求优化的问题。不论是梯度下降法、随机梯度下降、牛顿法、拟牛顿法抑或是Adam之类的高级的优化算法。
06
—
权值更新
迭代计算的最后一步就是根据反向传播的结果来更新权值了,更新公式如下:
由该公式可以定义权值更新函数为:
这样,前向传播,计算损失,反向传播,权值更新的神经网络训练过程就部署完成了。接下来我将定义一个神经网络模型将各个模块组合起来,具体如下:
参考:
https://www.cnblogs.com/rongyux/p/7742152.html
欢迎关注