激活函数、正向传播、反向传播及softmax分类器,一篇就够了!

1. 深度学习有哪些应用

  • 图像:图像识别、物体识别、图片美化、图片修复、目标检测。
  • 天然语言处理:机器创做、个性化推荐、文本分类、翻译、自动纠错、情感分析。
  • 数值预测、量化交易

2. 什么是神经网络

咱们以房价预测的案例来讲明一下,把房屋的面积做为神经网络的输入(咱们称之为𝑥),经过一个节点(一个小圆圈),最终输出了价格(咱们用𝑦表示)。其实这个小圆圈就是一个单独的神经元,就像人的大脑神经元同样。若是这是一个单神经元网络,无论规模大小,它正是经过把这些单个神经元叠加在一块儿来造成。若是你把这些神经元想象成单独的乐高积木,你就经过搭积木来完成一个更大的神经网络。git

神经网络与大脑关联不大。这是一个过分简化的对比,把一个神经网络的逻辑单元和右边的生物神经元对比。至今为止其实连神经科学家们都很难解释,究竟一个神经元能作什么。github

2.1 什么是感知器

这要从逻辑回归讲起,咱们都知道逻辑回归的目标函数以下所示:面试

z=\theta_0+\theta_1X_1+\theta_2X_2
a=g(z)=\frac{1}{1+e^{-z}}

咱们用网络来表示,这个网络就叫作感知器:算法

若是在这个感知器的基础上加上隐藏层,就会获得下面咱们要说的神经网络结构了。编程

2.2 神经网络的结构

神经网络的通常结构是由输入层、隐藏层(神经元)、输出层构成的。隐藏层能够是1层或者多层叠加,层与层之间是相互链接的,以下图所示。网络

通常说到神经网络的层数是这样计算的,输入层不算,从隐藏层开始一直到输出层,一共有几层就表明着这是一个几层的神经网络,例如上图就是一个三层结构的神经网络。框架

**解释隐藏层的含义:**在一个神经网络中,当你使用监督学习训练它的时候,训练集包含了输入𝑥也包含了目标输出𝑦,因此术语隐藏层的含义是在训练集中,这些中间结点的准确值咱们是不知道到的,也就是说你看不见它们在训练集中应具备的值。dom

  • 多隐藏层的神经网络比 单隐藏层的神经网络工程效果好不少。
  • 提高隐层层数或者隐层神经元个数,神经网络“容量”会变大,空间表达力会变强。
  • 过多的隐层和神经元节点,会带来过拟合问题。
  • 不要试图经过下降神经网络参数量来减缓过拟合,用正则化或者dropout。

2.3 为何神经网络具备非线性切分能力

假设对下图进行分类,圆圈为一类,红叉叉为另外一类,若是用线性切分的话不管如何都不能把它们进行分开。机器学习

这时,引入神经网络(2层神经网络),包含一个隐藏层,在隐藏层中,分别获得了P1和P2的图形,P1这条线以上的部分都是红叉叉,P2这条线如下的部分都是红叉叉,两个神经元就有2条线性直线。从隐藏层到输出层要作的事情就是把这两条直线给合并起来,就会获得h(x)的图形,也就是说P1以上的空间交上P2如下的空间就是红叉叉的分类,其他空间分类为圆圈。这就使得本来不可以线性切分变成非线性切分了。编程语言

若是隐藏层更加复杂的话,就可以完美的实现复杂平面样本点分布的划分(相似于抠图),以下图所示:

3. 神经网络的计算过程

3.1 计算过程

以下图所示。用圆圈表示神经网络的计算单元,逻辑回归的计算有两个步骤,首先你按步骤计算出𝑧,而后在第二 步中你以 sigmoid 函数为激活函数计算𝑧(得出𝑎),一个神经网络只是这样子作了好屡次重复计算。

其中的一个神经元计算以下图所示:

向量化计算,若是你执行神经网络的程序,用 for 循环来作这些看起来真的很低效。因此接下来咱们要作的就是把这四个等式向量化。向量化的过程是将神经网络中的一层神经元参数纵向堆积起来,例如隐藏层中的𝑤纵向堆积起来变成一个(4,3)的矩阵,用符号𝑊[1]表示。另外一个看待这个的方法是咱们有四个逻辑回归单元,且每个逻辑回归单元都有相对应的参数——向量𝑤,把这四个向量堆积在一块儿,你会得出这 4×3 的矩阵。

上面公式表示的是一个样本的向量化计算,那么多样本向量化计算其实就是在上面公式的基础上再增列数,每一列至关于一个样本。

3.2 随机初始化模型参数

在神经⽹络中,一般须要随机初始化模型参数。下⾯咱们来解释这样作的缘由。

假设输出层只保留⼀个输出单元o1(删去o2和o3以及指向它们的箭头),且隐藏层使⽤相同的激活函数。若是将每一个隐藏单元的参数都初始化为相等的值,那么在正向传播时每一个隐藏单元将根据相同的输⼊计算出相同的值, 并传递⾄输出层。在反向传播中,每一个隐藏单元的参数梯度值相等。所以,这些参数在使⽤基于梯度的优化算法迭代后值依然相等。以后的迭代也是如此。

在这种状况下,⽆论隐藏单元有多少, 隐藏层本质上只有1个隐藏单元在发挥做⽤。所以,正如在前⾯的实验中所作的那样,咱们一般将神经⽹络的模型参数,特别是权重参数,进⾏随机初始化。

有两种初始化方法:

  1. 采用正态分布的随机初始化方法。

  2. Xavier初始化方法:假设某全链接层的输入个数为a,输出个数为b,Xavier随机初始化将使该层中权重参数的每一个元素都随机采样于均匀分布:

    U[-\sqrt{\frac{6}{a+b}},\sqrt{\frac{6}{a+b}}]

    初始化后,每层输出的方差不会受该层输入个数的影响,且每层梯度的方差也不受该层输出个数的影响。

3.3 激活函数

3.3.1 激活函数有哪些

在隐层接一个线性变换后 ,再接一个非线性变换(如sigmoid),这个非线性变换叫作传递函数或者激活函数。上面的例子用的都是逻辑回归的Sigmoid激活函数,若是还不明白激活函数在哪,能够看下面这幅图。

  1. sigmoid函数

    image

    a=g(z)=\frac{1}{1+e^{-z}}
    g(z)^{'}=\frac{d}{dz}g(z)=\alpha(1-\alpha)
  2. tanh(双曲正切)函数

    事实上,tanh 函数是 sigmoid 的向下平移和伸缩后的结果。对它进行了变形后,穿过了(0,0)点,而且值域介于+1 和-1 之间。但有一个例外:在二分类的问题中,对于输出层,由于𝑦的值是 0 或 1,因此想让𝑦^的数值介于0和1之间,而不是在-1和+1之间。因此须要使用sigmoid激活函数。

    image

    a=g(z)=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}
    g(z)^{'}=\frac{d}{dz}g(z)=1-(tanh(z))^2

    sigmoid函数和tanh函数二者共同的缺点是,在𝑧特别大或者特别小的状况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,致使下降梯度降低的速度。

  3. ReLu(修正线性单元)函数

    只要𝑧是正值的状况下,导数恒等于 1,当𝑧是负 值的时候,导数恒等于 0。

    image

    a=max(0,z)
    g(x){'}=\left\{
\begin{aligned}
0 &  & if z < 0 \\
1 &  & if z > 0 \\
undefined &  & if z =0
\end{aligned}
\right.

    这有一些选择激活函数的经验法则: 若是输出是 0、1 值(二分类问题),则输出层选择 sigmoid 函数,而后其它的全部单 元都选择 Relu 函数。

  4. softmax激活函数

    • 非线性变换以前计算:z^{(l)}=W^{(l)}a^{(l-1)}+b^{(l)}
    • 通过非线性变换,临时变量:t=e^{z^{(l)}}
    • a^{l}=\frac{t_i}{\sum_{j=1}^{n}t_i} 归一化
    • a^l表示的就是第几个类别的几率值,这些几率值和为1

    以前,咱们的激活函数都是接受单行数值输入,例如 SigmoidReLu 激活函数,输入一个实数,输出一个实数。Softmax 激活函数的特殊之处在于,由于须要将全部可能的输出归一化,就须要输入一个向量,最后输出一个向量。

    hardmax 函数会观察𝑧的元素,而后在𝑧中最大元素的位置放上 1,其它位置放上 0,Softmax 所作的从𝑧到这些几率的映射更为温和。

    Softmax 回归将 logistic 回归推广到了两种分类以上。

3.3.2 优缺点

  • 在𝑧的区间变更很大的状况下,激活函数的导数或者激活函数的斜率都会远大于0,在程序实现就是一个 if-else 语句,而 sigmoid 函数须要进行浮点四则运算,在实践中,使用 ReLu 激活函数神经网络一般会比使用 sigmoid 或者 tanh 激活函数学习的更快。
  • sigmoidtanh 函数的导数在正负饱和区的梯度都会接近于 0,这会形成梯度弥散,而 ReluLeaky ReLu 函数大于 0 部分都为常数,不会产生梯度弥散现象。(同时应该注意到的是,Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀疏性,而 Leaky ReLu 不会有这问题) 𝑧在 ReLu 的梯度一半都是 0,可是,有足够的隐藏层使得 z 值大于 0,因此对大多数的 训练数据来讲学习过程仍然能够很快。

3.3.3 为何使用激活函数

若是你使用线性激活函数或者没有使用一个激活函数,那么不管你的神经网络有多少层一直在作的只是计算线性函数,因此不如直接去掉所有隐藏层。在咱们的简明案例中,事实证实若是你在隐藏层用线性激活函数,在输出层用 sigmoid 函数,那么这个模型的复杂度和没有任何隐藏层。的标准 Logistic 回归是同样的。

在这里线性隐层一点用也没有,由于这两个线性函数的组合自己就是线性函数,因此除非你引入非线性,不然你没法计算更有趣的函数,即便你的网络层数再多也不行。

3.3.4 人工神经网络中为何ReLu要好过于tanh和sigmoid function?

  1. 采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求偏差梯度时,求导涉及除法和指数运算,计算量相对大,而采用Relu激活函数,整个过程的计算量节省不少。
  2. 对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的状况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种状况会形成信息丢失),这种现象称为饱和,从而没法完成深层网络的训练。而ReLU就不会有饱和倾向,不会有特别小的梯度出现。
  3. Relu会使一部分神经元的输出为0,这样就形成了网络的稀疏性,而且减小了参数的相互依存关系,缓解了过拟合问题的发生(以及一些人的生物解释balabala)。固然如今也有一些对relu的改进,好比prelu,random relu等,在不一样的数据集上会有一些训练速度上或者准确率上的改进,具体的你们能够找相关的paper看。

3.3.5 激活函数有哪些性质?

  1. 非线性: 当激活函数是线性的,一个两层的神经网络就能够基本上逼近全部的函数。但若是激活函数是恒等激活函数的时候,即 f(x)=x,就不知足这个性质,并且若是 MLP 使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的;
  2. 可微性: 当优化方法是基于梯度的时候,就体现了该性质;
  3. 单调性: 当激活函数是单调的时候,单层网络可以保证是凸函数;
  4. f(x)≈x: 当激活函数知足这个性质的时候,若是参数的初始化是随机的较小值,那么神经网络的训练将会很高效;若是不知足这个性质,那么就须要详细地去设置初始值;
  5. 输出值的范围: 当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,由于特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种状况小,通常须要更小的 Learning Rate。

3.4 正向传播

正向传播(forward-propagation)是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。

逻辑回归的计算步骤:因此回想当时咱们讨论逻辑回归的时候,咱们有这个正向传播步骤,其中咱们计算𝑧,而后𝑎,而后损失函数𝐿。 正向传播相似,计算z^{[1]}a^{[1]},再计算z^{[2]}a^{[2]},最后获得loss function

\left.
\begin{aligned}
x \\
w \\
b
\end{aligned}
\right\}\Rightarrow{z}=w^Tx+b\Rightarrow{a=\sigma(z)}\Rightarrow{L(a,y)}

3.5 反向传播(BP)

反向传播(back-propagation)指的是计算神经网络参数梯度的方法。总的来讲,反向传播依据微积分中的链式法则,沿着从输出层到输入层的顺序,依次计算并存储目标函数有关神经网络各层的中间变量以及参数的梯度。

由正向传播通过全部的隐藏层到达输出层,会获得一个输出结果O_L,而后根据这个O_L带入loss funcation中,利用SGD算法进行最优化求解,其中每次梯度降低都会使用一次BP来更新各个网络层中的参数值,这就是BP回传偏差的意思。

image

  • 正向传播求损失,BP回传偏差。
  • 根据偏差信号修正每层的权重。对各个w进行求导,而后更新各个w。
  • 链式依赖损失函数y^{-}=h(g(f(x)))

3.6 随机梯度降低法(SGD)

3.6.1 mini-batch梯度降低

你能够把训练集分割为小一点的子集训练,这些子集被取名为 mini-batch,假设每个子集中只有 1000 个样本,那么把其中的𝑥 (1)到𝑥 (1000)取出来,将其称为第一个子训练集,也叫作 mini-batch,而后你再取出接下来的 1000 个样本,从𝑥 (1001)到𝑥 (2000),而后再取 1000个样本,以此类推。

在训练集上运行 mini-batch 梯度降低法,你运行 for t=1……5000,由于咱们有5000个各有 1000 个样本的组,在 for 循环里你要作得基本就是对𝑋 {𝑡}和𝑌 {𝑡}执行一步梯度降低法。

  • batch_size=1,就是SGD。
  • batch_size=n,就是mini-batch
  • batch_size=m,就是batch

其中1<n<m,m表示整个训练集大小。

优缺点:

  • batch:相对噪声低些,幅度也大一些,你能够继续找最小值。
  • SGD:大部分时候你向着全局最小值靠近,有时候你会远离最小值,由于那个样本刚好给你指的方向不对,所以随机梯度降低法是有不少噪声的,平均来看,它最终会靠近最小值,不过有时候也会方向错误,由于随机梯度降低法永远不会收敛,而是会一直在最小值附近波动。一次性只处理了一个训练样本,这样效率过于低下。
  • mini-batch:实践中最好选择不大不小的 mini-batch,获得了大量向量化,效率高,收敛快。

首先,若是训练集较小,直接使用 batch 梯度降低法,这里的少是说小于 2000 个样本。通常的 mini-batch 大小为 64 到 512,考虑到电脑内存设置和使用的方式,若是 mini-batch 大小是 2 的𝑛次方,代码会运行地快一些。

3.6.2 调节 Batch_Size 对训练效果影响到底如何?

  1. Batch_Size 过小,模型表现效果极其糟糕(error飙升)。
  2. 随着 Batch_Size 增大,处理相同数据量的速度越快。
  3. 随着 Batch_Size 增大,达到相同精度所须要的 epoch 数量愈来愈多。
  4. 因为上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
  5. 因为最终收敛精度会陷入不一样的局部极值,所以 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。

4. 为何说神经网络是端到端的网络?

端到端学习(end-to-end)是一种解决问题的思路,与之对应的是多步骤解决问题,也就是将一个问题拆分为多个步骤分步解决,而端到端是由输入端的数据直接获得输出端的结果。

就是不要预处理和特征提取,直接把原始数据扔进去获得最终结果。

特征提取包含在神经网络内部,因此说神经网络是端到端的网络。

优势

经过缩减人工预处理和后续处理,尽量使模型从原始输入到最终输出,给模型更多能够根据数据自动调节的空间,增长模型的总体契合度。

缺点

  • 它可能须要大量的数据。要直接学到这个𝑥到𝑦的映射,你可能须要大量(𝑥, 𝑦)数据。
  • 它排除了可能有用的手工设计组件。

5. 深度学习框架比较

现有的深度学习开源平台主要有 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来完成。

6. softmax分类器

6.1 什么是softmax

在图像分类的情景中,softmax分类器输出能够是一个图像类别的离散值,和线性回归不一样的是,softmax输出单元从一个变成了多个。

softmax回归和线性回归同样将输入特征与权重作线性叠加。与线性回归的一个主要不一样在于,**softmax回归的输出值个数等于标签里的类别数。**下图是用神经网络描绘了softmax回归,也是一个单层神经网络,因为每一个输出 o_1,o_2,o_3 的计算都要依赖于全部的输入 x_1,x_2,x_3,x_4 ,softmax回归的输出层也是一个全链接层。

o_1=x_1w_{11}+x_2w_{21}+x_3w_{31}+x_4w_{41}
o_2=x_1w_{12}+x_2w_{22}+x_3w_{32}+x_4w_{42}
o_3=x_1w_{13}+x_2w_{23}+x_3w_{33}+x_4w_{43}
o_4=x_1w_{14}+x_2w_{24}+x_3w_{34}+x_4w_{44}

6.2 softmax的计算

一个简单的办法是将输出值 o_i 当作预测类别是i的置信度,并将值最大的输出所对应的类别做为预测输出。例如,若是 o_1,o_2,o_3 分别为0.1 ; 10 ; 0.1,因为 o_2 最大,那么预测类别为2。

然而,直接使用输出层的输出会有两个问题:

  • 因为输出层的输出值的范围不肯定,咱们难以直观上判断这些值得意义。
  • 因为真实标签是离散值,这些离散值与不肯定范围的输出值之间的偏差难以衡量。

softmax运算解决了以上两个问题。它经过下面的公式将输出值变换成值为正且和为1的几率分布:

softmax(o_i)=\frac{exp(o_i)}{\sum_{i=1}^{n}exp(o_i)}

6.3 交叉熵损失函数

咱们已经知道,softmax运算将输出变换成一个合法的类别预测分布。实际上,真实标签也能够用类别分布表达:

对于样本i,咱们构造向量 y^{(i)}\in_{}R^q ,使其第 y^{(i)} 个元素为1,其他为0。这样咱们的训练目标能够设为使预测几率分布 \hat{y}^{(i)} 尽量接近真实的标签几率 y^{(i)}

想要预测分类结果正确,咱们其实并不须要预测几率彻底等于标签几率,而平方损失则过于严格。改善这个问题的一个方法是使用更适合衡量两个几率分布差别的测量函数。其中,交叉熵(cross entropy)是一个经常使用的衡量方法:

H(y^{(i)},\hat{y}^{(i)})=-\sum_{j=1}^{q}y_j^{(i)}log{\hat{y}}_j^{(i)}=-log{\hat{y}}_{y^{(i)}}^{(i)}

其中带下标的 y_j^{(i)} 是向量 y^{(i)} 中非 0 即 1 的元素。也就是说,交叉熵只关心对正确类别的预测几率,由于只要其值足够大,就能够确保分类结果正确。即最小化交叉熵损失函数等价于最大化训练数据集全部标签类别的联合预测几率。

7. 神经网络实现

TensorFlow示例:线性回归

机器学习通俗易懂系列文章

3.png


做者:@mantchs

GitHub:github.com/NLP-LOVE/ML…

欢迎你们加入讨论!共同完善此项目!群号:【541954936】NLP面试学习群

相关文章
相关标签/搜索