TensorFlow 2.0 深度学习实战 —— 详细介绍损失函数、优化器、激活函数、多层感知机的实现原理

前言

AI 人工智能包含了机器学习与深度学习,在前几篇文章曾经介绍过机器学习的基础知识,包括了监督学习和无监督学习,有兴趣的朋友可以阅读《 Python 机器学习实战 》。
而深度学习开始只是机器学习的一分支领域,它更强调从连续的层中进行学习,这种层级结构中的每一层代表不同程序的抽象,层级越高,抽象程度越大。这些层主要通过神经网络的模型学习得到的,最大的模型会有上百层之多。而最简单的神经网络分为输入层,中间层(中间层往往会包含多个隐藏层),输出层。
下面几篇文章将分别从前馈神经网络 FNN、卷积神经网络 CNN、循环神经网络 RNN、编码器等领域进行详细介绍。

目录

一、深度学习简介

二、损失函数

三、Optimizer 优化器

四、激活函数

五、多层感知机 MLP

六、利用 Dropout 进行正则化


一、深度学习简介

1.1 深度学习的起源

AI 人工智能包含了机器学习,而深度学习本属于机器学习的一个分支,它结合了生物神经学的原理,以多层学习模型,将数据层层细化提炼,最后完成输出。如今深度学习已经广泛应用于图像识别、人脸识别、语音识别、搜索引擎、自动驾驶等多个领域。

深度学习强调从连续的层中进行学习,每个层都是通过神经网络的模型来学习得到,神经网络的结构逐层叠加,最后通过输出层完成输出。深度学习的原理本来源于生物神经学,由于受到外界刺激神经元细胞发送信号,从其他神经元接收,多层叠加后形成树状结构,当到某个阈值后转换成激活状态。而深度学习的结构与此类似,原始数据输入后会经过多个隐藏层,每个隐藏层都会存在若干个神经元,最后通过输出层完成输出,层越深所提炼到纯度越高。

1.2 深度学习的工作原理

打个比方在输入层有 n 个参数 X1,X2,.....,Xn,每个参数的取值权重都保存在W1,W2,....,Wn,偏置量都保存于 h1,h2,...,hn,其求和结点值为公式 

当结点值超过某个值时就会引发激活函数 Φ(*) 把数据输出到下一层,周而复始直到输出层。而深度学习的意义在于通过千万个监督数据不断重复学习,从而调整权重与偏置量,使其与监督数据匹配。完成学习后,即使有末经测试的新数据输入,系统也可根据原有的基础进行判断,不断地完善。
区别于传统的数据学习,深度学习的不同在于: 1. 深度学习强调了模型结构的深度,它最少的深度有3层,就是输入层,隐藏层,输出层,而通常会有5层、6层,甚至10多层的隐藏层; 2. 深度明确了特征学习的重要性,通过逐层特征变换,将样本在原空间的特征表示变换到一个新特征空间,从而使特征纯度越来越高,让分类或预测更容易。

1.3 Tensorflow 2.0 简介

用于实现深度学习的框架有很多,常用的有 Tensorflow、Theano、CNTK 等,而在 Tensorflow 1.x 前 Keras 是用 Python 开发的模型库,能兼顾三大平台,在不同的后端运行。当 Tensorflow 2.0 出现后,已经把 Keras 定义为训练模型的一个 API 规范,把它包含到 Tensorflow 2.0 的一个库里,此后使用 Keras 时无需再额外下载 Keras 包。Eager 执行模型也是 Tensorflow 2.0 的一个重要特征,它可以跟 Keras 结合使用,形成一个高性能的流水线执行模式。另外 Tensorflow 2.0 使用函数代替了原来的 session 会话模式,把设计重心放在 Eager 执行模型上。以后在设计模型时无需要再考虑全局变量,占位符 placeholder 等繁琐的细节。Tensorflow 2.0 的应用将在下面几篇文章中一一介绍,敬请留意。

二、损失函数

上一节介绍到,深度学习是通过大量的监督数据进行训练,计算损失函数的最小值从而得出最符合现状的权重与偏移量的。损失函数的公式有很多,最常用的就是均方误差和交叉熵误差两种,关于损失函数的原理在《 Python机器学习实战 —— 监督学习 》中已经深入讲解过,在这章中主要从实用层面进行介绍。

在 Tensoflow 2.0 中可通过 model.compile (optimizer , loss , metrics)  方法绑定损失函数和计算梯度的方法,loss 参数可绑定 tensorflow.keras.losses 中多种已定义的损失函数,常用的 loss 损失函数有下面几种:(当中 yi 为真实值 yi^为预测值)

2.1 mean_squared_error 均方误差

1 def mean_squared_error(y_true, y_pred):
2     return K.mean(K.square(y_pred - y_true), axis=-1)

均方误差是最常用的损失函数,一般用于回归计算

2.2 mean_absolute_error 平均绝对误差

1 def mean_absolute_error(y_true, y_pred):
2     return K.mean(K.abs(y_pred - y_true), axis=-1)

平均绝对误差与均方误差类似,一般用于回归计算,只不过均方误差公式使用的是平方和的平均值,而平均绝对误差则是用绝对值的平均值

2.3 mean_absolute_percentage_error 平均绝对值百分比误差

1 def mean_absolute_percentage_error(y_true, y_pred):
2     diff = K.abs((y_true - y_pred) / K.clip(K.abs(y_true),
3                                             K.epsilon(),
4                                             None))
5     return 100. * K.mean(diff, axis=-1)

平均绝对值百分比误差则是用真实值与预测值的差值比例进行计算的,通常会乘以百分比进行计算,一般用于回归计算。这是销量预测最常用的指标,在实际的线上线下销量预测中有着非常重要的评估意义

2.4 mean_squared_logarithmic_error 对数方差

1 def mean_squared_logarithmic_error(y_true, y_pred):
2     first_log = K.log(K.clip(y_pred, K.epsilon(), None) + 1.)
3     second_log = K.log(K.clip(y_true, K.epsilon(), None) + 1.)
4     return K.mean(K.square(first_log - second_log), axis=-1)

对数方差计算了一个对应平方对数(二次)误差或损失的预估值风险度量,一般用于回归计算。当目标具有指数增长的趋势时, 该指标最适合使用, 例如人口数量, 跨年度商品的平均销售额等。

 2.5 categorical_crossentropy 多类交叉熵

1 def categorical_crossentropy(y_true, y_pred):
2     return K.categorical_crossentropy(y_true, y_pred)

交叉熵主要用于分类算法,当使用交叉熵损失函数时,目标值应该是分类格式 (nb_samples, nb_classes)  (即如果有10个类,输出数据格式应为 [-1,10],每个样本的目标值 nb_class 应该是一个10维的向量 ,这个向量除了表示类别的那个索引为1,其他均为0,类似于 [ [0,0,0,0,1,0,0,0,0,0],[0,1,0,0,0,0,0,0,0,0] , [...] ... ] 数组)。 为了将 整数目标值转换为分类目标值,可以使用 Keras 实用函数 to_categorical(int_labels, num_classes=None)

2.6  sparse_categorical_crossentropy 稀疏交叉熵

1 def sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1):
2     y_pred = ops.convert_to_tensor_v2_with_dispatch(y_pred)
3     y_true = math_ops.cast(y_true, y_pred.dtype)
4     return backend.sparse_categorical_crossentropy(
5         y_true, y_pred, from_logits=from_logits, axis=axis)

SCCE 稀疏多分类交叉熵与 CCE 多分类交叉熵的实现方式相类似,主要用于分类算法,只是目标值输出值格式略有不同,CEE以向量作为输出,而SCEE 则直接转化为索引值进行输出。例如同一组测试数据如果有10个分类CEE 的输出方式是 [-1,10],类似于 [ [0,0,0,0,1,0,0,0,0,0],[0,1,0,0,0,0,0,0,0,0] , [...] ... ] 数组)。而SCCE的输出方式将会是[-1,1],即类似 [ [1],[3],[4],[9] ..... ] 类型的数组。

2.7 binary_crossentropy 二进制交叉熵

def binary_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0):
     y_pred = ops.convert_to_tensor_v2_with_dispatch(y_pred)
    y_true = math_ops.cast(y_true, y_pred.dtype)
    label_smoothing = ops.convert_to_tensor_v2_with_dispatch(
        label_smoothing, dtype=backend.floatx())

    def _smooth_labels():
      return y_true * (1.0 - label_smoothing) + 0.5 * label_smoothing

    y_true = smart_cond.smart_cond(label_smoothing, _smooth_labels,
                                 lambda: y_true)
    return backend.mean(
        backend.binary_crossentropy(
            y_true, y_pred, from_logits=from_logits), axis=-1)

CCE 和 SCCE 主要用于多分类, 而 BCE 更适用于二分类,由于CCE 需要输出 n_class 个通道而 BCE 只需要输出一条通道,所以同一组测试数据往往 BCE 的运行效率会更高。需要注意的是,如果使用BCE损失函数,则节点的输出应介于(0-1)之间,这意味着你必须在最终输出中使用sigmoid激活函数。

2.8 hinge 合页 

1 def hinge(y_true, y_pred):
2     return K.mean(K.maximum(1. - y_true * y_pred, 0.), axis=-1)

它通常用于 "maximum-margin" 二分类任务中,如 SVM 支持向量机。由公式可以看出,使用 hinge 损失函数会使( yi * yi^)>1 的样本损失皆为0,由此带来了稀疏解,使得 svm 仅通过少量的支持向量就能确定最终超平面。关于 SVM 支持向量机模型在 《 Python 机器学习实战 —— 监督学习(下)》中有详细介绍,有兴趣的朋友可以打开链接。

2.9  squared_hinge 平方合页 

1 def squared_hinge(y_true, y_pred):
2       y_pred = ops.convert_to_tensor_v2_with_dispatch(y_pred)
3       y_true = math_ops.cast(y_true, y_pred.dtype)
4       y_true = _maybe_convert_labels(y_true)
5       return backend.mean(
6           math_ops.square(math_ops.maximum(1. - y_true * y_pred, 0.)), axis=-1)

squared_hinge 平方合页损失函数与 hinge 类似,只有取最大值时加上平方值,与常规 hinge 合页损失函数相比,平方合页损失函数对离群值的惩罚更严厉,一般多于二分类计算。

2.10 categorical_hinge 多类合页

1 def categorical_hinge(y_true, y_pred):
2       y_pred = ops.convert_to_tensor(y_pred)
3       y_true = math_ops.cast(y_true, y_pred.dtype)
4       pos = math_ops.reduce_sum(y_true * y_pred, axis=-1)
5       neg = math_ops.reduce_max((1. - y_true) * 
  • 2
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值