欢迎访问宙启技术站
智能推送

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函数和其变体。