咱们以房价预测的案例来讲明一下,把房屋的面积做为神经网络的输入(咱们称之为𝑥),经过一个节点(一个小圆圈),最终输出了价格(咱们用𝑦表示)。其实这个小圆圈就是一个单独的神经元,就像人的大脑神经元同样。若是这是一个单神经元网络,无论规模大小,它正是经过把这些单个神经元叠加在一块儿来造成。若是你把这些神经元想象成单独的乐高积木,你就经过搭积木来完成一个更大的神经网络。git
神经网络与大脑关联不大。这是一个过分简化的对比,把一个神经网络的逻辑单元和右边的生物神经元对比。至今为止其实连神经科学家们都很难解释,究竟一个神经元能作什么。github
这要从逻辑回归讲起,咱们都知道逻辑回归的目标函数以下所示:面试
咱们用网络来表示,这个网络就叫作感知器:算法
若是在这个感知器的基础上加上隐藏层,就会获得下面咱们要说的神经网络结构了。编程
神经网络的通常结构是由输入层、隐藏层(神经元)、输出层构成的。隐藏层能够是1层或者多层叠加,层与层之间是相互链接的,以下图所示。网络
通常说到神经网络的层数是这样计算的,输入层不算,从隐藏层开始一直到输出层,一共有几层就表明着这是一个几层的神经网络,例如上图就是一个三层结构的神经网络。框架
**解释隐藏层的含义:**在一个神经网络中,当你使用监督学习训练它的时候,训练集包含了输入𝑥也包含了目标输出𝑦,因此术语隐藏层的含义是在训练集中,这些中间结点的准确值咱们是不知道到的,也就是说你看不见它们在训练集中应具备的值。dom
假设对下图进行分类,圆圈为一类,红叉叉为另外一类,若是用线性切分的话不管如何都不能把它们进行分开。机器学习
这时,引入神经网络(2层神经网络),包含一个隐藏层,在隐藏层中,分别获得了P1和P2的图形,P1这条线以上的部分都是红叉叉,P2这条线如下的部分都是红叉叉,两个神经元就有2条线性直线。从隐藏层到输出层要作的事情就是把这两条直线给合并起来,就会获得h(x)的图形,也就是说P1以上的空间交上P2如下的空间就是红叉叉的分类,其他空间分类为圆圈。这就使得本来不可以线性切分变成非线性切分了。编程语言
若是隐藏层更加复杂的话,就可以完美的实现复杂平面样本点分布的划分(相似于抠图),以下图所示:
以下图所示。用圆圈表示神经网络的计算单元,逻辑回归的计算有两个步骤,首先你按步骤计算出𝑧,而后在第二 步中你以 sigmoid 函数为激活函数计算𝑧(得出𝑎),一个神经网络只是这样子作了好屡次重复计算。
其中的一个神经元计算以下图所示:
向量化计算,若是你执行神经网络的程序,用 for 循环来作这些看起来真的很低效。因此接下来咱们要作的就是把这四个等式向量化。向量化的过程是将神经网络中的一层神经元参数纵向堆积起来,例如隐藏层中的𝑤纵向堆积起来变成一个(4,3)的矩阵,用符号𝑊[1]表示。另外一个看待这个的方法是咱们有四个逻辑回归单元,且每个逻辑回归单元都有相对应的参数——向量𝑤,把这四个向量堆积在一块儿,你会得出这 4×3 的矩阵。
上面公式表示的是一个样本的向量化计算,那么多样本向量化计算其实就是在上面公式的基础上再增列数,每一列至关于一个样本。
在神经⽹络中,一般须要随机初始化模型参数。下⾯咱们来解释这样作的缘由。
假设输出层只保留⼀个输出单元o1(删去o2和o3以及指向它们的箭头),且隐藏层使⽤相同的激活函数。若是将每一个隐藏单元的参数都初始化为相等的值,那么在正向传播时每一个隐藏单元将根据相同的输⼊计算出相同的值, 并传递⾄输出层。在反向传播中,每一个隐藏单元的参数梯度值相等。所以,这些参数在使⽤基于梯度的优化算法迭代后值依然相等。以后的迭代也是如此。
在这种状况下,⽆论隐藏单元有多少, 隐藏层本质上只有1个隐藏单元在发挥做⽤。所以,正如在前⾯的实验中所作的那样,咱们一般将神经⽹络的模型参数,特别是权重参数,进⾏随机初始化。
有两种初始化方法:
采用正态分布的随机初始化方法。
Xavier初始化方法:假设某全链接层的输入个数为a,输出个数为b,Xavier随机初始化将使该层中权重参数的每一个元素都随机采样于均匀分布:
初始化后,每层输出的方差不会受该层输入个数的影响,且每层梯度的方差也不受该层输出个数的影响。
在隐层接一个线性变换后 ,再接一个非线性变换(如sigmoid),这个非线性变换叫作传递函数或者激活函数。上面的例子用的都是逻辑回归的Sigmoid激活函数,若是还不明白激活函数在哪,能够看下面这幅图。
sigmoid函数
tanh(双曲正切)函数
事实上,tanh 函数是 sigmoid 的向下平移和伸缩后的结果。对它进行了变形后,穿过了(0,0)点,而且值域介于+1 和-1 之间。但有一个例外:在二分类的问题中,对于输出层,由于𝑦的值是 0 或 1,因此想让𝑦^的数值介于0和1之间,而不是在-1和+1之间。因此须要使用sigmoid激活函数。
sigmoid函数和tanh函数二者共同的缺点是,在𝑧特别大或者特别小的状况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,致使下降梯度降低的速度。
ReLu(修正线性单元)函数
只要𝑧是正值的状况下,导数恒等于 1,当𝑧是负 值的时候,导数恒等于 0。
这有一些选择激活函数的经验法则: 若是输出是 0、1 值(二分类问题),则输出层选择 sigmoid 函数,而后其它的全部单 元都选择 Relu 函数。
softmax激活函数
以前,咱们的激活函数都是接受单行数值输入,例如 Sigmoid 和 ReLu 激活函数,输入一个实数,输出一个实数。Softmax 激活函数的特殊之处在于,由于须要将全部可能的输出归一化,就须要输入一个向量,最后输出一个向量。
hardmax 函数会观察𝑧的元素,而后在𝑧中最大元素的位置放上 1,其它位置放上 0,Softmax 所作的从𝑧到这些几率的映射更为温和。
Softmax 回归将 logistic 回归推广到了两种分类以上。
若是你使用线性激活函数或者没有使用一个激活函数,那么不管你的神经网络有多少层一直在作的只是计算线性函数,因此不如直接去掉所有隐藏层。在咱们的简明案例中,事实证实若是你在隐藏层用线性激活函数,在输出层用 sigmoid 函数,那么这个模型的复杂度和没有任何隐藏层。的标准 Logistic 回归是同样的。
在这里线性隐层一点用也没有,由于这两个线性函数的组合自己就是线性函数,因此除非你引入非线性,不然你没法计算更有趣的函数,即便你的网络层数再多也不行。
正向传播(forward-propagation)是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。
逻辑回归的计算步骤:因此回想当时咱们讨论逻辑回归的时候,咱们有这个正向传播步骤,其中咱们计算𝑧,而后𝑎,而后损失函数𝐿。 正向传播相似,计算,
,再计算
,
,最后获得loss function。
反向传播(back-propagation)指的是计算神经网络参数梯度的方法。总的来讲,反向传播依据微积分中的链式法则,沿着从输出层到输入层的顺序,依次计算并存储目标函数有关神经网络各层的中间变量以及参数的梯度。
由正向传播通过全部的隐藏层到达输出层,会获得一个输出结果,而后根据这个
带入loss funcation中,利用SGD算法进行最优化求解,其中每次梯度降低都会使用一次BP来更新各个网络层中的参数值,这就是BP回传偏差的意思。
你能够把训练集分割为小一点的子集训练,这些子集被取名为 mini-batch,假设每个子集中只有 1000 个样本,那么把其中的𝑥 (1)到𝑥 (1000)取出来,将其称为第一个子训练集,也叫作 mini-batch,而后你再取出接下来的 1000 个样本,从𝑥 (1001)到𝑥 (2000),而后再取 1000个样本,以此类推。
在训练集上运行 mini-batch 梯度降低法,你运行 for t=1……5000,由于咱们有5000个各有 1000 个样本的组,在 for 循环里你要作得基本就是对𝑋 {𝑡}和𝑌 {𝑡}执行一步梯度降低法。
其中1<n<m,m表示整个训练集大小。
优缺点:
首先,若是训练集较小,直接使用 batch 梯度降低法,这里的少是说小于 2000 个样本。通常的 mini-batch 大小为 64 到 512,考虑到电脑内存设置和使用的方式,若是 mini-batch 大小是 2 的𝑛次方,代码会运行地快一些。
端到端学习(end-to-end)是一种解决问题的思路,与之对应的是多步骤解决问题,也就是将一个问题拆分为多个步骤分步解决,而端到端是由输入端的数据直接获得输出端的结果。
就是不要预处理和特征提取,直接把原始数据扔进去获得最终结果。
特征提取包含在神经网络内部,因此说神经网络是端到端的网络。
优势:
经过缩减人工预处理和后续处理,尽量使模型从原始输入到最终输出,给模型更多能够根据数据自动调节的空间,增长模型的总体契合度。
缺点
现有的深度学习开源平台主要有 Caffe, PyTorch, MXNet, CNTK, Theano, TensorFlow, Keras, fastai等。
平台 | 优势 | 缺点 |
---|---|---|
TensorFlow | 1.功能很齐全,可以搭建的网络更丰富。 2.支持多种编程语言。 3.拥有强大的计算集群。 4.谷歌支持 5.社区活跃度高。 6.支持多GPU。 7.TensorBoard支持图形可视化。 |
1.编程入门难度较大。 2.计算图是纯 Python 的,所以速度较慢 3.图构造是静态的,意味着图必须先被「编译」再运行 |
Keras | 1.Keras是TensorFlow高级集成APi 2.Keras是一个简洁的API。 能够快速帮助您建立应用程序。 3.代码更加可读和简洁。 4.Keras处于高度集成框架。 5.社区活跃。 |
1.Keras框架环境配置比其余底层框架要复杂一些。 2.虽然更容易建立模型,可是面对复杂的网络结构时可能不如TensorFlow。 3.性能方面比较欠缺。 |
Pytorch | 1.它能够在流程中更改体系结构。 2.训练神经网络的过程简单明了。 3.可使用标准 Python 语法编写 for 循环语句。 4.大量预训练模型 |
1.不够TensorFlow全面,不过将来会弥补。 2.PyTorch部署移动端不是很好。 |
MXNet | 1.支持多语言。 2.文档齐全。 3.支持多个GPU。 4.清晰且易于维护的代码。 5.命令式和符号式编程风格之间进行选择。 |
1.不被普遍使用。 2.社区不够活跃。 3.学习难度大一些。 |
目前从招聘来讲,公司使用TensorFlow的占大多数,毕竟TensorFlow的社区、性能、部署方面都是很强的,因此以后写的实例代码都使用TensorFlow来完成。
在图像分类的情景中,softmax分类器输出能够是一个图像类别的离散值,和线性回归不一样的是,softmax输出单元从一个变成了多个。
softmax回归和线性回归同样将输入特征与权重作线性叠加。与线性回归的一个主要不一样在于,**softmax回归的输出值个数等于标签里的类别数。**下图是用神经网络描绘了softmax回归,也是一个单层神经网络,因为每一个输出 的计算都要依赖于全部的输入
,softmax回归的输出层也是一个全链接层。
一个简单的办法是将输出值 当作预测类别是i的置信度,并将值最大的输出所对应的类别做为预测输出。例如,若是
分别为0.1 ; 10 ; 0.1,因为
最大,那么预测类别为2。
然而,直接使用输出层的输出会有两个问题:
softmax运算解决了以上两个问题。它经过下面的公式将输出值变换成值为正且和为1的几率分布:
咱们已经知道,softmax运算将输出变换成一个合法的类别预测分布。实际上,真实标签也能够用类别分布表达:
对于样本i,咱们构造向量 ,使其第
个元素为1,其他为0。这样咱们的训练目标能够设为使预测几率分布
尽量接近真实的标签几率
。
想要预测分类结果正确,咱们其实并不须要预测几率彻底等于标签几率,而平方损失则过于严格。改善这个问题的一个方法是使用更适合衡量两个几率分布差别的测量函数。其中,交叉熵(cross entropy)是一个经常使用的衡量方法:
其中带下标的 是向量
中非 0 即 1 的元素。也就是说,交叉熵只关心对正确类别的预测几率,由于只要其值足够大,就能够确保分类结果正确。即最小化交叉熵损失函数等价于最大化训练数据集全部标签类别的联合预测几率。
做者:@mantchs
GitHub:github.com/NLP-LOVE/ML…