神经网络基础知识

来源:互联网 发布:变身之网络妖星系统 编辑:程序博客网 时间:2024/06/16 08:06

本周具体工作学习《神经网络与深度学习》这本书

 

人工神经元( Artificial Neuron )模型

人工神经元是神经网络的基本元素

 

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

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

 

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

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

 

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

 

 

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

      1中的这种阈值加权和的神经元模型称为M-P模型 ( McCulloch-PittsModel ),也称为神经网络的一个处理单元( PE, ProcessingElement )

 

2. 常用激活函数 

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

(1) 线性函数 (Liner Function )

 

(2) 斜面函数 (Ramp Function )

 

(3) 阈值函数 (Threshold Function )

 



 

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

(4) S形函数 (SigmoidFunction )

  该函数的导函数:

(5) 双极S形函数 

  该函数的导函数:

S形函数与双极S形函数的图像如下:



3. S形函数与双极S形函数图像

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

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

 

3. 神经网络模型 

      神经网络是由大量的神经元互联而构成的网络。根据网络中神经元的互联方式,常见网络结构主要可以分为下面3类:

(1) 前馈神经网络 (Feedforward Neural Networks )

      前馈网络也称前向网络。这种网络只在训练过程会有反馈信号,而在分类过程中数据只能向前传送,直到到达输出层,层间没有向后的反馈信号,因此被称为前馈网络。感知机(perceptron)BP神经网络就属于前馈网络。

      4中是一个3层的前馈神经网络,其中第一层是输入单元,第二层称为隐含层,第三层称为输出层(输入单元不是神经元,因此图中有2层神经元)。

4.前馈神经网络

 

  对于一个3层的前馈神经网络N,若用X表示网络的输入向量,W1~W3表示网络各层的连接权向量F1~F3表示神经网络3层的激活函数。

  那么神经网络的第一层神经元的输出为:

O1 = F1( XW1 )

  第二层的输出为:

O2 = F2 ( F1( XW1 ) W2 )

O2=F2(O1W2)

  输出层的输出为:

O3 = F3( F2 ( F1( XW1 ) W2 ) W3 )

O3=F3(O2W3)

      若激活函数F1~F3都选用线性函数,那么神经网络的输出O3将是输入X的线性函数。因此,若要做高次函数的逼近就应该选用适当的非线性函数作为激活函数。

 

(2) 反馈神经网络 (Feedback Neural Networks )

      反馈型神经网络是一种从输出到输入具有反馈连接的神经网络,其结构比前馈网络要复杂得多。典型的反馈型神经网络有:Elman网络Hopfield网络

5.反馈神经网络

 

(3) 自组织网络 (SOM ,Self-Organizing Neural Networks )

      自组织神经网络是一种无导师学习网络(非监督学习UnsupervisedLearning)。它通过自动寻找样本中的内在规律和本质属性,自组织、自适应地改变网络参数与结构。

6.自组织网络

 

4. 神经网络工作方式 

      神经网络运作过程分为学习和工作两种状态。

(1)神经网络的学习状态 

      网络的学习主要是指使用学习算法来调整神经元间的联接权,使得网络输出更符合实际。学习算法分为监督学习(Supervised Learning )无监督学习( UnsupervisedLearning )两类。

       监督学习算法将一组训练集 ( trainingset )送入网络,根据网络的实际输出与期望输出间的差别来调整连接权。有导师学习算法的主要步骤包括:

 

1 从样本集合中取一个样本(AiBi);

2 计算网络的实际输出O

3 D=Bi-O

4 根据D调整权矩阵W

5对每个样本重复上述过程,直到对整个样本集来说,误差不超过规定范围。

 

BP算法就是一种出色的有导师学习算法。

       无监督学习抽取样本集合中蕴含的统计特性,并以神经元之间的联接权的形式存于网络中。

      Hebb学习律是一种经典的无导师学习算法。

(2) 神经网络的工作状态 

      神经元间的连接权不变,神经网络作为分类器、预测器等使用。

 

 

 

 

 

 

 

5.神经网络实现 

 

1. 数据预处理 

      在训练神经网络前一般需要对数据进行预处理,一种重要的预处理手段归一化处理。下面简要介绍归一化处理的原理与方法。

 

数据归一化,就是将数据映射到[0,1][-1,1]区间或更小的区间,比如(0.1,0.9)

为什么要归一化处理? 

<1>输入数据的单位不一样,有些数据的范围可能特别大,导致的结果是神经网络收敛慢、训练时间长

<2>数据范围大的输入在模式分类中的作用可能会偏大,而数据范围小的输入作用就可能会偏小。

<3>由于神经网络输出层的激活函数的值域是有限制的,因此需要将网络训练的目标数据映射到激活函数的值域。例如神经网络的输出层若采用S形激活函数,由于S形函数的值域限制在(0,1),也就是说神经网络的输出只能限制在(0,1),所以训练数据的输出就要归一化到[0,1]区间。

<4>S形激活函数在(0,1)区间以外区域很平缓,区分度太小。例如S形函数f(X)在参数a=1时,f(100)f(5)只相差0.0067

 

 归一化算法 

  一种简单而快速的归一化算法是线性转换算法。线性转换算法常见有两种形式:

      <1>

y = ( x - min )/( max - min )

  其中minx的最小值,maxx的最大值,输入向量为x,归一化后的输出向量为y。上式将数据归一化到 [ 0 , 1 ]区间,当激活函数采用S形函数时(值域为(0,1))时这条式子适用。

      <2>

y = 2 * ( x - min ) / ( max - min ) - 1

      这条公式将数据归一化到 [ -1 , 1 ]区间。当激活函数采用双极S形函数(值域为(-1,1))时这条式子适用。

 

 

 

 

 

 

 

 

 

 

 

 

6.代码实现

IDEeclipse

Java Version:  jdk1.8

Nueroph是一个基于Java的神经网络框架。

 

通过程序,简单实现一个简单的感知机并让其学习逻辑运算AND  OR

 

 

 

由于,现在的数据分析,基本上都是用python语言做的,所以,有在英杰哪里,拿到Python的一段实现逻辑回归的程序,做测试:

# -*- coding: utf-8 -*-

"""

Created on Fri Jul  7 17:19:52 2017

 

@author: dblab

"""

 

import numpy

import theano

import theano.tensor asT

rng = numpy.random

 

N = 400                                   # training sample size

feats = 784                               # number ofinput variables

#logisticregression  逻辑回归

# generate a dataset: D= (input_values, target_class)

D = (rng.randn(N,feats), rng.randint(size=N, low=0, high=2))

training_steps = 10000

 

# Declare Theanosymbolic variables

x =T.dmatrix("x")

y =T.dvector("y")

 

# initialize the weightvector w randomly

#

# this and the followingbias variable b

# are shared so theykeep their values

# between trainingiterations (updates)

w =theano.shared(rng.randn(feats), name="w")

 

# initialize the biasterm

b = theano.shared(0.,name="b")

 

print("Initialmodel:")

print(w.get_value())

print(b.get_value())

# Construct Theanoexpression graph

p_1 = 1 / (1 +T.exp(-T.dot(x, w) - b))   # Probabilitythat target = 1

prediction = p_1 >0.5                    # The predictionthresholded

xent = -y * T.log(p_1) -(1-y) * T.log(1-p_1) # Cross-entropy loss function

cost = xent.mean() +0.01 * (w ** 2).sum()# The cost to minimize

gw, gb = T.grad(cost,[w, b])             # Compute thegradient of the cost

                                          #w.r.t weight vector w and

                                          #bias term b

                                          # (weshall return to this in a

                                          #following section of this tutorial)

 

# Compile

train = theano.function(

          inputs=[x,y],

          outputs=[prediction, xent],

          updates=((w, w - 0.1 * gw), (b, b - 0.1 *gb)))

predict =theano.function(inputs=[x], outputs=prediction)

 

# Train

for i inrange(training_steps):

    pred, err = train(D[0], D[1])

 

print("Finalmodel:")

print(w.get_value())

print(b.get_value())

print("targetvalues for D:")

print(D[1])

print("predictionon D:")

print(predict(D[0]))

 

 

 

测试结果:

 

 

1表示通过,0表示不通过, 下面的truefalse是通过boolean值表示的。

阅读全文
0 0