深度学习500问——Chapter03:深度学习基础(2)

文章目录


3.3 超参数

3.3.1 什么是超参数

超参数:在机器学习的上下文中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据。通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果。

超参数通常在于:

  1. 定义关于模型的更高层次的概念,如复杂性或学习能力。
  2. 不能直接从标准模型培训过程中的数据中学习,需要预先定义。
  3. 可以通过设置不同的值,训练不同的模型和选择更好的测试值来决定。

超参数具体来讲比如算法中的学习率(learning rate)、梯度下降法迭代的数量(iterations)、隐藏层数目(hidden layers)、隐藏层单元数目、激活函数(activation function)都需要根据实际情况来设置,这些数字实际上控制了最后的参数和的值,所以它们被称作超参数。

3.3.2 如何寻找超参数的最优值

在使用机器学习算法时,总有一些难调的超参数。例如权重衰减大小,高斯核宽度等等。这些参数需要人为设置,设置的值对结果产生较大影响。常见设置超参数的方法有:

  1. 猜测和检查:根据经验或直觉,选择参数,一直迭代。
  2. 网格搜素:让计算机尝试在一定范围内均匀分布的一组值。
  3. 随机搜素:让计算机随机挑选一组值。
  4. 贝叶斯优化:使用贝叶斯优化超参数,会遇到贝叶斯优化算法本身就需要很多参数的困难。
  5. MITIE方法,初始猜测的前提下进行局部优化。它使用BOBYQA算法,并有一个精心选择的起始点。由于BOBYQA只寻找最近的局部最优解,所以这个方法是否成功很大程度上取决于是否有一个好的起点。在MITIE的情况下,我们知道一个好的起点,但这不是一个普遍的解决方案,因为通常你不会知道好的起点在哪里。从好的方面来说,这种方法非常适合寻找局部最优解。稍后我会再讨论这一点。
  6. 最新提出的LIPO的全局优化方法。这个方法没有参数,而且经验证比随机搜索方法好。

3.3.3 超参数搜索一般过程

超参数搜索一般过程:

  1. 将数据集划分为训练集、验证集和测试集。
  2. 在训练集上根据模型的性能指标对模型参数进行优化。
  3. 在验证集上根据模型的性能指标对模型的超参数进行搜索。
  4. 步骤2和步骤3交替迭代,最终确定模型的参数和超参数,在测试集中验证评价模型的优劣。

其中,搜索过程需要搜索算法,一般有:网格搜索、随机搜索、启发式智能搜索、贝叶斯搜索。

3.4 激活函数

3.4.1 为什么需要非线性激活函数

为什么需要激活函数?

  1. 激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。
  2. 激活函数可以引入非线性因素。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数是一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。
  3. 激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。

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

  1. 假若网络中全部是线性部件,那么线性的组合还是线性,与单独一个线性分类器无异。这样就做不到用非线性来逼近任意函数。
  2. 使用非线性激活函数,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。使用非线性激活函数,能够从输入输出之间生成非线性映射。

3.4.2 常见的激活函数及图像

1. sigmoid 激活函数

函数的定义为:f(x) = \frac{1}{1 + e^{-x}},其值域为(0,1)

函数图像如下:

2. tanh 激活函数

函数的定义为:f(x) = tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}},值域为(-1,1)

函数图像如下:

3. Relu 激活函数

函数的定义为:f(x) = max(0, x),值域为[0,+∞)。

函数图像如下:

4. Leak Relu 激活函数

函数定义为:f(x) = \begin{cases} ax, & \text{if } x<0 \\ x, & \text{if } x>0 \end{cases},值域为 (-∞,+∞)。

函数图像如下(a = 0.5):

5. SoftPlus 激活函数

函数的定义为:f(x) = ln( 1 + e^x),值域为 (0,+∞)。

函数图像如下:

6. softmax 激活函数

函数定义为:\sigma(z)j = \frac{e^{z_j}}{\sum{k=1}^K e^{z_k}}

Softmax 多用于多分类神经网络输出。

3.4.3 常见激活函数的导数计算

对常见激活函数,导数计算如下:

原函数函数表达式导数备注
Sigmoid激活函数f(x) = \frac{1}{1 + e^{-x}}f^{'}(x) = \frac{1}{1 + e^{-x}}(1- \frac{1}{1 + e^{-x}})=f(x)(1-f(x))

当x=10或x=-10时,f^{'}(x) \approx0

当x=0时,f^{'}(x) =0.25

Tanh激活函数f(x) = \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}f'(x) = -(\tanh(x))^2

当x=10或x=-10时,f^{'}(x) \approx0

当x=0时,f^{`}(x) =1

Relu激活函数f(x)=max(0,x)c(u) = \begin{cases} 0, & \text{if } u<0 \\ 1, & \text{if } u>0 \\ \text{undefined}, & \text{if } u=0 \end{cases}通常x=0时,给定其导数为1和0

3.4.4 激活函数有哪些性质

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

3.4.5 如何选择激活函数

选择一个适合的激活函数并不容易,需要考虑很多因素,通常的做法是,如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者测试集上进行评价。然后看哪一种表现更好,就去使用它。

以下是常见的选择情况:

  1. 如果输出是0、1值(二分类问题),则输出层选择 sigmoid 函数,然后其他的所有的单元都选择 Relu 函数。
  2. 如果在隐藏层上不确定使用哪个激活函数,那么通常会使用 Relu 激活函数。有时,也会使用 tanh 激活函数,但 Relu 的一个优点是:当是负值的时候,导数等于0。
  3. sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
  4. tanh 激活函数:tanh是非常优秀的,几乎适合所有场合。
  5. Relu 激活函数:最常见的默认函数,如果不确定用哪个激活函数,就使用 Relu 或 Leaky Relu,再去尝试其他的激活函数。
  6. 如果遇到了一些死的神经元,我们可以使用 Leaky ReLU 函数。

3.4.6 使用 ReLu 激活函数的优点

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

3.4.7 什么时候可以用线性激活函数

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

3.4.8 怎样理解 Relu(<0时)是非线性激活函数

Relu激活函数图像如下:

根据图像可以看出具有如下特点:

  1. 单侧抑制;
  2. 相对宽阔的兴奋边界;
  3. 稀疏激活性;

        ReLU函数从图像上看,是一个分段线性函数,把所有的负值都变为0,而正值不变,这样就成为单侧抑制。

        因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。

稀疏激活性:从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。当x<0时,ReLU硬饱和,而当x>0时,则不存在饱和问题。ReLU能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。

3.4.9 Softmax 定义及作用

Softmax是一种形如下式的函数:

P(i) = \frac{exp(\theta_i^T x)}{\sum_{k=1}^{K} exp(\theta_i^T x)}

其中,\theta_ix是列向量,\theta_i^T x可能被换成函数关于x的函数f_i(x)

通过softmax函数,可以使得P(i)的范围在[0,1]之间。在回归和分类问题中,通常\theta是待求参数,通过寻找使得P(i)最大的\theta_i作为最佳参数。

但是,使得范围在 [0,1] 之间的方法有很多,为啥要在前面加上以e的幂函数的形式呢?参考 logistic函数: P(i) = \frac{1}{1+exp(-\theta_i^T x)},这个函数的作用就是使得P(i)在负无穷到0的区间趋向于0,在0到正无穷的区间趋向1。同样 softmax函数加入了e的幂函数正是为了两极化:正样本的结果将趋近于1,而负样本的结果趋近于0。这样为多类别提供了方便(可以把P(i)看作是样本属于类别的概率)。可以说,Softmax函数就是 logistic函数的一种泛化

softmax函数可以把它的输入,通常被称为 logits 或者 logit scores,处理成0到1之间,并且能够把输出归一化到和为1。这意味着 softmax函数与分类的概率分布等价。它是一个网络预测多分类问题的最佳输出激活函数。

3.4.10 Softmax函数如何应用于多分类

softmax用于多分类过程,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类。

假设我们有一个数组,V_i表示V中的第i个元素,那么这个元素的 softmax 值就是:

S_i = \frac{e^{V_i}}{\sum_j e^{V_j}}

从下图看,神经网络中包含了输入层,然后通过两个特征层处理,最后通过softmax分析器就能得到不同条件下的概率,这里需要分成三个类别,最终会得到y=0, y=1, y=2的概率值。

继续看下面的图,三个输入通过 softmax 后得到一个数组[0.05 , 0.10 , 0.85],这就是 soft 的功能。

更形象的映射过程如下图所示:

softmax直白来说就是将原来输出是3,1,-3通过 softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标!

3.4.11 交叉熵代价函数定义及其求导推导

神经元的输出就是a=\sigma (z),其中z=\sum w_{j}i_{j}+b就是输入的带权和。

C = -\frac{1}{n} \sum[y \ln(a) + (1 - y) \ln(1 - a)]

其中,n是训练数据的总数,求和是在所有的训练输入 x上进行的,y是对应的目标输出。

表达式是否解决学习缓慢的问题并不明显。实际上,甚至将这个定义看作是代价函数也不是显而易见的!在解决学习缓慢前,我们来看看交叉熵为何能够解释成一个代价函数。

将交叉熵看作是代价函数有两点原因:

第一,它是非负的,C>0。可以看出:式子中的求和中的所有独立的项都是负数的,因为对数函数的定义域是(0,1),并且求和前面有一个负号,所以结果是非负。

第二,如果对于所有的训练输入x,神经元实际的输出接近目标值,那么交叉熵将接近0。

假设在这个例子中,y=0而a\approx 0。这是我们想要得到的结果。我们看到公式中的第一个项就消去了,因为y=0,而第二项实际上就是− ln(1 − a) ≈ 0。反之,y = 1 ⽽ a ≈ 1。所以在实际输出和⽬标输出之间的差距越⼩,最终的交叉熵的值就越低了。(这里假设输出结果不是0,就是1,实际分类也是这样的)。

​ 综上所述,交叉熵是非负的,在神经元达到很好的正确率的时候会接近 0。这些其实就是我们想要的代价函数的特性。其实这些特性也是⼆次代价函数具备的。所以,交叉熵就是很好的选择了。但是交叉熵代价函数有⼀个⽐⼆次代价函数更好的特性就是它避免了学习速度下降的问题。为了弄清楚这个情况,我们来算算交叉熵函数关于权重的偏导数。我们将$a={\varsigma}(z)$代⼊到 公式中应⽤两次链式法则,得到:

​ 根据\varsigma(z)=\frac{1}{1+e^{-z}} 的定义,和⼀些运算,我们可以得到\varsigma'(z) =\varsigma(z)(1 -\varsigma(z)).。化简后可得:

\frac{\partial C}{\partial w_{j}} = \frac{1}{n} \sum x_{j}(\varsigma(z) - y)

​ 这是⼀个优美的公式。它告诉我们权重学习的速度受到\varsigma(z) - y,也就是输出中的误差的控制。更⼤的误差,更快的学习速度。这是我们直觉上期待的结果。特别地,这个代价函数还避免了像在⼆次代价函数中类似⽅程中{\varsigma}'(z)导致的学习缓慢。当我们使⽤交叉熵的时候,{\varsigma}'(z)被约掉了,所以我们不再需要关心它是不是变得很小。这种约除就是交叉熵带来的特效。实际上,这也并不是⾮常奇迹的事情。我们在后⾯可以看到,交叉熵其实只是满⾜这种特性的⼀种选择罢了。

​ 根据类似的方法,我们可以计算出关于偏置的偏导数。我这⾥不再给出详细的过程,你可以轻易验证得到:

\frac{\partial C}{\partial b} = \frac{1}{n} (\varsigma(z) - y)

​ 再⼀次, 这避免了⼆次代价函数中类似{\varsigma}'(z)项导致的学习缓慢。

3.4.12 为什么Tanh收敛速度比Sigmoid快

首先看如下两个函数的求导:

\text{tanh}'(z) = 1 - \text{tanh}^2(z) \in (0,1) \\ s'(z) = s(z) * (1 - s(z)) \in (0,1/4)

由上面两个公式可知tanh(x)梯度消失的问题比sigmoid轻,所以Tanh收敛速度比Sigmoid快。

注:梯度消失(gradient vanishing)或者爆炸(gradient explosion)是激活函数以及当前权重耦合产生的综合结果:​ 设任意激活函数为\sigma(\cdot),k+1层网络输出为f_{k+1}=\sigma(Wf_k),求导得到\frac {\partial h_{t+1}}{\partial h_t}=diag(\sigma'(Wh_t))W。可见求导结果同时会受到权重W和激活函数的导数\sigma'(\cdot)的影响,以sigmoid函数\sigma(X)=\frac {1}{1+e^{-x}}为例,其导数为\sigma'(x)=\frac{1}{1+e^{-x}}(1-\frac{1}{1+e^{-x}}),其值恒大于零小于1,用链式法则求梯度回传时连续相乘使得结果趋于0,但是如果权重W是较大的数值,使得\frac {\partial f_{t+1}}{\partial f_t}相乘结果大于1,则梯度回传时连续相乘则不会发生梯度消失。 综上,在讨论激活函数收敛速度或与梯度消失或者爆炸相关时,应同时考虑当前权重W数值的影响。

3.4.13 内聚外斥 - Center Loss

在计算机视觉任务中, 由于其简易性, 良好的表现, 与对分类任务的概率性理解, Cross Entropy Loss (交叉熵代价) + Softmax 组合被广泛应用于以分类任务为代表的任务中. 在此应用下, 我们可将其学习过程进一步理解为: 更相似(同类/同物体)的图像在特征域中拥有“更近的距离”, 相反则”距离更远“. 换而言之, 我们可以进一步理解为其学习了一种低类内距离(Intra-class Distance)与高类间距离(Inter-class Distance)的特征判别模型. 在此Center Loss则可以高效的计算出这种具判别性的特征. 不同于传统的Softmax Loss, Center Loss通过学习“特征中心”从而最小化其类内距离. 其表达形式如下:

L_{C} = \frac{1}{2}\sum^{m}{i=1}||x{i}-c_{y_{i}}||^{2}_{2}

其中x_{i}表示FCN(全连接层)之前的特征, c_{y_i}表示y_{i}个类别的特征中心, m表示mini-batch的大小. 我们很清楚的看到L_{C}的终极目标为最小化每个特征与其特征中心的方差, 即最小化类内距离. 其迭代公式为:

\frac{\partial L_c}{\partial z_i} = x_i - c_{y_i}

\Delta{c_{j}} = \frac{\sum^{m}{i=1}\delta(y{i}=j)\cdot(c_{j}-x_{i})}{1+\sum^{m}{i=1}\delta(y{i}=j)}

其中,\delta(\text{condition}) = \begin{cases} 1 & \text{if condition is True} \\ 0 & \text{otherwise} \end{cases}

结合Softmax, 我们可以搭配二者使用, 适当平衡这两种监督信号. 在Softmax拉开类间距离的同时, 利用Center Loss最小化类内距离. 例如:

L = L_{S} + \lambda L_{C} \\ = -\sum_{i=1}^{m}\log \frac{e^{W_{y_{i}}^{T}x_{i} + b_{y_{i}}}}{\sum_{j=1}^{m}e^{W_{j}^{T}x_{i} + b_{j}}} + \frac{\lambda}{2}\sum_{i=1}^{m}\|x_{i} - c_{y_{i}}\|^{2}_{2}

即便如此, Center Loss仍有它的不足之处: 其特征中心为存储在网络模型之外的额外参数, 不能与模型参数一同优化. 这些额外参数将与记录每一步特征变化的自动回归均值估计(autoregressive mean estimator)进行更迭. 当需要学习的类别数量较大时, mini-batch可能无力提供足够的样本进行均值估计. 若此Center Loss将需要平衡两种监督损失来以确定更迭, 其过程需要一个对平衡超参数的搜索过程, 使得其择值消耗昂贵.

  • 16
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. 什么是 Java 异常? Java 异常是指程序执行期间可能发生的错误或异常情况,例如除以零、数组越界、空指针引用等。当这些异常发生时,Java 虚拟机会抛出一个异常对象,并且程序的执行流程将被中断。 2. Java 异常处理机制有哪些关键字和语句? Java 异常处理机制包括以下关键字和语句: - try:用于包含可能会抛出异常的代码块。 - catch:用于捕获指定类型的异常,并在捕获到异常时执行相应的处理代码。 - finally:用于包含无论是否发生异常都需要执行的代码块。 - throw:用于抛出指定的异常对象。 - throws:用于声明可能会抛出指定类型异常的方法。 3. Java 中的异常分为哪几类? Java 中的异常分为两大类:Checked Exception 和 Unchecked Exception。 Checked Exception 是指在编译时就能够检查出来的异常,例如 IOException、ClassNotFoundException 等。程序必须显式地处理这些异常,否则编译不通过。 Unchecked Exception 是指在运行时才能检查出来的异常,例如 NullPointerException、ArrayIndexOutOfBoundsException 等。程序可以选择处理这些异常,但不处理也不会导致编译错误。 4. 请简要说明 try-catch-finally 的执行流程。 当程序执行到 try 块时,Java 会尝试执行其中的代码。如果在 try 块中抛出了异常,则会将异常对象传递给 catch 块进行处理。catch 块会匹配异常类型,如果匹配成功,则执行相应的处理代码。如果 catch 块处理完异常后,程序需要继续执行,则会执行 finally 块中的代码。如果 finally 块中也抛出了异常,则该异常会覆盖 try 或 catch 块中的异常。 如果 try 块中没有抛出异常,则 catch 块不会被执行。如果 finally 块中抛出异常,则该异常会覆盖 try 块中的异常。 5. 什么是异常链? 异常链是指在处理异常时,将一个异常对象作为另一个异常的原因,并将它们组合成一个异常链。这样做的好处是,在抛出异常时可以同时传递多个异常信息,从而更加清晰地表示异常发生的原因。 6. 请简要说明 try-with-resources 的作用和使用方法。 try-with-resources 是 Java 7 中引入的语法,用于自动关闭实现了 AutoCloseable 接口的资源。在 try 块中声明需要使用的资源,Java 会在 try 块执行完毕后自动关闭这些资源,无需手动调用 close 方法。 try-with-resources 的语法如下: ``` try (Resource1 r1 = new Resource1(); Resource2 r2 = new Resource2()) { // 使用资源 } catch (Exception e) { // 处理异常 } ``` 7. 请简要说明 Java 中的文本 IO。 Java 中的文本 IO 主要包括两种类:Reader 和 Writer。Reader 用于读取字符流,而 Writer 用于写入字符流。 Java 中常用的 Reader 类包括 InputStreamReader、FileReader 和 BufferedReader,常用的 Writer 类包括 OutputStreamWriter、FileWriter 和 BufferedWriter。这些类提供了各种方法来读取和写入字符流,并且可以处理多种编码格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOYCE_Leo16

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值