百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

10分钟带你了解神经网络基础:反向传播算法详解

itomcoil 2024-12-28 13:35 33 浏览

作者:Great Learning Team

deephub.ai 翻译组

1.神经网络

2.什么是反向传播?

3.反向传播是如何工作的?

4.损失函数

5.为什么我们需要反向传播?

6.前馈网络

7.反向传播的类型

8.案例研究

在典型的编程中,我们输入数据,执行处理逻辑并接收输出。 如果输出数据可以某种方式影响处理逻辑怎么办? 那就是反向传播算法。 它对以前的模块产生积极影响,以提高准确性和效率。

让我们来深入研究一下。


神经网络(Neural network)


神经网络是连接单元的集合。每个连接都有一个与其相关联的权重。该系统有助于建立基于海量数据集的预测模型。它像人类的神经系统一样工作,有助于理解图像,像人类一样学习,合成语音等等。

什么是反向传播(What is backpropagation?)

我们可以将反向传播算法定义为在已知分类的情况下,为给定的输入模式训练某些给定的前馈神经网络的算法。当示例集的每一段都显示给网络时,网络将查看其对示例输入模式的输出反应。之后,测量输出响应与期望输出与误差值的比较。之后,我们根据测量的误差值调整连接权重。

在深入研究反向传播之前,我们应该知道是谁引入了这个概念以及何时引入。它最早出现在20世纪60年代,30年后由大卫·鲁梅尔哈特、杰弗里·辛顿和罗纳德·威廉姆斯在1986年的著名论文中推广。在这篇论文中,他们谈到了各种神经网络。今天,反向传播做得很好。神经网络训练是通过反向传播实现的。通过这种方法,我们根据前一次运行获得的错误率对神经网络的权值进行微调。正确地采用这种方法可以降低错误率,提高模型的可靠性。利用反向传播训练链式法则的神经网络。简单地说,每次前馈通过网络后,该算法根据权值和偏差进行后向传递,调整模型的参数。典型的监督学习算法试图找到一个将输入数据映射到正确输出的函数。反向传播与多层神经网络一起工作,学习输入到输出映射的内部表示。

反向传播是如何工作的?(How does backpropagation work?)

让我们看看反向传播是如何工作的。它有四层:输入层、隐藏层、隐藏层II和最终输出层。

所以,主要的三层是:

1.输入层

2.隐藏层

3.输出层

每一层都有自己的工作方式和响应的方式,这样我们就可以获得所需的结果并将这些情况与我们的状况相关联。 让我们讨论有助于总结此算法所需的其他细节。

这张图总结了反向传播方法的机能。

1.输入层接收x

2.使用权重w对输入进行建模

3.每个隐藏层计算输出,数据在输出层准备就绪

4.实际输出和期望输出之间的差异称为误差

5.返回隐藏层并调整权重,以便在以后的运行中减少此错误

这个过程一直重复,直到我们得到所需的输出。训练阶段在监督下完成。一旦模型稳定下来,就可以用于生产。

损失函数(Loss function)

一个或多个变量被映射到实数,这些实数表示与这些变量值相关的某个数值。为了进行反向传播,损失函数计算网络输出与其可能输出之间的差值。

为什么我们需要反向传播?(Why do we need backpropagation?)

反向传播有许多优点,下面列出一些重要的优点:

?反向传播快速、简单且易于实现

?没有要调整的参数

?不需要网络的先验知识,因此成为一种灵活的方法

?这种方法在大多数情况下都很有效

?模型不需要学习函数的特性

前馈网络(Feed forward network)

前馈网络也称为MLN,即多层网络。 之所以称为前馈,是因为数据仅在NN(神经网络)中通过输入节点,隐藏层并最终到达输出节点。 它是最简单的人工神经网络。

反向传播的类型(Types of backpropagation)

有两种类型的反向传播网络。

?静态反向传播(Static backpropagation)

?循环反向传播(Recurrent backpropagation)

1. 静态反向传播(Static backpropagation)

在这个网络中,静态输入的映射生成静态输出。像光学字符识别这样的静态分类问题将是一个适合于静态反向传播的领域。

2. 循环反向传播(Recurrent backpropagation)

反复进行反向传播,直到达到某个阈值为止。 在到达阈值之后,将计算误差并向后传播。

这两种方法的区别在于,静态反向传播与静态映射一样快。

案例研究(Case Study)

让我们使用反向传播进行案例研究。 为此,我们将使用Iris数据(鸢尾花卉数据集),该数据包含诸如萼片和花瓣的长度和宽度之类的特征。 在这些帮助下,我们需要确定植物的种类。

为此,我们将构建一个多层神经网络,并使用sigmoid函数,因为它是一个分类问题。

让我们看一下所需的库和数据。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split


为了忽略警告,我们将导入另一个名为warnings的库。


import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

接着让我们读取数据。

iris = pd.read_csv("iris.csv")
iris.head()

现在我们将把类标记为0、1和2。

iris. replace (, , inplace=True)

我们现在将定义函数,它将执行以下操作。

1.对输出执行独热编码(one hot encoding)。

2.执行sigmoid函数

3.标准化特征

对于独热编码,我们定义以下函数。

def to_one_hot(Y):
    n_col = np.amax(Y) + 1
    binarized = np.zeros((len(Y), n_col))
    for i in range(len(Y)):
        binarized ] = 1.
return binarized

#现在我们来定义一个sigmoid函数

def sigmoid_func(x):
    return 1/(1+np.exp(-x))
def sigmoid_derivative(x):
    return sigmoid_func(x)*(1 – sigmoid_func(x))

现在我们将定义一个用于标准化的函数。

def normalize (X, axis=-1, order=2):
    l2 = np. atleast_1d (np.linalg.norm(X, order, axis))
    l2 = 1
return X / np.expand_dims(l2, axis)

现在我们将对特征进行规范化,并对输出应用独热编码。


x = pd.DataFrame(iris, columns=columns)
x = normalize(x.as_matrix())

y = pd.DataFrame(iris, columns=columns)
y = y.as_matrix()
y = y.flatten()
y = to_one_hot(y)

现在是时候应用反向传播了。为此,我们需要定义权重和学习率。让我们这么做吧。但在那之前,我们需要把数据分开进行训练和测试。

#Split data to training and validation data(将数据拆分为训练和验证数据)
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.33)
#Weights
w0 = 2*np.random.random((4, 5)) - 1 #for input - 4 inputs, 3 outputs
w1 = 2*np.random.random((5, 3)) - 1 #for layer 1 - 5 inputs, 3 outputs
#learning rate
n = 0.1

我们将为错误设置一个列表,并通过可视化查看训练中的更改如何减少错误。

errors = []

让我们执行前馈和反向传播网络。对于反向传播,我们将使用梯度下降算法。

for i in range (100000):
#Feed forward network
layer0 = X_train
layer1 = sigmoid_func(np.dot(layer0, w0))
layer2 = sigmoid_func(np.dot(layer1, w1))
Back propagation using gradient descent
layer2_error = y_train - layer2
layer2_delta = layer2_error * sigmoid_derivative(layer2)
layer1_error = layer2_delta.dot (w1.T)
layer1_delta = layer1_error * sigmoid_derivative(layer1)
w1 += layer1.T.dot(layer2_delta) * n
w0 += layer0.T.dot(layer1_delta) * n
error = np.mean(np.abs(layer2_error))
errors.append(error)

准确率将通过从训练数据中减去误差来收集和显示

accuracy_training = (1 - error) * 100

现在让我们直观地看一下如何通过减少误差来提高准确度。(可视化)

plt.plot(errors)
plt.xlabel('Training')
plt.ylabel('Error')
plt.show()

现在让我们查看一下准确率。

print ("Training Accuracy of the model " + str (round(accuracy_training,2)) + "%")

Output: Training Accuracy of the model 99.04%

我们的训练模型表现很好。现在让我们看看验证的准确性。

#Validate
layer0 = X_test
layer1 = sigmoid_func(np.dot(layer0, w0))
layer2 = sigmoid_func(np.dot(layer1, w1))
layer2_error = y_test - layer2
error = np.mean(np.abs(layer2_error))
accuracy_validation = (1 - error) * 100
print ("Validation Accuracy of the model "+ str(round(accuracy_validation,2)) + "%")

Output: Validation Accuracy 92.86%

这个性能符合预期。

应遵循的最佳实践准则(Best practices to follow)

下面讨论一些获得好模型的方法:

?如果约束非常少,则系统可能不起作用

?过度训练,过多的约束会导致过程缓慢

?只关注少数方面会导致偏见

反向传播的缺点(Disadvantages of backpropagation)

?输入数据是整体性能的关键

?有噪声的数据会导致不准确的结果

?基于矩阵的方法优于小批量方法(mini-batch)


综上所述,神经网络是具有输入和输出机制的连接单元的集合,每个连接都有相关联的权值。反向传播是"误差的反向传播",对训练神经网络很有用。它快速、易于实现且简单。反向传播对于处理语音或图像识别等易出错项目的深度神经网络非常有益。

相关推荐

Python编程实现求解高次方程_python求次幂
Python编程实现求解高次方程_python求次幂

#头条创作挑战赛#编程求解一元多次方程,一般情况下对于高次方程我们只求出近似解,较少的情况可以得到精确解。这里给出两种经典的方法,一种是牛顿迭代法,它是求解方程根的有效方法,通过若干次迭代(重复执行部分代码,每次使变量的当前值被计算出的新值...

2025-10-23 03:58 itomcoil

python常用得内置函数解析——sorted()函数

接下来我们详细解析Python中非常重要的内置函数sorted()1.函数定义sorted()函数用于对任何可迭代对象进行排序,并返回一个新的排序后的列表。语法:sorted(iterabl...

Python入门学习教程:第 6 章 列表

6.1什么是列表?在Python中,列表(List)是一种用于存储多个元素的有序集合,它是最常用的数据结构之一。列表中的元素可以是不同的数据类型,如整数、字符串、浮点数,甚至可以是另一个列表。列...

Python之函数进阶-函数加强(上)_python怎么用函数

一.递归函数递归是一种编程技术,其中函数调用自身以解决问题。递归函数需要有一个或多个终止条件,以防止无限递归。递归可以用于解决许多问题,例如排序、搜索、解析语法等。递归的优点是代码简洁、易于理解,并...

Python内置函数range_python内置函数int的作用

range类型表示不可变的数字序列,通常用于在for循环中循环指定的次数。range(stop)range(start,stop[,step])range构造器的参数必须为整数(可以是内...

python常用得内置函数解析——abs()函数

大家号这两天主要是几个常用得内置函数详解详细解析一下Python中非常常用的内置函数abs()。1.函数定义abs(x)是Python的一个内置函数,用于返回一个数的绝对值。参数:x...

如何在Python中获取数字的绝对值?

Python有两种获取数字绝对值的方法:内置abs()函数返回绝对值。math.fabs()函数还返回浮点绝对值。abs()函数获取绝对值内置abs()函数返回绝对值,要使用该函数,只需直接调用:a...

贪心算法变种及Python模板_贪心算法几个经典例子python

贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。以下是贪心算法的主要变种、对应的模板和解决的问题特点。1.区间调度问题问题特点需要从一组区间中选择最大数...

Python倒车请注意!负步长range的10个高能用法,让代码效率翻倍

你是否曾遇到过需要倒着处理数据的情况?面对时间序列、日志文件或者矩阵操作,传统的遍历方式往往捉襟见肘。今天我们就来揭秘Python中那个被低估的功能——range的负步长操作,让你的代码优雅反转!一、...

Python中while循环详解_python怎么while循环

Python中的`while`循环是一种基于条件判断的重复执行结构,适用于不确定循环次数但明确终止条件的场景。以下是详细解析:---###一、基本语法```pythonwhile条件表达式:循环体...

简单的python-核心篇-面向对象编程

在Python中,类本身也是对象,这被称为"元类"。这种设计让Python的面向对象编程具有极大的灵活性。classMyClass:"""一个简单的...

简单的python-python3中的不变的元组

golang中没有内置的元组类型,但是多值返回的处理结果模拟了元组的味道。因此,在golang中"元组”只是一个将多个值(可能是同类型的,也可能是不同类型的)绑定在一起的一种便利方法,通常,也...

python中必须掌握的20个核心函数——sorted()函数

sorted()是Python的内置函数,用于对可迭代对象进行排序,返回一个新的排序后的列表,不修改原始对象。一、sorted()的基本用法1.1方法签名sorted(iterable,*,ke...

12 个 Python 高级技巧,让你的代码瞬间清晰、高效

在日常的编程工作中,我们常常追求代码的精简、优雅和高效。你可能已经熟练掌握了列表推导式(listcomprehensions)、f-string和枚举(enumerate)等常用技巧,但有时仍会觉...

Python的10个进阶技巧:写出更快、更省内存、更优雅的代码

在Python的世界里,我们总是在追求效率和可读性的完美平衡。你不需要一个数百行的新框架来让你的代码变得优雅而快速。事实上,真正能带来巨大提升的,往往是那些看似微小、却拥有高杠杆作用的技巧。这些技巧能...