IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【深一点学习】BP网络,结合数学推导的代码实现 -> 正文阅读

[人工智能]【深一点学习】BP网络,结合数学推导的代码实现

  • 认识一个简单的神经网络

    • 在这里插入图片描述
  • 反向传播的推导(结合上图推导,慢慢来才比较快)

    • E = 1 2 ∑ j ? 1 l ( y j ^ ? y j ) 2 , 误 差 表 示 ; f ( x ) = s i g m o i d ( x ) = 1 1 + e ? x , 激 活 函 数 对 上 式 分 别 求 导 : ? E ? y j ^ = y j ^ ? y j ; ? f ( x ) ? x = f ( x ) ( 1 ? f ( x ) ) 隐 藏 层 权 重 修 正 量 的 公 式 : Δ w h j = ? η ? E ? w h j , 梯 度 的 反 方 向 为 下 降 方 向 , η 为 学 习 步 长 其 中 : ? E ? w h j = ? E ? y j ^ ? ? y j ^ ? β j ? ? β j ? w h j 其 中 : ? β j ? w h j = b h ; ? y j ^ ? β j = y j ^ ( 1 ? y j ^ ) ; ? E ? y j ^ = y j ^ ? y j Δ w h j = ? η ( y j ^ ? y j ) ( y j ^ ( 1 ? y j ^ ) ) ( b h ) 构 建 一 个 中 间 变 量 : g j = ? ? E ? y j ^ ? ? y j ^ β j = ? ( y j ^ ? y j ) ( y j ^ ( 1 ? y j ^ ) ) 对 于 输 出 层 神 经 元 的 偏 置 更 新 量 : Δ θ j = ? η g j = η ( y j ^ ? y j ) ( y j ^ ( 1 ? y j ^ ) ) 对 输 入 层 神 经 元 的 权 重 进 行 更 新 量 : Δ v i h = ? η ? E ? b h ? ? b h ? α h ? x i = η b h ( 1 ? b h ) ∑ j = 1 l w h j g j x i 对 隐 层 偏 置 进 行 更 新 量 : Δ γ h = η ? E ? b h ? ? b h ? α h = η b h ( 1 ? b h ) ∑ j = 1 l w h j g j E=\frac{1}{2}\sum_{j-1}^l(\hat{y_j}-y_j)^2,误差表示;f(x)=sigmoid(x)=\frac{1}{1+e^{-x}},激活函数\\ 对上式分别求导:\frac{\partial{E}}{\partial{\hat{y_j}}}=\hat{y_j}-y_j;\frac{\partial{f(x)}}{\partial{x}}=f(x)(1-f(x))\\ 隐藏层权重修正量的公式:\Delta{w_{hj}}=-\eta\frac{\partial{E}}{\partial{w_{hj}}},梯度的反方向为下降方向,\eta为学习步长\\ 其中:\frac{\partial{E}}{\partial{w_{hj}}}=\frac{\partial{E}}{\partial{\hat{y_j}}}·\frac{\partial{\hat{y_j}}}{\partial{\beta_j}}·\frac{\partial{\beta_j}}{\partial{w_{hj}}}\\ 其中:\frac{\partial{\beta_j}}{\partial{w_{hj}}}=b_h;\frac{\partial{\hat{y_j}}}{\partial{\beta_j}}=\hat{y_j}(1-\hat{y_j});\frac{\partial{E}}{\partial{\hat{y_j}}}=\hat{y_j}-y_j\\ \Delta{w_{hj}}=-\eta(\hat{y_j}-y_j)(\hat{y_j}(1-\hat{y_j}))(b_h)\\ 构建一个中间变量:g_j=-\frac{\partial{E}}{\partial\hat{y_j}}·\frac{\partial{\hat{y_j}}}{\beta_j}=-(\hat{y_j}-y_j)(\hat{y_j}(1-\hat{y_j}))\\ 对于输出层神经元的偏置更新量:\Delta\theta_j=-\eta{g_j}=\eta(\hat{y_j}-y_j)(\hat{y_j}(1-\hat{y_j}))\\ 对输入层神经元的权重进行更新量:\Delta{v_{ih}}=-\eta\frac{\partial{E}}{\partial{b_h}}·\frac{\partial{b_h}}{\partial\alpha_h}·x_i=\eta{b_h}(1-b_h)\sum_{j=1}^lw_{hj}g_jx_i\\ 对隐层偏置进行更新量:\Delta\gamma_h=\eta\frac{\partial{E}}{\partial{b_h}}·\frac{\partial{b_h}}{\partial\alpha_h}=\eta{b_h}(1-b_h)\sum_{j=1}^lw_{hj}g_j E=21?j?1l?(yj?^??yj?)2,f(x)=sigmoid(x)=1+e?x1?,?yj?^??E?=yj?^??yj?;?x?f(x)?=f(x)(1?f(x))Δwhj?=?η?whj??E?,η?whj??E?=?yj?^??E???βj??yj?^????whj??βj???whj??βj??=bh?;?βj??yj?^??=yj?^?(1?yj?^?);?yj?^??E?=yj?^??yj?Δwhj?=?η(yj?^??yj?)(yj?^?(1?yj?^?))(bh?)gj?=??yj?^??E??βj??yj?^??=?(yj?^??yj?)(yj?^?(1?yj?^?))Δθj?=?ηgj?=η(yj?^??yj?)(yj?^?(1?yj?^?))Δvih?=?η?bh??E???αh??bh???xi?=ηbh?(1?bh?)j=1l?whj?gj?xi?Δγh?=η?bh??E???αh??bh??=ηbh?(1?bh?)j=1l?whj?gj?
  • 手动实现一个两层(隐层,输出层)的神经网络(结合反向传播推到的各权重值及阈值的更新量推导结果)

    • 在这里插入图片描述

    • import numpy as np
      import matplotlib.pyplot as plt
      # 显示中文
      plt.rcParams['font.sans-serif']=['SimHei']
      plt.rcParams['axes.unicode_minus']=False
      #自定义sigmoid激活函数
      def sigmoid(x):
          return 1.0/(1+np.exp(-x))
      real_values = 1
      #设置两个神经元输入及一个阈值
      Inet_input = np.array([0.985,0.211,-1])
      #设置输出层的输入并初始化,4个神经元输入加上一个阈值
      Onet_input = np.array([0.0,0,0,0,-1])#设置为浮点型
      #学习率
      learning_rate = 1
      #设置隐层神经元的权值和阈值的更新矩阵
      w_mid = np.zeros([3,4])
      #设置输出层神经元的权重和阈值更新向量
      w_out = np.zeros([5])
      #隐层权值及阈值修正量
      delta_w_mid = np.zeros([3,4])
      #输出层权值及阈值的修正量
      delta_w_out = np.zeros([5])
      history = []
      error = []
      #定义训练轮次
      for epoch in range(100):
          #数据进入网络,从输入层到隐藏层的过程
          for i in range(4):
              Onet_input[i] = sigmoid(sum(Inet_input*w_mid[:,i]))
          #4个隐层神经元加上一个偏置,于输出层的各权重运算
          model_output = sigmoid(sum(Onet_input*w_out))
          #反向传播的是误差
          Err = abs(model_output - real_values)
          #输出每轮训练的结果
          print(epoch,model_output)
          history.append(model_output)
          error.append(Err)
          #输出层权值更新量
          delta_w_out = learning_rate * model_output * ( 1 - model_output )*( real_values - model_output ) * Onet_input
          #输出层阈值更新量
          delta_w_out[4] = - learning_rate * model_output * ( 1 - model_output )*( real_values - model_output )
          #先更新输出层神经元的权值及阈值
          w_out = w_out + delta_w_out
          for i in range(4):
              #隐层权值更新量,由于只有一个输出神经元,所以求和符号无
              delta_w_mid[:,i] = learning_rate*Onet_input[i]*(1-Onet_input[i])*w_out[i]*model_output*(1-model_output)*(real_values-model_output)*Inet_input
              #隐层阈值更新量
              delta_w_mid[2,i] = - learning_rate*Onet_input[i]*(1-Onet_input[i])*w_out[i]*model_output*(1-model_output)*(real_values-model_output)
          #更新隐层神经元的权值及阈值
          w_mid = w_mid + delta_w_mid
      plt.plot(history,label="模型输出值",color="red",linewidth=1.0,linestyle='--')
      plt.plot(error,label="模型损失值")
      plt.legend(loc='best')
      plt.show()
      
    • 学习步长为1,真实值为1,训练轮次为100

      • 在这里插入图片描述

BP神经网络简介

  • BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络模型之一

  • 人工神经网络无需事先确定输入输出之间映射关系的数学方程,仅通过自身的训练,学习某种规则在给定输入值时得到最接近期望输出值的结果。作为一种智能信息处理系统,人工神经网络实现其功能的核心是算法。BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称为BP算法,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。

  • BP神经网络已广泛应用于非线性建摸、函数逼近、系统辨识等方面。理论上已经证明,在不限制隐含节点数的情況下,两层(只有一个隐层)的BP网络可以实现任意非线性映射。在模式样本相对较少的情況下,较少的隐层节点,可以实现模式样本空间的超平面划分,此时,选择两层BP网络就可以了。当模式样本数很多时,减小网络规模,增加一个隐层是有必要的,但是BP网络隐含层数一般不超过两层。

  • BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的

  • BP神经网络的过程主要分为两个阶段,

    • 第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;
    • 第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置输入层到隐含层的权重和偏置
  • 神经网络的基本组成单元是神经元。神经元的通用模型如图所示,其中常用的激活函数有阈值函数、sigmoid函数和双曲正切函数。

    • 在这里插入图片描述
  • BP网络采用的传递函数是非线性变换函数——Sigmoid函数。其特点是函数本身及其导数都是连续的。

    • f ( x ) = 1 1 + e ? x , 单 极 性 S i g m o i d 函 数 ( 下 图 上 ) f ( x ) = 1 ? e ? x 1 + e ? x , 双 极 性 S i g m o i d 函 数 ( 下 图 下 ) f(x)=\frac{1}{1+e^{-x}},单极性Sigmoid函数(下图上)\\ f(x)=\frac{1-e^{-x}}{1+e^{-x}},双极性Sigmoid函数(下图下) f(x)=1+e?x1?Sigmoidf(x)=1+e?x1?e?x?Sigmoid

    • 在这里插入图片描述

    • 在这里插入图片描述

  • BP神经网络无论在网络理论还是在性能方面已比较成熟。其突出优点就是具有很强的非线性映射能力和柔性的网络结构。网络的中间层数、各层的神经元个数可根据具体情况任意设定,并且随着结构的差异其性能也有所不同。但是BP神经网络也存在以下的一些主要缺陷。

    • 学习速度慢,即使是一个简单的问题,一般也需要几百次甚至上千次的学习才能收敛。
    • 容易陷入局部极小值
    • 网络层数、神经元个数的选择没有相应的理论指导。
    • 网络推广能力有限。
  • BP网络主要用于以下四个方面

    • 函数逼近:用输入向量和相应的输出向量训练一个网络逼近一个函数。
    • 模式识别:用一个待定的输出向量将它与输入向量联系起来。
    • 分类:把输入向量所定义的合适方式进行分类。
    • 数据压缩:减少输出向量维数以便于传输或存储。
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:11:32  更:2022-04-04 12:14:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/8 4:18:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码