1.背景:
1.1以人脑中的神经网络为启发,历史上出现过很多不同的版本
1.2最著名的算法是1980年的backpropagation
2.多层向前神经网络
2.1backpropagation被使用在多层向前神经网络上
2.2多层向前神经网络由以下部分组成:
输入层、隐藏层、输出层
2.3每层由单元组成
2.4输入层是由训练集的实例特征向量传入
2.5经过连接节点的权重传入下一层,一层的输出是下一层的输入
2.6隐藏层的个数可以是任意的,输入层有一层,输出层有一层
2.7每个单元也可以被称作神经节点,根据生物学来源定义
2.8一层中加权的求和,然后根据非线性方程转化输出
2.9作为多层先前神经网络,理论上,如果有足够多的隐藏层和足够大的训练集,可以模拟出任何方程
3.设计神经网络结构
3.1使用神经网络训练数据之前,必须确定神经网络的层数,以及每层单元的个数
3.2特征向量在被传入输入层时通常先被标准化到0-1之间(为了加速学习过程)
3.3离散型变量可以被编码成每一个输入单元对应一个特征值可能赋的值
3.4神经网络既可以用来做分类问题,也可以解决回归问题
4.backpropagation算法
4.1通过迭代性来处理训练集中的实例
4.2对比经过神经网络后输入层预测值与真实值之间
4.3反方向(从输出层=>隐藏层=>输入层),以最小误差来更新每个连接的权重
5.算法详细介绍
输入:D:数据集,l:学习率,一个多层向前神经网络
输出:一个训练好的神经网络
5.1初始化权重和偏向:随机初始化在-1到1之间,或者-0.5到0.5之间,每个单元有一个偏向
5.2对于每一个训练实例x执行以下步骤:
5.2.1:由输入层向前传送
5.2.2:根据误差反向传送
5.3终止条件
(1)权重的更新低于某个阈值
(2)预测的错误率低于某个阈值
(3)达到一定的循环次数
练习1:
# -*- coding:utf-8 -*-
import numpy as np
import numpy as np
#定义激活函数和相应的导数,双曲函数和逻辑函数
def tanh(x): #定义双曲函数
return np.tanh(x)
def tanh_deriv(x): #定义双曲函数的导数
return 1.0-np.tanh(x)*np.tanh(x) #更新权重的时候需要用到双曲函数的倒数
def logistic(x): #定义逻辑函数
return 1.0/(1+np.exp(-x))
def logistic_derivative(x): #定义逻辑函数的导数
return logistic(x)*(1-logistic(x))
#定义一个神经网络的类
class NeuralNetwork:
#构造函数,初始化实例,,layers表示每层神经网络上的神经元个数元组,默认激活函数是双曲线函数
def __init__(self,layers,activation='tanh'):
#判断激活函数是双曲函数还是逻辑函数,初始化激活函数
if activation == 'logistic':
self.activation = logistic
self.activation_deriv = logistic_derivative
elif activation == 'tanh':
self.activation = tanh
self.activation_deriv = tanh_deriv
#初始化权重值,随机赋值
self.weights = [] #在当前类中
for i in range(1,len(layers)-1