YJango:深度学习入门

为什么神经网络能够识别

为了研究神经网络,我们必须要对什么网络是什么有一个更直观的认识。


基本变换:层

一、神经网络每一层在做什么?

数学式子

\vec{y}= a(W\cdot\vec{x} + {b}),其中\vec{x}是输入向量,\vec{y}是输出向量,\vec{b}是偏移向量,W是权重矩阵,a()是激活函数。每一层仅仅是把输入\vec{x}经过如此简单的操作得到\vec{y}

数学理解

通过如下5种对输入空间(输入向量的集合)的操作,完成的f:\vec{x}\rightarrow\vec{y}变换 (矩阵的行空间到列空间)。

  1. 升维/降维
  2. 放大/缩小
  3. 旋转
  4. 平移
  5. “弯曲”

这5种操作中,1,2,3的操作由W\cdot\vec{x}完成,4的操作是由+\vec{b}完成,5的操作则是由a()来实现。

每层的数学理解:用线性变换跟随着非线性变化,将输入空间投向另一个空间

物理理解

W\cdot\vec{x} 的理解就是通过组合形成新物质a()又符合了我们所处的世界都是非线性的特点。

假想情景

\vec{x}是二维向量,维度是碳原子和氧原子的数量 [C;O],数值且定为[1;1]。若确定\vec{y}是三维向量,就会形成如下网络的形状 (神经网络的每个节点表示一个维度)。通过改变权重的值,可以获得若干个不同物质。右侧的节点数决定了想要获得多少种不同的新物质(矩阵的行数)。

二维--->三维

若权重W的数值如(1),那么网络的输出\vec{y}就会是三个新物质,二氧化碳,臭氧,一氧化碳。

\left[\begin{matrix}CO_{2}\\O_{3}\\CO\end{matrix}\right]=\left[\begin{matrix}1 & 2 \\0 & 3\\1 & 1\end{matrix}\right] \cdot \left[\begin{matrix}C \\O \\\end{matrix}\right]\tag{1}

若减少右侧的一个节点,并改变权重W至(2),那输出\vec{y}就会是两个新物质,[ O_{0.3} ;CO_{1.5}]

\left[\begin{matrix}O_{0.3}\\CO_{1.5}\\\end{matrix}\right]=\left[\begin{matrix}0& 0.3 \\1 & 1.5\\\end{matrix}\right] \cdot \left[\begin{matrix}C \\O \\\end{matrix}\right]\tag{2}

若再加一层,就是再次通过组合[CO_{2};O_{3};CO]这三种基础物质,形成若干个更高层的物质。

若希望通过层网络能够从C, O空间转变到[CO_{2};O_{3};CO]空间的话,那么网络的学习过程就是将W的数值变成尽可能接近(1)的过程 。

重要的是这种组合思想,组合成的东西在神经网络中并不需要有物理意义,可以是抽象概念。

每层神经网络的物理理解:通过现有的不同成分的组合形成新成分


二、神经网络如何完成识别任务?

数学视角:“线性可分”

  • 一维情景:以分类为例,当要分类正数、负数、零,三类的时候,一维空间的直线可以找到两个超平面(比当前空间低一维的子空间。当前空间是直线的话,超平面就是点)分割这三类。但面对像分类奇数和偶数无法找到可以区分它们的点的时候,我们借助 x % 2(除2取余)的转变,把x变换到另一个空间下来比较0和非0,从而分割奇偶数。
这里写图片描述
  • 二维情景:平面的四个象限也是线性可分。但下图的红蓝两条线就无法找到一超平面去分割。

神经网络的解决方法依旧是转换到另外一个空间下,用的是所说的5种空间变换操作。比如下图就是经过放大、平移、旋转、扭曲原二维空间后,在三维空间下就可以成功找到一个超平面分割红蓝两线 (同SVM的思路一样)。

上面是一层神经网络可以做到的空间变化。若把\vec{y} 当做新的输入再次用这5种操作进行第二遍空间变换的话,网络也就变为了二层。最终输出是\vec{y}= a_{2}(W_{2}\cdot(a_{1}(W_{1}\cdot\vec{x} + {b}_{1})) + {b}_{2})。设想当网络拥有很多层时,对原始输入空间的“扭曲力”会大幅增加,如下图,最终我们可以轻松找到一个超平面分割空间。

当然也有如下图失败的时候,关键在于“如何扭曲空间”。所谓监督学习就是给予神经网络网络大量的训练例子,让网络从训练例子中学会如何变换空间。每一层的权重W控制着如何变换空间,我们最终需要的也就是训练好的神经网络的所有层的权重矩阵。。这里有非常棒的可视化空间变换demo一定要打开尝试并感受这种扭曲过程。

更多内容请看Neural Networks, Manifolds, and Topology

神经网络的学习就是学习如何利用矩阵的线性变换加激活函数的非线性变换,将原始输入空间投向线性可分/稀疏的空间去分类/回归。 增加节点数:增加维度,即增加线性转换能力。 增加层数:增加激活函数的次数,即增加非线性转换次数。

物理视角:“物质组成”

  • 类比:回想上文由碳氧原子通过不同组合形成若干分子的例子。若从分子层面继续迭代这种组合思想,可以形成DNA,细胞,组织,器官,最终可以形成一个完整的人。继续迭代还会有家庭,公司,国家等。这种现象在身边随处可见。并且原子的内部结构与太阳系又惊人的相似。不同层级之间都是以类似的几种规则再不断形成新物质。你也可能听过分形学这三个字。可通过观看从1米到150亿光年来感受自然界这种层级现象的普遍性。
这里写图片描述
  • 人脸识别情景:我们可以模拟这种思想并应用在画面识别上。由像素组成菱角,再组成五官,最后到不同的人脸。每一层代表不同的物质层面 (如分子层)。而每层的W存储着如何组合上一层的物质从而形成若干新物质。 如果我们完全掌握一架飞机是如何从分子开始一层一层形成的,拿到一堆分子后,我们就可以判断他们是否可以以此形成方式,形成一架飞机。 附:Tensorflow playground展示了数据是如何“流动”的。
这里写图片描述

神经网络的学习过程就是自动寻找成分组成方式的过程。 增加节点数:增加同一层物质的种类,比如118个元素的原子层就有118个节点。 增加层数:增加更多层级,比如分子层,原子层,器官层,并通过判断更抽象的概念来识别物体。

按照上文在理解视角中所述的观点,可以想出下面两条理由关于为什么更深的网络会更加容易识别,增加容纳变体(variation)(红苹果、绿苹果)的能力、鲁棒性(robust)。

  • 数学视角:变体(variation)很多的分类的任务需要高度非线性的分割曲线。不断的利用那5种空间变换操作将原始输入空间像“捏橡皮泥一样”在高维空间下捏成更为线性可分/稀疏的形状:可视化空间变换。
  • 物理视角:通过对“抽象概念”的判断来识别物体,而非细节。比如对“飞机”的判断,即便人类自己也无法用语言或者若干条规则来解释自己如何判断一个飞机。因为人脑中真正判断的不是是否“有机翼”、“能飞行”等细节现象,而是一个抽象概念。层数越深,这种概念就越抽象,所能涵盖的变异体就越多,就可以容纳战斗机,客机等很多种不同种类的飞机。

然而这只解释了为何神经网络有效,并没有接触到核心问题:为何深层神经网络更有效


三、如何训练神经网络?

既然我们希望网络的输出尽可能的接近真正想要预测的值。那么就可以通过比较当前网络的预测值和我们真正想要的目标值,再根据两者的差异情况来更新每一层的权重矩阵(比如,如果网络的预测值高了,就调整权重让它预测低一些。不断调整,直到能够预测出目标值)。

因此就需要先定义“如何比较预测值和目标值的差异”,这便是损失函数目标函数(loss function or objective function),用于衡量预测值和目标值的差异的方程。loss function的输出值(loss)越高表示差异性越大。那神经网络的训练就变成了尽可能的缩小loss的过程。

所用的方法是梯度下降(Gradient descent):通过使loss值向当前点对应梯度的反方向不断移动,来降低loss。一次移动多少是由学习速率(learning rate)来控制的。

梯度下降的问题:

然而使用梯度下降训练神经网络拥有两个主要难题。

1、局部极小值(或鞍点)

梯度下降寻找的是loss function的局部极小值,而我们想要全局最小值。如下图所示,我们希望loss值可以降低到右侧深蓝色的最低点,但loss在下降过程中有可能“卡”在左侧的局部极小值中。也有最新研究表明在高维空间下局部极小值通常很接近全局最小值,训练网络时真正与之“斗争”的是鞍点。但不管是什么,其难处就是loss“卡”在了某个位置后难以下降。唯一的区别是:陷入局部极小值就难以出来,陷入鞍点最终会逃脱但是耗时。

试图解决“卡在局部极小值”问题的方法分两大类:

  • 调节步伐:调节学习速率,使每一次的更新“步伐”不同。常用方法有:
    • 随机梯度下降(Stochastic Gradient Descent (SGD):每次只更新一个样本所计算的梯度
    • 小批量梯度下降(Mini-batch gradient descent):每次更新若干样本所计算的梯度的平均值
    • 动量(Momentum):不仅仅考虑当前样本所计算的梯度;Nesterov动量(Nesterov Momentum):Momentum的改进
    • Adagrad、RMSProp、Adadelta、Adam:这些方法都是训练过程中依照规则降低学习速率,部分也综合动量
  • 优化起点:合理初始化权重(weights initialization)、预训练网络(pre-train),使网络获得一个较好的“起始点”,如最右侧的起始点就比最左侧的起始点要好。常用方法有:高斯分布初始权重(Gaussian distribution)、均匀分布初始权重(Uniform distribution)、Glorot 初始权重、He初始权、稀疏矩阵初始权重(sparse matrix)

2、梯度的计算

机器学习所处理的数据都是高维数据,该如何快速计算梯度、而不是以年来计算。其次如何更新隐藏层的权重?解决方法是:计算图:反向传播算法这里的解释留给非常棒的Computational Graphs: Backpropagation

需要知道的是,反向传播算法是求梯度的一种方法。如同快速傅里叶变换(FFT)的贡献。

而计算图的概念又使梯度的计算更加合理方便。


四、基本流程图

下面就简单浏览一下训练和识别过程,并描述各个部分的作用。

这里写图片描述

收集训练集(train data)

也就是同时有input以及对应label的数据。每个数据叫做训练样本(sample)。label也叫target,也是机器学习中最贵的部分。上图表示的是我的数据库。假设input的维度是39,label的维度是48。

设计网络结构(architecture)

确定层数、每一隐藏层的节点数和激活函数,以及输出层的激活函数和损失函数。上图用的是两层隐藏层(最后一层是输出层)。隐藏层所用激活函数a( )是ReLu,输出层的激活函数是线性linear(也可看成是没有激活函数)。隐藏层都是1000节点。损失函数L( )是用于比较距离MSE:mean((output - target)^2)。MSE越小表示预测效果越好。训练过程就是不断减小MSE的过程。到此所有数据的维度都已确定:

  • 训练数据:input \in R^{39} ;label \in R^{48}
  • 权重矩阵:W_{h1}\in R^{1000x39};W_{h2}\in R^{1000x1000} ;W_{o}\in R^{48x1000}
  • 偏移向量:b_{h1}\in R^{1000};b_{h2}\in R^{1000} ;b_{o}\in R^{48}
  • 网络输出:output \in R^{48}

数据预处理(preprocessing)

将所有样本的input和label处理成能够使用神经网络的数据。label的值域符合激活函数的值域。并简单优化数据以便让训练易于收敛。比如中心化(mean subtraction)、归一化(normlization)、主成分分析(PCA)、白化(whitening)。假设上图的input和output全都经过了中心化和归一化。

权重初始化(weights initialization)

W_{h1}、W_{h2}、W_{0}在训练前不能为空,要初始化才能够计算loss从而来降低。W_{h1}、W_{h2}、W_{0}初始化决定了loss在loss function中从哪个点开始作为起点训练网络。上图用均匀分布初始权重(Uniform distribution)。

训练网络(training)

训练过程就是用训练数据的input经过网络计算出output,再和label计算出loss,再计算出gradients来更新weights的过程。

算当前网络的预测值output =linear (W_{o} \cdot Relu(W_{h2}\cdot Relu(W_{h1}\cdot input+b_{h1})+b_{h2}) +b_{o})

  • 计算loss:loss = mean((output - target)^2)
  • 计算梯度:从loss开始反向传播计算每个参数(parameters)对应的梯度(gradients)。这里用Stochastic Gradient Descent (SGD) 来计算梯度,即每次更新所计算的梯度都是从一个样本计算出来的。传统的方法Gradient Descent是正向传递所有样本来计算梯度。SGD的方法来计算梯度的话,loss function的形状如下图所示会有变化,这样在更新中就有可能“跳出”局部最小值。
  • 更新权重:这里用最简单的方法来更新,即所有参数都 W = W - learningrate * gradient
  • 预测新值:训练过所有样本后,打乱样本顺序再次训练若干次。训练完毕后,当再来新的数据input,就可以利用训练的网络来预测了。这时的output就是效果很好的预测值了。下图是一张实际值和预测值的三组对比图。输出数据是48维,这里只取1个维度来画图。蓝色的是实际值,绿色的是预测值。最上方的是训练数据的对比图(几乎重合),而下方的两行是神经网络模型从未见过的数据预测对比图。(不过这里用的是RNN,主要是为了让大家感受一下效果)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

学界 | 马里兰大学论文:训练深度神经网络中的一致性难题

3585
来自专栏PPV课数据科学社区

机器测试题(下)

人工智能一直助力着科技发展,新兴的机器学习正推动着各领域的进步。如今,机器学习的方法已经无处不在—从手机上的语音助手到商业网站的推荐系统,机器学习正以不容忽视的...

2976
来自专栏SIGAI学习与实践平台

基于深度学习的目标检测算法综述

目标检测的任务是找出图像中所有感兴趣的目标(物体),确定它们的位置和大小,是机器视觉领域的核心问题之一。由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮...

4492
来自专栏算法channel

2000字总结3种项目和面试中常用的集成学习算法

俗话说,“三个臭皮匠,顶个诸葛亮”,多个比较弱的人若能有一种方法集中利用他们的智慧,也可以达到比较好的效果,这就是集成学习的思想。

810
来自专栏人工智能LeadAI

Assignment 3 (神经网络) | 斯坦福CS231n-深度学习与计算机视觉课程

该笔记是以斯坦福cs231n课程的python编程任务为主线,展开对该课程主要内容的理解和部分数学推导。这篇文章是第三篇。 ? CS231n简介 CS231n的...

3747
来自专栏机器学习算法与Python学习

基础 | 10幅图解释机器学习中的基本概念

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 以下的几幅图是我认为在解释机器学习基...

3356
来自专栏人工智能

Python机器学习:通过scikit-learn实现集成算法

在现实生活中,常常采用集体智慧来解决问题。那么在机器学习中,能否将多种机器学习算法组合在一起,使计算出来的结果更好呢?这就是集成算法的思想。集成算法是提高算法准...

28910
来自专栏目标检测和深度学习

计算机视觉必读:目标跟踪、网络压缩、图像分类、人脸识别等

新智元专栏 作者:张皓(南京大学) 【新智元导读】深度学习目前已成为发展最快、最令人兴奋的机器学习领域之一。本文以计算机视觉的重要概念为线索,介绍深度学...

50911
来自专栏专知

【深度学习最精炼中文讲义】前馈与卷积神经网络详解,复旦邱锡鹏老师《神经网络与深度学习》报告分享02(附报告pdf下载)

【导读】复旦大学副教授、博士生导师、开源自然语言处理工具FudanNLP的主要开发者邱锡鹏(http://nlp.fudan.edu.cn/xpqiu/)老师撰...

1.8K6
来自专栏达观数据

技术干货 | 一文详解高斯混合模型原理

高斯混合模型(Gaussian Mixture Model)通常简称GMM,是一种业界广泛使用的聚类算法,该方法使用了高斯分布作为参数模型,并使用了期望最大(E...

4806

扫码关注云+社区

领取腾讯云代金券