文档章节

深度学习的核心——分类器的选择

nextowang
 nextowang
发布于 2017/05/12 17:39
字数 2676
阅读 1757
收藏 1

Tensorflow的激活函数

深度神经网络的激活操作提供了三种不同类型的非线性函数

  1. 平滑的非线性(sigmoid,tanh,elu,softplus和softsign)
  2. 连续但不是每个地方可区分的函数(relu,relu6,crelu和relu_x)
  3. 随机正则化(dropout)

常用的激活函数有sigmoid,relu和dropout

sigmoid

以监督学习为例,假设我们有训练样本集,那么神经网络算法能够提供一种复杂且非线性的假设模型 ,它具有参数,可以以此参数来拟合我们的数据。sigmoid函数作为激活函数

可以看出,这个单一“神经元”的输入-输出映射关系其实就是一个逻辑回归(logistic regression)也可以选择双曲正切函数(tanh)

relu:
Relu激活函数(The Rectified Linear Unit)表达式为:

第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失,从而无法完成深层网络的训练。第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生 
dropout:
假设我们要训练这样一个神经网络,输入是x输出是y,正常的流程是:我们首先把x通过网络前向传播然后后把误差反向传播以决定 如何更新参数让网络进行学习。使用dropout之后过程变成:

  1. 首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变.
  2. 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后就按照随机梯度下降法更新(没有被删除的神经元)对应的参数(w,b)。
  3. 然后继续重复这一过程:恢复被删掉的神经元(此时 被删除的神经元 保持原样,而没有被删除的神经元已经有所更新)。从隐藏神经元中随机选择一个一半大小的子集 临时删除掉(备份被删除神经元的参数)。对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b)(没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)
  4. 不断重复这一过程。 

Tensorflow 分类回归模型

深度神经网络也提供了Softmax回归模型的分类操作,Softmax回归模型是logistic回归模型在多分类问题上的推广,在多分类问题中,类标签 y 可以取两个以上的值。Softmax回归是有监督的。在 logistic 回归中,我们的训练集由 m 个已标记的样本构成:,其中输入特征,(我们对符号的约定如下:特征向量 x 的维度为 n+1,其中 x0 = 1 对应截距项 ) 由于 logistic 回归是针对二分类问题的,因此类标记假设函数(hypothesis function) 如下:

我们将训练模型参数,使其能够最小化代价函数 :

在 softmax回归中,我们解决的是多分类问题(相对于 logistic 回归解决的二分类问题),类标 y 可以取 k 个不同的值(而不是 2 个)。
对于给定的测试输入 x,我们想用假设函数针对每一个类别j估算出概率值 p(y=j | x)。也就是说,我们想估计 x 的每一种分类结果出现的概率。因此,我们的假设函数将要输出一个 k 维的向量(向量元素的和为1)来表示这 k 个估计的概率值。 具体地说,我们的假设函数  形式如下:

其中是模型的参数。请注意这一项对概率分布进行归一化,使得所有概率之和为 1 。

Tensorflow Cross Entropy(交叉熵)

在信息论中,如果编码方案是编码方案,则在相同的底层事件集上的两个概率分布 p 和 q 之间的交叉熵测量识别从集合中提取的事件所需的平均比特数 使用它被优化为“非自然”概率分布 q,而不是“真实”分布 p,其表达式为:

TensorFlow本身也提供了多种交叉熵算法的实现。TensorFlow针对分类问题,实现了四个交叉熵函数,分别是:

  1. sigmoid_cross_entropy_with_logits
  2. softmax_cross_entropy_with_logits
  3. sparse_softmax_cross_entropy_with_logits
  4. weighted_sigmoid_cross_entropy_with_logits

sigmoid_cross_entropy_with_logits

TensorFlow最早实现的交叉熵算法。这个函数的输入是logits和targets,logits就是神经网络模型中的 W * X矩阵,注意不需要经过sigmoid,而targets的shape和logits相同,就是正确的label值,例如这个模型一次要判断100张图是否包含10种动物,这两个输入的shape都是[100, 10]。注释中还提到这10个分类之间是独立的、不要求是互斥,这种问题我们称为多目标。

softmax_cross_entropy_with_logits

Softmax本身的算法很简单,就是把所有值用e的n次方计算出来,求和后算每个值占的比率,保证总和为1,一般我们可以认为Softmax出来的就是confidence也就是概率,softmaxcrossentropywithlogits和sigmoidcrossentropywithlogits很不一样,输入是类似的logits和lables的shape一样,但这里要求分类的结果是互斥的,保证只有一个字段有值,例如CIFAR-10中图片只能分一类而不像前面判断是否包含多类动物。在函数头的注释中我们看到,这个函数传入的logits是unscaled的,既不做sigmoid也不做softmax,因为函数实现会在内部更高效得使用softmax,对于任意的输入经过softmax都会变成和为1的概率预测值,这个值就可以代入变形的Cross Entroy算法- y * ln(a) - (1 - y) * ln(1 - a)算法中,得到有意义的Loss值了。如果是多目标问题,经过softmax就不会得到多个和为1的概率,而且label有多个1也无法计算交叉熵,因此这个函数只适合单目标的二分类或者多分类问题。

sparse_softmax_cross_entropy_with_logits

sparse_softmax_cross_entropy_with_logits是softmax_cross_entropy_with_logits的易用版本,除了输入参数不同,作用和算法实现都是一样的。前面提到softmax_cross_entropy_with_logits的输入必须是类似onehot encoding的多维特征,但CIFAR-10、ImageNet和大部分分类场景都只有一个分类目标,label值都是从0编码的整数,每次转成onehot encoding比较麻烦,用sparse_softmax_cross_entropy_with_logits,它的第一个参数logits和前面一样,shape是[batch_size, num_classes],而第二个参数labels以前也必须是[batchsize, numclasses]否则无法做Cross Entropy,这个函数改为限制更强的[batch_size],而值必须是从0开始编码的int32或int64,而且值范围是[0, num_class),如果我们从1开始编码或者步长大于1,会导致某些label值超过这个范围,代码会直接报错退出。如果用户已经做了onehot encoding那可以直接使用不带“sparse”的sparse_softmax_cross_entropy_with_logits函数

weighted_sigmoid_cross_entropy_with_logits

weighted_sigmoid_cross_entropy_with_logits是sigmoid_cross_entropy_with_logits的拓展版,输入参数和实现和后者差不多,可以多支持一个pos_weight参数,目的是可以增加或者减小正样本在算Cross Entropy时的Loss。实现原理很简单,在传统基于sigmoid的交叉熵算法上,正样本算出的值乘以某个系数接口。

Tensorflow Optimizer

如下图所示为用MNIST数据训练的不同Optimizer的比较

MomentumOptimizer:如果梯度下降是沿着一个陡峭的山谷向下游的山谷,那么它往往会从一个谷墙发展到另一个山谷,而不会在山谷上进行许多进展。这是因为最大的梯度在山谷上下,而沿着地面的坡度相当小。动量优化尝试通过跟踪先前的梯度来纠正这一点,并且如果它们不断改变方向,然后阻止它们,并且如果梯度保持相同的方向然后奖励它们。这样,谷壁梯度减小,谷底梯度增强。
AdagradOptimizer:Adagrad被优化为在干草堆中找到针头并处理大型稀疏矩阵。它跟踪以前的变化,并将放大不常更改的权重的变化,并抑制频繁变化的权重的变化。
AdadeltaOptimizer:Adadelta是Adagrad的扩展,只能记住以前更改的固定大小窗口。这使得算法比纯Adagrad的攻击性更差。
AdamOptimizer:自适应力矩估计(Adam)保持每个权重的单独学习速率以及先前梯度的指数衰减平均值。这将Momentum和Adagrad的元素结合在一起,并且具有相当高的记忆效率,因为它不会保留任何东西的历史(仅滚动平均值)。它被认为对于稀疏矩阵和噪声数据都很好地工作。
FtrlOptimizer:Ftrl-Proximal是为广告点击预测开发的,它们具有数十亿的维度,因此巨大的权重矩阵非常稀疏。这里的主要特点是保持接近零的权重为零,因此可以跳过和优化计算。
RMSPropOptimizer:RMSprop与Adam类似,它只是使用不同的移动平均线,但具有相同的目标。

 

 

© 著作权归作者所有

nextowang
粉丝 1
博文 7
码字总数 12120
作品 0
西安
程序员
私信 提问
【机器学习PAI实战】—— 玩转人工智能之综述

模型训练与在线预测服务、推荐算法四部曲、机器学习PAI实战、更多精彩,尽在开发者分会场 【机器学习PAI实战】—— 玩转人工智能之商品价格预测 【机器学习PAI实战】—— 玩转人工智能之你最...

迷你芊宝宝
03/21
12
0
一文读懂人工智能、机器学习、深度学习、强化学习的关系(必看)

近些年,人工智能的热度都维持在一定的高度。从Google AlphaGo到Chatbot聊天机器人、智能理专、精准医疗、机器翻译等,人工智能技术被应用于安防、医疗、家居、交通、智慧城市等各行各业,其...

悠悠啊
02/14
0
0
机器学习实战篇——用支撑向量算法在Kaggle上跑个分

之前写了关于人工智能和机器学习的理论基础文章,今天就理论联系实际,用机器学习算法跑个分。 机器学习最重要的就是数据,Kaggle平台提供了大量数据为机器学习的学习者和研究者提供一个跑分...

Hongtao洪滔
2018/06/18
0
0
数据挖掘十大算法以及scikit-learn算法选择图

1. C4.5 C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3算法. C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1) 用信息增益率来选择属性,克服了用信息...

kwame211
2018/05/16
0
0
AI学习笔记——End-to-End(端到端)的深度学习

1. 什么是End-to-End 学习 要知道什么是End-to-End学习首先要知道传统的非End-to-End学习是什么。以语义分类(判断评论为正面评论还是负面评论)为例,非End-to-End的学习需要对语音识别之前...

Hongtao洪滔
2018/07/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sync.Mutex 互斥锁

说明: 互斥锁用来保证在任一时刻,只能有一个例程访问某对象。Mutex 的初始值为解锁状态。Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。Mutex 可...

李琼涛
8分钟前
2
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
11分钟前
2
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
13分钟前
2
0
事假杨晨龙(Z16021)月薪请假单

svn co URL --username xxx-- password yyy ./

桃花飞舞
36分钟前
3
0
当Activity关闭后,网络请求回调的处理

当我们在使用网络请求的时候,一般都是通过回调来获取请求到的数据。对于网络请求的回调需要注意的几个点 比如我们的回调在Activity中处理数据,当我们把Activity关闭后,如果获取到数据时,...

shzwork
37分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部