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

目标:推导、实现一个简单的人工神经网络

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  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容