自学记录《深度学习500问》之 深度学习基础

1.为什么使用深层表示?

  1. 深度神经网络是一种递进式的学习算法,浅层的神经元直接从数据中学习一些低层次的简单特征,例如边缘、纹理等。而深层的神经元则基于已经学习到的浅层特征继续学习更高级的特征, 从计算机的角度来学习深层次的信息。
  2. 深层的网络隐藏单元数量相对较少,隐藏层数目较多,如果浅层的网络想要达到同样的计算结果,则需要指数级增长神经元的数量才能达到。

2.为什么深层神经网络难以训练?

  1. 梯度消失:从隐藏层从后向前看,梯度会变得越来越小,说明前面层的学习效果远低于后面的层,所以学习会卡住。

梯度消失的原因受到多种因素影响,例如学习率的大小,网络参数的初始化激活函数的边缘效应等。在深层神经网络中,每一个神经元计算得到的梯度都会传递给前一层,较浅层的神经元接收到的梯度受到之前所有层梯度的影响。如果计算得到的梯度值非常小,随着层数增多,求出的梯度更新信息将会以指数形式衰减,就会发生梯度消失。下图是不同隐含层的学习速率:
在这里插入图片描述

  1. 梯度爆炸:在深度网络或循环神经网络等结构当中,梯度在网络中不断累积,变成非常大,导致网络的权重参数大幅更新,使网络不稳定。在极端情况下,权重值甚至会溢出,变为NaN值,再也无法更新。

若激活函数的导数的绝对值小于1**,那么经过多次连乘后传到前面层的误差项就接近于0,那么就会导致前面层的参数几乎没有更新,即梯度消失。反之,若激活函数的导数的绝对值大于1,多次连乘后就会非常大,导致梯度爆炸。**

  1. 权重矩阵的退化导致模型的有效自由度减少

​ 参数空间中学习的退化速度减慢,导致减少了模型的有效维数,网络的可用自由度对学习中梯度范数的贡献不均衡,随着相乘矩阵的数量(即网络深度)的增加,矩阵的乘积变得越来越退化。在有硬饱和边界的非线性网络中(例如 ReLU 网络),随着深度增加,退化过程会变得越来越快。Duvenaud等人2014年的论文里展示了关于该退化过程的可视化:
在这里插入图片描述
随着深度的增加,输入空间(左上角所示)会在输入空间中的每个点处被扭曲成越来越细的单丝,只有一个与细丝正交的方向影响网络的响应。沿着这个方向,网络实际上对变化变得非常敏感。

3.深度学习和机器学习有什么不同?

机器学习:利用计算机使用概率学、统计学等知识,输入数据,让计算机学会新知识。机器学习的过程,就是训练数据去优化目标函数。
深度学习:是一种特殊的机器学习,具有更强大的能力和灵活性,它是通过学习将世界表示为嵌套的层次结构,由浅至深提取特征。
主要区别:传统的机器学习需要定义一些手工特征,从而指向性的去提取目标信息,非常依赖任务的特异性以及设计特征的专家经验。深度学习则不需要,可以从大数据中自主学习简单特征,逐渐学习更为复杂的深层特征。

在这里插入图片描述

4.前向传播与反向传播

前向传播(foward propagation, FP):由输入层逐层计算得到输出的过程。

向传播(backward propagation, BP):由网络的输出通过计算梯度由深到浅的更新网络参数。

5.神经网络的输出

在这里插入图片描述
如上图,输入层有三个节点,我们将其依次编号为 1、2、3;隐藏层的 4 个节点,编号依次为 4、5、6、7;最后输出层的两个节点编号为 8、9。比如,隐藏层的节点 4,它和输入层的三个节点 1、2、3 之间都有连接,其连接上的权重分别为是   w 41 , w 42 , w 43 \ w_{41}, w_{42}, w_{43}  w41,w42,w43
为了计算节点 4 的输出值,我们必须先得到其所有上游节点(也就是节点 1、2、3)的输出值。节点 1、2、3 是输入层的节点,所以,他们的输出值就是输入向量本身。按照上图画出的对应关系,可以看到节点 1、2、3 的输出值分别是   x 1 , x 2 , x 3 \ x_1, x_2, x_3  x1,x2,x3

a 4 = σ ( w T ⋅ a ) = σ ( w 41 x 4 + w 42 x 2 + w 43 a 3 + w 4 b ) a_4 = \sigma(w^T \cdot a) = \sigma(w_{41}x_4 + w_{42}x_2 + w_{43}a_3 + w_{4b}) a4=σ(wTa)=σ(w41x4+w42x2+w43a3+w4b)

其中   w 4 b \ w_{4b}  w4b 是节点 4 的偏置项。

同样,我们可以继续计算出节点 5、6、7 的输出值   a 5 , a 6 , a 7 \ a_5, a_6, a_7  a5,a6,a7

计算输出层的节点 8 的输出值   y 1 \ y_1  y1

y 1 = σ ( w T ⋅ a ) = σ ( w 84 a 4 + w 85 a 5 + w 86 a 6 + w 87 a 7 + w 8 b ) y_1 = \sigma(w^T \cdot a) = \sigma(w_{84}a_4 + w_{85}a_5 + w_{86}a_6 + w_{87}a_7 + w_{8b}) y1=σ(wTa)=σ(w84a4+w85a5+w86a6+w87a7+w8b)

其中   w 8 b \ w_{8b}  w8b 是节点 8 的偏置项。

同理,我们还可以计算出   y 2 \ y_2  y2。这样输出层所有节点的输出值计算完毕,我们就得到了在输入向量   x 1 , x 2 , x 3 , x 4 \ x_1, x_2, x_3, x_4  x1,x2,x3,x4 时,神经网络的输出向量   y 1 , y 2 \ y_1, y_2  y1,y2 。这里我们也看到,输出向量的维度和输出层神经元个数相同。

6.卷积神经网络的输出

在这里插入图片描述
假设图像宽度   W i n = 5 \ W_{in}=5  Win=5,filter 宽度   F = 3 \ F=3  F=3,Zero Padding   P = 0 \ P=0  P=0,步幅   S = 2 \ S=2  S=2,则输出尺寸:

W o u t = ( W i − F + 2 P 单 侧 ) / S + 1 W_ {out} = (W_i-F+2P_{单侧})/S+1 Wout=(WiF+2P)/S+1

7.池化层的输出

Pooling 层主要的作用是下采样,通过去掉 Feature Map 中不重要的样本,进一步减少参数数量。
例:   2 ∗ 2 \ 2*2  22   m a x p o o l i n g \ max pooling  maxpooling
在这里插入图片描述
除了   M a x P o o i n g \ Max Pooing  MaxPooing 之外,常用的还有   A v e r a g e P o o l i n g \ Average Pooling  AveragePooling ——取各样本的平均值。​
对于深度为   D \ D  D   F e a t u r e M a p \ Feature Map  FeatureMap,各层独立做   P o o l i n g \ Pooling  Pooling,因此   P o o l i n g \ Pooling  Pooling 后的深度仍然为   D \ D  D(即池化后特征图通道数不变) 。

8.神经网络更“深”有什么意义?

前提:在一定范围内

  • 在神经元的数量相同的情况下,深层网络具有更大的容量,分层组合可以创造指数级的表达空间,能够组合更多不同类项的子结构,可以更容易的学习和表示各种特征。
  • 隐藏层的增加意味着由激活函数带来的非线性变换嵌套层数更多,就能构造更复杂的映射关系。

9.什么是超参数?

超参数是在开始学习之前设置的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习选择一组最优的超参数,以提高学习的性能和效果。
具体来讲包括学习率(learning rate)、梯度下降法的迭代次数(iterations)隐藏层数(hidden layers)隐藏层单元数激活函数( activation function)等,都需要根据实际情况来设置,这些数字实际上控制了最后的参数和的值,所以它们被称作超参数。

10.如何寻找超参数的最优值?

  1. 猜测+试验:根据经验选择参数,训练;调整,再训练;再调整,训练;直至训练结果较符合要求。
  2. 网络搜索:让计算机尝试在一定范围内均匀分布的一组值。
  3. 随机搜索:让计算机随机挑选一组值
  4. MITIE方法:好的初始猜测的前提下,进行局部优化。

11.超参数搜索的一般过程?

  1. 将数据集分成训练集、验证集和测试集。
  2. 根据训练集上训练,得到模型参数。
  3. 在验证集上根据模型的性能指标对模型超参数进行搜索。
  4. 步骤2和步骤3交替迭代,直至网络模型符合要求。
  5. 模型的参数已经固定,此时在测试集中评价模型优劣

12.为什么需要非线性激活函数?

为什么需要激活函数?

  1. 激活函数可以让模型去理解和学习非常复杂的非线性函数。
  2. 如不使用激活函数,那么输出信号仅是一个简单的线性函数,神经网络则无法学习和拟合复杂的数据类型,例如图像、语音等等等。
  3. 激活函数可以把当前的特征空间映射转换到另一个空间,让数据能更好的被分类。

为什么激活函数需要是非线性的?

  1. 如果激活函数都是线性的,那么组合后网络仍是线性的,增加激活函数仅相当于改变了网络的权重参数W和偏置b,这样就做不到用非线性来逼近任意函数。
  2. 使用了非线性激活函数 ,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。使用非线性激活函数,能够从输入输出之间生成非线性映射。

13.常见的激活函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

14.常见的激活函数的导数

在这里插入图片描述

15.激活函数有哪些性质?

  1. 非线性:激活函数是非线性的,理论上来讲一个两层的神经网络就可以逼近所有函数。
  2. 可微性:可以基于梯度优化参数。
  3. 单调性:当激活函数是单调的时候,单层网络能够保证是凸函数。
  4. f(x) ≈ x:当激活函数满足这个性质的时候,如果参数的初始化是随机的较小值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要详细地去设置初始值。
  5. 输出值的范围:当激活函数的输出是有限的时候,基于梯度的优化算法会更稳定(因为特征的表示受有限权值的影响更显著);当激活函数的输出是无限的时候,模型的训练会更高效,此时一般需要小一点的learning reat。

16.如何选择激活函数?

通常的做法是,如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者测试集上进行评价。然后看哪一种表现的更好,就去使用它。
以下是常见的选择情况:
6. 如果输出是0,1二分类问题,则输出层选用Sigmoid函数,其他层选用Relu函数。
7. 在隐藏层上通常会选用最常用的默认函数:Relu函数,或者Leaky ReLu函数。有时也会使用tanh函数,但 Relu 的一个优点是:当是负值的时候,导数等于 0。
8. tanh函数非常优秀,几乎适合所有场合。
9. Sigmoid函数除了二分类的输出层以外基本不会用。
10. 如果遇到了一些死的神经元,可以使用Leaky ReLu函数。

17.使用Relu激活函数的优点?

  1. 在区间变动很大的情况下,Relu激活函数实际上就是一个if-else语句,而sigmoid函数需要进行浮点四则运算,在实践中,使用Relu函数的神经网络通常会比使用sigmoid和tanh激活函数的神经网络学习得更快。
  2. sigmoid和tanh函数的导数在正负饱和区间的梯度都会接近于0,导致梯度消失,而Relu和Leaky Relu函数大于0部分的梯度都为常数,不会出现此现象。
  3. 需要注意,当Relu函数进入负半区的时候,梯度为0,此时神经元不会训练,产生所谓的稀疏性,而Leaky Relu 不会产生这个问题。

18.什么时候可以使用线性激活函数?

  1. 输出层,大多可能使用线性激活函数。
  2. 在隐含层可能会用到一些线性激活函数。
  3. 总之用到线性激活函数的很少。

猜你喜欢

转载自blog.csdn.net/hou9021/article/details/115007958