神经网络是什么意思(附带实例)
神经网络是深度学习的基础,它试图模拟人脑的神经元网络,以实现对复杂模式的学习。本节讲介绍神经网络的各个组成部分,以及如何训练一个神经网络模型。
首先,我们需要了解神经网络的基本构成单元——神经元。在神经网络中,神经元一般有多个输入和一个输出。每个输入都有对应的权重,这些输入进行加权后,加上偏置值形成神经元的净输入。通过激活函数转换净输入,即可得到神经元的输出。这个过程可以被看作模型从数据中学习特征。
激活函数的主要目的是引入非线性因素到神经网络中,这样神经网络就可以解决复杂的问题了,如识别和理解语音、图像等数据,这些问题通常不能通过简单的线性模型解决。如果没有激活函数,则无论网络有多少层,最终输出都将是输入的线性组合,这将大大限制神经网络的表达能力。
常见的激活函数包括 Sigmoid、tanh、ReLU(Rectified Linear Unit)、Leaky ReLU、ELU(Exponential Linear Units)等:
通过激活函数,神经网络能学习并执行更复杂的任务。
神经网络的训练是通过优化权重和偏置值完成的,其目标是最小化损失函数(Loss Function)。在机器学习和统计学中,损失函数用量化模型预测结果与真实数据之间的差异。也就是说,损失函数可以衡量模型的预测错误程度。通过最小化损失函数,我们可以找到模型的最优参数。
常见的损失函数有以下两种:
下面,看一个简单的神经网络示例。
假设有一个二分类问题,输入是两个特征,输出是类别 0 或类别 1。我们可以构建一个包含一个隐藏层的简单神经网络解决这个问题。隐藏层包含两个神经元,使用 Sigmoid 函数作为激活函数;输出层包含一个神经元,同样使用 Sigmoid 函数作为激活函数。损失函数选择交叉熵损失。代码如下:
隐藏层中的每一个神经元都会接收来自上一层所有神经元的输入,并对这些输入进行加权求和,然后通过一个激活函数进行非线性变换,最后输出结果。
运行结果为:
通过上述讨论,读者应该对神经网络有了基本的理解。需要注意,神经网络是一个非常复杂的领域,还有许多细节需要进一步学习和实践。
首先,我们需要了解神经网络的基本构成单元——神经元。在神经网络中,神经元一般有多个输入和一个输出。每个输入都有对应的权重,这些输入进行加权后,加上偏置值形成神经元的净输入。通过激活函数转换净输入,即可得到神经元的输出。这个过程可以被看作模型从数据中学习特征。
激活函数的主要目的是引入非线性因素到神经网络中,这样神经网络就可以解决复杂的问题了,如识别和理解语音、图像等数据,这些问题通常不能通过简单的线性模型解决。如果没有激活函数,则无论网络有多少层,最终输出都将是输入的线性组合,这将大大限制神经网络的表达能力。
常见的激活函数包括 Sigmoid、tanh、ReLU(Rectified Linear Unit)、Leaky ReLU、ELU(Exponential Linear Units)等:
- Sigmoid 函数可以将任意实数映射到(0,1),通常用于输出层的二分类;
- tanh函数可以将任意实数映射到(-1,1),此函数是 Sigmoid 函数的变体;
- ReLU函数在输入大于 0 时,直接输出该值,在输入小于 0 时,输出 0。该函数简单且计算量小;
- Leaky ReLU 函数在输入小于 0 时,计算一个很小的常数乘以输入值的乘积,并输出该乘积;
- ELU函数在输入小于 0 时,输出一个小于等于 -1 的值,能缓解 ReLU 函数的 Dead ReLU 问题。
通过激活函数,神经网络能学习并执行更复杂的任务。
神经网络的训练是通过优化权重和偏置值完成的,其目标是最小化损失函数(Loss Function)。在机器学习和统计学中,损失函数用量化模型预测结果与真实数据之间的差异。也就是说,损失函数可以衡量模型的预测错误程度。通过最小化损失函数,我们可以找到模型的最优参数。
常见的损失函数有以下两种:
- 均方误差:这是最常用的回归损失函数。均方误差是实际输出和预测输出之间差平方的平均值。因此,均方误差只能用于回归问题。均方误差对于大的误差会给予更大的惩罚,因为误差被平方了;
- 交叉熵损失(Cross-Entropy):最常用的分类损失函数。在二分类问题中,交叉熵损失函数可以被看作真实类别的负对数概率。对于多分类问题,交叉熵损失函数是每个类别的负对数概率的和。交叉熵损失函数的优点是在实际类别和预测类别之间的差距较大时,损失会增大,这促使模型在训练过程中更快地收敛。
下面,看一个简单的神经网络示例。
假设有一个二分类问题,输入是两个特征,输出是类别 0 或类别 1。我们可以构建一个包含一个隐藏层的简单神经网络解决这个问题。隐藏层包含两个神经元,使用 Sigmoid 函数作为激活函数;输出层包含一个神经元,同样使用 Sigmoid 函数作为激活函数。损失函数选择交叉熵损失。代码如下:
import numpy as np from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.neural_network import MLPClassifier # 生成二分类问题的数据 X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=123) # 划分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123) # 构建神经网络模型 model = MLPClassifier(hidden_layer_sizes=(2, ), activation='logistic', solver='sgd', learning_rate_init=0.01, max_iter=500) # 训练模型 model.fit(X_train, y_train) # 预测 y_pred = model.predict(X_test) # 评估 print("Accuracy: ", accuracy_score(y_test, y_pred))在神经网络中,隐藏层是输入层和输出层之间的一层或多层,这些层的功能是将输入数据进行非线性转换,并将这些转换后的数据传递给下一层,直到输出层。
隐藏层中的每一个神经元都会接收来自上一层所有神经元的输入,并对这些输入进行加权求和,然后通过一个激活函数进行非线性变换,最后输出结果。
运行结果为:
D:\深度学习>python 神经网络.py D:\softWare\Python_3.11.4\Lib\site-packages\sklearn\neural_network\multilayer_perceptron.py:686: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (500) reached and the optimization hasn't converged yet. warnings.warn( Accuracy: 0.75 D:\深度学习>下面对上述代码中的细节进行介绍。
- 生成二分类问题的数据:使用 make_classification 函数生成一个包含 100 个样本、2 个特征、2 个有用信息的二分类问题数据集;
- 划分数据集:通过 train_test_split 函数将数据集划分为训练集和测试集,其中测试集的比例为 20%;
- 构建神经网络模型:使用 MLPClassifier 类构建一个神经网络模型,该模型有一个包含两个神经元的隐藏层,激活函数选择逻辑回归(sigmoid),求解器选择随机梯度下降(sgd),学习率初始值为 0.01,最大迭代次数为 500;
- 训练模型:通过调用模型的 fit 方法,使用训练数据对模型进行训练;
- 预测:使用训练好的模型对测试数据进行预测,预测结果保存在 y_pred 中;
- 评估:使用 accuracy_score 函数计算模型在测试集上的准确度,并将结果打印出来;
- 用户可以根据自己的需求调整模型的参数,如隐藏层神经元的数量、激活函数、优化器、学习率等。
通过上述讨论,读者应该对神经网络有了基本的理解。需要注意,神经网络是一个非常复杂的领域,还有许多细节需要进一步学习和实践。