Back-Propagation-Neural-Network

BPNN C++ CMake update pages-build-deployment

本项目是对项目 GavinTechStudio/bpnn_with_cpp 的代码重构,基于C++实现基础BP神经网络,有助于深入理解BP神经网络原理。

项目结构

主要框架

训练原理

具体公式推导请看视频讲解彻底搞懂BP神经网络 理论推导+代码实现(C++)

注意:本部分文档包含大量数学公式,由于GitHub markdown不支持数学公式渲染,推荐以下阅读方式:

  1. 如果您使用的是Chrome、Edge、Firefox等浏览器,可以安装插件MathJax Plugin for Github(需要网络能够访问chrome web store)。
  2. 使用PDF的方式进行阅读(推荐)。
  3. 使用预渲染的静态网页进行阅读(推荐)。
  4. .键或点击链接进入GitHub在线IDE预览README.md文件。

0. 神经网络结构图

1. Forward(前向传播)

1.1 输入层向隐藏层传播

hj=σ(ixiwijβj)

其中hj为第j个隐藏层节点的值,xi为第i个输入层节点的值,wij为第i个输入层节点到第j个隐藏层节点的权重,βj为第j个隐藏层节点偏置值,σ(x)Sigmoid激活函数,后续也将继续用这个表达,其表达式如下

σ(x)=11+ex

本项目中的代码实现如下:

1.2 隐藏层向输出层传播

yk^=σ(jhjvjkλk)

其中yk^为第k个输出层节点的值(预测值),hj为第j个隐藏层节点的值,vjk为第j个隐藏层节点到第k个输出层节点的权重,λk为第k个输出层节点的偏置值,σ(x)为激活函数。

本项目中的代码实现如下:

2. 计算损失函数(Loss Function)

损失函数定义如下:

Loss=12k(ykyk^)2

其中yk为第k个输出层节点的目标值(真实值),yk^为第k个输出层节点的值(预测值)。

本项目中的代码实现如下:

3. Backward(反向传播)

利用梯度下降法进行优化。

3.1 计算Δλk(输出层节点偏置值的修正值)

其计算公式如下(激活函数为Sigmoid时):

Δλk=η(ykyk^)yk^(1yk^)

其中η为学习率(其余变量上方已出现过不再进行标注)。

本项目中的代码实现如下:

3.2 计算Δvjk(隐藏层节点到输出层节点权重的修正值)

其计算公式如下(激活函数为Sigmoid时):

Δvjk=η(ykyk^)yk^(1yk^)hj

其中hj为第j个隐藏层节点的值(其余变量上方已出现过不再进行标注)。

本项目中的代码实现如下:

3.3 计算Δβj(隐藏层节点偏置值的修正值)

其计算公式如下(激活函数为Sigmoid时):

Δβj=ηk(ykyk^)yk^(1yk^)vjkhj(1hj)

其中vjk为第j个隐藏层节点到第k个输出层节点的权重(其余变量上方已出现过不再进行标注)。

本项目中的代码实现如下:

3.4 计算Δwij(输入层节点到隐藏层节点权重的修正值)

其计算公式如下(激活函数为Sigmoid时):

Δwij=ηk(ykyk^)yk^(1yk^)vjkhj(1hj)xi

其中xi为第i个输入层节点的值(其余变量上方已出现过不再进行标注)。

本项目中的代码实现如下: