西瓜笔记(四上)
一、神经元模型
每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个“阈值(threshold)”,那么它就会被激活,即“兴奋”起来,向其他神经元发送化学物质。
M-P神经元模型
神经元接收到来自n个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接(connection)进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,通过“激活函数”处理产生输出。激活函数如下:


阶跃函数具有不连续,不光滑等不太好的性质,于是引入了sigmoid函数。
二、感知机与多层网络
感知机是由两层神经元组成的。轻松实现逻辑与、或、非运算。如图所示:


f就是上述的“激活函数”。
训练过程:给定训练数据集,权重wi以及阈值θ可看作一个固定输入为-1.0的“哑结点(dummy node)”所对应的连接权重wn+1,这样,权重和阈值的学习就可统一为权重的学习。感知机的学习规则很简单,对于训练样例(x,y)x是输入向量,若当前感知机的输出为y',则感知机的权重这样调整:

感知机只有输出层神经元进行激活函数处理,即拥有一层功能神经元,学习能力很有限,只能解决线性可分的问题。
搭建一个感知机除了训练数据之外,我们需要给出的就是学习率(0,1)和训练次数。随便举个🌰:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Sep 28 16:59:28 2018
@author: Melina
"""
#感知器
import numpy as np
class Perceptron:
def __init__(self,eta=0.01,iter=10):#学习率和迭代次数
self.eta=eta
self.iter=iter
def fit(self,x,y):
self.w=np.zeros(1+x.shape[1])
self.errors=[]
for i in range(self.iter):
errors=0
for xi,target in zip(x,y):
update=self.eta*(target-self.predict(xi))#权重更新
self.w[1:]+=update*xi
self.w[0]+=update*1
errors+=int(update!=0)
self.errors.append(errors)
def net_input(self,x):
return np.dot(x,self.w[1:]+self.w[0]*1) #矩阵乘法
def predict(self,x):
return np.where(self.net_input(x)>=0.0,1,-1)#类似三目运算符
instance=Perceptron(0.01,10)
x=np.array([[1,2],[4,5]])
y=np.array([-1,1])
instance.fit(x,y)
x=np.array([6,6])
print(instance.predict(x))
总体来说,就是掌握三个公式
多层前馈神经网络(multi-layer feedforward neural networks)
每层神经元与下一层神经元全互联,神经元之间不存在同层链接,也不存在跨层连接。
三、误差逆传播算法(error BackPropagation)
该方法是迄今为止最成功的神经网络学习算法。可用于训练多层前馈神经网络。变量设置如下:

假设隐层和输出层神经元都使用sigmoid函数。对训练例(xk,yk),假定神经网络的输出为y'k。
均方误差为:

对任意参数,更新公式是:

BP算法基于梯度下降策略,以目标的负梯度方向进行调整(这个意思就是我们要尽可能减小误差,接近真实情况)。η是学习速率(数值较小代表学习可以更细致,速度自然会更慢,这是需要我门自己设定的)。下面以w的计算为例:

根据链式法则:

根据βj的定义,显然有:

sigmoid函数有一个很好的性质:

推出:

带入原公式:

同理:

其他三个参数分别是:

θ是输出层阈值,Υ是隐层的阈值。
这是“标准BP算法”。

浙公网安备 33010602011771号