0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

解析深度网络背后的数学以及解析这背后的原理

电子工程师 来源:未知 作者:李倩 2018-08-24 09:31 次阅读

【导读】为了更好地理解神经网络的运作,今天只为大家解读神经网络背后的数学原理。而作者写这篇文章的目的一个是为了整理自己学到的知识;第二个目的也是为了分享给大家,如果学习时有困惑难解的知识,希望这篇文章可以有助于大家的学习与理解。对于代数和微积分相关内容基础薄弱的小伙伴们,虽然文中涉及不少数学知识,但我会尽量让内容易于大家理解。

▌解析深度网络背后的数学

如今,已有许多像 Keras, TensorFlow, PyTorch 这样高水平的专门的库和框架,我们就不用总担心矩阵的权重太多,或是对使用的激活函数求导时存储计算的规模太大这些问题了。基于这些框架,我们在构建一个神经网络时,甚至是一个有着非常复杂的结构的网络时,也仅需少量的输入和代码就足够了,极大地提高了效率。无论如何,神经网络背后的原理方法对于像架构选择、超参数调整或者优化这样的任务有着很大的帮助。

图一 训练集可视化

举个例子,我们将利用上图展示的训练集数据去解决一个二分类问题。从上面的图可以看出,数据点形成了两个圆,这对于许多传统的机器学习算法是不容易的,但是现在用一个小的神经网络就可能很好地解决这个问题了。为了解决这个问题,我们将构建一个神经网络:包括五个全连接层,每层都含有不同数目的单元,结构如下:

图二 神经网络架构

其中,隐藏层使用 ReLU 作为激活函数,输出层使用 Sigmoid。这是一个非常简单的架构,但是对于解决并解释这个问题已经足够了。

用 KERAS 求解

首先,先给大家介绍一个解决方法,使用了一个最受欢迎的机器学习库—— KERAS 。

fromkeras.modelsimportSequentialfromkeras.layersimportDensemodel=Sequential()model.add(Dense(4,input_dim=2,activation='relu'))model.add(Dense(6,activation='relu'))model.add(Dense(6,activation='relu'))model.add(Dense(4,activation='relu'))model.add(Dense(1,activation='sigmoid'))model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])model.fit(X_train,y_train,epochs=50,verbose=0)

正如我在简介中提到的,少量的输入数据和代码就足以构建和训练出一个模型,并且在测试集上的分类精度几乎达到100%。概括来讲,我们的任务其实就是提供与所选架构一致的超参数(层数、每层的神经元数、激活函数或者迭代次数)。先给大家展示一个超酷的可视化结果,是我在训练过程中得到的:

图三 训练中正确分类区域的可视化

现在我们来解析这背后的原理。

▌什么是神经网络?

让我们从关键问题开始:什么是神经网络?它是一种由生物启发的,用来构建可以学习并且独立解释数据中联系的计算机程序的方法。如上图二所示,网络就是各层神经元的集合,这些神经元排列成列,并且相互之间连接,可以进行交流。

▌单个神经元

每个神经元以一组 x 变量(取值从1到 n )的值作为输入,计算预测的 y-hat 值。假设训练集中含有 m 个样本,则向量 x 表示其中一个样本的各个特征的取值。此外,每个单元有自己的参数集需要学习,包括权重向量和偏差,分别用 w 和 b 表示。在每次迭代中,神经元基于本轮的权重向量计算向量 x 的加权平均值,再加上偏差。最后,将计算结果代入一个非线性激活函数 g。我会在下文中介绍一些最流行的激活函数。

图四 单个神经元

▌单层

现在我们看一下神经网络中整体的一层是怎么计算的。我们将整合每个单元中的计算,进行向量化,然后写成矩阵的形式。为了统一符号,我们选取第 l 层写出矩阵等式,下标 i 表示第 i 个神经元。

图五 单层神经网络

注意一点:当我们对单个单元写方程的时候,用到了 x 和 y-hat,它们分别表示特征列向量和预测值。但当我们对整个层写的时候,要用向量 a 表示相应层的激活值。因此, 向量 x 可以看做第0层输入层的激活值。每层的各个神经元相似地满足如下等式:

为了清楚起见,以下是第二层的所有表达式:

可见,每层的表达式都是相似的。用 for 循环来表示很低效,因此为了加速计算速度我们使用了向量化。首先,将权重向量 w 的转置堆叠成矩阵 W。相似地,将各个神经元的偏差也堆在一起组成列向量 b。由此,我们就可以很轻松地写出一个矩阵等式来表示关于某一层的所有神经元的计算。使用的矩阵和向量维数表示如下:

▌多样本向量化

到目前为止,我们写出的等式仅包含一个样本。但在神经网络的学习过程中,通常会处理一个庞大的数据集,可达百万级的输入。因此,下一步需要进行多样本向量化。我们假设数据集中含有 m 个输入,每个输入有 nx 个特征。首先,将每层的列向量 x, a, z 分别堆成矩阵 X, A, Z。然后,根据新的矩阵重写之前的等式。

▌什么是激活函数?我们为什么需要它?

激活函数是神经网络的关键元素之一。没有它们,神经网络就只是一些线性函数的组合,其本身也只能是一个线性函数。我们的模型有复杂度的限制,不能超过逻辑回归。其中,非线性元保证了更好的适应性,并且能在学习过程中提供一些复杂的函数。激活函数对学习的速度也有显著影响,这也是在选择时的评判标准之一。图六展示了一些常用的激活函数。近年来,隐藏层中使用最广的激活函数大概就是 ReLU 了。不过,当我们在做二进制分类问题时,我们有时仍然用 sigmoid,尤其是在输出层中,我们希望模型返回的值在0到1之间。

图六 常用激活函数及其导数函数图像

▌损失函数

关于学习过程进展的基本的信息来源就是损失函数值了。通常来说,损失函数可以表示我们离“理想”值还差多远。在本例中,我们用binary crossentropy(两元交叉熵)来作为损失函数,不过还有其他的损失函数,需要具体问题具体分析。两元交叉熵函数表示如下:

下图展示了在训练过程中其值的变化,可见其值随着迭代次数如何增加与减少,精度如何提高

图七 训练过程中精确度及损失的变化

▌神经网络如何学习?

学习过程其实就是在不断地更新参数 W 和 b 的值从而使损失函数最小化。为此,我们运用微积分以及梯度下降的方法来求函数的极小。在每次迭代中,我们将分别计算损失函数对神经网络中的每个参数的偏导数值。对这方面计算不太熟悉的小伙伴,我简单解释一下,导数可以刻画函数的(斜率)。我们已经知道了怎样迭代变量会有怎么样的变化,为了对梯度下降有更直观的认识,我展示了一个可视化动图,从中可以看到我们是怎么通过一步步连续的迭代逼近极小值的。在神经网络中也是一样的——每一轮迭代所计算的梯度显示我们应该移动的方向。而他们间最主要的差别在于,神经网络需要计算更多的参数。确切地说,怎么计算如此复杂的导数呢?

图八 动态梯度下降

▌反向传播算法

反向传播算法是一种可以计算十分复杂的梯度的算法。在神经网络中,各参数的调整公式如下:

其中,超参数 α 表示学习率,用以控制更新步长。选定学习率是非常重要的——太小,NN 学习得太慢;太大,无法达到极小点。用链式法则计算 dW 和 db —— 损失函数对 W 和 b 的偏导数, dW 和 db 的维数与 W 和 b 相等。图九展示了神经网络中的一系列求导操作,从中可以清楚地看到前向和后向传播是怎样共同优化损失函数的。

图九 前向与后向传播

▌结论

希望这篇文章对各位小伙伴理解神经网络内部运用的数学原理有所帮助。当我们使用神经网络时,理解这个过程的基本原理是很有帮助的。文中讲述的内容虽然只是冰山一角,但都是我认为最重要的知识点。因此,我强烈建议大家能试着独立地去编一个小的神经网络,不要依赖框架,仅仅只用 Numpy 尝试一下。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4579

    浏览量

    98937
  • 机器学习
    +关注

    关注

    66

    文章

    8142

    浏览量

    130700

原文标题:解析深度神经网络背后的数学原理!

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    语音视频社交背后技术深度解析

    伴随智能硬件设备快速发展和网络条件提升,实时语音视频的应用越来越广泛,如何保障实时互动过程流畅不卡顿、如何消除回声成为关键。即构科技联合创始人蒋宁波在LiveVideoStack Meet上以语音视频社交为例,深度解析实时语音视
    的头像 发表于 12-15 08:05 6722次阅读
    语音视频社交<b class='flag-5'>背后</b>技术<b class='flag-5'>深度</b><b class='flag-5'>解析</b>

    Zstack中串口操作的深度解析(一)

    本帖最后由 eehome 于 2013-1-5 10:06 编辑 Zstack中串口操作的深度解析(一)欢迎研究ZigBee的朋友和我交流。。。
    发表于 08-12 21:11

    I2C通信设计深度解析

    I2C通信设计深度解析
    发表于 08-12 21:31

    java经典面试题深度解析

    免费视频教程:java经典面试题深度解析对于很多初学者来说,学好java在后期面试的阶段都没什么经验,为了让大家更好的了解面试相关知识,今天在这里给大家分享了一个java经典面试题深度解析
    发表于 06-20 15:16

    解析蓝牙mesh网络

    解析蓝牙mesh网络
    发表于 10-31 12:30

    5G背后的核心技术解析

    虚拟现实、无人机、自动驾驶,在这些炫酷的热门技术背后,都能看到5G移动通信系统的身影。今年春季,3GPP组织将5G部分空口标准化工作由研究阶段转入工作阶段。意味着,经过多年的热切期盼,传说中的5G
    发表于 06-18 07:07

    深度解析5G背后的专利技术和通信原理

    2018年11月29日,中国首个跨省5G视频通话在上海、苏州、杭州、合肥四城实现互联。“G”代表“generation”,5G网络即是第五代移动通信网络。简单来说,1G时我们用手机打电话,2G时我们
    发表于 07-15 19:35

    解析深度学习:卷积神经网络原理与视觉实践

    解析深度学习:卷积神经网络原理与视觉实践
    发表于 06-14 22:21

    云计算背后采用的具体技术有哪些?

    云计算的平台建设方法以及应用构建方式是什么?云计算背后采用的具体技术有哪些?
    发表于 05-20 07:00

    功能安全---AUTOSAR架构深度解析 精选资料分享

    AUTOSAR架构深度解析本文转载于:AUTOSAR架构深度解析AUTOSAR的分层式设计,用于支持完整的软件和硬件模块的独立性(Independence),中间RTE(Runtime
    发表于 07-23 08:34

    AUTOSAR架构深度解析 精选资料推荐

    AUTOSAR架构深度解析本文转载于:AUTOSAR架构深度解析目录AUTOSAR架构深度解析A
    发表于 07-28 07:40

    AUTOSAR架构深度解析 精选资料分享

    AUTOSAR架构深度解析本文转载于:AUTOSAR架构深度解析AUTOSAR的分层式设计,用于支持完整的软件和硬件模块的独立性(Independence),中间RTE(Runtime
    发表于 07-28 07:02

    C语言深度解析

    C语言深度解析,本资料来源于网络,对C语言的学习有很大的帮助,有着较为深刻的解析,可能会对读者有一定的帮助。
    发表于 09-28 07:00

    LED繁荣背后存在的隐忧解析

    LED繁荣背后存在的隐忧解析 ---------无核心技术或致美丽泡沫 机遇与挑战: 在节能减排和低碳经济
    发表于 04-14 09:10 467次阅读

    一图深度解析IoT领域4大“战役”

    深度解析IoT领域4大“战役”
    的头像 发表于 01-22 10:25 4612次阅读