IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 深度学习知识总结——3. 激活函数与非线性输出(Activation function and Nonlinear Output) -> 正文阅读

[人工智能]深度学习知识总结——3. 激活函数与非线性输出(Activation function and Nonlinear Output)

在前面的章节里,分别介绍了声名远扬的梯度下降算法,计算图,以及反向传播。现在我们要思考这样一个问题。对于 y = a x + b y = ax +b y=ax+b这样一个线性模型来说,无论x有多复杂,都无法改变它线性输出的特点。
线性模型对于线性问题的求解是可行,但是我们需要用倒神经元网络的实际应用场景来说,有很多是无法直接套用线性模型来求解的。举个例子来说,对于分类问题,就无法很好的依靠线性模型进行求解。
所以,为了解决这个问题,就有科学家提出在每一层神经元的输出上,根据需要套一个激活函数,从而破坏神经元的线性结构,使它有求解非线形问题的能力。

关于激活函数与非线性输出

首先,我们先弄清楚一个问题。在实际的应用场景中输入的参数可能有多个,比如以经典的机器学习样本集鸢尾花为例

在这里插入图片描述
每个样本就最少包含4个基本属性(Features),以及对鸢尾花的分类(Class label)。由于实际生活中,很多问题不是非黑即白的,具有一定的模糊空间。例如,对于温水和热水,37度如果觉得还算温水,那么38度呢,39度呢。

在这里插入图片描述
而对于我们的数据集鸢尾花也有这样的情况。

在这里插入图片描述
这张图是关联性分析,可以看到在以萼片、花瓣大小进行分析品种时,会有“粘黏”的情况。所以可以知道如果线性的对数据进行类别判定,会出现非常大的偏差。所以我们需要对模型进行适当的“弯折”,让它的输出不要那么过于线性。

所以,使用激活函数的目的,就是为了影响计算图每一层的输出,打破输出值与输入参数之间的线性关系。你可以理解为在每一层的输出过程中加入一点“玄学”的元素。

在线性模型上增加激活函数

在这里插入图片描述
如果说原来的线性计算模型是这样的:

Created with Rapha?l 2.2.0 随机输入权重 向前传播并更新参数 损失函数->符合期望? 输出权重 向后传播并更新权重 yes no

那么增加了激活函数的模型就变成了这样:

Created with Rapha?l 2.2.0 随机输入权重 向前传播并更新参数 通过激活函数映射到新函数空间 损失函数->符合期望? 输出权重 向后传播并更新权重 yes no

由于激活函数的存在,使得输出不再是简简单单的线性输出,你不必担心由于新增了激活函数后,导致原模型中梯度的消失。事实上你可以类比一下 normalize 这种操作(在图形图像上很常见,比如把原始数据转换成浮点后经过滤波等操作后,为了可视化,需要把处理后的数据重新映射到[0, 255]的区间),梯度经过新函数变换后依然保留。

那么我们常用的激活函数有哪些呢?

常见的几个激活函数

Sigmoid 函数

严格来说,Sigmoid函数不止一个,任何符合 σ ( x ) = 1 1 + e ? x \sigma(x) = \frac{1}{1+ e^{-x}} σ(x)=1+e?x1?函数图像的,都可以被归类为Sigmoid函数,这是一种经常被用来做 0-1 分类问题的函数。

在这里插入图片描述

其函数式写为:

σ ( x ) = 1 1 + e ? x \sigma(x) = \frac{1}{1+ e^{-x}} σ(x)=1+e?x1?

除它之外,还有比较相似的tanh函数,其输出图像是:

在这里插入图片描述
这一类的都是Sigmoid函数家族,但是一般提到Sigmoid,一般指的就是老大哥 σ ( x ) = 1 1 + e ? x \sigma(x) = \frac{1}{1+ e^{-x}} σ(x)=1+e?x1?了。

这类函数的优点:

在于它可导,并且值域在有限范围区间,如 [0, 1],可以使神经元的输出标准化。

缺点:

  • 容易导致梯度消失:例如它的函数值在趋近 0 和 1 的时候函数值会变得平坦,梯度趋近于 0。
  • 不以零为中心:函数的输出恒为正值,不是以零为中心的,这会导致权值更新时只能朝一个方向更新,从而影响收敛速度。
  • 计算成本高昂:exp() 函数与其他非线性激活函数相比,计算成本高昂。
  • 梯度爆炸:x值在趋近0的左右两边时,会造成梯度爆炸情况。

tanh 函数

属于Sigmoid函数的一种,但是和老大哥所不同,它的取值范围是 [-1, 1]
在这里插入图片描述
其函数式为:

σ ( x ) = e x ? e ? x e x + e ? x \sigma(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} σ(x)=ex+e?xex?e?x?

缺点和Sigmoid函数一样,但是优点是解决了Sigmoid只能在[0, 1]之间的问题,其取值范围是[-1 , 1]

ReLu 函数

有些地方叫它整流函数,它可以对神经元输出进行有针对性的数据过滤作用。比方说,数据经过一定的处理后,输出的值包含符号为正的有效数据和符号为负的噪音数据,为了避免噪音数据输入到下一层的网络,所以可以使用这个函数,过滤需要的数据。

从函数图像上看,它是分段函数,基本的ReLu函数的函数式表达为:

σ ( x ) = { 0 x < 0 x x ≥ 0 \sigma(x) =\left\{\begin{matrix} 0 & x < 0\\ x & x \geq 0\\ \end{matrix}\right. σ(x)={0x?x<0x0?

当然,这个方向并不固定,根据需要也可以反过来,例如

σ ( x ) = { 0 x > 0 x x ≤ 0 \sigma(x) =\left\{\begin{matrix} 0 & x > 0\\ x & x \leq 0\\ \end{matrix}\right. σ(x)={0x?x>0x0?
在这里插入图片描述
常见的是最左侧的。但是有时候总有人想适当放一些另外一侧的数据,所以提出了其他的改进形式。

优点:

  • 收敛速度快
  • 能够滤除不需要的噪音
  • 降低运算成本

缺点:

  • 和Sigmoid函数相似,单向性
  • 如果在负轴存在有效数据,由于梯度消失的原因,而无法有效收敛

即便改进型避免了负轴的梯度归零的问题,但是ReLu存在的缺点,实际上只是得到了轻微修正而已,可以说这个系列的激活函数是缺点和优点都十分突出的函数家族。

来做个简单的应用吧

假设我们有这么一张表,这是一张我比较喜欢的辉光管工作时长表,这种前苏联时代的老玩意由于适用寿命都不长,所以如果持续点亮,那么在一定时候就会坏掉。

在这里插入图片描述

Duration(Year.)Work
0.1True
0.3True
0.5True
0.7True
0.9True
1.1True
1.3True
1.5False
1.7False
1.9False

也就是说,当时间到1.5年后,辉光管一定会坏掉,那么问题是1.4年的时候,它坏掉的机率有多大?

我们用Torch来执行一下,首先使用一个线性模型对数据进行预测,并且为了增加一点玄学的成分,用Sigmoid作为激活函数,BCE函数作为损失函数,然后看看预测情况如何

import torch

x_data = torch.Tensor([[0.1], [0.3], [0.5], [0.7], [0.9], [1.1], [1.3], [1.5], [1.7], [1.9]])  # 1 column x 10 rows
y_data = torch.Tensor([[1], [1], [1], [1], [1], [1], [1], [0], [0], [0]])  # 0 - false, 1 - true


class SimpleLogisticModel(torch.nn.Module):

    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(1, 1)
        """
        Regression analysis of the data was
        continued using the linear model
        """

    def forward(self, x):
        y_predicted = torch.sigmoid(self.linear(x))
        return y_predicted


if __name__ == "__main__":
    # fitting modle
    model = SimpleLogisticModel()

    # LOSS function
    criterion = torch.nn.BCELoss(size_average=False)

    # parameters optimizer
    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)  # stochastic gradient descent

    # training and do gradient descent calculation
    for epoch in range(500):
        # forward
        # y_predict_value = model(x_data)
        y_predicted_value = model.forward(x_data)

        # use MSE to check the deviation
        loss = criterion(y_predicted_value, y_data)

        # print for debug
        print(epoch, loss.item())

        # set calculated gradient to zero
        optimizer.zero_grad()

        # call backward to update the parameters
        loss.backward()

        # optimize parameters
        optimizer.step()

    # finally
    print("omega = ", model.linear.weight.item())
    print("bias = ", model.linear.bias.item())

    # test values
    x_test = torch.Tensor([1.4])
    y_test = model(x_test)

    # print out result
    print("final y = ", y_test.data)

输出结果是:

omega =  -7.137760162353516
bias =  9.893336296081543
final y =  tensor([0.4751])

如果四舍五入,那么y = 0,也就是说1.4年后,坏掉的可能性是53%,其实概率还是挺大的呢~

后记

如果你刚接触Ai框架,你可能看到这里有点懵,这些函数都是干嘛的,有什么用。其实我计划把如何使用这些Ai框架的内容放在后面,这部分属于理论范畴,我们弄明白神经元是怎么工作的先。

另外,关于激活函数就我介绍的这么些吗?其实目前公布的有很多,这里只是提到了一些对于初学者来说常用和简单的类型。在某乎上有这么一个帖子目前总结了目前常用的激活函数总类,你可以去那帖子上面看看。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-07 11:42:59  更:2021-07-07 11:43:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/21 23:45:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码