首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

周末AI课堂:神经网络综观 理论篇

AI课堂开讲,就差你了!

很多人说,看了再多的文章,可是没有人手把手地教授,还是很难真正地入门AI。为了将AI知识体系以最简单的方式呈现给你,从这个星期开始,芯君邀请AI专业人士开设“周末学习课堂”——每周就AI学习中的一个重点问题进行深度分析,课程会分为理论篇和代码篇,理论与实操,一个都不能少!

来,退出让你废寝忘食的游戏页面,取消只有胡吃海塞的周末聚会吧。未来你与同龄人的差异,也许就从每周末的这堂AI课开启了!

读芯术读者交流群,请加小编微信号:zhizhizhuji。等你。后台回复“周末AI课堂”,查阅相关源代码。

全文共2733字,预计学习时长6分钟

数学准备

Universal approximation theorem(万能近似定理):

具备至少一层squashing function隐层的前馈神经网络,如果拥有足够多的隐藏神经元,可以很好的逼近任何定义在

的有界连续函数。

神经网络加深的动机

根据万能近似定理,我们增加神经元的数量就可以扩大神经网络的容量、提高神经网络的复杂度。简单的增加隐藏神经元的数量可以有两种方式:

增加网络的宽度(width),即增加隐层包含的神经元个数

增加网络的深度(depth),即增加隐层的个数

目前已经证明,增加模型的深度比起宽度更为有效。一方面实践证明,单纯的增加宽度可能会使得整个网络变得难以实现,而增加深度要达到相同的误差,需要的神经元更少,换而言之,更深的模型减少了更宽的模型所需要的神经元;另一方面理论表明,深度学习是通过学习特征来改善模型,用较为简单的表示来表示复杂的表示,需要近似的函数是很多简单函数的不断复合,增加深度就对应着简单表示的多次复合,增加宽度对应着复杂表示的一次性提取。

根据《bagging集成和stacking集成》中所讲的,我们从集成的角度看待神经网络,假设感知机只有一个隐层,隐层的数目就代表着基学习器的个数,增加宽度,就是在增加基学习器的个数,但这样的集成方式与bagging并不完全相同,在bagging集成中,每个学习器都是独立的,但在多层感知机中,基学习器共享了前面层的权重系数。如果增加深度,就是在bagging中添加了stacking集成,一方面可以理解为层数的增加使得共享的权重系数多样性增加,就使得bagging基学习器多样性增加,最终集成的效果可能会更好,当然也可以理解为stacking集成的基学习器的增加。

More is Different

物理学中,当我们从微观层面的规律跨越到宏观层面规律,不少的人会秉持着一种还原论的态度(包括爱因斯坦),认为世界一定是由一条或几条深刻的规律所支配的,目前看来,粒子物理似乎是最基本的东西,化学不过是多体物理,分子生物学不过是化学罢了。“More is different”是物理学家P.M.Anderson提出的观点,即便你清楚了每个粒子的简单的相互作用,大量的粒子结合在一起,其表现行为远远超出了所谓的基本定律。与还原论相对应,Anderson持有的层展论认为不同层面应该有不同层面的规律,凝聚态物理的成功正是层展论的体现。

我们可以用集成学习去给予一些神经网络上的重要直觉,但经过复杂的bagging和stacking,从集成原理已经很难解释神经网络的工作逻辑,当我们开始用表示学习的思路去理解神经网络时,事实上就是尝试在新的层面上建立规律。同时,增加深度虽然是更有效的方式,但却会带来难以优化的问题。

从机器学习模型的角度来看,模型的Loss function,如何防止过拟合,超参数该如何调试,训练效果和速度如何得到保证,这些问题我们自然要探讨。但我想强调的是,除此之外,我们面临的更麻烦的问题是神经网络本身的特殊性,我们神经网络中遇到一系列问题归结到底都是对神经网络的结构设计问题:

从宏观层面来说,网络应该包含多少层,每一层应该有几个神经元,层与层应该如何连接

从微观层面来说,隐藏单元的类型是什么,输出单元该如何确定

要解决这些问题,我们要根据神经网络本身的性质来回答,而很少从集成学习的角度去解决,具体来说,都可以被归结到两个大类:

如何进行更好的表示

如何进行更好的优化

获得更好的表示

表示学习(representation learning)与我们提到过的特征选择、降维最大的区别就是,前者几乎不需要人工干预,而后者需要人工设计。在统计学习中,我们已经知道一个好的特征空间会对我们的机器学习任务产生极大的影响,典型例子是我们在前面课程中曾经介绍Kernel PCA降维方法,它直接把一个线性不可分的特征空间转化为了线性可分的特征空间,这样的转化就是完成了一次表示。

在神经网络中,我们会使用一种自编码器(autoencoder)的技术,它的结构较为简单,输入为原始数据,输出也希望是原始数据,从输入到隐层为编码,从输出到隐层为解码,这样隐层包含的就是原始数据的一个表示。简单的来说,我们希望:

我们在自编码器加上L1正则化,那么就会得到稀疏表示,我们在隐层上限制隐层维数小于输入,那么就会达到降维的目的,如果在输入中加入噪声,而输出是没有噪声的,那么就会得到一个具备去噪能力的表示。

图为自编码器的示例,compressed representation就是我们想要的表示

一种杰出的技术就是卷积神经网络(CNN),它考虑了图片的局部相关性,使用卷积操作提取了极其有用的特征,并用池化进一步组合特征,在图片识别领域取得了巨大的成功。在此基础上,人们进一步的修改卷积核的大小、个数和形状,同时创新地进行分组卷积,分通道加权卷积,同时使用不同大小的卷积核等,都是为了尽可能在隐层中获得比较好的表示。

如图是一个手写数字识别的神经网络可视化,convolution和pool操作是为了获得更好的表示。

同时,另一种广泛使用的技术就是循环神经网络(RNN),它考虑了语音的时序相关性,将隐层视为一个动态系统,同一隐层的神经元中添加了连接,使得现在的状态可以影响到未来的状态。在此基础上,人们可以进一步的添加双向的流通路径,使得未来的状态也可以影响现在。

如图所示,这是RNN的基本形式之一,在隐层s中我们添加了神经元之间的权重系数,希望神经网络利用到时序相关的信息,获得一个好的表示。

获得更好的优化

我们已经在前面介绍过诸如SGD,Adam,RMSProp等基于梯度的优化算法,并且强调了在深度学习中并不要求Loss function表现为凸函数,因为优化的目的不再是要找到全局的最小值,而是只要找到泛化误差在可接受范围内的参数。

但是,优化的难度部分来自于梯度的估计,简单的说,sigmoid函数的导数会在左右两端趋于零。

sigmoid函数的导数

为了避免此问题,隐藏单元就不能用sigmoid函数和tanh函数,只有在保证网络的激活很小时,他们才会表现良好。目前普遍使用的是ReLU(线性整流单元)作为激活函数:

ReLU易于优化,但在小于零的位置,relu仍然导数为零,所以又出现了大量的拓展,比如maxout单元,Leakly ReLU。但无论如何怎样修正,隐藏单元的设计都是为了尽可能的容易优化,ReLU流行的一大部分原因就是它近似于线性,非常容易优化,但同时也符合万能近似定理。

但即便我们使用了ReLU,优化仍然是困难的,很大程度上着来自多个权重连乘的后果,比如RNN中非常普遍的长期依赖问题,这样会放大或缩小每次的梯度结果,解决方案主要分为两类,一方面是新的层与层的连接方式的创新,比如ResNet和DenseNet,使得很深的网络优化也可以达到满意的效果,在RNN中还可以添加LSTM这样一种特殊的结构以解决长期依赖的问题,另一方面则是对层操作的创新,批标准化的出现,对每一层的输出做标准化,把原本很深的层都看作浅层来处理。

读芯君开扒

课堂TIPS

此文主要整理了深度网络设计的特有的两条思路,一条是获得更好的表示,另一条是获得更好的优化。它作为机器学习的一个强大方法,必然也会有模型的Loss function,如何防止过拟合,超参数该如何调试等问题,但在接下来的学习过程中,还是希望读者能抓住以上两条主要思路对深度学习的方法进行理解。

留言 点赞 发个朋友圈

我们一起探讨AI落地的最后一公里

作者:唐僧不用海飞丝

如需转载,请后台留言,遵守转载规范

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181013A1PFQM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券