Advertisement

深度前馈神经网络之深度神经网络(DNN)总结

阅读量:

文章目录

    1. 深度前馈神经网络概述
    1. 深度神经网络(全连接层)
    • 2-1-1 前向传播计算流程
    • 2-1-2 激活函数的作用机制
        • 2-1-3 Relu 函数特性
        • 2-1-4 Sigmoid 函数特点
        • 2-1-5 Tanh 属性分析
        • 2-1-6 ELU 性质探讨
      • 3、损失函数

        • 交叉熵函数
        • 均方误差损失函数

一、深度前馈神经网络概览

多层感知机(MLP)与深度神经网络(DNN)本质上是相同的模型,在名称上存在差异。
深度 neural 网络(DNN)、卷积 neural 网络(CNN)均属于深度前馈 neural 网络(DFNN)。本节专门阐述全连接 neural 网络的相关知识,后续章节将深入探讨卷积操作的核心组件 CNN。

  • 完全连接的架构中采用了多层感知机(MLP)以及深度前馈神经网络(DNN),其中每个当前层单元都与上一层的所有单元建立联系。
  • 稀疏式连接的设计基于卷积神经网络(CNN)架构,在此方案中仅与其上一层部分神经元产生联系。

网络结构

输入层–隐藏层(非线性激活函数用于解决异或难题)–输出层–处理 layer 采用 softmax 函数将结果转化为 probability distribution –最终 output layer

二、深度神经网络(全连接网络)

1、前向传播计算算法

深度神经网络采用全连接网络结构,采用前向传播计算算法,代码如下

复制代码
    import tensorflow as tf
    
    x = tf.constant([0.9, 0.85], shape=[1, 2])
    
    # 使用随机正态分布函数声明w1和w2两个变量,其中w1是2x3的矩阵,w2是3x1的矩阵
    # 这里使用了随机种子参数seed,这样可以保证每次运行得到的结果是一样的
    w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1), name="w1")
    w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1), name="w2")
    
    # 将biase(偏置项)参数b1设置为初始值全为0的1x3矩阵,b2是初始值全为1的1x1矩阵
    b1 = tf.Variable(tf.zeros([1, 3]))
    b2 = tf.Variable(tf.ones([1]))
    
    init_op = tf.global_variables_initializer()
    
    a = tf.nn.relu(tf.matmul(x, w1) + b1)
    y = tf.nn.relu(tf.matmul(a, w2) + b2)
    with tf.Session() as sess:
    sess.run(init_op)
    print(sess.run(y))
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

解释:
一般权重参数会初始化为随机矩阵,偏置会初始化全为1或者全为0。

2、激活函数(应用于每一个节点从而去线性化)

一般而言,在深度学习中使用激活函数时会遇到以下几种主要选择:其变种包括ELU函数(以及类似Leaky ReLU的其他形式),而ReLU函数则是其中较为基础且广泛应用的一种;tanh函数则以其独特的S型曲线特点而闻名;逻辑门单元(Logistic Unit)则是另一种常用的二分类激活方法。

注:改写过程中遵循以下原则:

  1. 仅对表达方式进行调整
  2. 保持了原文的核心含义
  3. 使用了更丰富的表述方式
  4. 保留了所有数学符号并正确排版
  5. 增加了一些必要的修饰词以提升可读性

Relu

复制代码
    tf.nn.relu(x, name = None)
    
    
      
    
    代码解读

函数形式f(x)=max(0,x)
加入ReLu激活函数的神经元被称为整流线性单元
图像:

在这里插入图片描述

相比Sigmod和ReLu函数,在性能上具有明显优势

Sigmoid

复制代码
    tf.sigmoid(x, name = None)
    
    
      
    
    代码解读

Sigmoid不建议应用于前馈网络中的隐藏单元,因为其会出现饱和现象,导致导数趋于零.函数形式为f(x)=\frac{1}{1+e^{-x}}.随着输入值x趋向负无穷,输出值y趋向于零;随着输入值x趋向正无穷,输出值y趋向于一;当输入值x等于零时,输出值y等于零点五.图像呈现S型曲线特征.

在这里插入图片描述

相较于sigmod函数与Relu函数而言,Sigmoid函数具有优缺点

tanh

复制代码
    tf.tanh(x, name = None)
    
    
      
    
    代码解读

函数形式f(x)=\frac{1-e^{-2x}}{1+e^{-2x}}
图像

在这里插入图片描述

相比sigmod函数与tanh函数

  • 在输入过大或过小的情况下,sigmoid和tanh函数都会表现出相似的行为特征——即输出变化幅度较小(即导数值趋近于零),这会导致权重更新变得缓慢;
    • sigmoid和tanh的主要区别在于它们的输出区间及对称性特点。具体而言,tanh的定义域是全体实数,而其值域为(-1,1),并且该函数关于原点对称。相比于sigmoid,tanh展现出更好的数值特性;
    • 在一般的二分类问题中,通常建议采用tanh作为隐藏层激活函数,并将其与sigmoid结合使用作为输出层激活函数;
    • tanh被定义为双曲正切函数,它的图像与sigmoid曲线具有高度相似之处

ELU

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

3、损失函数

从监督学习的角度来看, 分类问题和回归问题可被划分为两大基本类型. 在监督学习中需设定一个损失函数以衡量预测值与实际值之间的差距, 当该差距较小时则表明模型预测结果与实际数据间的差异较小, 这样的模型具有较高的准确性. 介绍几种常见的损失函数

  • 交叉熵损失函数,常用于分类问题
  • 均方误差损失函数,常用于回归问题

交叉熵函数

用于衡量两个概率向量q(x)和p(x)之间的距离大小的指标反映了两者之间的差异程度;为了确保这一目标的实现,神经网络必须输出一个有效的概率分布向量。

在这里插入图片描述
复制代码
    cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
    
    
      
    
    代码解读

计算均值的操作tf.reduce\_mean()被用于求取数据集上的平均值;为了限制张量数值范围,在深度学习模型中常用tf.clip\_by\_value操作来完成这一目标;对数值取对数的操作tf.log常用于降维处理或特征归一化;在使用交叉熵损失函数前,请确保神经网络输出结果为概率向量形式;常用将tf.nn.softmax\_cross\_entropy\_with\_logits()函数与softmax激活函数结合使用;该函数首先通过softmax将神经网络输出转为概率分布向量;接着应用交叉熵损失函数来衡量预测概率分布q(x)与真实概率分布p(x)之间的差异程度;
softmax操作定义为:给定一个输入向量\mathbf{x}(通常为 logits),softmax操作会将其转换为一个概率分布向量\sigma(\mathbf{x})=[\sigma(x_1), \sigma(x_2), ..., \sigma(x_n)]^T其中\sigma(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}}

在这里插入图片描述

注意;
tf.nn.sparse_softmax_cross_entropy_with_logits更适合于仅有一个标准答案的分类场景。具体实现可以通过以下tensorflow代码演示:

复制代码
    cross_entropy = tf.nn.sorfmax_cross_entropy_with_logits(y_ ,y) 
    
    
      
    
    代码解读

均方误差损失函数

回归模型负责对具体数值进行预测,
神经网络将输出一个预测值,
通常仅包含一个回归节点。
即所设计的网络模型旨在最小化该损失函数。

回归模型负责对具体数值进行预测,
神经网络将输出一个预测值,
通常仅包含一个回归节点。
即所设计的网络模型旨在最小化该损失函数。

在这里插入图片描述

mse=tf.reduce_mean(tf.square(y_-y))

全部评论 (0)

还没有任何评论哟~