神经网络入门学习——神经网络的定义和感知机的构造
完成日期:2018.04.20
神经网络的定义
将模拟生物神经网络的数学模型统称为人工神经网络模型
1、大脑的学习过程
信息输入——模式加工——动作输入
模式加工:信息通过输入系统——也就是我们的各种感觉系统进入大脑内部不同的处理中心。随后,这些处理中心对进入的信息进行分析和模式识别。当处理中心觉察出某种模式时,将它编译后存储到脑内相应的记忆区。一旦我们的大脑学习到了某种特定的信息模式,无论什么时候我们再遇到它,哪怕它有一定的变化,以其他不完全相同的形式出现,我们都应该能够 再识别出来。每次接收到新的信息时,我们就会重复该模式加工过程。这样一次又一次之后,我们的大脑里就会储存越来越多的信息模式。
2、大脑的基本单位——神经元
两个最主要的特性——兴奋性和传导性
兴奋性:当刺激强度未达到某一阈值的时候,神经冲动不会发生,而当刺激达到该值时,神经冲动发生并能瞬间达到最大强度,此后刺激强度即使再继续加强或减弱,已诱发的冲动强度也不再发生变化。(人工神经元模型的传输函数大多数都是依据此原则来输出的)
传导性:从一个神经元的输出信息可以传导到其他神经元。
按照功能分类分为三类:感觉神经元(传入神经元)、运动神经元(传出神经元)、联络神经元(中间神经元)
如何构成神经网络
生物神经网络是由很多神经元互相连接的,而这些连接并不是固定不变的,在不断的学习过程中,一些新的连接会被逐渐建立起来,还有一些连接可能会消失,神经网络系统是一个极为庞大又错综复杂的系统。虽然每个神经元都十分简单,但如此大量的神经元与外部感受器之间的多种多样的连接方式也蕴含了变化莫测的反应方式。连接方式的多样化导致了行为方式的多样化。
自组织特性
每个神经元都可以自己决定和另外哪些神经元链接,甚至不链接,没有从一个“领导”的角色去安排大家的工作,而这种自己决定的特性构成了神经元的自主学习(对应于神经网络模型的训练),不存在外部指导。
构造人工神经网络
1、构造一个人工神经元
树突——输入部分、细胞体——处理部分、 轴突——输出部分
其中,p表示树突收到的刺激;w代表树突的强度权重;
f表示传递函数,可以把它看作格式化输出结果,将结果变成我们可以使用的一种符号和数字;
b表示内部强度值,同时还置内部强度,默认为1(为了考虑神经元本身的);
s表示信号处理,s = p1w1 + p2w2 + p3w3 + …… + pnwn + b × 1,实际上是为了归纳所有神经元输入结果,方便后续处理。
传递函数的基本种类
Step——阶梯函数:n大于等于0时,输出1,否则输出0
Sgn——符号函数:n大于等于0时,输出1,否则输出-1
Linear——线性函数:a=n,n本身就是神经元输出
Ramp——饱和线性函数:n小于0时输出0,n在0到1区间时,输出n,n大于1时输出1
Sigmoid——对数S形函数:有界函数,无论n如何,输出永远在(0,1)的开区间
Tanh——双曲正切S行函数:有界函数,无论n如何,输出永远在(-1,1)的开区间
2、感知机
最简单的神经网络,只有一个神经元
香蕉和苹果的分辨问题:
品种 | 颜色p1 | 形状p2 |
---|---|---|
1(苹果) | 1(红色) | 1(圆形) |
0(香蕉) | -1(黄色) | -1(弯形) |
预设:w1 = w2 = 1, b = 0
代入之前s的那个公式看看得到什么结果:(s = w1p1 + w2p2 + b × 1)
对苹果的鉴别如下:s = 1 × 1 + 1 × 1 + 0 = 2
对香蕉的鉴别如下:s = -1 × 1 + (-1) × 1 + 0 = -2
与预期相同,我们利用简单感知机实现了一个识别苹果和香蕉的例子
可是我们怎么知道w和b取1、1和0呢?
这就需要感知机的一套学习规则,修改神经网络的权值和偏置,保证我们随意取个权重参数也能使输出的值是正常的
w(new) = w(old) + ep
b(new) = b(old) + e
其中e表示误差,e = t - a,t为期望输出, a为实际输出
该学习规则是有监督的学习规则
用感知机实现一个简单的逻辑运算AND
#coding: utf-8
from numpy import *
import operator
import os
#create a dataset which contains 4 examples and 2 classes
def createDataset():
dataset = array([[1, 0], [1, 1], [0, 1], [0, 0]])
labels = [0, 1, 0, 0]
return dataset, labels
#transfer function ————> f
def step(a):
if a > 0:
return 1
else:
return 0
#signature function ————> s
def cal(data):
global w, b
res = 0
for i in xrange(len(data)):
res += data[i] * w[i]
res += b * 1
return step(res)
#update function
def update(data, label):
global w, b
e = label - cal(data)
for i in xrange(len(data)):
w[i] += data[i] * e
b += e
#create a peceptron and trains the best w and b
def classifyPeceptron(trainDataset, trainLabels):
global w, b #create global variable w and b
isFind = False #the flag of find the best w and b
numOfData = trainDataset.shape[0]
numOfDendron = trainDataset.shape[1]
w = [0] * numOfDendron
b = 0
#begin training
while (not isFind):
for i in xrange(numOfData):
if cal(trainDataset[i]) != trainLabels[i]:
print w, b
update(trainDataset[i], trainLabels[i])
break #exit for loop
elif i == numOfData - 1:
print w, b
isFind = True #ecit while loop
#test the perceptron
def test(trainData):
global w, b
for i in trainData:
print str(i) + " the result is: " + str(cal(i))
trainGroup, trainLabels = createDataset()
classifyPeceptron(trainGroup, trainLabels)
test(trainGroup)