学习知识要实时简单回顾,我把学习的神经网络模型简单梳理一下,方便入门与复习。
神经网络模型
神经网络简介
人工神经网络是在现代神经科学的基础上提出和发展起来的,旨在反映人脑结构及功能的一种抽象数学模型。自 1943 年美国心理学家W.McCulloch 和数学家 W. Pitts 提出形式神经元的抽象数学模型—MP 模型以来,人工神经网络理论技术经过了 50 多年曲折的发展。特别是 20 世纪 80 年代,人工神经网络的研究取得了重大进展,有关的理论和方法已经发展成一门界于物理学、数学、计算机科学和神经生物学之间的交叉学科。它在模式识别,图像处理,智能控制,组合优化,金融预测与管理,通信,机器人以及专家系统等领域得到广泛的应用,提出了 40 多种神经网络模型,其中比较著名的有感知机,Hopfield 网络,Boltzman 机,自适应共振理论及反向传播网络(BP)等。在这里我们仅讨论最基本的网络模型及其学习算法。
人工神经元模型
下图表示出了作为人工神经网络(artificial neural network,以下简称 NN)的基本单元的神经元模型,它有三个基本要素:
-
一组连接(对应于生物神经元的突触),连接强度由各连接上的权值表示,权值为正表示激活,为负表示抑制。
-
一个求和单元,用于求取各输入信号的加权和(线性组合)
-
一个非线性激活函数,起非线性映射作用并将神经元输出幅度限制在一定范围内(一般限制在 1,0或 -1,1 之间
此外还有一个阈值 θ k \theta_{k} θk
以上作用可分别以数学式表达出来:
u k = ∑ j = 1 p w i j x j , ν k = u k − θ k , y k = φ ( ν k ) u_k=\sum\limits_{j=1}^p w_{ij}x_j,\quad\nu_k=u_k-\theta_k,\quad y_k=\varphi(\nu_k) uk=j=1∑pwijxj,νk=uk−θk,yk=φ(νk)
式中 x 1 , x 2 , ⋯ , x p \text{}x_1,x_2,\cdots,x_p x1,x2,⋯,xp为输入信号, w k 1 , w k 2 , ⋯ , w k p w_{k1},w_{k2},\cdots,w_{kp} wk1,wk2,⋯,wkp为神经元之权值, u k u_{k} uk 为线性组合结果, θ t \theta_{t} θt 为阈值, φ ( ⋅ ) \varphi(\cdot) φ(⋅) 为激活函数, y k y_{k} yk 为神经元 k 的输出。
若把输入的维数增加一维,则可把阈值 θ k \theta_{k} θk 包括进去。例如
ν k = ∑ j = 0 p ν k j x j , y k = φ ( u k ) \nu_k=\sum\limits_{j=0}^p\nu_{kj}\mathbf x_j,y_k=\varphi\big(u_k\big) νk=j=0∑pνkjxj,yk=φ(uk)
此处增加了一个新的连接,其输入为 x 0 = − 1 ( 或 + 1 ) x_0=-1(或+1) x0=−1(或+1) ,权值为 w k 0 = θ k ( 或 b k ) w_{_{k0}}=\theta_{_k}(或b_{_k}) wk0=θk(或bk),如下图所示。
激活函数 φ (⋅)可以有以下几种: -
阈值函数
φ ( v ) = { 1 , v ≥ 0 0 , v < 0 \varphi(v)=\begin{cases}1,&v\geq0\\ 0,&v<0\end{cases} φ(v)={1,0,v≥0v<0
即阶梯函数。这时相应的输出为
y k = { 1 , v k ≥ 0 0 , v k < 0 y_k=\begin{cases}1,&v_k\geq0\\ 0,&v_k<0\end{cases} yk={1,0,vk≥0vk<0
其中 ν k = ∑ j = 1 p ν k j x j − θ k \nu_{k}=\sum_{j=1}^{p}\nu_{k j}\mathbf{x}_{j}-\theta_{k} νk=∑j=1pνkjxj−θk,常称此种神经元为 M − P模型。 -
分段线性函数
φ ( v ) = { 1 , v ≥ 1 1 2 ( 1 + v ) , − 1 < v < 1 0 , v ≤ − 1 \varphi(v)=\begin{cases}1,&v\ge1\\\\ \dfrac12(1+v),&-1<v<1\\\\ 0,&v\le-1\end{cases} φ(v)=⎩ ⎨ ⎧1,21(1+v),0,v≥1−1<v<1v≤−1
它类似于一个放大系数为 1 的非线性放大器,当工作于线性区时它是一个线性组合器,放大系数趋于无穷大时变成一个阈值单元。 -
sigmoid 函数
最常用的函数形式为
φ ( v ) = 1 1 + exp ( − α v ) \varphi(v)=\dfrac{1}{1+\exp(-\alpha v)} φ(v)=1+exp(−αv)1
参数 α> 0可控制其斜率。另一种常用的是双曲正切函数.
φ ( v ) = tanh ( v 2 ) = 1 − exp ( − v ) 1 + exp ( − v ) \varphi(v)=\tanh\left(\dfrac{v}{2}\right)=\dfrac{1-\exp(-v)}{1+\exp(-v)} φ(v)=tanh(2v)=1+exp(−v)1−exp(−v)
Matlab 中的激活(传递)函数如下表所示:
各个函数的定义及使用方法,可以参看 Matlab 的帮助(如在 Matlab 命令窗口运行help tansig,可以看到 tantig 的使用方法,及 tansig 的定义为 φ ( v ) = 2 1 + e − 2 v − 1 \varphi(v)=\frac{2}{1+e^{-2v}}-1 φ(v)=1+e−2v2−1)
网络结构及工作方式
除单元特性外,网络的拓扑结构也是 NN 的一个重要特性。从连接方式看 NN 主要有两种。
7. 前馈型网络
各神经元接受前一层的输入,并输出给下一层,没有反馈。结点分为两类,即输入单元和计算单元,每一计算单元可有任意个输入,但只有一个输出(它可耦合到任意多个其它结点作为其输入)。通常前馈网络可分为不同的层,第 i 层的输入只与第 1−i 层输出相连,输入和输出结点与外界相连,而其它中间层则称为隐层。
8. 反馈型网络
所有结点都是计算单元,同时也可接受输入,并向外界输出。
NN 的工作过程主要分为两个阶段:第一个阶段是学习期,此时各计算单元状态不变,各连线上的权值可通过学习来修改;第二阶段是工作期,此时各连接权固定,计算单元状态变化,以达到某种稳定状态。
从作用效果看,前馈网络主要是函数映射,可用于模式识别和函数逼近。反馈网络按对能量函数的极小点的利用来分类有两种:第一类是能量函数的所有极小点都起作用,这一类主要用作各种联想存储器;第二类只利用全局极小点,它主要用于求解最优化问题。
蠓虫分类问题
蠓虫分类问题可概括叙述如下:生物学家试图对两种蠓虫(Af 与 Apf)进行鉴别,依据的资料是触角和翅膀的长度,已经测得了 9 支 Af 和 6 支 Apf 的数据如下:
Af: (1.24,1.27),(1.36,1.74),(1.38,1.64),(1.38,1.82),(1.38,1.90),(1.40,1.70),
(1.48,1.82),(1.54,1.82),(1.56,2.08).
Apf: (1.14,1.82),(1.18,1.96),(1.20,1.86),(1.26,2.00),(1.28,2.00),(1.30,1.96).
现在的问题是:
- 根据如上资料,如何制定一种方法,正确地区分两类蠓虫。
- 对触角和翼长分别为(1.24,1.80),(1.28,1.84)与(1.40,2.04)的 3 个标本,用所得
到的方法加以识别。 - 设 Af 是宝贵的传粉益虫,Apf 是某疾病的载体,是否应该修改分类方法。如上的问题是有代表性的,它的特点是要求依据已知资料(9 支 Af 的数据和 6 支Apf 的数据)制定一种分类方法,类别是已经给定的(Af 或 Apf)。今后,我们将 9 支Af 及 6 支 Apf 的数据集合称之为学习样本。
求解
为解决上述问题,考虑一个其结构如下图所示的人工神经网络 ,
激活函数由
φ
(
v
)
=
1
1
+
exp
(
−
α
ν
)
\varphi(v)=\dfrac{1}{1+\exp(-\alpha\nu)}
φ(v)=1+exp(−αν)1来决定。
图中最下面单元,即由 • 所示的一层称为输入层,用以输入已知测量值。在我们的例子中,它只需包括两个单元,一个用以输入触角长度,一个用以输入翅膀长度。中间一层称为处理层或隐单元层,单元个数适当选取,对于它的选取方法,有一些文献进行了讨论,但通过试验来决定,或许是最好的途径。在我们的例子中,取三个就足够了。最上面一层称为输出层,在我们的例子中只包含二个单元,用以输出与每一组输入数据相对应的分类信息.任何一个中间层单元接受所有输入单元传来的信号,并把处理后的结果传向每一个输出单元,供输出层再次加工,同层的神经元彼此不相联接,输入与输出单元之间也没有直接联接。这样,除了神经元的形式定义外,我们又给出了网络结构。有些文献将这样的网络称为两层前传网络,称为两层的理由是,只有中间层及输出层的单元才对信号进行处理;输入层的单元对输入数据没有任何加工,故不计算在层数之内。
具体解法如下:
clear
p1=[1.24,1.27;1.36,1.74;1.38,1.64;1.38,1.82;1.38,1.90;
1.40,1.70;1.48,1.82;1.54,1.82;1.56,2.08];
p2=[1.14,1.82;1.18,1.96;1.20,1.86;1.26,2.00
1.28,2.00;1.30,1.96];
p=[p1;p2]';
pr=minmax(p);
goal=[ones(1,9),zeros(1,6);zeros(1,9),ones(1,6)];
plot(p1(:,1),p1(:,2),'h',p2(:,1),p2(:,2),'o')
net=newff(pr,[3,2],{'logsig','logsig'});
net.trainParam.show = 10;
net.trainParam.lr = 0.05;
net.trainParam.goal = 1e-10;
net.trainParam.epochs = 50000;
net = train(net,p,goal);
x=[1.24 1.80;1.28 1.84;1.40 2.04]';
y0=sim(net,p)
y=sim(net,x)
编写不易,求个点赞!!!!!!!
“你是谁?”
“一个看帖子的人。”
“看帖子不点赞啊?”
“你点赞吗?”
“当然点了。”
“我也会点。”
“谁会把经验写在帖子里。”
“写在帖子里的那能叫经验贴?”
“上流!”
cheer!!!