1. 神经网络
神经网络与深度学习
在过去的10年,AI不仅在学术界同时也在工业界取得了飞速的发展,背后离不开深度学习的贡献。就是因为深度学习的崛起,人工智能逐步进入了人们的视野,也有了今天各种AI的落地场景。特别是,ImageNet
竞赛和AlphaGo事件正好也起到了催化剂的作用,迅速引起了全球对AI的风波,促使人人谈论AI,也让很多公司开始对AI重视了起来。
实际上,基于神经网络的深度学习在90年代已经被人提出来了,但那个年代很少人关注深度学习,而且只有以hinton为代表的少部分人一直坚持了下来。
深度学习实际上并不新鲜, 包括反向传播算法在90年代已经被提出来了。但那个时候深度学习并没有受到关注, 主要因为它并没有带来很好的效果。归其原因:
- 第一、那时候我们并不知道如何更好地训练模型,预训练等概念2000年后才被提了出来;
- 第二、那时候数据量也很少, 而且我们知道深度学习的优势在于处理大量的数据。数据量较少时, 传统的方法也能取得较好的效果;
- 第三、训练深度学习需要大量的算力, 那时候显然不像今天, 有着很强的计算工具。
总结起来,对于深度学习的发展跟以下几点是离不开的
- 大量的数据(大数据)
- 计算资源(如GPU)
- 训练方法(如预训练)
很多时候,我们也可以认为真正让深度学习爆发起来的是数据和算力,这并不是没道理的。
深度学习加速推进了AI的发展以及工业界中的落地,然而深度学习模型的基础是神经网络,所以理解神经网络具有巨大意义。
神经网络中所涉及到的前向传播、反向传播等技术以及梯度消失等现象都会出现在其他深度学习模型如深度神经网络、卷积神经网络、RNN、LSTM中。先学好神经网络再去接触深度学习相关的技术,这样会事
半功倍。
神经网络与大脑
对于监督学习来讲,核心是要学出特征x到标签y之间的关系,具体的学习过程可通过机器学习模型。每一种机器学习模型实际上是对函数ff的假设,比如线性回归或者逻辑回归模型假设f为线性,
所以它只能学出x到y的线性映射关系。如果x,y之间并不是线性关系,则效果会大打折扣。
神经网络实际上也跟逻辑回归等模型一样,本质是要学出x到y之间的关系,但不同于其他的模型,我们希望神经网络可以模拟出人类在处理信息时的情形。
神经网络中的神经(neural)实际上跟大脑中的神经元(neuron)有着紧密的关系。
神经网络的提出是为了模拟大脑,你觉得目前的神经网络或者深度学习能够真正模拟出大脑的机理吗?
目前我们对大脑的认知是非常有限的, 真正能够打开大脑里的秘密可能需要未来很长时间, 但这也不是说, 我们对大脑完全不了解。从这个角度, 我们可以很容易判断出神经网络或者深度学习只能算是在我们有限的
认知下尽量模仿大脑。
学习的本质
神经网络试着模拟大脑中的信号传递
从映射的角度考虑
神经网络中的神经元
我们都知道神经网络模型的提出是为了模拟人的大脑的,而且人的大脑由非常多的神经元组成,每个神经元是接受信号和输出信号的最小单位。当我们人类接收外界信号时,这个信号会层层通过大脑里的神经元
进行传递,最终这些会使得人类对外界做出一些反应。类似的,神经网络本身也是由大量的神经元(neuron)构成。那接下来先了解一下神经网络中每一个神经元是如何工作的。
神经网络
- 神经元是神经网络的最小组成部分;
- 激活函数的作用是让x到y的映射关系更为复杂;(激活函数的目的就是让映射变得更复杂, 这样训练出来的模型可以学出 x到 y的更复杂的映射关系, 所以比较适合复杂一点的数据。)
- 神经元的作用实际上是接受数据,处理好之后再去输出;
2. 不同类型的激活函数
线性激活函数
线性激活函数实际上是没作用的,即便加了也等于什么都没加,因为它对信号不会做任何的处理。这有点类似于管道,来了信号之后原封不动地输出出去。之所以提出线性激活函数,其主要目的是为了完整性。
那什么会用到线性激活函数呢?通常在,深度模型中的最后一层会用到。另外,如果我们没有叠加任何的激活函数到神经元,默认可以认为是加了线性激活函数。
非线性激活函数
激活函数 Sigmoid
二分类问题
激活函数 "tanh"
3. 多层神经网络的向前传播
多层神经网络的前向传播,也就是给定一个输入之后,计算最终的输出。
神经网络是由神经元构成的,同时也是一层一层叠加而成的。那为什么要叠加呢? 之后会了解到。先看如何做前向传播(forward propagation),也就是给定一个输入之后,如何通过一层层的网络结构最后得到输
出,这一点对理解神经网络来讲格外重要。只有理解了这一点,才能清楚理解反向传播算法(back propagation),也是深度学习训练中最为核心的技术。
对于多层神经网络, 假如针对于每个神经元我们都选择线性激活函数,如果都是线性函数,多层是没有意义的, 如果都是线性函数, 最终得出的x和y之间的关系就是线性的;
如果每一个激活函数都是线性的, 那最终得出来的x, y映射关系也是线性的。假设我们对样本x 依次做了线性转换T1, T2, T3, 则最终的输出为T3 * ( T2* ( T1x)) , 利用矩阵的乘法性质,可以改写成 (T3 T2 * T1 ) * x,
多个矩阵的乘积仍然是矩阵,也就是线性转换。这就意味着,即便我们做了多层的转换, 最终的出来的仍然是线性关系, 所以它并不增加模型的复杂度。
拥有一层隐含层的神经网络
多输出 - 分类 & 损失函数
多层神经网络
当我们增加额外的隐含层时就可以得到多层神经网络。至于隐含层的个数是没有限制的,我们可以随意搭建很多层的神经网络。为什么要增加隐含层呢? 道理很简单,增加隐含层可直接导致模型的复杂度变高,
随之带来的就是可以学出x 到 y的更复杂的映射关系。
不管是卷积神经网络,还是RNN、STM,或是最新的模型像transform、bert,核心就是个反向传播算法;
bp(反方传播)算法如何在多层神经网络里运作的;
对于神经网络来讲,网络的层数、每一个隐含层所包含的神经元个数,这些都是模型的超参数。那这些超参数如何选择呢? 最经典的方法仍然是交叉验证,每种组合都实验一遍,并找出其中最好的参数组合。然
而,对于很多层的神经网络,我们具有非常多的超参数,仅仅做交叉验证就需要大量的计算资源。幸运的是,交叉验证本身可以并行化,每一组参数的尝试互不影响。
训练神经网络或者深度学习,实际上最大的挑战在于设计网络结构。那问题就来了,有没有更好地方式来设计网络结构呢?是否真的必要人工去一个个尝试呢?为了解决这些问题,AutoML概念被提了出来,也就
是让机器自动去寻找最好的网络结构。这个领域目前发展很迅速,在不久的将来我们应该都可以用上AutoML工具。
4. 学习模型的参数-反向传播算法
如何对深度神经网络做反向传播,从而去学习模型的参数。是整个深度学习领域的核心,贯穿任所有度学习模型。
任何模型训练的第一步是明确损失函数。模型训练过程无非就是在优化损失函数,从而找到让损失函数最小的模型的参数。主要以深度神经网络为例来讲解反向传播算法,自然而然的,第一步就是
要定义出损失函数。在这里先假定任务是分类任务,所以损失部分需要使用交叉熵损失(cross-entropy loss)。
神经网络的损失
任何模型训练的第一步是明确损失函数。模型训练过程无非就是在优化损失函数,从而找到让损失函数最小的模型的参数。以深度神经网络为例来讲解反向传播算法,自然而然的,第一步就是要定义出损失函
数。在这里先假定任务是分类任务,所以损失部分需要使用交叉熵损失(cross-entropy loss)。
反向传播算法
有了目标函数之后,就可以通过优化算法去学习参数了。在优化技术中,最经典的仍然是梯度下降法。如何把梯度下降法应用在深度神经网络中呢? 优化过程跟之前讲过的逻辑回归等模型有些区别,主要在于计
算梯度时要做一层一层的反向传播。详细剖析一下反向传播中具体会发生什么
总体来讲,对于网络的优化分为两步:
第一步叫作前向传播,也就是把特征向量放到模型里,然后通过一层一层得到预测值,再把预测值和实际真实值对比一下就可以得到针对于当前样本的损失。
第二步就是反向传播的过程了,核心是计算对于参数的梯度,同时在梯度计算过程中也依赖于正向传播中所计算的中间结果。
看到这里,很多人可能意识到了反向传播的复杂性,稍微不注意可能就会犯错,从而让整个的训练面临失败。另外,在实现过程中也会遇到一些棘手的问题比如数据的溢出等等。总而言之,真的想完全正确实现
一个反向传播算法是非常具有挑战的,可以想象一下,对于几十层、甚至几百层的网络结构如何准确地计算出参数的梯度?这个太难了!
深度学习框架的诞生
为了解决这个问题,很早之前人们就开始研究如何为用户封装反向传播的部分,让我们只专注于设计网络结构,不再去关注具体反向传播的细节。TensorFlow,Pytorch等框架就是为了这个目的而诞生的。这些
框架的核心价值就是帮助我们完成反向传播部分,不再需要我们纠结如何实现。
一旦网络结构设计好,这些框架就可以帮助计算梯度,随后就可以做梯度更新了。比如在Pytorch里,我们只需要在forward函数中完成前向传播的过程即可。这大大加速了模型的构建过程,同时也降低了应用深
度学习的门槛。所以,现在即便很多人没有具备很强的理论基础,仍可以使用这些框架来完成深度学习模型的搭建。今后,这种工具化的趋势会越来越明显,让每个人的工作变得更加高效,促使我们把最主要的
经历花在创新形的工作上。
5. 关于深度神经网络
从浅层到深度模型
浅层模型和深度模型之间的区别。深度模型的核心在于“深”,比如一个深度神经网络可能拥有几个隐含层,甚至更多。有点像搭积木,把一个模块一层一层地搭上去。 那为什么我们倾向于搭建一个多层的结构
呢? 而不是浅层的结构? 具体潜在的逻辑在哪儿呢?搭建多层的结构有很多好处。
深度神经网络的好处
其他常见的深度网络结构
RNN和LSTM模型主要用来解决时序(time series)的问题,比如预测天气、预测股价、或者预测一个句子的情感等等。 另外,机器翻译、文本生成、对话系统等很多任务可以基于LSTM模型来搭建的。 CNN主要
用来解决图像方面的任务,比如图像分类、交通信号识别、目标检测、行人检测等。 以上都属于深度学习领域,只要把机器学习部分学好了,深度学习的学习会变得很轻松。