TFLearn初探之Activation与Dropout

# Activation

[Activation解释](http://tflearn.org/layers/core/#activation)

[Activation源码](https://github.com/tflearn/tflearn/blob/master/tflearn/layers/core.py)

def activation(incoming, activation='linear', name='activation'):

    """ Activation.
    Apply given activation to incoming tensor.

    Arguments:
        incoming: A `Tensor`. The incoming tensor.
        activation: `str` (name) or `function` (returning a `Tensor`).
            Activation applied to this layer (see tflearn.activations).
            Default: 'linear'.
    """

## Activation解释

激活函数(Activation Function)运行时激活神经网络中某一部分神经元,将激活信息向后传入下一层的神经网络。神经网络的数学基础是处处可微的,所以选取激活函数要保证数据输入与输出也是可微的。

### 激励函数的作用

如果不使用激活函数,此时激活函数本质上相当于f(x)=ax+b。这种情况先,神经网络的每一层输出都是上层输入的线性函数。不难看出,不论神经网络有多少层,输出与输入都是线性关系,与没有隐层的效果是一样的,这个就是相当于是最原始的感知机(Perceptron)。至于感知机,大家知道其连最基本的异或问题都无法解决,更别提更复杂的非线性问题。

神经网络之所以能处理非线性问题,这归功于激活函数的非线性表达能力

### TFLearn官方提供的激活函数:

[Activation Functions](https://www.tensorflow.org/api_guides/python/nn#activation-functions)

***sigmoid函数***

被称为S型函数,它可以将整个实数区间映射到(0,1)区间,因此经常被用来计算概率,它也是在传统神经网络中被经常使用的一种激活函数。

优点:它输出映射在(0,1)内,单调连续,非常适合用作输出层,并且求导比较容易;

缺点:具有软饱和性,一旦输入落入饱和区,一阶导数就变得接近于0,很容易产生梯度消失。

饱和性:当|x|>c时,其中c为某常数,此时一阶导数等于0,通俗的说一阶导数就是上图中的斜率,函数越来越水平。

 

sigmoid函数的用法如下:


g = tflearn.input_data(shape=[None, 1])
g = tflearn.fully_connected(g, 128, activation='linear')
g = tflearn.fully_connected(g, 128, activation='linear')
g = tflearn.fully_connected(g, 1, activation='sigmoid')
g = tflearn.regression(g, optimizer='sgd', learning_rate=2.,
                       loss='mean_square')

sigmoid函数的优点:

在x=5的点和x=10的点原本相差很远(10-5=5)的点,在激活之后,也就是x=5和x=10对应的y坐标的值,相差的不大。比如说有一个噪声误差,在x=1000处,其他的点都分布在x=5到x=10之间,那么sigmoid的函数就可以很好的去掉这种误差带来的影响。

 

 

***tanh***

双曲正切函数,它将整个实数区间映射到了(-1,1),tanh函数也具有软饱和性。它的输出是以0为中心,tanh的收敛速度比sigmoid要快,由于存在软饱和性,所以tanh也存在梯度消失的问题。

***relu激活函数***

现在是最受欢迎的激活函数,经常被使用在神经网络中。relu函数的定义:f(x)=max(x,0)

在TensorFlow中还包括了relu函数的扩展函数如:relu6和crelu,除此之外还有leaky relu、PRelu、RRelu等。

  • relu6激活函数:定义min(max(features,0),6),也就是说它的取值区间被限定在了[0,6]之间。

***softmax函数***

[Softmax 函数的特点和作用](https://www.cnblogs.com/liuyu124/p/7332476.html)

softmax 是一个不错的激活函数。通过取每个元素的指数,然后归一化向量(使用任意的范数(norm),比如向量的普通欧几里得距离)从而将 softmax 应用于向量。

我们先来直观看一下,Softmax究竟是什么意思

我们知道max,假如说我有两个数,a和b,并且a>b,如果取max,那么就直接取a,没有第二种可能

但有的时候我不想这样,因为这样会造成分值小的那个饥饿。所以我希望分值大的那一项经常取到,分值小的那一项也偶尔可以取到,那么我用softmax就可以了 现在还是a和b,a>b,如果我们取按照softmax来计算取a和b的概率,那a的softmax值大于b的,所以a会经常取到,而b也会偶尔取到,概率跟它们本来的大小有关。所以说不是max,而是 softmax 那各自的概率究竟是多少呢,我们下面就来具体看一下,

S_i = \frac{e^{V_i}}{\sum_j{e^{V_j}}}

也就是说,是该元素的指数,与所有元素指数和的比值

这个定义可以说非常的直观,当然除了直观朴素好理解以外,它还有更多的优点

 

***dropout函数***

dropout函数会以一个概率为keep_prob来决定神经元是否被抑制。如果被抑制,该神经元输出为0,如果不被抑制则该神经元的输出为输入的1/keep_probbe倍,每个神经元是否会被抑制是相互独立的。神经元是否被抑制还可以通过调节noise_shape来调节,当noise_shape[i] == shape(x)[i],x中的元素是相互独立的。如果shape(x)=[k,l,m,n](k表示数据的个数,l表示数据的行数,m表示数据的列,n表示通道),当noise_shape=[k,1,1,n],表示数据的个数与通道是相互独立的,但是与数据的行和列是有关联的,即要么都为0,要么都为输入的1/keep_prob倍。

dropout函数对于机器学习中是非常常用的,因此会单独提取出来讨论。

## 常见激活函数优缺点比较

[激活函数的比较和优缺点,sigmoid,tanh,relu](https://blog.csdn.net/u011684265/article/details/78039280)

  • Sigmoid实现简单、计算量小。----缺点:函数梯度饱和、收敛缓慢。
  • tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。-----缺点:与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好。
  • ReLU得到的 SGD 的收敛速度会比 sigmoid/tanh 快很多。-----缺点:训练的时候很”脆弱”,很容易就”die”了
    例如,一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元的梯度就永远都会是 0. 如果 learning rate 很大,那么很有可能网络中的 40% 的神经元都”dead”了。
  • Softmax 的特点 1)单侧抑制。 2)相对宽阔的兴奋边界。 3)稀疏激活性。softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。

## 使用场景

一般二分类问题中,隐藏层用tanh函数,输出层用sigmod函数。

多分类神经网络输出通常使用softmax

tanh在特征相差明显时的效果会很好 在循环过程中会不断扩大特征效果

ReLU用于隐层神经元输出

 

# Dropout

[Dropout解释](http://tflearn.org/layers/core/#dropout)

[Activation源码](https://github.com/tflearn/tflearn/blob/master/tflearn/layers/core.py)

def dropout(incoming, keep_prob, noise_shape=None, name="Dropout"):
    """ Dropout.
    Outputs the input element scaled up by `1 / keep_prob`. The scaling is so
    that the expected sum is unchanged.

    By default, each element is kept or dropped independently. If noise_shape
    is specified, it must be broadcastable to the shape of x, and only dimensions
    with noise_shape[i] == shape(x)[i] will make independent decisions. For
    example, if shape(x) = [k, l, m, n] and noise_shape = [k, 1, 1, n], each
    batch and channel component will be kept independently and each row and column
    will be kept or not kept together.

    Arguments:
        incoming : A `Tensor`. The incoming tensor.
        keep_prob : A float representing the probability that each element
            is kept.
        noise_shape : A 1-D Tensor of type int32, representing the shape for
            randomly generated keep/drop flags.
        name : A name for this layer (optional).
    """

## Dropout解释

**Droptout定义**

1. Dropout是TensorFlow里面为了防止或减轻过拟合而使用的函数,它一般用在全连接层

2. dropout 是训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。

**Dropout特征”

解决了两个大规模神经网络的问题: 

- 费时

- 容易过拟合

[拟合问题、优化器](https://blog.csdn.net/m0_37870649/article/details/79305205)

过拟合是很多机器学习的通病,过拟合了,得到的模型基本就废了。而为了解决过拟合问题,一般会采用ensemble方法,即训练多个模型做组合,此时,费时就成为一个大问题,不仅训练起来费时,测试起来多个模型也很费时。总之,几乎形成了一个死锁。

Dropout的出现很好的可以解决这个问题,每次做完dropout,相当于从原始的网络中找到一个更瘦的网络。因而,对于一个有N个节点的神经网络,有了dropout后,就可以看做是2n个模型的集合了,但此时要训练的参数数目却是不变的,这就解脱了费时的问题。这个思想可以参考染色体的减数分裂与基因重组,从而增强后代的适应能力。

使用Dropout后,模型的收敛速度变慢,准确率上升的速度慢。那么为什么还要使用Dropout呢?通过对比两次的测试准确率和训练准确率,可以看到,没有使用Dropout的方法测试准确率和训练准确率相差比较大,这就是过拟合的问题,使用了Dropout就可以进行优化。另外,本部分提供的例子并没有很好的体现出Dropout的优势,两者的准确率的对比不明显,如果使用大型卷积神经网络进行样本训练,结果会更明显。

参考:

[dropout防止过拟合](https://blog.csdn.net/huahuazhu/article/details/73649389)

[如何理解dropout?](https://blog.csdn.net/zeuseign/article/details/72742579)

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值