Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解

  • 常用激活函数
    • Sigmoid 激活函数
    • Tanh 激活函数
    • ReLU 激活函数
    • 线性激活函数
    • Softmax 激活函数
  • 损失函数
    • 均方误差
    • 平均绝对误差
    • 分类交叉熵
  • 系列链接

常用激活函数

使用激活函数可以实现网络的高度非线性,这对于建模输入和输出之间的复杂关系非常关键。如果没有非线性激活函数,那么该网络将仅仅能够表达简单的线性映射,即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的,只有加入了非线性激活函数之后,深度神经网络才具备了令人惊异的非线性映射学习能力。 可以在网络中的多个层中应用激活函数。

Sigmoid 激活函数

sigmoid 是使用范围最广的一类激活函数,其取值范围为 [0, 1],它可以将一个实数映射到 [0, 1] 的区间,可以将其用于二分类问题。

Sigmoid 函数公式定义如下所示:

sigmoid(x)=11+e−xsigmoid(x)=\frac 1 {1+e^{-x}}sigmoid(x)=1+e−x1​

使用 Python 实现此函数:

def sigmoid(x):return 1/(1+np.exp(-x))

函数图像如下所示,可以看到函数的形状如 S 曲线,因此也称为 S 型生长曲线:

  • sigmoid 函数优点:平滑、易于求导。
  • sigmoid 函数缺点:反向传播求导涉及除法,因此计算量大;反向传播时,很容易就会出现梯度消失的情况,从而限制了深层网络的训练。

Tanh 激活函数

Tanh 是双曲函数的一种,其是 Sigmoid 激活函数的改进,是以零为中心的对称函数,其取值范围为 [-1, 1]Tanh 激活函数计算公式如下:
tanh(x)=ex−e−xex+e−x=2sigmoid(2x)−1tanh(x) =\frac {{e^x} -e^{-x}} {{e^x} +e^{-x}}=2sigmoid(2x)-1 tanh(x)=ex+e−xex−e−x​=2sigmoid(2x)−1
使用 Python 实现此函数:

def tanh(x):return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))

函数图像如下所示,它在开区间 (-1, 1) 内是单调递增的奇函数,函数图形关于原点对称:

  • tanh 函数优点:tanh 函数是 sigmoid 函数的改进,收敛速度快,不易出现 loss 值晃动。

  • tanh 函数缺点:无法解决梯度弥散的问题,函数的计算量同样是指数级的,计算相对复杂。

ReLU 激活函数

修正线性单元 (Rectified Linear Units, ReLU) 激活函数是 sigmoidtanh 激活函数的完美替代激活函数,是深度学习领域最重要的突破技术之一。ReLU 激活函数计算公式如下:

relu(x)={0,x<0x,x≥0relu(x) = \begin{cases} 0, & {x<0} \\ x, & {x\ge0} \end{cases} relu(x)={0,x,​x<0x≥0​
使用 Python 实现此函数:

def relu(x):return np.where(x>0, x, 0)

函数图像如下所示,当输入值 大于等于 0 时,则 ReLU 函数按原样输出。如果输入小于 0,则 ReLU 函数值为 0。因为 ReLU 函数的大于等于 0 的线性分量具有固定导数,而对另一个线性分量导数为 0。因此,使用 ReLU 函数训练模型要快得多。

  • ReLU 函数优点:不存在梯度消失问题,计算成本很低,收敛速度比 sigmoidtanh 函数快得多。
  • ReLU 函数缺点:当梯度值过大时,其权重更新后为负数,在 ReLU 函数中导数恒为零,导致后面的梯度也不再更新,也被称为 dying ReLU 问题。

线性激活函数

线性激活的输出是输入值本身,按原样输出输入值:
linear(x)=xlinear(x) = xlinear(x)=x
使用 Python 实现此函数:

def linear(x):return x


该函数仅用于解决回归问题的神经网络模型的输出层,注意不能在隐藏层中使用线性激活函数。

Softmax 激活函数

通常,softmax 在神经网络输出最终结果前使用。通常使用 softmax 是为了确定输入在给定场景中属于 n 个可能的输出类别之一的概率。假设我们正在尝试将数字图像分类为可能的 10 类(数字从0到9)之一。在这种情况下,有 10 个输出值,其中每个输出值代表输入图像属于某个类别的概率。Softmax 激活函数计算公式如下:

softmax(xi)=ei∑j=0Nejsoftmax(x_i)=\frac {e^i} {\sum _{j=0} ^N e^j}softmax(xi​)=∑j=0N​ejei​

softmax 激活用于为输出中的每个类别提供一个概率值,其中 iii 表示输出的索引。使用 Python 实现此函数:

def softmax(x):return np.exp(x) / np.sum(np.exp(x))

softmax 函数一般作为神经网络的最后一层,接受来自上一层网络的输入值,然后将其转化为概率。例如我们要识别一张图片,其可能的标签为 [apple, banana, lemon, pear],则网络最后一层值 [1.0, 2.0, 3.0, 4.0] 经过 softmax 函数后输出为 [0.0320586, 0.08714432, 0.23688282, 0.64391426]

损失函数

利用损失函数计算损失值,模型就可以通过反向传播去更新各个参数,通过降低真实值与预测值之间的损失,使得模型计算得到的预测值趋近于真实值,从而达到模型训练的目的,在构建神经网络时通常使用的损失函数如下。损失函数需要为非负实值函数。

均方误差

误差是网络输出的预测值与实际值之差。我们对误差取平方,是因为误差可以是正值或负值。平方确保正误差和负误差不会相互抵消。我们计算均方误差 (Mean Square Error, MSE),以便当两个数据集的大小不相同时,它们间的误差是可比较的。预测值 (p) 和实际值 (y) 之间的均方误差计算如下:
mse(p,y)=1n∑i=1n(p−y)2mse(p,y)=\frac 1 n \sum _{i=1} ^n(p-y)^2mse(p,y)=n1​i=1∑n​(p−y)2

使用 Python 实现此函数:

def mse(p, y):return np.mean(np.square(p - y))

当神经网络需要预测连续值时,通常使用均方误差。

平均绝对误差

平均绝对误差 (Mean Absolute Error, MSE) 的工作方式与均方误差非常相似。平均绝对误差通过对所有数据点上的实际值和预测值之间的绝对差值取平均值,从而确保正误差和负误差不会相互抵消。预测值 (p) 和实际值 (y) 之间的平均绝对误差的实现方式如下:
mse(p,y)=1n∑i=1n∣p−y∣mse(p,y)=\frac 1 n \sum _{i=1} ^n|p-y|mse(p,y)=n1​i=1∑n​∣p−y∣
使用 Python 实现此函数:

def mae(p, y):return np.mean(np.abs(p - y))

与均方误差相似,平均绝对误差通常用于连续变量值的预测。

分类交叉熵

交叉熵是对两种不同分布(实际分布和预测分布)之间差异的度量。与上述两个损失函数不同,它被广泛用于离散值输出数据。两种分布之间的交叉熵计算如下:

−(ylog2p+(1−y)log2(1−p))-(ylog_2p+(1-y)log_2(1-p))−(ylog2​p+(1−y)log2​(1−p))

yyy 是实际结果,ppp 是预测结果。预测值 (p) 和实际值 (y) 之间的分类交叉熵的 python 实现方式如下:

def categorical_cross_entropy(p, y):return -np.sum((y*np.log2(p) + (1-y)*np.log2(1-p)))

当预测值远离实际值时,分类交叉熵损失具有较高的值,而当与实际值接近时,分类交叉熵损失具有较低的值。

系列链接

Keras深度学习实战(1)——神经网络基础与模型训练过程详解
Keras深度学习实战(2)——使用Keras构建神经网络
Keras深度学习实战(3)——神经网络性能优化技术详解

Keras深度学习实战(4)——深度学习中常用激活函数和损失函数详解相关推荐

  1. java开发中常用的Git命令详解

    java开发中常用的Git命令详解(IDEA内如何操作) 一:写这篇文章的目的是什么? 二:使用场景在哪里? 1:当我们要使用idea去git仓库拉代码时,首先我们的idea得配置git工具 2:项目 ...

  2. caffe中常用层: BatchNorm层详解

    Batchnorm原理详解 前言:Batchnorm是深度网络中经常用到的加速神经网络训练,加速收敛速度及稳定性的算法,可以说是目前深度网络必不可少的一部分.  本文旨在用通俗易懂的语言,对深度学习的 ...

  3. 机器学习、深度学习中常用的优化算法详解——梯度下降法、牛顿法、共轭梯度法

    一.梯度下降法 1.总述: 在机器学习中,基于基本的梯度下降法发展了三种梯度下降方法,分别为随机梯度下降法,批量梯度下降法以及小批量梯度下降法. (1)批量梯度下降法(Batch Gradient D ...

  4. Windows学习总结(10)——Windows系统中常用的CMD命令详解

    1.ping命令 ping是电脑网络故障诊断中的常用的命令,它的作用是用来检查网络是否通畅或者网络连接速度.我们来看一下PING命令的具体表述. 日常的诊断过程中我们最常用到的就是诊断连接是否通畅.

  5. Nginx中常用的指令配置详解

    rewrite指令的作用:是做一些访问匹配规则的判断,从而实现相应的操作. location / { proxy_pass http://192.168.1.5 if (-d $request_fil ...

  6. Linux ❉ 文件目录中常用命令 pwd / ls 详解

    一 pwd命令:显示当前路径 由于 Linux 文件系统中有许多目录,当用户执行一条 Linux 命令又没有指定该命令或参数所在的目录时,Linux 系统就会首先在当前目录(目前的工作目录)搜寻这个命 ...

  7. Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏

    Keras深度学习实战--使用深度Q学习进行SpaceInvaders游戏 0. 前言 1. 问题与模型分析 2. 使用深度 Q 学习进行 SpaceInvaders 游戏 相关链接 0. 前言 在& ...

  8. 深度学习之图像分类(十七)-- Transformer中Self-Attention以及Multi-Head Attention详解

    深度学习之图像分类(十七)Transformer中Self-Attention以及Multi-Head Attention详解 目录 深度学习之图像分类(十七)Transformer中Self-Att ...

  9. 深度学习之图像分类(二十五)-- S2MLPv2 网络详解

    深度学习之图像分类(二十五)S2MLPv2 网络详解 目录 深度学习之图像分类(二十五)S2MLPv2 网络详解 1. 前言 2. S2MLPv2 2.1 S2MLPv2 Block 2.2 Spat ...

最新文章

  1. 无废话-SQL Server 2005新功能(1) - TSQL
  2. python 操作txt 写入列表
  3. 分布式表格系统Google Bigtable详解
  4. java isempty_Java ArrayDeque isEmpty()方法与示例
  5. versions-maven-plugin插件批量修改版本号
  6. python 代码替换_用Python将绝对URL替换成相对URL的代码
  7. (转)C#中的委托(Delegate)和事件(Event)
  8. 轻便的客户端本地文件数据库 SQLite
  9. pureftp在企业中的应用及配置
  10. Java中将List转成逗号数组的方案
  11. 用python写WordCount的MapReduce代码
  12. Ext.grid.EditorGridPanel点击单元格改变数据,动态添加列
  13. Python制作某电商平台商品竞拍脚本,能自动定时、抢拍、购买
  14. nginx的安装以及简单代理域名
  15. java海贼王_Java 学以致用--为我的海贼王统一命名
  16. webp动图转gif
  17. Elastic Job学习笔记
  18. c++错误:Process returned -1073741571 (0xC00000FD)
  19. 小数分频器vhdl实现_基于FPGA的小数分频器的设计与实现.doc
  20. fir.im Weekly - Mobile developer 利器分享 1

热门文章

  1. 在配置文件web.xml中配置Struts2的启动信息
  2. java中如何将string 转化成long
  3. String和包装类Integer\Double\Long\Float\Character 都是final类型
  4. 亲和数[HDU2040]
  5. 关于sliverlight4 打印功能
  6. BugFree在Windows Server 2003+IIS 6+MySQL的配置
  7. 狼来了!中国房地产的实质--比喻太生动了
  8. [转载] Python学习笔记——用装饰器decorator和Memoization记忆化提高效率,原理讲清楚了
  9. ByteToByte64String、Base64StringToBytes
  10. Asp.Net中OnClientClick与OnClick