Part1 深度学习是什么?
深度学习(Deep Learning)是机器学习的一个分支,它使用神经网络模拟人脑的学习方式,从大量数据中自动学习和提取特征,进行预测和决策。
深度学习依赖于多层神经网络,每一层神经元接受前一层神经元的输出,并通过权重和激活函数进行计算,传递到下一层神经元。
神经元模型是模拟生物神经元行为的计算模型,它在人工智能和机器学习领域扮演着核心角色。
神经元就像人体大脑中的微小开关,能够接收来自其他神经元的信号,并根据这些信号的产生反应。
在人工智能中,我们用数学模型来模拟这种生物神经元的行为。
一个简单的神经元模型包括输入、权重、激活函数和输出。
-
输入就像神经元 树突 接收到的信号,
-
权重则像是调整信号强度的小调节器,
-
激活函数决定是否产生输出,
-
而输出则是传递给其他神经元的信号。
其中,
(1)activation functions——add non-linearity to the neural network
其可以帮助神经网络使用有用的信息,抑制无关的数据点,它将决定神经元对网络的输入在使用更简单的数学运算进行预测的过程中是否重要。它的作用是从输入值集合中推导出节点(或层)的输出。
在神经网络中,激活函数用于在网络的每个节点或层中引入非线性,这使得网络能够学习和模拟更复杂的函数映射。没有激活函数,无论网络有多少层,它都只能学习线性函数,这将大大限制网络的表达能力。常见的激活函数包括ReLU(Rectified Linear Unit),Sigmoid,Tanh等。
注:激活函数在神经网络中的作用至关重要,它们在每个层的前向传播过程中引入了一个额外的步骤,尽管这增加了计算量,但其价值是显而易见的。以下是原因:
如果我们假设有一个神经网络不使用激活函数,那么在这种情况下,每个神经元将仅对输入数据进行线性变换,使用权重和偏差。这是因为无论我们在神经网络中添加多少隐藏层,所有层的行为都将是相同的,因为两个线性函数的复合本身也是一个线性函数。
虽然这使得神经网络结构变得更简单,但学习任何复杂任务变得不可能,我们的模型最终将仅仅是一个线性回归模型。线性回归模型只能处理线性关系,它无法捕捉数据中的非线性模式,这在现实世界中是很常见的情况。因此,没有激活函数的神经网络将无法有效地学习和模拟现实世界中的复杂数据和任务。
激活函数的引入,使得神经网络能够进行非线性变换,这极大地扩展了模型的表达能力,使其能够学习和模拟更加复杂的函数映射。这样,神经网络就不再局限于简单的线性问题,而是能够处理分类、回归、模式识别等更广泛的应用场景。
常见的神经网络激活函数:
①Binary step function
-
二元步函数依赖于一个阈值:这个阈值是一个特定的数值,用来决定神经元是否应该被激活。如果输入的信号强度超过了这个阈值,神经元就会激活;如果没有超过,神经元则保持不激活状态。
-
输入与阈值的比较:当输入信号(例如,来自前一层的神经元的输出)被送入激活函数时,它会被与阈值进行比较。如果输入值大于阈值,神经元就会输出一个高电平信号(通常为1),表示激活状态;如果输入值小于或等于阈值,神经元则输出一个低电平信号(通常为0),表示不激活状态。
-
输出传递:如果神经元被激活,它的输出会被传递到下一层的神经元。如果神经元没有被激活,它的输出就不会被传递到下一层,这意味着下一层的神经元不会接收到来自当前神经元的任何信号。
这种二元步函数的特点是简单明了,但它也有局限性,比如不能提供多值输出,这使得它不适合用于需要多类分类的问题。此外,由于步函数的梯度为零,这在反向传播过程中会阻碍梯度的计算,从而影响神经网络的学习效率。
②Linear Activation Function
线性激活函数,也被称作“无激活”或“恒等函数”(乘以1.0),是一种激活值与输入成比例的函数。这种函数不会对输入的加权和做任何处理,它只是简单地输出给它的值。
数学上,线性激活函数可以表示为 ( f(x) = x )。这个函数的特点是它对输入值 ( x ) 没有任何非线性的处理,它直接将输入值传递给下一层。这种函数的输出就是输入值本身,乘以1.0,实际上并没有改变输入值。
然而,线性激活函数存在两个主要问题:
- 由于其导数是一个常数(即 ( f'(x) = 1 )),与输入 ( x ) 无关,这使得使用反向传播算法时无法根据输入值调整权重,因为权重的更新依赖于导数与输入值的乘积。
- 如果在神经网络中使用线性激活函数,所有的层最终都会合并成一层。无论神经网络有多少层,最后一层仍然是第一层的线性函数。这意味着,使用线性激活函数的神经网络实际上等同于只有一层的网络,这限制了网络的表达能力和学习能力。
③Non-Linear Activation Functions
-
线性激活函数:这里提到的线性激活函数实际上就是一个线性回归模型。线性回归模型只能创建输入和输出之间的线性关系,也就是说,它只能处理简单的线性问题。
-
线性激活函数的局限性:由于线性激活函数的能力有限,它不能创建输入和输出之间复杂的映射关系。这意味着线性模型不能很好地处理非线性问题,也就是说,它不能很好地模拟现实世界中复杂的数据关系。
-
非线性激活函数的作用:
- 允许反向传播:非线性激活函数使得神经网络能够进行反向传播算法。反向传播算法是训练神经网络的关键步骤,它依赖于激活函数的导数与输入有关,这样我们就可以反向计算并理解哪些输入神经元的权重可以提供更好的预测。
- 允许多层神经元堆叠:非线性激活函数允许在神经网络中堆叠多层神经元。这是因为通过多层的非线性组合,网络的输出可以是输入的非线性函数,从而使得任何输出都可以在神经网络中以函数计算的形式被表示。
-
非线性激活函数的多样性:最后,这段话提到了将介绍十种不同的非线性神经网络激活函数及其特性。这些不同的激活函数各有特点,适用于不同类型的问题和网络结构。
简而言之,非线性激活函数是神经网络能够处理复杂问题的关键,它们使得网络能够学习和模拟现实世界中的非线性关系。
3.1.1 Sigmoid / Logistic Activation Function
Sigmoid/Logistic Activation Function(Sigmoid/逻辑激活函数)是一种在机器学习和深度学习中常用的激活函数。这种函数能够将任何实数值作为输入,并输出一个介于0到1之间的值。这意味着无论输入值是正数还是负数,输出值总是被限制在这个范围内。
具体来说,当输入值越大(即更正数),Sigmoid函数的输出值越接近1.0;相反,当输入值越小(即更负数),输出值越接近0.0。这个特性使得Sigmoid函数非常适合用来预测一个事件发生的概率,因为概率值总是介于0和1之间。
Sigmoid函数的数学表达式通常写作: ,其中,( e ) 是自然对数的底数,大约等于2.71828,( x ) 是输入值。
Sigmoid函数的形状呈现S形,随着输入值的增加,函数值从0逐渐增加到1,但永远不会达到1;随着输入值的减小,函数值从1逐渐减小到0,但永远不会达到0。这种平滑的过渡使得Sigmoid函数在梯度下降算法中非常有用,因为它提供了一个连续且平滑的梯度,有助于优化算法的收敛。
-
为什么Sigmoid/Logistic激活函数广泛使用:
- 它通常用于需要预测概率作为输出的模型。因为任何事件的概率值都存在于0到1之间,Sigmoid函数因其输出范围恰好符合这一要求,因此是合适的选择。
-
Sigmoid函数的特性:
- 该函数是可微分的,并且提供了一个平滑的梯度,这意味着它能够防止输出值出现跳跃。这种特性由Sigmoid激活函数的S形曲线表示。
-
Sigmoid函数的导数:
- Sigmoid函数的导数表达式为( f'(x) = \text{sigmoid}(x) \times (1 - \text{sigmoid}(x)) )。这个导数表达式说明了函数的梯度如何随着输入值的变化而变化。
-
Sigmoid函数的限制:
- 导数的图形显示,在输入值的-3到3范围内,梯度值是显著的,这意味着在这个输入范围内,函数对于输入的微小变化比较敏感,梯度值较大(梯度值大意味着模型在训练过程中能够更有效地更新权重,因为梯度提供了权重更新的方向和大小)。而在其他区域,图形变得非常平坦。这意味着当输入值大于3或小于-3时,函数的梯度会变得非常小。随着梯度值接近零,网络停止学习,这就是所谓的梯度消失问题。
-
Sigmoid函数的另一个限制:
- Sigmoid函数的输出不是围绕零对称的,这意味着所有神经元的输出都将具有相同的符号。这使得神经网络的训练变得更加困难和不稳定。
总的来说,Sigmoid/Logistic激活函数因其在概率预测中的适用性和可微分性而被广泛使用,但也存在梯度消失和输出不对称的问题。
3.1.2 Softmax Function
(在研究Softmax激活函数之前,需要先理解sigmoid激活函数,因为它是Softmax的基础,并且用于计算概率值)
Sigmoid函数存在一个问题。如果一个模型有多个输出类别,并且每个类别的Sigmoid输出值分别是0.8, 0.9, 0.7, 0.8, 和0.6,这些值加起来超过了1,这在概率论中是不合理的,因为所有类别的概率之和应该等于1。
为了解决这个问题,Softmax函数被引入。Softmax函数可以被看作是多个Sigmoid函数的组合,它计算的是相对概率。与Sigmoid函数类似,Softmax函数也为每个类别返回一个概率值,但它确保所有类别的概率之和为1。Softmax函数通常用作神经网络最后一层的激活函数,特别是在多类别分类问题中。
Softmax函数是处理多类别分类问题时非常有用的工具,它将输出层的原始输出值转换成概率分布,使得我们可以轻松地识别出最可能的类别。
3.2 Tanh Function(Hyperbolic Tangent)
是一种在神经网络中常用的激活函数,它与Sigmoid或Logistic激活函数非常相似,都呈现出S形的曲线。不同之处在于双曲正切函数的输出范围是-1到1,而Sigmoid函数的输出范围是0到1。
具体来说,在双曲正切函数中,如果输入值越大(即更正),输出值就越接近1.0;相反,如果输入值越小(即更负),输出值就越接近-1.0。这意味着双曲正切函数能够将输入值映射到-1和1之间的范围内,从而为神经网络的隐藏层提供了一种有效的非线性转换。这种转换有助于网络学习输入数据的复杂模式。
-
双曲正切激活函数的优势:
- 零中心化输出:双曲正切函数的输出值范围是-1到1,这意味着它的输出是围绕0中心化的。这种特性允许我们很容易地将输出值映射为强烈负值、中性或强烈正值。这有助于在神经网络中更好地解释和处理数据。
-
在神经网络隐藏层中的应用:
- 双曲正切函数的输出值位于-1到1之间,这使得隐藏层的均值接近0或非常接近0。这种特性有助于将数据居中,从而使得下一层的学习过程更加容易。居中的数据可以减少学习过程中的偏置,提高网络的收敛速度和性能。
-
双曲正切激活函数的梯度分析:
-
"vanishing gradients"(梯度消失)是指在训练深度神经网络时,如果使用某些激活函数,反向传播的梯度可能会随着网络层数的增加而迅速减小,最终趋近于零。这会使得深层网络中的权重几乎不更新,导致训练过程非常缓慢。
-
tanh函数(双曲正切函数)是sigmoid函数的一个变体,它的输出范围是-1到1,而sigmoid函数的输出范围是0到1。tanh函数的梯度更陡峭意味着tanh函数的导数在输入值附近变化更快。尽管如此,tanh函数仍然可能面临梯度消失的问题,尤其是在输入值远离零点时。
-
-
与sigmoid函数的比较:
- 尽管sigmoid和tanh函数都面临梯度消失问题,但由于tanh函数是零中心化的,并且梯度没有被限制在特定方向上移动,因此在实践中,tanh非线性总是比sigmoid非线性更受青睐。
总结来说,双曲正切激活函数因其零中心化的特性和在隐藏层中的应用而被广泛使用,但同时也需要注意其梯度可能带来的局限性。
3.3.1 ReLU Function
ReLU是Rectified Linear Unit的缩写,中文意思是“修正线性单元”。它是一种在神经网络中常用的激活函数。虽然ReLU看起来像是线性函数,但它实际上有一个导数函数,这使得它能够支持反向传播算法,同时保持计算效率。
ReLU的数学表达式是: 这意味着,如果输入x小于0,ReLU函数的输出就是0;如果输入x大于或等于0,ReLU函数的输出就是x本身。其优点是计算简单,训练速度快,并且能够缓解梯度消失问题。
ReLU的优势:
-
计算效率:ReLU函数只激活一部分神经元,这意味着在给定的输入中,只有当输入值大于0时,神经元才会被激活。这种特性使得ReLU相比于sigmoid和tanh函数在计算上更加高效。sigmoid和tanh函数在输入值较大或较小时,梯度接近于0,这会导致所谓的梯度消失问题,而ReLU的导数在输入大于0时是常数1,这有助于在反向传播过程中保持梯度的流动,可以避免这个问题。
-
加速梯度下降:ReLU的线性和非饱和特性有助于加速梯度下降算法向损失函数的全局最小值的收敛。因为ReLU的导数在正区间内是常数(值为1),这有助于梯度在正区间内保持较大的值,从而加快学习过程。
ReLU的局限性:
-
Dying ReLU问题:这是ReLU的一个主要问题,指的是在反向传播过程中,如果神经元的输出小于0,那么它的梯度将会是0。这意味着在更新权重和偏置时,这些神经元不会得到更新,从而可能导致所谓的“死神经元”,即这些神经元永远不会被激活。这会减少模型的表达能力,影响其拟合或训练数据的能力。
-
输入值的压缩:由于所有负的输入值都会被置为0,这可能会导致模型在训练数据上的拟合能力下降,因为模型失去了对负输入值的敏感性。
(为了构建更可靠的机器学习模型,建议将数据分为训练集、验证集和测试集,这样可以更全面地评估模型的性能,并避免过拟合)
3.3.2 Leaky ReLU Function
Leaky ReLU 是一种改进版的 ReLU(Rectified Linear Unit,线性整流单元)激活函数,它被设计出来以解决所谓的“Dying ReLU”问题。这个问题指的是在训练神经网络时,如果使用标准的 ReLU 函数,当某些神经元的输入为负时,ReLU 函数的输出会是零,这会导致这些神经元在反向传播过程中的梯度也为零,从而在训练过程中这些神经元可能永远不会被激活,即“死亡”。
为了解决这个问题,Leaky ReLU 在负数区域引入了一个很小的正斜率(slope),即使输入为负,Leaky ReLU 也能产生一个小的非零输出。这种设计允许负输入的神经元在反向传播中仍然能够接收到梯度信号,从而避免了神经元的死亡,使得网络训练更加稳定和有效。
Leaky ReLU通过允许负值输入有一个非零的梯度来解决这个问题。然而,这种改进也带来了一些局限性:
-
预测可能不一致:对于负输入值,Leaky ReLU的预测可能不如正输入值那样一致。这是因为Leaky ReLU在负值区域的斜率非常小,这可能导致模型在处理负值输入时的预测不够稳定。
-
学习参数耗时:Leaky ReLU对于负值的梯度非常小,这意味着在训练过程中,模型参数的更新速度可能会比较慢,从而导致学习过程耗时较长。
3.3.3 Parametric ReLU Function
是一种自适应调整其在负半轴上行为的ReLU变体,通过学习参数a来解决梯度消失的问题。目的是解决ReLU函数在负半轴上的“死亡神经元”问题。这个参数a定义了函数在负半轴上的斜率。在训练过程中,通过反向传播算法,可以学习到最适合当前问题的参数a的值。
3.3.4 Exponential Linear Units (ELUs) Function
Exponential Linear Unit(指数线性单元),是一种激活函数,它在处理负值时使用指数曲线(log curve),这意味着对于负值,ELU函数会输出一个接近于0但大于0的值,这有助于减少神经元的死亡(即输出始终为0的情况)
-
ELU作为ReLU的强有力替代品,具有以下优势:
- 平滑性:ELU在输出值达到-α之前会逐渐变得平滑,而ReLU则迅速平滑。这意味着ELU在处理负值时,其激活函数的斜率会逐渐减小,直到输出达到-α,这有助于模型更好地捕捉数据的细微变化。
- 避免死ReLU问题:通过为输入的负值引入对数曲线,ELU避免了ReLU中的“死ReLU”问题。这有助于网络在训练过程中适当地调整权重和偏置,从而推动网络向正确的方向发展。
-
ELU函数的局限性:
- 计算时间增加:由于包含了指数运算,ELU的计算时间比ReLU更长。
- α值不学习:在ELU中,参数α(alpha)是固定的,不会在训练过程中学习调整。
- 梯度爆炸问题:尽管ELU在负值上的表现优于ReLU,但在某些情况下,它仍然可能面临梯度爆炸的问题,这可能影响网络的训练稳定性。
简而言之,ELU是一种改进的激活函数,它试图解决ReLU的一些缺点,如在负值上的激活问题,但同时也带来了一些新的挑战,如计算复杂性和可能的梯度问题。
3.4 Swish
Swish是一种自门控(self-gated)激活函数,这意味着它的激活程度取决于输入值本身,从而可以自适应地调整网络的响应。其值在 ( X ) 为负无穷时趋于一个固定值,在 ( X ) 为正无穷时趋于无限大,而在 ( X ) 取值的整个范围内,函数值不会低于某个最小值。这种函数通常在数学和物理学中用来描述某些现象,例如某些物理量在极端条件下的行为。
-
平滑性:Swish函数是一个平滑的函数,这意味着它在x=0附近不会像ReLU那样突然改变方向。ReLU函数在x=0处有一个尖锐的转折点,当输入值从负数变为正数时,ReLU的输出会突然从0跳到输入值本身。而Swish函数则是从0开始,平滑地过渡到小于0的值,然后再向上弯曲,这意味着它在x=0附近的变化更加连续。
-
对小负值的处理:在ReLU激活函数中,所有小于0的值都会被设为0,这可能会丢失一些对数据模式捕捉很重要的小负值信息。而Swish函数不会将这些小负值设为0,因此能够保留这些可能对学习数据模式有用的信息。
-
对大负值的处理:尽管Swish函数不会将小负值设为0,但它和ReLU一样,会将大负值设为0,这样做的目的是为了增加网络的稀疏性,这通常有助于提高网络的泛化能力。
-
非单调性:Swish函数不是一个单调函数,这意味着它不总是增加或减少的。这种特性使得Swish能够更丰富地表达输入数据和权重,从而可能提高学习效果。
总的来说,Swish激活函数通过其平滑性和非单调性,以及对负值的不同处理方式,提供了一种可能比ReLU更有效的方式来激活神经网络中的神经元。
3.5 Gaussian Error Linear Unit (GELU)
高斯误差线性单元(Gaussian Error Linear Unit,简称GELU)激活函数,它是一种在自然语言处理(NLP)领域中广泛使用的神经网络激活函数,与BERT、ROBERTa、ALBERT等顶级模型兼容。GELU的设计理念是结合了dropout、zoneout和ReLU的特性。
-
ReLU(Rectified Linear Unit,线性整流单元):它是一个确定性的激活函数,其输出是输入值的正部分,如果输入值是负的,则输出为零。
-
Dropout:这是一种正则化技术,它在训练过程中随机地将一部分神经元的输出设置为零,以防止过拟合。Dropout是随机的,因为它在每次迭代中都可能选择不同的神经元进行“丢弃”。
-
Zoneout:这是循环神经网络(RNN)中的一种正则化技术,它随机地将一部分输入向量设置为零,与Dropout类似,但是作用于序列数据。
这种激活函数在计算机视觉、自然语言处理和语音识别等领域的任务中,相比于ReLU和ELU等激活函数,表现出更好的性能。
GELU将这些特性结合起来,通过以下方式产生神经元的输出:
- 它将输入 ( x ) 乘以一个随机变量 ( m ),这个变量 ( m ) 来自伯努利分布 ( \text{Bernoulli}(\Phi(x)) )。
- 这里的 ( \Phi(x) ) 是标准正态分布的累积分布函数,表示为 ( \Phi(x) = P(X \leq x) ),其中 ( X \sim N(0, 1) )。
- 选择正态分布是因为神经元的输入往往遵循正态分布,特别是在使用了批量归一化(Batch Normalization)的情况下。
3.6 Scaled Exponential Linear Unit (SELU)
SELU是一种新型的激活函数,它通过允许正负值的输出,帮助网络层保持和调整前一层的平均值和方差,从而实现内部归一化。这有助于网络更快地收敛,并且比传统的ReLU激活函数具有更多的灵活性。然而,SELU作为一种相对较新的激活函数,还需要更多的研究来探索其在不同类型的神经网络架构(如卷积神经网络CNNs和循环神经网络RNNs)中的应用。
-
SELU在自归一化网络中的定义和作用:
- SELU是为自归一化网络设计的,它负责内部归一化,这意味着网络的每一层都会保持前一层的平均值和方差。这种归一化是通过调整平均值和方差来实现的。
-
SELU与ReLU的比较:
- SELU能够输出正数和负数,这使得它能够改变平均值。而ReLU激活函数由于只能输出正数,所以不能改变平均值。
-
梯度对方差的影响:
- 梯度可以用来调整方差。为了增加方差,激活函数需要有一个梯度大于1的区域。
(2)Neural Networks Architecture
其指的是神经网络的结构设计。神经网络是一种受人脑结构启发的数学模型,它通过模拟人脑神经元的连接和交互来处理信息。神经网络的架构包括多个层次,如输入层、隐藏层和输出层,以及这些层之间的连接权重和激活函数。
- 输入层:这是神经网络接收数据的地方,每个节点代表一个特征。输入层接受来自域的原始输入。在此层不执行任何计算。这里的节点只是将信息(特性)传递给隐藏层。
- 隐藏层:这些是中间层,可以有多个,用于处理输入数据并提取更高级的特征。顾名思义,这一层的节点是不公开的,它们提供了神经网络的抽象。隐藏层对通过输入层输入的特征进行各种计算,并将结果传输到输出层。
- 输出层:这是神经网络给出最终结果的地方,其节点数量和类型取决于任务的需要,例如分类或回归。它是网络的最后一层,带来了通过隐藏层学到的信息,并最终传递出最终的价值。
- 权重:连接神经元的边,表示神经元之间连接的强度。
- 激活函数:非线性函数,用于在每一层引入非线性,使得网络能够学习和模拟更复杂的函数。
注:所有的隐藏图层通常使用相同的激活函数。但是,输出层通常会使用与隐藏层不同的激活函数。选择取决于模型的预测目标或类型。
(3)Feedforward Propagation
其是一种在神经网络中信息流动的基本方式,信息的流动是单向的,也就是说,它从输入层流向隐藏层,再流向输出层,而不会反向流动。输入数据被用来在隐藏层计算一些中间函数。这些中间函数通常指的是激活函数,它们对输入数据进行处理,以便于网络能够学习和识别复杂的模式。这些中间结果随后被用来计算最终的输出。输出层的神经元根据隐藏层的激活值来生成网络的最终预测或分类结果。
在神经网络的前向传播过程中,激活函数起着至关重要的作用。激活函数可以被比喻为一个数学上的“门”,它位于当前神经元接收输入信号和产生输出信号传递给下一层之间的位置上。具体来说,激活函数用于决定神经元是否应该被激活,以及激活的程度。它影响着神经元的输出,从而影响整个神经网络的学习和预测能力。
- 引入非线性:激活函数允许模型捕捉和学习数据中的非线性关系。
- 控制输出范围:不同的激活函数有不同的输出范围,例如,Sigmoid函数的输出范围是(0,1),而ReLU函数的输出可以是任何正数。
- 影响学习速度:某些激活函数可能会影响梯度的流动,从而影响神经网络的学习速度和性能。
(4) Backpropagation
其是一种在训练神经网络时常用的算法,通过调整网络的参数来最小化代价函数(cost function),这些参数包括权重(weights)和偏置(biases)。代价函数是一个衡量网络预测结果与实际结果差异的指标,通常希望这个值尽可能小。其核心思想是利用梯度下降法来调整网络中的权重(weights),目的是使得网络的输出值尽可能接近我们期望的输出值。
在训练过程中,每个连接的权重都会不断更新。这是通过计算损失函数(衡量实际输出和期望输出之间差异的函数)的梯度来实现的。以最小化网络的实际输出向量和期望输出向量之间的差异是反向传播算法的最终目标。通过不断调整权重,我们希望网络的输出能够尽可能地接近我们期望的输出,从而提高模型的预测准确性。
具体来说,反向传播算法包括以下几个步骤:
- 前向传播:输入数据在网络中向前流动,通过每一层的计算,最终得到输出结果。
- 计算代价:将输出结果与期望的输出进行比较,计算出代价函数的值。
- 反向传播:利用代价函数的梯度信息,从输出层开始反向传递回输入层,逐层计算每个参数的梯度。
- 参数更新:根据计算出的梯度,使用某种优化算法(如梯度下降)来更新网络的权重和偏置。
这里提到的"cost function gradients"(代价函数梯度)是指代价函数对每个参数的导数,它告诉我们每个参数应该如何调整才能减少代价函数的值。"activation function"(激活函数)是神经网络中用来引入非线性的函数,它决定了神经元的激活状态,是影响网络性能的关键因素之一。
总的来说,反向传播算法通过计算代价函数的梯度,指导网络参数的调整,从而使得网络能够更好地学习数据特征,提高预测或分类的准确性。
Part2 深度学习如何训练的?
(1)深度学习
为了进一步提高模型的准确性和泛化能力,科学家们引入了各种优化技术和算法,如
-
激活函数Activation Fuction的改进
-
权重初始化Weight Initilization方法
-
正则化技术Normalization
-
梯度下降的变种Gradient Gescent Optimization Algoritms
-
新的网络结构Network Structure,如卷积神经网络(CNN)和循环神经网络( RNN ),以适应不同类型的数据和任务。
(2)梯度下降算法
梯度下降算法基于这样一个原理:损失函数的梯度指向函数增长最快的方向。因此,如果我们希望减少损失函数的值,我们就需要沿着梯度的反方向调整模型的参数。梯度是损失函数关于模型参数的导数,它指示了参数的调整方向,以减少损失函数的值。
(3)Pytorch训练代码
深度学习的训练代码虽然在细节上可能有所不同,但它们的核心结构和步骤是高度类似的。无论使用的是图像、文本还是音频数据,训练开始之前都需要对数据进行加载、预处理和分割。这部分代码通常涉及到数据加载器,它会将数据集分成小批量,并确保数据在训练过程中被正确地处理。训练代码包括前向传播、计算损失、反向传播和参数更新。这个过程会重复进行多轮(epoch),直到模型性能达到预期目标。
(4)机器学习与深度学习的区别
机器学习:通常使用相对简单的算法(如线性回归、决策树)处理数据。需要人工设计特征工程来提高模型性能。
深度学习:通过深层神经网络自动学习特征,能够处理和学习高维度和复杂的数据模式,适用于图像识别、自然语言处理等复杂任务。
机器学习算法通过数据进行训练,识别数据中的模式和规律,并在此基础上进行预测或决策。随着数据量的增加和算法的优化,机器学习模型能够不断改进其性能,使其在特定任务上表现得越来越好。
-
线性回归:
-
线性假设:假设输入特征与输出标签之间存在线性关系。
-
独立同分布(IID):训练集中的数据是独立且同分布的。
-
决策树:
-
独立性假设:每个特征在决策过程中是相互独立的。
-
连续性假设:特征可以是连续的或离散的,算法通过找到最佳分割点来构建树。
-
神经网络:
-
非线性假设:通过非线性激活函数来建模数据中的复杂非线性关系。
-
层次化假设:通过分层结构来学习数据的不同层次和抽象。
传统的机器学习算法往往需要人工设计特征,这一过程称为特征工程,既费时又需要专业知识。
深度学习能够自动从原始数据中学习到有用的特征,减少了对人工特征工程的需求。深度学习模型可以实现端到端的学习,即直接从原始输入数据到最终输出结果(如分类标签或翻译文本)的学习,而无需中间步骤。
Part3 深度学习与迁移学习
(1)迁移学习
迁移学习是一种机器学习技术,它将已在一个任务上学到的知识(如模型参数、特征表示等)应用到另一个相关任务上。这种技术特别有用,因为它允许模型在数据稀缺的情况下也能表现出色。通常使用在大规模数据集上预训练的模型作为起点,例如在ImageNet数据集上预训练的卷积神经网络(CNN)。在预训练模型的基础上,使用少量标记数据对模型进行微调,以适应新任务。
(2)迁移学习实现方法
微调(Fine-tuning)是深度学习中一种有效的迁移学习策略,它允许我们利用预训练模型对特定任务进行优化。其基本原理是,首先在一个大规模的数据集上预训练一个深度学习模型,捕捉通用的特征表示,然后将这个预训练模型作为起点,在目标任务上进行进一步的训练以提升模型的性能。
适配过程通常涉及以下步骤:
-
我们会替换模型的输出层,以匹配目标任务的类别数量和类型。例如,如果目标任务是图像分类,而预训练模型原本用于不同的分类任务,我们就需要将模型的最后一层替换成适合新任务类别数的新层。
-
【可做可不做】我们冻结预训练模型中的大部分层,这样可以防止在微调过程中这些层学到的通用特征被破坏。通常情况下,只对模型的最后一部分层进行解冻,这些层负责学习任务特定的特征。
-
使用目标任务的数据集对模型进行训练。在这个过程中,我们会用梯度下降等优化算法更新模型的权重,从而使模型能够更好地适应新的任务。训练时,可能会使用比预训练时更低的学习率,以避免过度拟合目标数据集。
Part4 常见的图像分类网络
(1)AlexNet
AlexNet是一种具有深远影响的卷积神经网络(CNN)架构,由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton设计。它在2012年的ImageNet大规模视觉识别挑战赛(ILSVRC)中取得了突破性的成绩,大幅度超越了之前的图像分类技术(非深度学习技术)。
AlexNet包含八个层次结构,前五个是卷积层,其中一些后跟最大池化层,最后三个是全连接层。具体结构如下:
-
卷积层:AlexNet的前五个层次都是卷积层,每个卷积层后面跟着一个ReLU激活函数,以引入非线性。这些卷积层旨在提取图像的特征。
-
局部响应归一化(LRN):在某些卷积层后使用了局部响应归一化,这是一种提高模型泛化能力的正则化方法。
-
最大池化层:在部分卷积层之后使用最大池化层来降低特征的空间维度,减少计算量和过拟合的风险。
-
全连接层:网络的最后三个层次是全连接层,其中最后两个全连接层后跟有Dropout,以进一步防止过拟合。
-
输出层:最后一个全连接层后是线性层,然后是softmax激活函数,输出1000个类别上的概率分布。
(2)ResNet
ResNet(残差网络)是一种深度卷积神经网络架构,由微软研究院的研究员何恺明等人提出。ResNet在2015年的ImageNet图像识别大赛中取得了冠军,并在深度学习领域产生了重大影响。它的主要创新点是引入了残差学习的概念,允许训练非常深的网络,从而缓解了深度神经网络训练中的梯度消失和梯度爆炸问题。
ResNet的核心是残差块(residual block),网络通过堆叠这些残差块来构建。一个基本的残差块包含以下几部分:
-
跳跃连接(Skip Connections):这是ResNet最关键的创新,通过跳跃连接,输入可以直接绕过一个或多个层传到输出,输出是输入与这些层的输出的加和。这种结构使得网络可以学习输入到输出的残差,而不是直接学习输出,这有助于缓解梯度消失问题。
-
卷积层:残差块内部包含多个卷积层,通常使用小尺寸的卷积核(如3x3),并且通常会有批量归一化(Batch Normalization)和ReLU激活函数。
-
池化层:在某些残差块之间会插入最大池化层来降低特征图的空间维度。
ResNet有多个变种,包括ResNet-50、ResNet-101、ResNet-152等,数字代表了网络中权重层的数量。这些变种在网络的深度和宽度上有所不同,但都基于相同的残差学习架构。ResNet能够成功训练超过100层的网络,这在之前是不可能实现的。在ImageNet竞赛中,ResNet取得了3.57%的错误率,远低于之前的表现最好的模型。
(3)EfficientNet
EfficientNet是一种高效的卷积神经网络(CNN)架构,它通过一种新颖的网络缩放方法来提升模型的性能和效率。EfficientNet 的核心是其 compound scaling 方法,该方法通过一个复合系数统一缩放网络的深度、宽度和分辨率。在过去,网络缩放通常是通过任意选择深度、宽度或分辨率的增加来实现的,而EfficientNet的方法则是通过一系列固定的缩放系数来同时增加这三个维度。例如,如果想要使用更多的计算资源,可以通过增加网络深度、宽度和图像大小的特定比例来实现,其中的比例系数是通过在小型模型上进行小规模的网格搜索确定的。
注:
①在训练神经网络时可能遇见的问题:
-
梯度消失:在某些激活函数(如sigmoid函数)的作用下,输入空间被压缩到一个很小的输出空间(0到1之间)。由于这些激活函数的特性,当输入发生较大变化时,输出的变化却很小,导致导数(即梯度)变得很小。在只有少数几层的浅层网络中,这不是一个大问题。但是,当网络层数增多时,梯度会变得非常小,以至于训练过程无法有效进行。梯度太小意味着权重更新非常缓慢,导致学习过程进展缓慢。
-
梯度爆炸:在训练过程中,由于误差梯度的累积,导致神经网络模型权重的更新变得非常大。这种情况会导致网络变得不稳定,学习过程无法完成。此外,权重值可能变得非常大,以至于超出了计算机处理的数值范围,导致所谓的NaN(Not a Number,非数值)值出现。NaN值的出现通常意味着模型已经失去了数值稳定性,无法继续进行有效的学习。
梯度消失和梯度爆炸都是深度学习中需要解决的问题,它们分别导致训练过程过于缓慢或不稳定。解决这些问题的方法包括使用不同的激活函数(例如ReLU),引入权重初始化策略,或使用批量归一化等技术。
②如何选择合适的激活函数:
-
选择激活函数:需要根据正在解决的预测问题类型,特别是预测变量的类型,来为输出层匹配合适的激活函数。
-
一般规则:通常,可以首先尝试使用ReLU激活函数,如果ReLU没有提供最佳结果,再考虑其他激活函数。
-
其他指导原则:
- ReLU激活函数应该仅用于隐藏层。
- Sigmoid/Logistic和Tanh函数不应该用于隐藏层,因为它们会使模型在训练过程中更容易遇到问题(例如梯度消失)。
- Swish函数用于超过40层深度的神经网络。
-
输出层激活函数的选择:根据正在解决的预测问题类型,选择输出层的激活函数:
- 回归问题(Regression):使用线性激活函数。
- 二分类问题(Binary Classification):使用Sigmoid/Logistic激活函数。
- 多分类问题(Multiclass Classification):使用Softmax激活函数。
- 多标签分类问题(Multilabel Classification):使用Sigmoid激活函数。
-
隐藏层激活函数的选择:通常根据神经网络的架构类型来选择隐藏层的激活函数:
- 卷积神经网络(Convolutional Neural Network, CNN):使用ReLU激活函数。
- 循环神经网络(Recurrent Neural Network, RNN):使用Tanh和/或Sigmoid激活函数。
③ImageNet 介绍
ImageNet 包含超过1400万张注释过的图像,这些图像分布在超过2.2万个类别中。它的规模之大使得它成为深度学习模型训练和评估的理想数据集。ImageNet 数据集中的图像包含了各种场景、物体、背景和遮挡情况,这为算法提供了极大的挑战。这种多样性使得在 ImageNet 上训练的模型能够学习到鲁棒的特征,从而在现实世界应用中表现良好。
ImageNet 提供了一个标准的性能基准,研究者可以通过在 ImageNet 上的表现来比较不同模型的性能。此外许多在 ImageNet 上预训练的模型被用作迁移学习的起点,这些模型在新任务上通常表现出色。
参考资料:
Activation Functions in Neural Networks [12 Types & Use Cases] (v7labs.com)