• 神经网络基本原理

一.神经元模型

图中x1~xn是从其他神经元传来的输入信号,wij表示表示从神经元j到神经元i的连接权值,θ表示一个阈值 ( threshold ),或称为偏置( bias )。则神经元i的输出与输入的关系表示为:

图中 yi表示神经元i的输出,函数f称为激活函数 ( Activation Function )或转移函数 ( Transfer Function ) ,net称为净激活(net activation)。若将阈值看成是神经元i的一个输入x0的权重wi0,则上面的式子可以简化为:

若用X表示输入向量,用W表示权重向量,即:

X = [ x0 , x1 , x2 , ....... , xn ]

则神经元的输出可以表示为向量相乘的形式:

若神经元的净激活net为正,称该神经元处于激活状态或兴奋状态(fire),若净激活net为负,则称神经元处于抑制状态。

图1中的这种“阈值加权和”的神经元模型称为M-P模型 ( McCulloch-Pitts Model ),也称为神经网络的一个处理单元( PE, Processing Element )

  • 激活函数

激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数。

(1) 线性函数 ( Liner Function )

(2) 斜面函数 ( Ramp Function )

(3) 阈值函数 ( Threshold Function )

以上3个激活函数都属于线性函数,下面介绍两个常用的非线性激活函数。

(4) S形函数 ( Sigmoid Function )

  该函数的导函数:

(5) 双极S形函数 

  该函数的导函数:

双极S形函数与S形函数主要区别在于函数的值域,双极S形函数值域是(-1,1),而S形函数值域是(0,1)。

由于S形函数与双极S形函数都是可导的(导函数是连续函数),因此适合用在BP神经网络中。(BP算法要求激活函数可导)

  • 多层感知器模型

二.BP神经网络

BP网络的学习过程由信号的正向传播和反向传播两个过程组成:

  • 正向传播时信号从输入层计算各层加权和经由各隐层最终传递到输出层,得到输出结果
  • 输出结果与期望结果(监督信号)比较得到输出误差,误差反传是依照梯度下降算法将误差沿着隐藏层到输入层逐层反传,将误差分摊给各层的所有单元,从而得到各个单元的误差信号(学习信号),据此修改各单元权值

  • 研究步骤

    1. 确定激活函数,BP网络的激活函数必须可微,一般采用Sigmoid函数或线性函数作为激活函数。这里隐层和输出层我们均采用Sigmoid函数
    2. 计算输出

对于隐层:

对于输出层:

3.权值调整

这里我们用代价函数E来描述网络误差,使用随机梯度下降(SGD,StochasticGradient Descent)策略, 以代价函数的负梯度方向对参数进行调整。每次只针对一个训练样例更新权值。这种算法被称作误差逆传播(error Back Propagation)算法,简称标准BP算法

代价函数E:

根据梯度下降策略,误差沿梯度方向下降最快,故应使权值的调整量与误差的梯度下降成正比,即:

  • 对于输出

  • 对于隐层

其中表示学习率,用来限制训练速度的快慢

  • BP算法推导

  • BP学习算法流程图

  • 局限性

多极小值点容易使训练陷入局部最小

在函数变化平缓的区域收敛速度会很慢,使得训练次数大大增加

  • 改进算法

增加动量项:由于在梯度下降过程中,随着梯度越来越小,权值更新越来越慢,此时可能出现因为梯度极速下降而造成的震荡,也可能出现因为梯度下降过缓而造成收敛过慢

*引入上一次的权值调整作为调整项,使权值调整具有一定的惯性,含有动量项的权值调整表达式为

称为动量因子。即此次权值的调整如果和上次方向相同会加速收敛,如果方向相反会减缓震荡。因此可以很好的提高训练速度

*学习率在一定程度上限定了权值调整的快慢, 学习率调整也是先用大的学习率到震荡区域,这个区域包含极小值,然后再用小的学习率逼近极小值。学习率的增减通过乘以一个因子来实现

  • R代码实现(nnet包的单隐层BP网络)

  • 加载数据和数据清洗
  • 清理环境变量,加载Soanr,Mines vs. Rocks 数据
rm(list=ls())
library(mlbench)
data(Sonar)
  • 重新定义因子级别为0,1,其中岩石是级别1,金属是级别0
levels(Sonar$Class)<-c(,)
  • 随机抽样,建立训练集和测试集,抽样比例是7:3
set.seed()
select<-sample(:nrow(Sonar),nrow(Sonar)*0.7)
train<-Sonar[select,]
test<-Sonar[-select,]
  • 对数据进行中心标准化
train[,:]=scale(train[,:])
test[,:]=scale(test[,:])
  • 使用nnet包实现BP神经网络
library(nnet)
mynnet<-nnet(Class~., linout =F,size=, decay=0.0076, maxit=,
data = train)

结果评估

  • 使用测试集预测
out<-predict(mynnet, test)
out[out<0.5]=
out[out>=0.5]=
  • 计算准确率
rate<-sum(out==test$Class)/length(test$Class)

分别在训练集和测试集上预测,并且绘制ROC曲线

  • 这里我们构建绘制ROC曲线函数方便日后调用
ROC<-function(model,train,test,objcolname,ifplot=TRUE){
library(ROCR,quietly = T)
train$p<-predict(model, train)
test$p<-predict(model, test) predTr <- prediction(train$p, train[,objcolname])
perfTr <- performance(predTr,"tpr","fpr") predTe <- prediction(test$p, test[,objcolname])
perfTe <- performance(predTe,"tpr","fpr") tr_auc<-round(as.numeric(performance(predTr,'auc')@y.values),)
te_auc<-round(as.numeric(performance(predTe,'auc')@y.values),) if(ifplot==T){
plot(perfTr,col='green',main="ROC of Models")
plot(perfTe, col='black',lty=,add=TRUE);
abline(,,lty=,col='red') tr_str<-paste("Tran-AUC:",tr_auc,sep="")
legend(0.3,0.45,c(tr_str),:)
te_str<-paste("Test-AUC:",te_auc,sep="")
legend(0.3,0.25,c(te_str),:)
}
auc<-data.frame(tr_auc,te_auc)
return(auc)
}
  • 绘制ROC 曲线
ROC(model=mynnet,train=train,test=test,objcolname="Class",ifplot=T)
  • 调参

构建调参函数network()

network<-function(formula,data,size,adjust,decay=,maxit=,scale=TRUE,
samplerate=0.7,seed=,linout=FALSE,ifplot=TRUE){
library(nnet)
##规范输出变量为0,
yvar<-colnames(data)==(all.vars(formula)[])
levels(data[,yvar])<-c(,)
##抽样建立训练集和测试集
set.seed(seed)
select<-sample(:nrow(data),nrow(data)*samplerate)
train=data[select,]
test=data[-select,]
##根据给定判断进行标准化
if(scale==T){
xvar<-colnames(data)!=(all.vars(formula)[])
train[,xvar]=scale(train[,xvar])
test[,xvar]=scale(test[,xvar])
}
##循环使用nnet训练调参
obj<-eval(parse(text = adjust))
auc<-data.frame()
for(i in obj){
if(adjust=="size"){
mynnet<-nnet(formula,size=i,linout=linout,decay=decay,
maxit=maxit,trace=FALSE,data=train)
}
else if(adjust=="decay"){
mynnet<-nnet(formula,size=size,linout=linout,decay=i,
maxit=maxit,trace=FALSE,data=train)
}
##调用之前的ROC()得到对应参数的AUC值
objcolname<-all.vars(formula)[]
auc0<-ROC(model=mynnet,train=train,test=test,
objcolname=objcolname,ifplot=F)
##输出指定参数不同值对应的数据框
out<-data.frame(i,auc0)
auc<-rbind(auc,out)
} names(auc)<-c(adjust,"Train_auc","Test_auc")
if(ifplot==T){
library(plotrix)
twoord.plot(auc[,],auc$Train_auc,auc[,],auc$Test_auc,lcol=,
rcol=,xlab=adjust,ylab="Train_auc",
rylab="Test_auc",type=c("l","b"),lab=c(,,))
}
return(auc)
}

开始调参

auc<-network(Class~.,data=Sonar,size=:,adjust="size",
decay=0.0001,maxit=,scale=T)
auc<-network(Class~.,data=Sonar,size=,adjust="decay",
decay=c(,seq(0.0001,0.01,0.0003)),maxit=)

三.RBF神经网络

RBF是一种单隐层前馈神经网络,它使用径向基函数做为隐层神经元激活函数,而输出层是对隐层神经元输出的线性组合。

RBF学习算法需要确定的网络参数为基函数的中心和方差,隐层到输出层的权值。

1.自组织选取中心法

a)   第一步,自组织学习阶段

无导师学习过程,求解隐含层基函数的中心与方差。

b)   第二步,有导师学习阶段(仿逆或LMS方法)

求解隐含层到输出层之间的权值。

采用高斯函数作为径向基函数,如下:

网络的输出为:

设d是样本的期望输出值,那么基函数的方差可表示为:

自组织选取中心法的步骤:

第一步:采用K-均值聚类方法求取基函数中心

①网络的初始化,随机选取h个训练样本作为聚类中心

②将输入的训练样本集合按最近邻规则分组,按照  与中心为  之间的欧氏距离将分配到输入样本  的各个聚类集合    中。

③重新调整聚类中心,计算各个聚类集合   中训练样本的平均值,即新的聚类中心  ,如果新的聚类中心不再发生变化,则所得到的   即为RBF神经网络最终的基函数中心,否则返回②,进入下一轮的中心求解。

第二步,求解方差。RBF神经网络的基函数为高斯函数时,方差可由下式求解。

式中 Cmax为中所选取中心之间的最大距离。

第三步,确定隐层到输出层之间的权值。隐含层至输出层之间神经元的连接权值可以用最小二乘法直接计算得到,公式如下:

2.随机选取中心法

3.有监督选取中心法

4.正交最小二乘法

神经网络模型及R代码实现的更多相关文章

  1. 深度学习之PyTorch实战(2)——神经网络模型搭建和参数优化

    上一篇博客先搭建了基础环境,并熟悉了基础知识,本节基于此,再进行深一步的学习. 接下来看看如何基于PyTorch深度学习框架用简单快捷的方式搭建出复杂的神经网络模型,同时让模型参数的优化方法趋于高效. ...

  2. 基于pytorch的CNN、LSTM神经网络模型调参小结

    (Demo) 这是最近两个月来的一个小总结,实现的demo已经上传github,里面包含了CNN.LSTM.BiLSTM.GRU以及CNN与LSTM.BiLSTM的结合还有多层多通道CNN.LSTM. ...

  3. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

  4. 机器学习入门-BP神经网络模型及梯度下降法-2017年9月5日14:58:16

    BP(Back Propagation)网络是1985年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一. B ...

  5. 通过TensorFlow训练神经网络模型

    神经网络模型的训练过程其实质上就是神经网络参数的设置过程 在神经网络优化算法中最常用的方法是反向传播算法,下图是反向传播算法流程图: 从上图可知,反向传播算法实现了一个迭代的过程,在每次迭代的开始,先 ...

  6. 利用Tensorflow实现卷积神经网络模型

    首先看一下卷积神经网络模型,如下图: 卷积神经网络(CNN)由输入层.卷积层.激活函数.池化层.全连接层组成,即INPUT-CONV-RELU-POOL-FC池化层:为了减少运算量和数据维度而设置的一 ...

  7. 利用Tensorflow实现神经网络模型

    首先看一下神经网络模型,一个比较简单的两层神经. 代码如下: # 定义参数 n_hidden_1 = 256 #第一层神经元 n_hidden_2 = 128 #第二层神经元 n_input = 78 ...

  8. bp神经网络模型推导与c语言实现(转载)

    转载出处:http://www.cnblogs.com/jzhlin/archive/2012/07/28/bp.html BP 神经网络中的 BP 为 Back  Propagation 的简写,最 ...

  9. BP神经网络模型及梯度下降法

    BP(Back Propagation)网络是1985年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一. B ...

随机推荐

  1. 如何监控ORACLE索引使用与否

    在数据库管理与维护中,我们总会遇到一个问题:我们创建的索引是否会被某些SQL语句使用呢?换个通俗表达方式:我创建的索引是否是未使用的索引(unused Indexes),是否有价值呢?如果创建的某个索 ...

  2. Linux系统下面挂载u盘

    1.先插好u盘到Linux服务器,然后查看u盘挂载到哪个目录下面. [root@localhost ~]# /sbin/fdisk -l 2.挂载到u目录下面 [root@localhost ~]# ...

  3. ERROR: Unable to globalize '/usr/local/NONE/etc/php-fpm.d/*.conf' 问题的解决

    今天继续作大死,趟php7的配置的坑. 照例,安装了昨天的各种扩展之后,解压php7的压缩文件到 /usr/local/. 然后开始配置config的扩展: ./configure --prefix= ...

  4. PB gird类型数据窗口 设置分组、分组小计、合计

    今天遇到一个需求,gird表格数据如下:  部门  类型 数据   A  类型1  1  A  类型2  2  B  类型1  3  B  类型2  4   合计 10 实际需要显示的结果为:  部门 ...

  5. x86开启 HUGEPAGES

    HugePage,就是指的大页内存管理方式,在操作系统Linux环境中,内存是以页Page的方式进行分配,默认大小为4K,HugePage是传统4K Page的替代方案.顾名思义,是用HugePage ...

  6. Referenced file contains errors (http://www.springframework.org/schema...错误

    Referenced file contains errors (http://www.springframework.org/schema...错误 Referenced file contains ...

  7. [LeetCode] Number of 1 Bits 位1的个数

    Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also know ...

  8. array

    1.array() //创建数组 2.array_change_key_case($arr,CASE_UPPER); //将键名全部大写,不加参数全变小写--没啥用 3.array_chunk($ar ...

  9. 利用StringEscapeUtils对字符串进行各种转义与反转义(Java)

    apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils,这个工具类是在2.3版本以上加上的去的,利用它能很方便的进行html,xml ...

  10. JavaScript基础语法

    首先,JavaScript的基本语法是以名为ECMAScript的伪语言定义的,理解ECMAScript的细节就是理解它在浏览器中实现的关键,目前大多数浏览器都遵循了ECMAScript第3版的,但是 ...