当前位置:   article > 正文

机器学习第五章-神经网络

机器学习第五章-神经网络

目录

5.1神经元模型

5.2感知机与多层网络

5.3误差逆传播算法(BP)

5.4全局最小与局部极小

5.5其他常见的神经网络

5.5.1RBF网络

5.5.2ART网络

5.5.3SOM网络

5.5.4级联相关网络

5.5.5Elman网络

5.5.6Boltzmann 机


5.1神经元模型

        神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。

        神经网络中最基本的成分是神经元模型。在生物神经网络中每个神经元与其他神经元相连,当它兴奋时, 就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个阔值,那么它就会被激活兴奋起来,向其他神经元发送化学物质。

        一直沿用至今的是 "M-P 神经元模型“,如下图所示:
        神经元会接收外界的n个输入信号,这些输入会与带权重的连接传递,再通过“激活函数”对信号进行处理从而产生神经元的输出。
        理想的激活函数是阶跃函数,其将输入值映射为输出值0或1,但是因为其不连续、不光滑的性质,实际常用sigmoid函数作为激活函数,有时也将sigmoid函数叫做挤压函数。阶跃函数和sigmoid函数如下所示:

5.2感知机与多层网络

        感知机由两层神经元组成,输入层接收外界输入信号后传递给输出层, 输出 层是 M-P 经元,亦称"阔值逻辑单元",结构示意图如下:
                                        
        更一般地,给定训练数据集,权重w_{i}(i=1,2, \ldots, n)以及阈值\theta可通过学习得到.
        感知机学习规则非常简单,对训练样例忡(x,y) 若当前感知机的输出为\hat{y},则感知机权
重将这样调整:
                                w_{i} \leftarrow w_{i}+\Delta w_{i}
                                \Delta w _ { i } = \eta ( y - \hat { y } ) x _ { i }
其中\eta为学习率.
        感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元,其学习能力非常有限.所以应该采用多层功能神经元,如下图所示,输出层与输入层之间有一层神经元,被称为隐居或隐含层,隐含层和输出层神经元都是拥有激活函数的功能神经元.
多层神经元结构图如下:
                

5.3误差逆传播算法(BP)

        误差逆传播算法是更强大的学习算法,BP算法基于梯度下降策略,以目标的负梯度方向对参数进行调整。学习率控制着算法每一轮迭代中的更新步长,太长会导致震荡,太短会导致收敛速度过慢。其基本流程如下图所示:

BP 算法的目标是要最小化训练集 D上的累积误差:
                                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        E = \frac { 1 } { m } \sum _ { k = 1 } ^ { m } E _ { k }
        一般来说,标准 BP算法每次更新只针对单个样例,累积 BP 算法直接针对累积误差最小化.
实际应用中经常靠“试错法”来调整设置隐层神经元的个数。一般用两种策略来缓解BP网络的过拟合:
        一,“早停”:将数据分成训练集和验证集,训练、集用来计算梯度、更新连接权和阔值,验证集用来估计误差,若训练集误差降低但验证集误差升高?则停止训练,同时返回具有最小验证集误差的连接权和阑值.
        二,“正则化”:在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阔值的平方和.仍令 Ek 表示第 k个训练样例上的误差,w_{i}表示连接权和阙值,则误差目标函数改变为:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​   E=\lambda \frac{1}{m} \sum_{k=1}^{m} E_{k}+(1-\lambda) \sum_{i} w_{i}^{2}
        下面是一个简单的示例,展示了如何使用Python实现一个基本的误差逆传播算法来训练一个神经网络。这个示例使用了NumPy库来进行矩阵运算,假设我们要训练一个简单的多层感知机(MLP)来解决二分类问题:
  1. import numpy as np
  2. # 定义sigmoid函数及其导数
  3. def sigmoid(x):
  4. return 1 / (1 + np.exp(-x))
  5. def sigmoid_derivative(x):
  6. return x * (1 - x)
  7. # 定义神经网络类
  8. class NeuralNetwork:
  9. def __init__(self, input_size, hidden_size, output_size):
  10. # 初始化权重
  11. self.weights_input_hidden = np.random.randn(input_size, hidden_size)
  12. self.weights_hidden_output = np.random.randn(hidden_size, output_size)
  13. def forward(self, inputs):
  14. # 前向传播
  15. self.hidden_input = np.dot(inputs, self.weights_input_hidden)
  16. self.hidden_output = sigmoid(self.hidden_input)
  17. self.output = sigmoid(np.dot(self.hidden_output, self.weights_hidden_output))
  18. return self.output
  19. def backward(self, inputs, targets, learning_rate):
  20. # 反向传播
  21. output_error = targets - self.output
  22. output_delta = output_error * sigmoid_derivative(self.output)
  23. hidden_error = output_delta.dot(self.weights_hidden_output.T)
  24. hidden_delta = hidden_error * sigmoid_derivative(self.hidden_output)
  25. # 更新权重
  26. self.weights_hidden_output += self.hidden_output.T.dot(output_delta) * learning_rate
  27. self.weights_input_hidden += inputs.T.dot(hidden_delta) * learning_rate
  28. def train(self, inputs, targets, epochs, learning_rate):
  29. for epoch in range(epochs):
  30. for i in range(len(inputs)):
  31. output = self.forward(inputs[i])
  32. self.backward(inputs[i], targets[i], learning_rate)
  33. if epoch % 1000 == 0:
  34. print(f"Epoch {epoch}: Error = {np.mean(np.square(targets - self.forward(inputs)))}")
  35. # 示例用法
  36. if __name__ == "__main__":
  37. # 输入数据和对应的标签(二分类问题)
  38. inputs = np.array([[0, 0],
  39. [0, 1],
  40. [1, 0],
  41. [1, 1]])
  42. targets = np.array([[0], [1], [1], [0]])
  43. # 创建神经网络实例
  44. neural_network = NeuralNetwork(input_size=2, hidden_size=4, output_size=1)
  45. # 训练神经网络
  46. neural_network.train(inputs, targets, epochs=10000, learning_rate=0.1)
  47. # 测试神经网络(示例输出)
  48. test_inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
  49. for input in test_inputs:
  50. print(f"Input: {input}, Predicted Output: {neural_network.forward(input)}")

5.4全局最小与局部极小

        若用 E表示神经网络在训练集上的误差,则它显然是关于连接权\omega 和阈值\theta的函数.此时,神经网络的训练过程可看作一个参数寻优过程 ,即在参数空间中,寻找一组最优参数使得E最小.
观察下图可以明显看出全局最小和局部极小的区别:
        ​​​​​​​        
"全局最最小"一定是"局部极小”,反之不成立。
        基于梯度的搜索是使用最广泛的参数寻优方法,梯度下降法的主要思想就是沿着负梯度方向去搜索最优解,负梯度方向是函数值下降最快的方向,若迭代到某处的梯度为0,则表示达到一个局部最小,参数更新停止。因此在现实任务中,通常使用以下策略尽可能地去接近全局最小:
        1:以多组不同参数值初始化多个神经网络,取其中误差最小的解作为最终参数.
        2:使用 "模拟退火" 技术,每一步都以一定的概率接受比当前解更差的结果
        3:使用随机梯度下降,随机梯度下降法在计算梯度时加入了随机因素,即便陷入局部极小点,它计算出的梯度仍可能不为零。
        此外, 遗传算法也常用来训练神经网络以更好地逼近全局最小。
        下面实验代码演示了如何使用梯度下降算法来寻找一个函数的全局最小值和局部最小值。这里假设我们要优化的函数是一个简单的二次函数 f(x)=x^{4}-3x^{3}+2:
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. # 定义函数及其导数
  4. def f(x):
  5. return x**4 - 3*x**3 + 2
  6. def f_derivative(x):
  7. return 4*x**3 - 9*x**2
  8. # 梯度下降算法找到最小值
  9. def gradient_descent(starting_point, learning_rate, epochs):
  10. x = starting_point
  11. for epoch in range(epochs):
  12. gradient = f_derivative(x)
  13. x = x - learning_rate * gradient
  14. return x, f(x)
  15. # 寻找全局最小值
  16. global_min_point, global_min_value = gradient_descent(starting_point=0.0, learning_rate=0.01, epochs=1000)
  17. # 寻找局部最小值(不同初始点)
  18. local_min_point1, local_min_value1 = gradient_descent(starting_point=-1.0, learning_rate=0.01, epochs=1000)
  19. local_min_point2, local_min_value2 = gradient_descent(starting_point=2.0, learning_rate=0.01, epochs=1000)
  20. # 输出结果
  21. print(f"Global Minimum: Point = {global_min_point}, Value = {global_min_value}")
  22. print(f"Local Minimum 1: Point = {local_min_point1}, Value = {local_min_value1}")
  23. print(f"Local Minimum 2: Point = {local_min_point2}, Value = {local_min_value2}")
  24. # 绘制函数图像及最小值点
  25. x = np.linspace(-2, 3, 400)
  26. y = f(x)
  27. plt.figure(figsize=(10, 6))
  28. plt.plot(x, y, label='f(x) = x^4 - 3x^3 + 2')
  29. plt.scatter(global_min_point, global_min_value, color='red', label='Global Minimum')
  30. plt.scatter(local_min_point1, local_min_value1, color='green', label='Local Minimum 1')
  31. plt.scatter(local_min_point2, local_min_value2, color='orange', label='Local Minimum 2')
  32. plt.xlabel('x')
  33. plt.ylabel('f(x)')
  34. plt.title('Gradient Descent to Find Global and Local Minima')
  35. plt.legend()
  36. plt.grid(True)
  37. plt.show()

        实验结果如下:

5.5其他常见的神经网络

5.5.1RBF网络

        RBF网络是一种单隐层前馈神经网络,假定输入为 d维向量x,输出为实值, RBF 网络可表示为:

                                                \varphi(\boldsymbol{x})=\sum_{i=1}^{q} w_{i} \rho\left(\boldsymbol{x}, \boldsymbol{c}_{i}\right)

        通常采用两步过程来训练 RBF 网络:第一步,确定神经元中心c_{i}常用的方式包括随机采样、聚类等;第二步,利用 BP 算法等来确定参数w_{i}\beta _{i}.

5.5.2ART网络

        ART网络是竞争型学习的重要代表,该网络由比较层、识别层、识别阈值和重置模块构成.其中,比较层负责输入样本,并将其传递给识别层神经元.识别层每个神经元对应一个模式类,神经元数目可在训练过程中动态增长以增加新的模式类.

        它通过两个主要机制实现自适应:一是保持稳定的识别和分类能力,即当新输入到达时,网络可以调整自身以适应新模式,而不会完全改变已有的学习;二是在学习过程中通过比较新输入与已有模式的相似性来决定是否创建新的类别或更新现有类别。这使得ART网络在处理动态变化的数据和实时学习中具有较好的鲁棒性和适应性。

5.5.3SOM网络

        SOM网络是一种竞争学习型的无监督神经网络,它能将高维输入数据映射到低维空间 ,同时保持输入数据在高维空间的拓扑结构。
        SOM 的训练过程很简单:在接收到一个训练样本后.每个输出层神经局会计算该样本与自身携带的权向量之间的距离,距离最近的神经元成为竞争获胜者,称为最佳匹配单元。 然后,最佳匹配单元及其邻近神经元的权向量将被调整,以使得这些权向量与当前输入样本的距离缩小.这个过 程不断迭代,直至收敛.
        ​​​​​​​        ​​​​​​​        

5.5.4级联相关网络

        结构自适网络是将网络结构也当作学习的目标之一。并希望能在训练过程中找到最符合数据特点 的网络结构。级联相关网络就是结构自适应网络的代表,其训练过程如下:

        与一般的前馈神经网络相比,级联相关网络无需设置网络层数、隐层神经元数目,且训练速度较快,但其在数据较小时易陷入过拟合。

5.5.5Elman网络

        Elman 网络它的结构与多层前馈网络很相似,但隐层神经元的输出被反馈回来,与下一时刻输入层神经元提供的信号一起,作为隐层神经元在下一时刻的输入:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        

5.5.6Boltzmann 机

        神经网络中有一类模型是为网络状态定义一个“能量”,能量最小化时网络达到理想状态,而网络的训练就是在最小化这个能量函数。Boltzmann机就是一种“基于能量的模型”常见结构如图 其神经元分为两层:显层与隐层。显层用于表示数据的输入与输出,隐层则被理解为数据的内在表达。Boltzmann 机中的神经元都是布尔型的,即只能取 0、1两种状态,状态1表示激活,状态0表示抑制。

        ​​​​​​​        ​​​​​​​        

     

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/936383
推荐阅读
相关标签
  

闽ICP备14008679号