笔记1中我们利用搭建了神经网络最简单的结构单元:感知机。笔记2将继续学习如何手动搭建神经网络。我们将学习如何利用搭建一个含单隐层的神经网络。单隐层顾名思义,即仅含一个隐藏层的神经网络,抑或是成为两层网络。
继续回顾一下搭建一个神经网络的基本思路和步骤:
定义网络结构(指定输出层、隐藏层、输出层的大小)
初始化模型参数
循环操作:执行前向传播/计算损失/执行后向传播/权值更新
定义网络结构
假设为神经网络的输入特征矩阵,为标签向量。则含单隐层的神经网络的结构如下所示:
网络结构的函数定义如下:
其中输入层和输出层的大小分别与和的有关。而隐层的大小可由我们手动指定。这里我们指定隐层的大小为4。
初始化模型参数
假设为输入层到隐层的权重数组、为输入层到隐层的偏置数组;为隐层到输出层的权重数组,为隐层到输出层的偏置数组。于是我们定义参数初始化函数如下:
其中对权值的初始化我们利用了中的生成随机数的模块,偏置的初始化则使用了模块。通过设置一个字典进行封装并返回包含初始化参数之后的结果。
前向传播
在定义好网络结构并初始化参数完成之后,就要开始执行神经网络的训练过程了。而训练的第一步则是执行前向传播计算。假设隐层的激活函数为函数, 输出层的激活函数为函数。则前向传播计算表示为:
定义前向传播计算函数为:
从参数初始化结果字典里取到各自的参数,然后执行一次前向传播计算,将前向传播计算的结果保存到这个字典中, 其中为经过激活函数激活后的输出层的结果。
计算当前训练损失
前向传播计算完成后我们需要确定以当前参数执行计算后的的输出与标签值之间的损失大小。与笔记1一样,损失函数同样选择为交叉熵损失:
定义计算损失函数为:
执行反向传播
当前向传播和当前损失确定之后,就需要继续执行反向传播过程来调整权值了。中间涉及到各个参数的梯度计算,具体如下图所示:
根据上述梯度计算公式定义反向传播函数:
将各参数的求导计算结果放入字典进行返回。
这里需要提一下的是涉及到的关于数值优化方面的知识。在机器学习中,当所学问题有了具体的形式之后,机器学习就会形式化为一个求优化的问题。不论是梯度下降法、随机梯度下降、牛顿法、拟牛顿法,抑或是 Adam 之类的高级的优化算法,这些都需要花时间掌握去掌握其数学原理。
权值更新
迭代计算的最后一步就是根据反向传播的结果来更新权值了,更新公式如下:
由该公式可以定义权值更新函数为:
这样,前向传播-计算损失-反向传播-权值更新的神经网络训练过程就算部署完成了。当前了,跟笔记1一样,为了更加一点,我们也将各个模块组合起来,定义一个神经网络模型:
以上便是本节的主要内容,利用手动搭建一个含单隐层的神经网路。从零开始写起,打牢基础,待到结构熟练,原理吃透,再去接触一些主流的深度学习框架才是学习深度学习的最佳途径。
参考资料:
https://www.coursera.org/learn/machine-learning
https://www.deeplearning.ai/
领取专属 10元无门槛券
私享最新 技术干货