前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C+实现神经网络之贰—前向传播和反向传播

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

作者头像
企鹅号小编
发布2018-01-15 14:46:54
6990
发布2018-01-15 14:46:54
举报
文章被收录于专栏:人工智能人工智能

前言

前一篇文章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媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - CVPy媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档