美文网首页
构建一个简单的人工神经网络

构建一个简单的人工神经网络

作者: Mexplochin | 来源:发表于2018-12-01 17:50 被阅读0次
目标:推导、实现一个简单的人工神经网络
Simple Neural Network
结点激活函数使用
初始连接权重可以随机生成
信号传播

为了实现信号传播,要将上一层各结点的输出信号按该结点每条输出连接的权重比例进行分配,并在该层各结点处得到所有输入连接的组合信号,对组合信号应用激活函数就可以得到结点的实际输出信号。
以Input层和Hidden层的信号传播为例,设Input层各结点输入信号构成的矩阵为,X_{input}=\begin{pmatrix} x_1 & x_2 & \cdots & x_n \end{pmatrix}^T
由于对Input层输入信号并不应用激活函数,所以Input层输出信号与其输入信号相等。而Input层到Hidden层的连接权重矩阵为,
W_{ih}=\begin{pmatrix} w_{11} & w_{21} & \cdots & w_{n1} \\ w_{12} & w_{22} & \cdots & w_{n2} \\ \vdots & \vdots & \ddots & \vdots \\ w_{1m} & w_{2m} & \cdots & w_{nm} \end{pmatrix}
其中w_{nm}是指Input层结点n到Hidden层结点m的连接权重。由此得到Hidden层各结点组合输入信号(输入信号总和),并对其应用激活函数,就是Hidden层各结点输出信号,
X_{hidden}=W_{ih} X_{input} \\ O_{hidden}=Sigmoid(X_{hidden})
同理可得Hidden层与Output层的信号传播方法,
X_{output}=W_{ho} O_{hidden}\\ O_{output}=Sigmoid(X_{output})

误差反向传播

以Hidden层和Output层的误差反向传播为例,由训练数据的目标值和Output层的实际输出值可以得到Output层的误差矩阵,
E_{output}=Target-O_{output}=\begin {pmatrix} e_1 & e_2 & \cdots & e_n \end{pmatrix}^T
将误差按原始权重比例分配到每条连接并反向传播至Hidden层,分配到各条连接上的误差和Hidden层的误差分别为e_{ij}=e_{j}\times \frac {w_{ij}} {\sum_{i=1}^n w_{ij}},e_{ij}\in E_{link},e_{j}\in E_{output}, w_{ij}\in W_{ho}\\ e_{i}=\sum_{j=1}^m e_{ij},e_{i}\in E_{hidden}
其中e_{ij}是指Hidden层结点i到Output层结点j连接分配到的误差,转化为矩阵表述,E_{hidden}=W_{ho}^T E_{output}W_{ho}^T是将原权重比例矩阵去归一化因子后的得到的矩阵。

改进连接权重

通过梯度下降法使用误差指导连接权重的调整。Output层结点误差总和关于输入连接权重的函数关系为,
\epsilon(W_{ho})=\sum_{i=1}^n (Target(i)-O_{output}(i))^2\\ O_{output}=Sigmoid(W_{ho}O_{hidden})
转化为对单个结点进行运算,求出误差在各权重维度上的梯度,
\frac {\partial \epsilon} {\partial w_{jk}}=\frac \partial {\partial w_{jk}} (Target(k)-O_{output}(k))^2,j=1,2,\cdots,n\\ \frac {\partial \epsilon} {\partial w_{jk}}=\frac {\partial \epsilon} {\partial O_{output}(k)} \frac {\partial O_{output}(k)} {\partial w_{jk}}=-2(Target(k)-O_{output}(k))\frac {\partial S(\sum_j {w_{jk} O_{hidden}(j)})} {\partial w_{jk}}\\ =-2(Target(k)-O_{output}(k))O_{output}(k)(1-O_{output}(k))O_{hidden}(j)
结合学习率,即可得到权重的改变量\Delta w

代码实现
import numpy as np
import scipy.special
class neuralNetwork :
    #构造函数 设定输入层、隐藏层、输出层节点数量
    def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate):
        self.nInodes=inputnodes
        self.nHnodes=hiddennodes
        self.nOnodes=outputnodes
        
        self.fLrate =learningrate
        
        self.mW_ih=np.random.normal(0,pow(self.nHnodes,-0.5),(self.nHnodes,self.nInodes))
        self.mW_ho=np.random.normal(0,pow(self.nOnodes,-0.5),(self.nOnodes,self.nHnodes))
        
        self.activation_function=lambda x: scipy.special.expit(x)
    #学习训练集数据 优化权重
    def train(self,inputs_list,targets_list):
        mO_t=np.array(targets_list,ndmin=2).T
        
        #mO_o=self.query(inputs_list)         
        #-------------------------------------------------------------#
        mX_i=np.array(inputs_list,ndmin=2).T
        
        mX_h=np.dot(self.mW_ih,mX_i)
        mO_h=self.activation_function(mX_h)
        
        mX_o=np.dot(self.mW_ho,mO_h)
        mO_o=self.activation_function(mX_o)
        #-------------------------------------------------------------# 
       
        mE_o=mO_t-mO_o                       
        mE_h=np.dot(self.mW_ho.T,mE_o)       
        
        self.mW_ho+=self.fLrate*np.dot((mE_o*mO_o*(1-mO_o)),mO_h.T)
        self.mW_ih+=self.fLrate*np.dot((mE_h*mO_h*(1-mO_h)),mX_i.T)
        
    
    #给定输入 从输出节点给出答案
    def query(self,inputs_list):
        mX_i=np.array(inputs_list,ndmin=2).T
        
        mX_h=np.dot(self.mW_ih,mX_i)
        mO_h=self.activation_function(mX_h)
        
        mX_o=np.dot(self.mW_ho,mO_h)
        mO_o=self.activation_function(mX_o)
        
        return mO_o  

相关文章

  • 人工神经网络及其MATLAB实现

    前言 这里只记录BP神经网络 1.人工神经网络基本理论 1.1人工神经网络模型拓扑结构 人工神经网络是由大量简单的...

  • 构建一个简单的人工神经网络

    目标:推导、实现一个简单的人工神经网络 信号传播 为了实现信号传播,要将上一层各结点的输出信号按该结点每条输出连接...

  • 自动编码器【转】

    查看原文 1 简介 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身...

  • 黑箱方法-神经网络①

    人工神经网络 人工神经网络的概念 人工神经网络(Artificial Neural Networks,ANN)是对...

  • 人工神经网络综述

    文章主要分为:一、人工神经网络的概念;二、人工神经网络的发展历史;三、人工神经网络的特点;四、人工神经网络的结构。...

  • 《机器学习(周志华)》学习笔记(五)

    Q:什么是人工神经网络? A:人工神经网络是科学及模拟人类大脑的神经神经网络建立的数学模型。人工神经网络由一个个“...

  • 神经网络算法之神经元

    背景简介 对人类中枢神经系统的观察启发了人工神经网络这个概念。在人工神经网络中,简单的人工节点,称作神经元(或感知...

  • Tensorboard进行可视化 1

    我们之前已经构建了一个简单的神经网络算法。如果想在Tensorboard中可视化这个神经网络,可以用Tensorb...

  • 1-1-1 欢迎学习这门纳米学位

    在这门纳米学位中,你将学习人工智能 (AI) 的基础知识,来构建和训练神经网络。 编程入门基础数学什么是神经网络这...

  • 人工智能——神经网络在人工智能中扮演的角色和发展历史

    随着人工智能的应用范围普及和扩大,大家对人工神经网络(学习单元)也渐渐耳闻目染。下面 就简单的为大家介绍下神经网络...

网友评论

      本文标题:构建一个简单的人工神经网络

      本文链接:https://www.haomeiwen.com/subject/xswlcqtx.html