【机器学习(一)】神经网络分类及简单案例

1. 神经网络分类

2. PyTorch神经网络拟合正弦函数

3. 神经网络实现数字排序

4. 利用神经网络求解一元一次方程

1. 神经网络分类 

神经网络是一种模仿人类神经系统的计算模型,它由大量的人工神经元节点相互连接而成。神经网络可以通过学习数据的模式和特征,从而实现自主的学习和预测功能。

神经网络模型通常包括输入层、隐藏层和输出层。输入层用于接收输入数据,隐藏层通过一些数学函数对输入数据进行处理并产生特征表示,输出层根据这些特征表示产生输出结果。

神经网络的训练通常通过反向传播算法来实现。反向传播算法是一种基于梯度下降的优化方法,通过计算输出误差对各层节点权重的梯度,并对权重进行更新,从而不断优化神经网络的性能。

神经网络在机器学习领域中被广泛应用,可以用于图像分类、语音识别、自然语言处理、推荐系统等多种任务。它的发展也推动了人工智能领域的发展。

机器学习中的神经网络有很多种,以下是其中几种常见的神经网络及其适用范围:

  1. 前馈神经网络(Feedforward Neural Networks):前馈神经网络是最简单的神经网络之一,它由输入层、多个隐层和输出层组成,信息只能从输入层流向输出层,不能倒退。适用于分类和回归任务。常见的前馈神经网络包括多层感知机(Multilayer Perceptron,MLP)和卷积神经网络(Convolutional Neural Networks,CNN)等。

  2. 循环神经网络(Recurrent Neural Networks):循环神经网络是一种能够处理序列数据的神经网络,它能够将之前的输出作为当前输入的一部分,从而具有记忆功能。适用于自然语言处理、语音识别、时间序列预测等任务。常见的循环神经网络包括长短时记忆网络(Long Short-Term Memory,LSTM)和门控循环单元(Gated Recurrent Unit,GRU)等。

  3. 卷积神经网络(Convolutional Neural Networks):卷积神经网络是一种专门用于处理图像、视频等二维数据的神经网络,它利用了卷积运算的局部感知性和参数共享的特点,减少了需要训练的参数数量,从而提高了模型的泛化能力。适用于图像分类、目标检测、图像分割等任务。

  4. 自编码器(Autoencoders):自编码器是一种用于数据压缩和特征提取的神经网络,它通过训练一个将输入数据压缩到低维编码后再解码还原回原始数据的模型,学习到输入数据的稀疏表示和重要特征。适用于数据降维、数据去噪、特征提取等任务。

  5. 生成对抗网络(Generative Adversarial Networks,GAN):生成对抗网络由生成器和判别器两个部分组成,其中生成器用于生成与真实数据相似的假数据,判别器则用于判别真实数据和假数据。生成器和判别器之间不断进行对抗学习,从而使生成器生成的假数据更加逼真。适用于图像生成、图像风格转换、文本生成等任务。

这些神经网络在不同的领域和任务中都有广泛的应用,其中包括自然语言处理、计算机视觉、语音识别、推荐系统等。

以下是另外几种神经网络及其适用范围:

  1. 注意力机制神经网络(Attention Mechanism):注意力机制神经网络是一种能够动态地学习和选择输入信息的神经网络。它通过给不同的输入信息赋予不同的权重,从而提高模型的精度和泛化能力。适用于机器翻译、图像标注、语音识别等任务。

  2. 预训练模型(Pretrained Models):预训练模型是指已经在大规模数据上进行了训练的神经网络模型,通常采用无监督或半监督的方式进行预训练,然后在有标注数据上进行微调。预训练模型能够学习到通用的特征表示,从而在特定任务上表现更好。适用于自然语言处理、计算机视觉等任务。

  3. 稀疏自适应神经网络(Sparse Adaptive Neural Networks):稀疏自适应神经网络是一种能够自动地学习稀疏表示的神经网络。它能够根据输入数据的分布和任务的要求,自动地选择合适的神经元,并调整它们的权重,从而提高模型的精度和泛化能力。适用于数据降维、特征提取等任务。

  4. 同步神经网络(Synchronous Neural Networks):同步神经网络是一种能够模拟神经元之间同步放电的神经网络。它能够模拟大脑的同步神经活动,从而提高模型的计算效率和精度。适用于模式识别、人工智能等任务。

总之,不同的神经网络适用于不同的任务和领域。选择合适的神经网络模型需要根据具体的应用场景和问题进行综合考虑。

数值优化算法是求解无约束或约束优化问题的一种重要方法,广泛应用于科学、工程、金融等领域。以下是常见的数值优化算法:

  1. 最速下降法:沿着函数的梯度方向进行迭代,每次迭代都在当前点的负梯度方向上取一步,直到满足一定的停止准则。

  2. 牛顿法:利用函数的一阶和二阶导数信息,构造二次模型来逼近原始函数,并求解二次模型的最优解,以更新当前点的位置。

  3. 共轭梯度法:用于求解对称正定线性方程组和无约束优化问题,利用共轭方向的特性,迭代过程中每次更新的方向都是前面所有方向的线性组合。

  4. 拟牛顿法:利用函数值和梯度的信息,构造一种拟二阶模型来逼近原始函数,并求解拟二阶模型的最优解,以更新当前点的位置。

  5. 遗传算法:通过模拟自然进化过程,使用交叉、变异等操作来生成新的解,并使用适应度函数对每个解进行评估,以找到最优解。

  6. 粒子群算法:通过模拟群体中个体的行为,每个个体都有一个位置和速度,通过相互协作来寻找最优解。

  7. 支持向量机(SVM):使用最大间隔分类器来寻找数据的最优分类超平面,采用凸优化算法进行求解。

  8. 神经网络算法:利用误差反向传播算法和梯度下降法等优化算法来优化神经网络的权重和偏置,以提高预测精度。

除了上述算法之外,还有很多其他的数值优化算法,如半正定规划、整数规划、动态规划等。每种算法都有其特点和适用范围,需要根据具体问题进行选择。

2.PyTorch神经网络拟合正弦函数

下面代码实现的是一种具有一个隐藏层的前馈神经网络。该网络的输入是一个一维的值,输出是一个标量值。隐藏层使用了sigmoid激活函数,输出层没有使用激活函数。因此,它是一个简单的两层前馈神经网络,可以近似一个非线性函数,例如正弦函数。


import torch
import numpy as np
import matplotlib.pyplot as plt

# 定义训练数据
x = np.random.uniform(-np.pi, np.pi, size=(100, 1))
y = np.sin(x)

# 定义神经网络结构
class Net(torch.nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.hidden = torch.nn.Linear(1, 20)
        self.output = torch.nn.Linear(20, 1)
        
    def forward(self, x):
        x = torch.sigmoid(self.hidden(x))
        x = self.output(x)
        return x

net = Net()

# 定义损失函数和优化器
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.01)

# 训练神经网络
for epoch in range(10000):
    # 随机选择一些训练数据
    indices = np.random.choice(len(x), size=10)
    x_batch = torch.tensor(x[indices], dtype=torch.float32)
    y_batch = torch.tensor(y[indices], dtype=torch.float32)
    
    # 前向传播和反向传播
    optimizer.zero_grad()
    y_pred = net(x_batch)
    loss = criterion(y_pred, y_batch)
    loss.backward()
    optimizer.step()
    
    # 输出损失值
    if epoch % 1000 == 0:
        print("Epoch {}, Loss {:.4f}".format(epoch, loss.item()))

# 绘制结果
x_test = np.linspace(-np.pi, np.pi, 100)
x_test_tensor = torch.tensor(x_test.reshape(-1, 1), dtype=torch.float32)
y_pred_tensor = net(x_test_tensor)
y_pred = y_pred_tensor.detach().numpy()

plt.figure(figsize=(8, 5))
plt.plot(x_test, np.sin(x_test), label="ground truth")
plt.plot(x_test, y_pred, label="predicted")
plt.legend()
plt.show()

上述代码的训练数据是100个在区间[-π, π]上均匀采样的数据点x,以及它们对应的正弦函数值y=sin(x)。训练的目的是训练一个神经网络,使其能够对在输入区间[-π, π]上的任意x值的正弦函数值进行预测。

训练过程分为以下几个步骤:

  1. 定义神经网络结构:定义了一个包含一个隐藏层和一个输出层的神经网络,其中隐藏层有20个神经元,输入为1维,输出为标量。
  2. 定义损失函数和优化器:使用均方误差损失函数,采用随机梯度下降优化器来更新神经网络的权重。
  3. 训练神经网络:使用随机梯度下降法来进行训练。在每个epoch中,随机选择一个大小为10的mini-batch,将其输入到网络中,计算损失并进行反向传播,然后更新网络的权重。
  4. 绘制结果:最后,将训练好的网络在区间[-π, π]上的预测结果与真实值进行对比,并将结果可视化。

总体而言,该代码的目的是演示如何使用PyTorch训练一个简单的神经网络来近似正弦函数。在训练过程中,通过不断地调整网络的权重,使得神经网络的预测结果逐渐接近真实值,从而达到近似正弦函数的目的。

在神经网络训练过程中,有三个关键的概念:epoch、mini-batch和batch size。

  1. Epoch:一个epoch指的是对整个训练数据集进行一次遍历。在训练过程中,会将训练数据集分为若干个batch,每次训练时遍历一个batch的数据,经过多次迭代(epoch),可以使得整个训练数据集中的样本都得到训练。

  2. Mini-batch:一个mini-batch是指一个batch中包含的样本数。在上述代码中,mini-batch的大小为10,也就是每次训练时选择10个随机样本进行训练。

  3. Batch size:一个batch size是指在一个batch中包含的样本数量。在上述代码中,batch size的大小为10,也就是每次训练时选择10个随机样本进行训练。

在上述代码中,训练了10000个epoch,每个epoch选择了一个大小为10的mini-batch进行训练。每次选择训练样本时,使用了numpy库中的np.random.choice函数随机选择了10个训练样本,以此来增加训练样本的多样性。

通过随机选择样本,可以避免过拟合的发生,同时可以增加样本的多样性,使得模型更加健壮。在实际训练中,通常会通过交叉验证等方法来进一步提高模型的性能。

3. 神经网络实现数字排序

循环神经网络(Recurrent Neural Networks,RNN)是一种具有记忆能力的神经网络模型,在处理序列数据、语音识别、自然语言处理等任务中有广泛的应用。以下是循环神经网络的一些应用场景:

  1. 语言模型:循环神经网络可以学习并预测自然语言中的下一个单词,从而生成文本,完成文本自动生成、机器翻译等任务。

  2. 语音识别:循环神经网络可以通过对声音信号进行分类和识别,实现语音识别任务。

  3. 时序数据预测:循环神经网络可以对时间序列数据进行建模和预测,如股票价格预测、天气预测等。

  4. 图像描述生成:循环神经网络可以结合卷积神经网络实现图像描述生成,即根据输入的图片生成相应的文字描述。

  5. 推荐系统:循环神经网络可以通过学习用户历史行为数据,预测用户未来的行为,实现推荐系统中的个性化推荐。

总之,循环神经网络适用于需要考虑历史数据和上下文信息的任务,可以处理输入序列中的时序信息,具有很强的应用价值。

我们可以考虑一个简单的排序问题,即给定一个由数字组成的列表,我们的目标是将它们按从小到大的顺序排序。

例如,给定列表 [4, 2, 7, 1, 3],我们的目标是将其排序为 [1, 2, 3, 4, 7]

下面是一个使用Keras实现的简单神经网络模型,该模型将一个未排序的数字列表作为输入,输出对该列表进行排序后的结果。模型将学习如何将数字列表重新排列以生成已排序的输出。

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM

# 生成随机的数字列表
X = np.random.randint(0, 100, size=(100, 10))
y = np.sort(X, axis=1)  # 对每行数字列表进行排序

# 构建神经网络模型
model = Sequential()
model.add(LSTM(64, input_shape=(10, 1)))
model.add(Dense(10))

# 编译模型
model.compile(loss='mse', optimizer='adam')

# 训练模型
model.fit(X.reshape(100, 10, 1), y, epochs=100, verbose=0)

# 使用模型进行预测
x_test = np.array([[55, 3, 7, 23, 98, 12, 9, 0, 45, 31]])
y_pred = model.predict(x_test.reshape(1, 10, 1))

print("输入数据:", x_test)
print("预测结果:", y_pred)

在上面的代码中,我们首先生成了100个随机数字列表。我们对每个数字列表进行排序,并将这些已排序的列表作为我们的目标输出。

接下来,我们构建了一个简单的神经网络模型,该模型包含一个LSTM层和一个密集层。我们使用mse(均方误差)作为损失函数,并使用adam优化器进行模型训练。

在训练完成后,我们使用模型进行预测。在这个例子中,我们手动创建了一个未排序的数字列表,并将其输入模型进行预测。模型输出已排序的数字列表,该数字列表与我们的目标输出非常接近。

在神经网络中,通常会将输出层的激活函数设置为非线性函数,以便使得神经网络能够学习到非线性的关系。在回归问题中,输出层的激活函数通常使用线性函数,因为它可以输出实数值。但在排序问题中,我们需要将多个整数进行排序,而整数之间的大小关系是线性的,所以使用线性函数并不适合。

为了解决这个问题,我们可以将输出层的激活函数设置为 softmax 函数,使得输出结果变成概率分布。在排序问题中,softmax 函数可以将输出结果转化为每个整数在排序中出现的概率。因为每个整数在排序中只出现一次,所以概率分布中的每个数都应该接近于 0 或 1。但是由于神经网络的学习过程中存在一定的误差,输出结果可能会略微偏离这个理想状态,因此输出结果会有小数的出现。

这种方法被称为神经网络排序,它可以通过机器学习的方式,自动学习排序规则,并通过训练数据进行优化,从而得到更加准确的排序结果。相比于传统的排序算法,神经网络排序能够处理更加复杂的排序问题,而且不需要事先设计特定的规则和特征,因此具有更高的灵活性和适应性。此外,它还可以处理一些传统排序算法无法处理的问题,如处理大规模的非数值型数据、处理有缺失值的数据等。

4. 利用神经网络求解一元一次方程

下面这个例子用到了 Keras 框架,利用单层神经网络来解决一元一次方程的问题。我们准备了 10 组已知的 x 和 y 值,然后将其作为训练数据进行训练。在训练完成后,我们利用训练好的模型来预测另外 5 组 x 值对应的 y 值,并将结果输出。

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

# 准备数据
x_train = np.array([[2], [3], [4], [5], [6], [7], [8], [9], [10], [11]])
y_train = np.array([[5], [8], [11], [14], [17], [20], [23], [26], [29], [32]])

# 构建模型
model = Sequential()
model.add(Dense(units=1, input_dim=1))

# 编译模型
model.compile(loss='mean_squared_error', optimizer='sgd')

# 训练模型
model.fit(x_train, y_train, epochs=1000)

# 预测结果
x_test = np.array([[12], [13], [14], [15], [16]])
y_test = model.predict(x_test)

# 输出结果
print(y_test)

下面是这个例子的详细分析:

  1. 神经网络模型:这个例子使用了一个简单的单层神经网络,包含一个输入层和一个输出层,每层都只有一个神经元。输入层接收一个自变量 $x$,输出层输出一个因变量 $y$,神经网络的目的是拟合这两个变量之间的线性关系。这个模型属于线性回归模型,可通过梯度下降法进行优化。

  2. 训练数据:训练数据由 10 组自变量和因变量组成,自变量是 x 的值,因变量是对应的 y 的值。这些数据用于训练模型。

  3. 训练过程:在训练过程中,模型使用训练数据进行学习和优化。首先需要编译模型,指定优化算法和损失函数。这个例子使用的是随机梯度下降法(SGD)作为优化算法,使用均方误差(MSE)作为损失函数。然后模型使用 fit() 方法对训练数据进行训练,指定训练的轮数(epochs)。在训练过程中,模型不断调整权重和偏置,以最小化损失函数的值。

  4. 模型评价:在训练完成后,我们使用训练好的模型对测试数据进行预测,并计算预测值与实际值之间的误差。在这个例子中,我们使用了 5 组测试数据,即输入自变量 $x$ 的值,预测输出因变量 $y$ 的值。误差评价使用的是平均绝对误差(MAE)和均方误差(MSE)。

  5. 输出结果:在预测完成后,我们将预测的结果输出到屏幕上,即输出 5 组输入 $x$ 对应的预测输出 $y$ 值。

在这个例子中,我们使用的是非常简单的模型和数据集,主要是为了演示神经网络如何应用于求解数学方程。在实际应用中,我们需要更复杂的模型和更大的数据集来解决更复杂的问题。同时还需要考虑模型的可解释性和泛化能力等因素。

参考资料

猜你喜欢

转载自blog.csdn.net/qq_45659165/article/details/129147735