C+实现神经网络之贰—前向传播和反向传播

前言

前一篇文章C++实现神经网络之壹—Net类的设计和神经网络的初始化中,大部分还是比较简单的。因为最重要事情就是生成各种矩阵并初始化。神经网络中的重点和核心就是本文的内容——前向和反向传播两大计算过程。每层的前向传播分别包含加权求和(卷积?)的线性运算和激活函数的非线性运算。反向传播主要是用BP算法更新权值。本文也分为两部分介绍。

前向过程

如前所述,前向过程分为线性运算和非线性运算两部分。相对来说比较简单。

线型运算可以用来表示,其中X是输入样本,这里即是第N层的单列矩阵,W是权值矩阵,Y是加权求和之后的结果矩阵,大小与N+1层的单列矩阵相同。b是偏置,默认初始化全部为0。不难推知,W的大小是。正如上一篇中生成weights矩阵的代码实现一样:

非线性运算可以用来表示。Y就是上面得到的Y。O就是第N+1层的输出。f就是我们一直说的激活函数。激活函数一般都是非线性函数。它存在的价值就是给神经网络提供非线性建模能力。激活函数的种类有很多,比如sigmoid函数,tanh函数,ReLU函数等。各种函数的优缺点可以参考更为专业的论文和其他更为专业的资料。

我们可以先来看一下前向函数forward()的代码:

for循环里面的两句就分别是上面说的线型运算和激活函数的非线性运算。

激活函数里面实现了不同种类的激活函数,可以通过第二个参数来选取用哪一种。代码如下:

各个函数更为细节的部分在和文件中。在此略去不表,感兴趣的请君移步。

需要再次提醒的是,上一篇博客中给出的Net类是精简过的,下面可能会出现一些上一篇Net类里没有出现过的成员变量。完整的Net类的定义还是在里。

反向传播过程

反向传播原理是链式求导法则,其实就是我们高数中学的复合函数求导法则。这只是在推导公式的时候用的到。具体的推导过程我推荐看看下面这一篇教程,用图示的方法,把前向传播和反向传播表现的清晰明了,强烈推荐!

Principles of training multi-layer neural network using backpropagation。

一会将从这一篇文章中截取一张图来说明权值更新的代码。在此之前,还是先看一下反向传播函数backward()的代码是什么样的:

可以看到主要是是三行代码,也就是调用了三个函数:

第一个函数计算输出误差和目标函数,所有输出误差平方和的均值作为需要最小化的目标函数。

第二个函数计算delta误差,也就是下图中delta1*df()那部分。

第三个函数更新权值,也就是用下图中的公式更新权值。

下面是从前面强烈推荐的文章中截的一张图:

就看下updateWeights()函数的代码:

核心的两行代码应该还是能比较清晰反映上图中的那个权值更新的公式的。图中公式里的eta常被称作学习率。训练神经网络调参的时候经常要调节这货。

计算输出误差和delta误差的部分纯粹是数学运算,乏善可陈。

需要注意的就是计算的时候输出层和隐藏层的计算公式是不一样的。

另一个需要注意的就是......难道大家没觉得本系列文章的代码看起来非常友好吗

至此,神经网络最核心的部分已经实现完毕。剩下的就是想想该如何训练了。这个时候你如果愿意的话仍然可以写一个小程序进行几次前向传播和反向传播。还是那句话,鬼知道我在能进行传播之前到底花了多长时间调试!

本文来自企鹅号 - CVPy媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能头条

深度学习目标检测指南:如何过滤不感兴趣的分类及添加新分类?

20630
来自专栏Petrichor的专栏

思考: 神经网络层 的 功能识别

卷积操作 即为 一系列 滤波操作 之和 。 有关卷积的概念,具体可参加我的这篇文章:深度学习: convolution (卷积) 。

11950
来自专栏PPV课数据科学社区

译:支持向量机(SVM)及其参数调整的简单教程(Python和R)

一、介绍 数据分类是机器学习中非常重要的任务。支持向量机(SVM)广泛应用于模式分类和非线性回归领域。 SVM算法的原始形式由Vladimir N.Vapnik...

81380
来自专栏ATYUN订阅号

Python中的白噪声时间训练

白噪声是时间序列预测中的一个重要概念。如果一个时间序列是白噪声,它是一个随机数序列,不能预测。如果预测误差不是白噪声,它暗示了预测模型仍有改进空间。 在本教程中...

95260
来自专栏人工智能

深度学习入门笔记(2)-线性回归 Linear Regression with autograd

一同前行! 假设我们有一个曲线(或者平面)y=wx+b 我们给定它一个特定的w,和b w = [2,51] b = 21.2 即y=2x1+51x2+21.2 ...

28890
来自专栏GAN&CV

基础 | batchnorm原理及代码详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25737169/article/d...

9610
来自专栏磐创AI技术团队的专栏

基于Doc2vec训练句子向量

72450
来自专栏智能算法

机器学习三人行(系列三)----end-to-end机器学习

系列二我们详细介绍了数据下载,数据透析以及数据的不同分组方式,详情请参考:机器学习三人行(系列二)----机器学习前奏,洞悉数据之美!。但是在真正进行训练之前,...

40080
来自专栏人工智能

机器学习(四)——梯度下降算法解释以及求解

机器学习(四) ——梯度下降算法解释以及求解θ (原创内容,转载请注明来源,谢谢) (本文接机器学习(二)的内容) 一、解释梯度算法 ? 梯度算法公式以及简化的...

23250
来自专栏算法channel

机器学习逻辑回归:算法兑现为python代码

0 回顾 昨天推送了逻辑回归的基本原理:从逻辑回归的目标任务,到二分类模型的构建,再到如何用梯度下降求出二分类模型的权重参数。今天,我们将对这个算法兑现为代码...

37050

扫码关注云+社区

领取腾讯云代金券