lasagne.nonlinearities.sigmoid()函数在多层感知机中的应用
发布时间:2024-01-15 05:43:41
在多层感知机(Multilayer Perceptron, MLP)中,由于每个神经元的输出必须经过一个非线性激活函数,才能引入非线性特征。sigmoid函数就是一种常用的非线性激活函数之一。
sigmoid函数的定义为:
$$
\text{sigmoid}(x) = \frac{1}{1 + e^{-x}}
$$
sigmoid函数的输出范围在0到1之间,具有光滑连续、单调递增的特点。这使得sigmoid函数非常适合用作二分类问题中的激活函数,因为它可以将输入映射到一个概率值,表示为输入属于正类的可能性。
在多层感知机中,通常将sigmoid函数应用于隐藏层和输出层的神经元。隐藏层中的sigmoid函数可以为网络引入非线性特征,增加网络的表达能力。输出层中的sigmoid函数可以将输出映射到一个概率值,用于二分类问题。
下面是一个使用sigmoid函数的多层感知机的例子:
import numpy as np
# 定义sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义多层感知机
class MLP:
def __init__(self, input_size, hidden_size, output_size):
self.W1 = np.random.randn(input_size, hidden_size) # 输入层到隐藏层的权重
self.b1 = np.random.randn(hidden_size) # 隐藏层的偏置
self.W2 = np.random.randn(hidden_size, output_size) # 隐藏层到输出层的权重
self.b2 = np.random.randn(output_size) # 输出层的偏置
def forward(self, X):
# 前向传播
self.z1 = np.dot(X, self.W1) + self.b1 # 隐藏层的加权和
self.a1 = sigmoid(self.z1) # 隐藏层的激活值
self.z2 = np.dot(self.a1, self.W2) + self.b2 # 输出层的加权和
self.a2 = sigmoid(self.z2) # 输出层的激活值
return self.a2
# 创建一个多层感知机对象
mlp = MLP(input_size=2, hidden_size=3, output_size=1)
# 输入样本
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
# 目标标签
y = np.array([[0], [1], [1], [0]])
# 训练多层感知机
learning_rate = 0.1
for iteration in range(1000):
output = mlp.forward(X)
loss = np.mean((output - y) ** 2)
# 反向传播
delta2 = (output - y) * output * (1 - output) # 输出层的误差
delta1 = delta2.dot(mlp.W2.T) * mlp.a1 * (1 - mlp.a1) # 隐藏层的误差
# 更新参数
mlp.W2 -= learning_rate * mlp.a1.T.dot(delta2) # 更新隐藏层到输出层的权重
mlp.b2 -= learning_rate * np.sum(delta2, axis=0) # 更新输出层的偏置
mlp.W1 -= learning_rate * X.T.dot(delta1) # 更新输入层到隐藏层的权重
mlp.b1 -= learning_rate * np.sum(delta1, axis=0) # 更新隐藏层的偏置
if iteration % 100 == 0:
print(f'iteration {iteration}: loss {loss:.4f}')
# 测试多层感知机
output = mlp.forward(X)
predicted_labels = (output > 0.5).astype(int)
print(f'predicted_labels: {predicted_labels}')
在上述例子中,我们创建了一个具有2个输入神经元、3个隐藏神经元和1个输出神经元的多层感知机。我们使用sigmoid函数作为激活函数,并使用均方误差(mean squared error)作为损失函数。
然后,我们用反向传播算法进行训练,通过不断调整权重和偏置来减小损失函数。最后,我们使用训练好的多层感知机对输入样本进行测试,并输出预测标签。
通过使用sigmoid函数作为非线性激活函数,多层感知机能够处理非线性问题,并具有较好的拟合能力。当然,sigmoid函数也存在一些问题,如输出值在边界处接近0或1,导致梯度消失问题。因此,在现代神经网络中,常常使用其他更优秀的激活函数,如ReLU函数和其变体。
