机器学习(五)使用Python和R语言从头开始理解和编写神经网络(一)

简介: 本篇文章是原文的翻译过来的,自己在学习和阅读之后觉得文章非常不错,文章结构清晰,由浅入深、从理论到代码实现,最终将神经网络的概念和工作流程呈现出来。自己将其翻译成中文,以便以后阅读和复习和网友参考。因时间(文字纯手打加配图)紧促和翻译水平有限,文章有不足之处请大家指正。

[博客文章地(https://yanqiangmiffy.github.io/2017/07/24/Python26-%E4%BD%BF%E7%94%A8Python%E5%92%8CR%E8%AF%AD%E8%A8%80%E4%BB%8E%E5%A4%B4%E5%BC%80%E5%A7%8B%E7%90%86%E8%A7%A3%E5%92%8C%E7%BC%96%E5%86%99%E7%A5%9E%E7%BB%8F%E7%BD%91%E7


本篇文章是原文的翻译过来的,自己在学习和阅读之后觉得文章非常不错,文章结构清晰,由浅入深、从理论到代码实现,最终将神经网络的概念和工作流程呈现出来。自己将其翻译成中文,以便以后阅读和复习和网友参考。因时间(文字纯手打加配图)紧促和翻译水平有限,文章有不足之处请大家指正。


介绍


你可以通过两种方式学习和实践一个概念:

  • 选项1:您可以了解一个特定主题的整个理论,然后寻找应用这些概念的方法。所以,你阅读整个算法的工作原理,背后的数学知识、假设理论、局限,然后去应用它。这样学习稳健但是需要花费大量的时间去准备。
  • 选项2:从简单的基础开始,并就此主题研究直觉上的知识。接下来,选择一个问题并开始解决它。在解决问题的同时了解这些概念,保持调整并改善您对此问题的理解。所以,你去了解如何应用一个算法——实践并应用它。一旦你知道如何应用它,请尝试使用不同的参数和测试值,极限值去测试算法和继续优化对算法的理解。


我更喜欢选项2,并采取这种方法来学习任何新的话题。我可能无法告诉你算法背后的整个数学,但我可以告诉你直觉上的知识以及基于实验和理解来应用算法的最佳场景。

在与其他人交流的过程中,我发现人们不用花时间来发展这种直觉,所以他们能够以正确的方式努力地去解决问题。


在本文中,我将从头开始讨论一个神经网络的构建,更多地关注研究这种直觉上的知识来实现神经网络。我们将在“Python”和“R”中编写代码。读完本篇文章后,您将了解神经网络如何工作,如何初始化权重,以及如何使用反向传播进行更新。

让我们开始吧


目录


  • 神经网络背后的简单直觉知识
  • 多层感知器及其基础知识
  • 涉及神经网络方法的步骤
  • 可视化神经网络工作方法的步骤
  • 使用Numpy(Python)实现NN
  • 使用R实现NN
  • [可选]反向传播算法的数学观点


神经网络背后的直观知识


如果您是开发人员或了解一种工作——知道如何在代码中调试错误。您可以通过改变输入或条件来触发各种测试用例,并查找输出,输出的变化提供了一个提示:在代码中,去哪里寻找bug? - 哪个模块要检查,哪些行要阅读。找到bug后,您进行更改并继续运行,直到您能够运行正确的代码或者实现应用程序。


神经网络的工作方式非常相似。它需要多个输入,通过来自多个隐藏层的多个神经元进行处理,并使用输出层返回结果。这个结果估计过程在技术上被称为“前向传播”。

接下来,我们将结果与实际输出进行比较。任务是使神经网络的输出接近实际(期望的)输出。在这些神经元中,每一个都会对最终输出产生一些误差,你如何减少这些误差呢?


我们尝试最小化那些对错误“贡献”更多的神经元的值和权重,并且在返回到神经网络的神经元并发现误差在哪里时发生。这个过程被称为“向后传播”。

为了减少迭代次数来实现最小化误差,神经网络通常使用称为“梯度下降”的算法,来快速有效地优化任务。


的确 ,这就是神经网络如何工作的!我知道这是一个非常简单的表示,但它可以帮助您以简单的方式理解事物。


多层感知器及其基础知识


就像原子是形成地球上任何物质的基础 - 神经网络的基本形成单位是感知器。 那么,什么是感知器呢?


感知器可以被理解为需要多个输入并产生一个输出的任何东西。 例如,看下面的图片


感知器


上述结构需要三个输入并产生一个输出,下一个逻辑问题是输入和输出之间的关系是什么?让我们从基本的方式着手,寻求更复杂的方法。


下面我讨论了三种创建输入输出关系的方法:

  1. 通过直接组合输入和计算基于阈值的输出。例如:取x1 = 0,x2 = 1,x3 = 1并设置阈值= 0。因此,如果x1 + x2 + x3> 0,则输出为1,否则为0.可以看出,在这种情况下,感知器会将输出计算为1。
  2. 接下来,让我们为输入添加权重。权重重视输入。例如,您分别为x1,x2和x3分配w1 = 2,w2 = 3和w3 = 4。为了计算输出,我们将输入与相应权重相乘,并将其与阈值进行比较,如w1 * x1 + w2 * x2 + w3 * x3>阈值。与x1和x2相比,这些权重对于x3显得更重要。
  3. 最后,让我们添加偏置量:每个感知器也有一个偏置量,可以被认为是感知器多么灵活。它与某种线性函数y = ax + b的常数b类似,它允许我们上下移动线以适应数据更好的预测。假设没有b,线将始终通过原点(0,0),并且可能会得到较差的拟合。例如,感知器可以具有两个输入,在这种情况下,它需要三个权重。每个输入一个,偏置一个。现在输入的线性表示将如下所示:w1 * x1 + w2 * x2 + w3 * x3 + 1 * b。


但是,上面所讲的感知器之间的关系都是线性的,并没有那么有趣。所以,人们认为将感知器演化成现在所谓的人造神经元,对于输入和偏差,神经元将使用非线性变换(激活函数)。


什么是激活函数?


激活函数将加权输入(w1 * x1 + w2 * x2 + w3 * x3 + 1 * b)的和作为参数,并返回神经元的输出。

激活函数


在上式中,我们用x0表示1,w0表示b。

激活函数主要用于进行非线性变换,使我们能够拟合非线性假设或估计复杂函数。 有多种激活功能,如:“Sigmoid”“Tanh”ReLu等等。


前向传播,反向传播和训练次数(epochs)


到目前为止,我们已经计算了输出,这个过程被称为“正向传播”。 但是如果估计的输出远离实际输出(非常大的误差)怎么办? 下面正是我们在神经网络中所做的:基于错误更新偏差和权重。 这种权重和偏差更新过程被称为“反向传播”。


反向传播(BP)算法通过确定输出处的损耗(或误差),然后将其传播回网络来工作, 更新权重以最小化每个神经元产生的错误。 最小化误差的第一步是确定每个节点w.r.t.的梯度(Derivatives),最终实现输出。 要获得反向传播的数学视角,请参阅下面的部分。


这一轮的前向和后向传播迭代被称为一个训练迭代也称为“Epoch”。ps:e(一)poch(波)的意思;一个epoch是指把所有训练数据完整的过一遍


多层感知器


现在,我们来看看多层感知器。 到目前为止,我们已经看到只有一个由3个输入节点组成的单层,即x1,x2和x3,以及由单个神经元组成的输出层。 但是,出于实际,单层网络只能做到这一点。 如下所示,MLP由层叠在输入层和输出层之间的许多隐层组成。


多层感知器


上面的图像只显示一个单一的隐藏层,但实际上可以包含多个隐藏层。 在MLP的情况下要记住的另一点是,所有层都完全连接,即层中的每个节点(输入和输出层除外)连接到上一层和下一层中的每个节点。让我们继续下一个主题,即神经网络的训练算法(最小化误差)。 在这里,我们将看到最常见的训练算法称为梯度下降。


全批量梯度下降和随机梯度下降


Gradient Descent的第二个变体通过使用相同的更新算法执行更新MLP的权重的相同工作,但差异在于用于更新权重和偏差的训练样本的数量。


全部批量梯度下降算法作为名称意味着使用所有的训练数据点来更新每个权重一次,而随机渐变使用1个或更多(样本),但从不使整个训练数据更新权重一次。


让我们用一个简单的例子来理解这个10个数据点的数据集,它们有两个权重w1和w2。

  • 全批:您可以使用10个数据点(整个训练数据),并计算w1(Δw1)的变化和w2(Δw2)的变化,并更新w1和w2。
  • SGD:使用第一个数据点并计算w1(Δw1)的变化,并改变w2(Δw2)并更新w1和w2。 接下来,当您使用第二个数据点时,您将处理更新的权重


神经网络方法的步骤


多层感知器


我们来看一步一步地构建神经网络的方法(MLP与一个隐藏层,类似于上图所示的架构)。 在输出层,我们只有一个神经元,因为我们正在解决二进制分类问题(预测0或1)。 我们也可以有两个神经元来预测两个类的每一个。


先看一下广泛的步骤:

  1. 我们输入和输出
  • X作为输入矩阵
  • y作为输出矩阵
  1. 我们用随机值初始化权重和偏差(这是一次启动,在下一次迭代中,我们将使用更新的权重和偏差)。 让我们定义:
  • wh作为权重矩阵隐藏层
  • bh作为隐藏层的偏置矩阵
  • wout作为输出层的权重矩阵
  • bout作为偏置矩阵作为输出层
  1. 我们将输入和权重的矩阵点积分配给输入和隐藏层之间的边,然后将隐层神经元的偏差添加到相应的输入,这被称为线性变换:
    hidden_layer_input= matrix_dot_product(X,wh) + bh
  2. 使用激活函数(Sigmoid)执行非线性变换。 Sigmoid将返回输出1/(1 + exp(-x)).
    hiddenlayer_activations = sigmoid(hidden_layer_input)
  3. 对隐藏层激活进行线性变换(取矩阵点积,并加上输出层神经元的偏差),然后应用激活函数(再次使用Sigmoid,但是根据您的任务可以使用任何其他激活函数 )来预测输出
    output_layer_input = matrix_dot_product (hiddenlayer_activations * wout ) + bout
    output = sigmoid(output_layer_input)

<strong>所有上述步骤被称为“前向传播”(Forward Propagation)</strong>

  1. 将预测与实际输出进行比较,并计算误差梯度(实际预测值)。 误差是均方损失= ((Y-t)^2)/2
    E = y – output
  2. 计算隐藏和输出层神经元的斜率/斜率(为了计算斜率,我们计算每个神经元的每层的非线性激活x的导数)。 S形梯度可以返回 x * (1 – x).
    slope_output_layer = derivatives_sigmoid(output)
    slope_hidden_layer = derivatives_sigmoid(hiddenlayer_activations)
  3. 计算输出层的变化因子(delta),取决于误差梯度乘以输出层激活的斜率
    d_output = E * slope_output_layer
  4. 在这一步,错误将传播回网络,这意味着隐藏层的错误。 为此,我们将采用输出层三角形的点积与隐藏层和输出层之间的边缘的重量参数(wout.T)。
    Error_at_hidden_layer = matrix_dot_product(d_output, wout.Transpose)
  5. 计算隐层的变化因子(delta),将隐层的误差乘以隐藏层激活的斜率
    d_hiddenlayer = Error_at_hidden_layer * slope_hidden_layer
  6. 在输出和隐藏层更新权重:网络中的权重可以从为训练示例计算的错误中更新。
    wout = wout + matrix_dot_product(hiddenlayer_activations.Transpose, d_output)*learning_rate
    wh = wh + matrix_dot_product(X.Transpose,d_hiddenlayer)*learning_rate
    learning_rate:权重更新的量由称为学习率的配置参数控制)
  7. 在输出和隐藏层更新偏差:网络中的偏差可以从该神经元的聚合错误中更新。
  • bias at output_layer =bias at output_layer + sum of delta of output_layer at row-wise * learning_rate
  • bias at hidden_layer =bias at hidden_layer + sum of delta of output_layer at row-wise * learning_rate
  1. bh = bh + sum(d_hiddenlayer, axis=0) * learning_rate
    bout = bout + sum(d_output, axis=0)*learning_rate

<strong>从6到12的步骤被称为“向后传播”(Backward Propagation)</strong>

一个正向和反向传播迭代被认为是一个训练周期。 如前所述,我们什么时候训练第二次,然后更新权重和偏差用于正向传播。


以上,我们更新了隐藏和输出层的权重和偏差,我们使用了全批量梯度下降算法。

相关文章
|
17天前
|
机器学习/深度学习 数据可视化 计算机视觉
【视频】机器学习交叉验证CV原理及R语言主成分PCA回归分析犯罪率|数据共享
【视频】机器学习交叉验证CV原理及R语言主成分PCA回归分析犯罪率|数据共享
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
【机器学习】什么是贝叶斯网络?
【5月更文挑战第10天】【机器学习】什么是贝叶斯网络?
|
6天前
|
机器学习/深度学习 数据采集 算法
数据分享|R语言机器学习预测案例合集:众筹平台、机票折扣、糖尿病患者、员工满意度
数据分享|R语言机器学习预测案例合集:众筹平台、机票折扣、糖尿病患者、员工满意度
|
7天前
|
数据可视化
R语言机器学习方法分析二手车价格影响因素
R语言机器学习方法分析二手车价格影响因素
|
12天前
|
机器学习/深度学习 PyTorch TensorFlow
【Python机器学习专栏】循环神经网络(RNN)与LSTM详解
【4月更文挑战第30天】本文探讨了处理序列数据的关键模型——循环神经网络(RNN)及其优化版长短期记忆网络(LSTM)。RNN利用循环结构处理序列依赖,但遭遇梯度消失/爆炸问题。LSTM通过门控机制解决了这一问题,有效捕捉长距离依赖。在Python中,可使用深度学习框架如PyTorch实现LSTM。示例代码展示了如何定义和初始化一个简单的LSTM网络结构,强调了RNN和LSTM在序列任务中的应用价值。
|
12天前
|
机器学习/深度学习 PyTorch TensorFlow
【Python机器学习专栏】卷积神经网络(CNN)的原理与应用
【4月更文挑战第30天】本文介绍了卷积神经网络(CNN)的基本原理和结构组成,包括卷积层、激活函数、池化层和全连接层。CNN在图像识别等领域表现出色,其层次结构能逐步提取特征。在Python中,可利用TensorFlow或PyTorch构建CNN模型,示例代码展示了使用TensorFlow Keras API创建简单CNN的过程。CNN作为强大深度学习模型,未来仍有广阔发展空间。
|
12天前
|
机器学习/深度学习 自然语言处理 语音技术
【Python 机器学习专栏】Python 深度学习入门:神经网络基础
【4月更文挑战第30天】本文介绍了Python在深度学习中应用于神经网络的基础知识,包括神经网络概念、基本结构、训练过程,以及Python中的深度学习库TensorFlow和PyTorch。通过示例展示了如何使用Python实现神经网络,并提及优化技巧如正则化和Dropout。最后,概述了神经网络在图像识别、语音识别和自然语言处理等领域的应用,并强调掌握这些知识对深度学习的重要性。随着技术进步,神经网络的应用将持续扩展,期待更多创新。
|
12天前
|
数据采集 数据挖掘 测试技术
python、R语言ARIMA-GARCH分析南方恒生中国企业ETF基金净值时间序列分析
python、R语言ARIMA-GARCH分析南方恒生中国企业ETF基金净值时间序列分析
|
13天前
|
机器学习/深度学习 PyTorch TensorFlow
【Python机器学习专栏】Python环境下的机器学习库概览
【4月更文挑战第30天】本文介绍了Python在机器学习中的重要性及几个主流库:NumPy用于数值计算,支持高效的数组操作;Pandas提供数据帧和序列,便利数据处理与分析;Matplotlib是数据可视化的有力工具;Scikit-learn包含多种机器学习算法,易于使用;TensorFlow和Keras是深度学习框架,Keras适合初学者;PyTorch则以其动态计算图和调试工具受到青睐。这些库助力机器学习研究与实践。
|
13天前
|
机器学习/深度学习 数据采集 安全
基于机器学习的网络安全威胁检测系统
【4月更文挑战第30天】 随着网络技术的迅猛发展,网络安全问题日益凸显。传统的安全防御机制在应对复杂多变的网络攻击时显得力不从心。为了提高威胁检测的准确性和效率,本文提出了一种基于机器学习的网络安全威胁检测系统。该系统通过集成多种数据预处理技术和特征选择方法,结合先进的机器学习算法,能够实时识别并响应各类网络威胁。实验结果表明,与传统方法相比,本系统在检测率、误报率以及处理速度上均有显著提升,为网络安全管理提供了一种新的技术手段。