首页 > 其他分享 >梯度消失:深度学习的挑战

梯度消失:深度学习的挑战

时间:2023-07-31 18:37:16浏览次数:52  
标签:深度 权重 梯度 消失 ReLU 神经网络 挑战

介绍

深度学习使计算机能够从大量数据中学习并做出复杂的决策,从而彻底改变了人工智能领域。这一成功在很大程度上归功于深度神经网络的发展,它能够从数据中学习分层表示。然而,这些网络面临着一个被称为“梯度消失”的重大挑战,这可能会阻碍它们的训练和表现。在本文中,我们将探讨梯度消失的概念、其原因、后果和一些潜在的解决方案。

image-20230731115228742

了解渐变消失

在深度神经网络中,信息流经多个层,每个层由相互连接的神经元或节点组成。在训练期间,网络通过调整这些连接的权重来学习,以最小化预测输出和实际输出之间的差异。这个过程是通过一种称为反向传播的技术实现的,其中计算损失函数相对于权重的梯度并用于更新模型。

当反向传播期间计算的梯度在向后传播穿过层时变得非常小时,就会发生梯度消失。因此,网络早期层的权重收到的更新可以忽略不计,从而显着减慢学习速度,甚至完全阻止学习。这种现象在非常深的网络中变得特别成问题。

梯度消失的原因

  1. 激活函数:激活函数在将非线性引入神经网络方面起着至关重要的作用。常用的激活函数(如 sigmoid 和 tanh)的输出范围有限,因此在反向传播期间保持大量梯度具有挑战性。当梯度太小时,权重更新变得微不足道,阻碍了学习。
  2. **权重初始化:**不正确的权重初始化也会导致梯度消失。如果权重的初始化方式导致激活太大或太小,则在反向传播期间梯度可能会变得非常小。
  3. 深度架构:网络的深度加剧了梯度消失问题。随着层数的增加,梯度必须经过更多的变换,从而导致进一步的减少。

梯度消失的后果

  1. 缓慢收敛:梯度消失会减慢神经网络在训练期间的收敛速度。该模型可能需要过多的时期才能从数据中学习有意义的表示,从而导致更长的训练时间。
  2. **性能不佳:**在极端情况下,梯度消失问题可能导致网络陷入次优解决方案,甚至完全阻止收敛,从而导致手头任务的性能不佳。

梯度消失的解决方案

  1. **ReLU和变体:**整流线性单元(ReLU)及其变体(例如,Leaky ReLU,参数化ReLU)作为激活函数而广受欢迎,因为它们在一定程度上缓解了梯度消失问题。ReLU函数提供非饱和激活,允许梯度在反向传播期间更自由地流动。
  2. **正确的权重初始化:**使用He初始化或Xavier/Glorot初始化等技术有助于适当地设置神经元的初始权重。这些方法考虑了每个神经元的输入和输出连接的数量,这有助于保持更好的梯度平衡。
  3. **批量规范化:**批量归一化是一种对每层输入进行归一化的技术,可有效减少内部协变量偏移。这种归一化有助于在隐藏层中保持一致的值范围,使训练更加稳定并减少梯度消失问题。
  4. **跳过连接:**跳过连接或残差连接允许梯度在反向传播期间绕过某些层。这种方法由ResNet架构推广,有助于缓解梯度消失,并促进非常深度网络的训练。

法典

下面是一个完整的单块 Python 代码,实现了具有梯度消失问题的深度神经网络,以及如何使用整流线性单元 (ReLU) 激活函数来缓解它。

import numpy as np

# Define the sigmoid activation function
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# Define the derivative of the sigmoid function
def sigmoid_derivative(x):
    return x * (1 - x)

# Define the ReLU activation function
def relu(x):
    return np.maximum(0, x)

# Define the derivative of the ReLU function
def relu_derivative(x):
    return np.where(x <= 0, 0, 1)

# Define the neural network class
class NeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        
        # Initialize weights and biases for the hidden layer
        self.weights_hidden = np.random.rand(self.input_size, self.hidden_size)
        self.biases_hidden = np.random.rand(1, self.hidden_size)
        
        # Initialize weights and biases for the output layer
        self.weights_output = np.random.rand(self.hidden_size, self.output_size)
        self.biases_output = np.random.rand(1, self.output_size)
        
    def forward(self, X):
        # Calculate the weighted sum and apply ReLU activation for the hidden layer
        hidden_layer_input = np.dot(X, self.weights_hidden) + self.biases_hidden
        hidden_layer_output = relu(hidden_layer_input)
        
        # Calculate the weighted sum and apply sigmoid activation for the output layer
        output_layer_input = np.dot(hidden_layer_output, self.weights_output) + self.biases_output
        output_layer_output = sigmoid(output_layer_input)
        
        return output_layer_output

# Example usage:
if __name__ == "__main__":
    # Sample input data (4 examples, 3 features each)
    X = np.array([[0, 0, 1],
                  [0, 1, 1],
                  [1, 0, 1],
                  [1, 1, 1]])
    
    # Corresponding target labels (4 examples, 1 label each)
    y = np.array([[0],
                  [1],
                  [1],
                  [0]])
    
    # Create a neural network with 3 input nodes, 4 hidden nodes, and 1 output node
    neural_network = NeuralNetwork(input_size=3, hidden_size=4, output_size=1)
    
    # Make a forward pass through the neural network to get the predictions
    predictions = neural_network.forward(X)
    
    print("Predictions:")
    print(predictions)

在这个例子中,我们创建了一个包含 3 个输入节点、4 个隐藏节点和 1 个输出节点的简单神经网络。网络对隐藏层使用 ReLU 激活函数,对输出层使用 sigmoid 激活函数。权重和偏差是随机初始化的。

Predictions:
[[0.9363414 ]
 [0.98761619]
 [0.9599209 ]
 [0.99235822]]

请注意,此代码用于教育目的,未针对生产用途进行优化。在实践中,您可能希望使用专门的深度学习库,如TensorFlow或PyTorch,它们提供了更有效和可定制的神经网络实现,包括用于消失梯度的内置解决方案。

结论

梯度消失是训练深度神经网络的重大挑战。这种现象会阻碍学习过程,并可能对模型的性能产生不利影响。研究人员和从业者继续探索创新的解决方案,以有效解决这个问题。随着深度学习领域的发展,解决梯度消失问题仍将是释放深度神经网络全部潜力并使其能够在广泛的任务中脱颖而出的关键方面。

标签:深度,权重,梯度,消失,ReLU,神经网络,挑战
From: https://blog.51cto.com/u_15720252/6911065

相关文章

  • 人工智能 (AI) 的未来:未来的进步和挑战
    介绍:人工智能(AI)已成为21世纪最具变革性的技术之一。随着人工智能研究和机器学习算法的快速发展,我们站在一个新时代的风口浪尖。在这篇博文中,我们将探讨人工智能的最新突破、机器学习的发展趋势,以及人工智能对各个行业和整个社会的潜在影响。人工智能和机器学习的演变:自成立以来,人工......
  • DASCTF 2023 & 0X401七月暑期挑战赛
    比赛只出了一道,小菜不是罪过-_-controlflow这个题动调到底就行foriinrange(40):after_xor[i]=inp[i]^0x401after_xor[i]+=i*i;foriinrange(11,30,1):x=i-10after_xor[i]^=x*(x+1)foriinrange(40):after_xor[i]-=iafter_xo......
  • 【Python&目标识别】Labelimg标记深度学习(yolo)样本
    ​    人工智能、ai、深度学习已经火了很长一段时间了,但是还有很多小伙伴没有接触到这个行业,但大家应该多多少少听过,网上有些兼职就是拿电脑拉拉框、数据标注啥的,其实这就是在标记样本,供计算机去学习。所以今天跟大家分享下如何使用Labelimg去自己标记深度学习样本。......
  • DASCTF 2023 & 0X401七月暑期挑战赛——— 解析viphouse
    DASCTF2023&0X401七月暑期挑战赛———解析viphouse保护策略静态分析main  主函数在while循环提供了一个菜单。void__fastcall__noreturnmain(__int64a1,char**a2,char**a3){charnptr[10];//[rsp+Eh][rbp-12h]BYREFunsigned__int64v4;//[rsp......
  • 深度学习基础语法
    深度学习基础-李沐课程跟学数据操作+数据预处理定义一个1-11个数值的一维张量x=torch.arange(12)tensor([0,1,2,3,4,5,6,7,8,9,10,11])通过shape访问张量的形状和张量中元素的总数x.shape元素总数x.numel改变一个张量的形状,但是不改变......
  • 基于Alexnet深度学习神经网络的人脸识别算法matlab仿真
    1.算法理论概述       人脸识别是计算机视觉领域中一个重要的研究方向,其目的是识别不同人的面部特征以实现自动身份识别。随着深度学习神经网络的发展,基于深度学习神经网络的人脸识别算法已经成为了当前最先进的人脸识别技术之一。本文将详细介绍基于AlexNet深度学习神经......
  • 104. 二叉树的最大深度
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/\920/\157返回它的最大深度 3。#Definitionforabinarytreenode.......
  • 基于LSTM深度学习网络的时间序列预测matlab仿真
    1.算法理论概述       时间序列预测是一类重要的预测问题,在很多领域都有着广泛的应用,如金融、交通、气象等。然而,由于时间序列数据本身具有时序性和相关性,因此预测难度较大。传统的时间序列预测方法大多采用统计学方法,如ARIMA模型、指数平滑法等,但这些方法在处理非线性、......
  • 二叉树某个节点的深度
    微信公众号:码云成化关注可了解更多的教程及进阶技巧。问题或建议,请公众号留言;如果你觉得阿云对你有所帮助,欢迎赞赏深度的定义[当前结点的层数。默认叶子节点是null节点,深度是0。其子节点是null节点,深度是1。]普通二叉树给出上图一个普通二叉树,如果计算结点深度,......
  • 第三章 指针才是C语言的精髓(嵌入式Linux与物联网软件开发 C语言内核深度解析)
    这仅仅是读《嵌入式Linux与物联网软件开发:C语言内核深度解析》pdf的知识记录 地址:指的都是某个字节的地址。比如inta的空间大小有4个字节,每个字节都有一个地址(也就是有4个地址),但是只有首字节地址才能作为整个a空间的地址。也就是说,整个内存以1个字节为基本单位划分无数个地址,......