机器学习 第五章 神经网络
1. 神经元模型
1.1 什么是神经元模型?
神经元模型是神经网络的基本单元,就像生物神经元一样,它接收来自其他神经元的输入信号,通过带权重的连接传递,然后通过激活函数处理产生输出。
1.2 M-P神经元模型
1943年,McCulloch和Pitts提出了M-P神经元模型,这个模型非常简单,但却是现代神经网络的基础。在这个模型中,神经元接收到来自几个其他神经元传递过来的输入信号,这些输入信号通过带权重的连接进行传递,神经元接收到的总输入值将与神经元的阈值进行比较,然后通过激活函数处理以产生神经元的输出。
1.3 激活函数
激活函数是神经元模型中的关键部分,它决定了神经元的输出。常见的激活函数有阶跃函数和Sigmoid函数。阶跃函数将输入值映射为输出值“0”或“1”,而Sigmoid函数则将输入值挤压到(0,1)输出值范围内。
1.4 代码实现
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
class Neuron:
def __init__(self, weights, bias):
self.weights = weights
self.bias = bias
def forward(self, inputs):
total = np.dot(inputs, self.weights) + self.bias
return sigmoid(total)
#示例
weights = np.array([0.5, -0.3])
bias = 0.1
neuron = Neuron(weights, bias)
inputs = np.array([1, 0])
output = neuron.forward(inputs)
print("Neuron output:", output)
2. 感知机与多层网络
2.1 感知机
感知机由两层神经元组成,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元。感知机能容易地实现逻辑与、或、非运算。
2.2 多层网络
多层网络包含输入层、隐层和输出层,能够解决非线性可分问题。常见的多层前馈神经网络结构如图5.6所示。
2.3 代码实现
Python复制
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
class Layer:
def __init__(self, input_size, output_size):
self.weights = np.random.rand(input_size, output_size)
self.bias = np.zeros((1, output_size))
def forward(self, inputs):
self.inputs = inputs
self.output = sigmoid(np.dot(inputs, self.weights) + self.bias)
return self.output
def backward(self, output_error, learning_rate):
d_output = output_error * sigmoid_derivative(self.output)
d_weights = np.dot(self.inputs.T, d_output)
d_bias = np.sum(d_output, axis=0, keepdims=True)
input_error = np.dot(d_output, self.weights.T)
self.weights -= learning_rate * d_weights
self.bias -= learning_rate * d_bias
return input_error
class NeuralNetwork:
def __init__(self, layer_sizes):
self.layers = []
for i in range(len(layer_sizes) - 1):
self.layers.append(Layer(layer_sizes[i], layer_sizes[i + 1]))
def forward(self, inputs):
for layer in self.layers:
inputs = layer.forward(inputs)
return inputs
def train(self, inputs, targets, learning_rate):
output = self.forward(inputs)
error = targets - output
for layer in reversed(self.layers):
error = layer.backward(error, learning_rate)
#示例
layer_sizes = [2, 2, 1]
nn = NeuralNetwork(layer_sizes)
inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
targets = np.array([[0], [1], [1], [0]])
for _ in range(10000):
nn.train(inputs, targets, 0.1)
output = nn.forward(inputs)
print("Neural network output:", output)
3. 误差逆传播算法 (BP算法)
3.1 什么是BP算法?
BP算法是训练多层神经网络的最成功算法,通过误差逆传播来调整网络参数。
3.2 BP算法的工作流程
前向传播:输入信号从输入层逐层传递到输出层,产生输出结果。
误差计算:计算输出层的误差。
误差逆传播:将误差逆向传播至隐层神经元。
参数更新:根据隐层神经元的误差来调整连接权和阈值。
3.3 代码实现
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
class Layer:
def __init__(self, input_size, output_size):
self.weights = np.random.rand(input_size, output_size)
self.bias = np.zeros((1, output_size))
def forward(self, inputs):
self.inputs = inputs
self.output = sigmoid(np.dot(inputs, self.weights) + self.bias)
return self.output
def backward(self, output_error, learning_rate):
d_output = output_error * sigmoid_derivative(self.output)
d_weights = np.dot(self.inputs.T, d_output)
d_bias = np.sum(d_output, axis=0, keepdims=True)
input_error = np.dot(d_output, self.weights.T)
self.weights -= learning_rate * d_weights
self.bias -= learning_rate * d_bias
return input_error
class NeuralNetwork:
def __init__(self, layer_sizes):
self.layers = []
for i in range(len(layer_sizes) - 1):
self.layers.append(Layer(layer_sizes[i], layer_sizes[i + 1]))
def forward(self, inputs):
for layer in self.layers:
inputs = layer.forward(inputs)
return inputs
def train(self, inputs, targets, learning_rate):
output = self.forward(inputs)
error = targets - output
for layer in reversed(self.layers):
error = layer.backward(error, learning_rate)
#示例
layer_sizes = [2, 2, 1]
nn = NeuralNetwork(layer_sizes)
inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
targets = np.array([[0], [1], [1], [0]])
for _ in range(10000):
nn.train(inputs, targets, 0.1)
output = nn.forward(inputs)
print("Neural network output:", output)
4. 全局最小与局部极小
4.1 什么是全局最小和局部极小?
全局最小是指参数空间中所有点的误差函数值均不小于该点的误差函数值。
局部极小是指参数空间中的某个点,其邻域点的误差函数值均不小于该点的函数值。
4.2 如何找到全局最小?
在现实任务中,人们常采用以下策略来试图“跳出”局部极小,从而进一步接近全局最小:
以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数。
使用“模拟退火”技术,模拟退火在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小。
使用随机梯度下降,与标准梯度下降法精确计算梯度不同,随机梯度下降法在计算梯度时加入了随机因素,即使陷入局部极小点,它计算出的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索。
5. 其他常见神经网络
5.1 RBF网络
RBF网络是一种单隐层前馈神经网络,它使用径向基函数作为隐层神经元激活函数,而输出层则是对隐层神经元输出的线性组合。
5.2 ART网络
ART网络是一种竞争型学习的重要代表,该网络由比较层、识别层、识别阈值和重置模块构成。其中,比较层负责接收输入样本,并将其传递给识别层神经元,识别层每个神经元对应一个模式类,神经元数目可在训练过程中动态增长以增加新的模式类。
5.3 SOM网络
SOM网络是一种竞争学习型的无监督神经网络,它能将高维输入数据映射到低维空间(通常为二维),同时保持输入数据在高维空间的拓扑结构,即将高维空间中相似的样本点映射到网络输出层中的邻近神经元。
5.4 级联相关网络
级联相关网络是一种结构自适应神经网络,网络结构也当作学习的目标之一,并希望能在训练过程中找到最符合数据特点的网络结构。
5.5 Elman网络
Elman网络是一种递归神经网络,允许网络中出现环形结构,从而可让一些神经元的输出反馈回来作为输入信号,这样的结构与信息反馈过程,使得网络在t时刻的输出状态不仅与t时刻的输入有关,还与t-1时刻的网络状态有关,从而能处理与时间有关的动态变化。
5.6 Boltzmann机
Boltzmann机是一种基于能量的模型,其神经元分为两层:显层与隐层,显层用于表示数据的输入与输出,隐层则被理解为数据的内在表达。Boltzmann机的训练过程就是将每个训练样本视为一个状态向量,使其出现的概率尽可能大。