Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Paddle 2.1 拟合二次函数

Paddle 2.1 拟合二次函数

原创
作者头像
8菠萝
修改于 2021-11-08 02:02:31
修改于 2021-11-08 02:02:31
1K0
举报
文章被收录于专栏:菠萝上市没有菠萝上市没有

背景

拟合非线性函数。

概念

当目标函数是非线性时,比如拟合二次函数,神经网络需要引如激活函数。激活函数是用来加入非线性因素的,解决线性模型所不能解决的问题。

常见激活函数:

Sigmoid函数

Sigmoid.png
Sigmoid.png

Sigmoid函数时使用范围最广的一类非线性激活函数,具有指数函数的形状,它在物理意义上最为接近生物神经元。其自身的缺陷,最明显的就是饱和性。从函数图可以看到,其两侧导数逐渐趋近于0,杀死梯度。

Sigmoid优点:

这应该是神经网络中使用最频繁的激励函数了,它把一个实数(输入的连续实值)压缩到0到1之间,当输入的数字非常大的时候,结果会接近1,当输入非常大的负数时,则会得到接近0的结果。在早期的神经网络中使用地非常多,因为它很好地解释了神经元受到刺激后是否被激活和向后传递的场景(0:几乎没有被激活;1:完全被激活)。

Sigmoid缺点:

不过近几年在深度学习的应用中比较少见到它的身影,因为使用Sigmoid函数容易出现梯度弥散或者梯度饱和。当神经网络的层数很多时,如果每一层的激活函数都采用Sigmoid函数的话,就会产生梯度弥散梯度爆炸的问题,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。

Tanh 函数

tanh.png
tanh.png

tanh是双曲函数中的一个,tanh() 为双曲正切,关于原点中心对称

正切函数时非常常见的激活函数,与Sigmoid函数相比,它的输出均值是0,使得其收敛速度要比Sigmoid快,减少迭代次数。相对于Sigmoid的好处是它的输出的均值为0,克服了第二点缺点。但是当饱和的时候还是会杀死梯度。

在神经网络的应用中,tanh通常要优于Sigmoid的,因为 tanh的输出在 -1~1之间,均值为0,更方便下一层网络的学习。但是有一个例外,如果做二分类,输出层可以使用 Sigmoid,因为它可以算出属于某一类的概率。

ReLU 函数

ReLU.png
ReLU.png

针对Sigmoid函数和tanh的缺点,提出ReLU函数。

线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元,是一种人工神经网络中常用的激活函数(activation function),通常指代以斜坡函数及其变种为代表的非线性函数。

ReLU优点:

  • 1,解决了gradient vanishing (梯度消失)问题(在正区间)
  • 2,计算方便,求导方便,计算速度非常快,只需要判断输入是否大于0
  • 3,收敛速度远远大于 Sigmoid函数和 tanh函数,可以加速网络训练

ReLU缺点:

  • 1,由于负数部分恒为零,会导致一些神经元无法激活
  • 2,输出不是以0为中心

Leaky ReLU 函数

LeakReLU.png
LeakReLU.png

Leaky ReLU解决了ReLU会杀死一部分神经元的情况。Leaky ReLU 是给所有负值赋予一个非零斜率。Leaky ReLU 激活函数是在声学模型(2013)中首次提出。

理论上来说,Leaky ReLU 有ReLU的所有优点,外加不会有 Dead ReLU 问题,但是在实际操作当中,并没有完全证明 Leaky ReLU 总是好于 ReLU

Leaky ReLU 主要是为了避免梯度消失,当神经元处于非激活状态时,允许一个非0的梯度存在,这样不会出现梯度消失,收敛速度快。他的优缺点和ReLU类似。

ReLU6 函数

ReLU 在 x > 0 的区域使用 x 进行线性激活,有可能造成激活后的值太大,影响模型的稳定性,为抵消 ReLU激活函数的线性增长部分,可以使用ReLU6函数。

ReLU6 就是普通的 ReLU,但是限制最大输出值为6(对输出值做 clip),这是为了在移动端设备 float16的低精度的时候,也能够有很好的数值分辨率,如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的 float16 无法很好地精确描述如此大范围的数值,带来精度损失。

实践

拟合目标函数 y=x^2 + x + 1

代码语言:txt
AI代码解释
复制
import numpy as np
import paddle 
import paddle.nn as nn
import paddle.nn.functional as F
from paddle.io import DataLoader, Dataset
import matplotlib.pyplot as plt

# 模拟数据
x = np.array([np.random.randn()  for x in range(100)])
y = np.array([i * i  + i  + 1 for i in x])

# 定义数据集
class CurDataSet(Dataset):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __getitem__(self, idx):
        data =  paddle.to_tensor(self.x[idx], dtype='float32')
        label = paddle.to_tensor(self.y[idx], dtype='float32')
        return data, label 

    def __len__(self):
        return len(self.x)

# 定义网络
layer_num = 32
class CurNet(nn.Layer):
    def __init__(self):
        super(CurNet, self).__init__()
        self.fc1 = nn.Linear(1, layer_num)
        self.fc2 = nn.Linear(layer_num, 1)
        self.reu = nn.ReLU()

    def forward(self, inputs):
        x = self.fc1(inputs)
        x = F.relu(x)
        x = self.fc2(x)
        return x

net = CurNet()
opt = paddle.optimizer.Adam(learning_rate=1e-2,
                            beta1=0.8,
                            parameters=net.parameters())
dataset = CurDataSet(x, y)
loader = DataLoader(dataset,
                    shuffle=True,
                    drop_last=True,
                    batch_size= 20)
# 开始训练
net.train()
for e in range(100):
    for i, (data, label) in enumerate(loader()):
        out = net(data)
        loss = nn.functional.mse_loss(out, label)
        loss = paddle.mean(loss)
        loss.backward()
        opt.step()
        opt.clear_grad()
        print("Epoch {} batch {}: loss = {}".format(
            e, i, np.mean(loss.numpy())))
     
# 开始评估
net.eval()
plt.scatter(x, y, color='blue', label="act")
x = sorted(x)
z = np.array([net(paddle.to_tensor(i)).numpy()[0] for i in x])
plt.plot(x, z, color='red', label="eval")

plt.legend()
plt.show()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
Paddle 2.1 拟合线性函数
个人理念里的人工智能,最终是对某种“函数”的拟合,这种函数可能是一维的,二维的,多维的。但这个“函数”不是推导出来的公式,而是一个黑盒子,有点类是图灵机的感觉。通过一系列的输入,训练这个盒子,不断调参修正得到正确的拟合函数。
8菠萝
2021/10/28
6100
【机器学习-监督学习】神经网络与多层感知机
  本文将会介绍机器学习中最重要的内容之一——神经网络(neural network,NN),它是深度学习的基础。神经网络的名称来源于生物中的神经元。自有计算机以来,人们就希望能让计算机具有和人类一样的智能,因此,许多研究者将目光放到了人类的大脑结构上。作为生物神经系统的基本单元,神经元在形成智能的过程中起到了关键作用。神经元的结构并不复杂,简单来说,神经元由树突、轴突和细胞体构成。图1是神经元的结构示意图。由其他神经元传来的神经脉冲在细胞间通过神经递质传输。神经递质被树突接收后,相应的神经信号传给细胞体,由细胞体进行处理并积累。当积累神经递质的兴奋性超过了某个阈值,就会触发一个动作电位,将新的信号传至轴突末梢的突触,释放神经递质给下一个神经元。生物的智能、运动等几乎所有生命活动的控制信号都由这些看似简单的神经元进行传输。
Francek Chen
2025/01/22
4530
【机器学习-监督学习】神经网络与多层感知机
5分钟了解神经网络激活函数
机器学习是一个使用统计学和计算机科学原理来创建统计模型的研究领域,用于执行诸如预测和推理之类的主要任务。这些模型是给定系统的输入和输出之间的数学关系集。学习过程是估计模型参数的过程,以便模型可以执行指定的任务。学习过程会尝试使机器具有学习能力,而无需进行显式编程。这是ANN的作用。
deephub
2020/05/09
9920
5分钟了解神经网络激活函数
手写数字识别之网络结构
无论是牛顿第二定律任务,还是房价预测任务,输入特征和输出预测值之间的关系均可以使用“直线”刻画(使用线性方程来表达)。但手写数字识别任务的输入像素和输出数字标签之间的关系显然不是线性的,甚至这个关系复杂到我们靠人脑难以直观理解的程度。
zhangjiqun
2024/12/14
1600
手写数字识别之网络结构
深度学习基础知识(一)--激活函数
在神经网络中加入激活函数存在的意义就是为网络增加非线性因素,比如全卷积神经网络,不加入激活函数,就是一堆线性操作矩阵运算,对于复杂任务仅用线性操作而不用复杂的函数表示肯定效果不会好。
languageX
2022/05/04
4.9K1
一文速学-让神经网络不再神秘,一天速学神经网络基础-激活函数(二)
前一篇文章我们具体讲述了神经网络神经元的基本构造,以及引入了神经网络一些概念性质,有了这些基础我们就能更好的理解每一层神经网络究竟要做什么,如何工作的。
fanstuck
2024/03/11
6141
一文速学-让神经网络不再神秘,一天速学神经网络基础-激活函数(二)
用函数拟合能力解释神经网络
从下图中,我们很容易观察出来有3个转折点,而且红色曲线也基本可以拟合上蓝色曲线了。
birdskyws
2019/03/04
1.6K0
用函数拟合能力解释神经网络
深度学习4大激活函数
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出实际上都是上层输入的线性函数。
皮大大
2023/08/25
4840
深度学习4大激活函数
python实现之激活函数
激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。
python与大数据分析
2022/03/11
4640
python实现之激活函数
神经网络基础--激活函数
人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的 计算模型。人脑可以看做是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。下图是生物神经元示意图:
用户10950404
2024/08/06
3140
神经网络基础--激活函数
神经网络编程 - 前向传播和后向传播(附完整代码)
【导读】本文的目的是深入分析深层神经网络,剖析神经网络的结构,并在此基础上解释重要概念,具体分为两部分:神经网络编程和应用。在神经网络编程部分,讲解了前向传播和反向传播的细节,包括初始化参数、激活函数
WZEARW
2018/04/16
1.5K0
神经网络编程 - 前向传播和后向传播(附完整代码)
【机器学习】揭开激活函数的神秘面纱
激活函数(Activation Function)是神经网络中非常关键的组成部分,主要用于在神经网络的节点(或称神经元)上引入非线性因素。这是因为神经网络的基本计算单元是线性加权和,而单纯的线性组合无法模拟现实世界中复杂的非线性关系。通过引入激活函数,神经网络能够学习并模拟各种复杂的映射关系。
小言从不摸鱼
2024/09/10
2890
【机器学习】揭开激活函数的神秘面纱
8个深度学习中常用的激活函数
当在隐藏层和输出层中实现时,激活函数的选择非常关键。模型的准确性和损失很大程度上依赖于激活函数。此外,必须根据您对模型的期望来选择它们。例如,在二值分类问题中,sigmoid函数是一种最优选择。
deephub
2021/07/01
7350
神经网络的激活函数
人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN),是一种模仿生物神经网络结构和功能的 计算模型。人脑可以看做是一个生物神经网络,由众多的神经元连接而成。各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通过轴突输出信号。
@小森
2024/05/03
2410
神经网络的激活函数
神经网络中常见的激活函数
深度学习中已经成为了人工智能领域的必备工具,源于人工神经网络的研究,含多个隐藏层的多层感知器就是一种深度学习结构。寻找隐藏层的权重参数和偏置的过程,就是常说的“学习”过程,其遵循的基本原则就是使得网络最终的输出误差最小化。在神经⽹络中,激活函数是必须选择的众多参数之⼀,从而使神经⽹络获得最优的结果和性能。
半吊子全栈工匠
2022/12/03
2.1K0
神经网络中常见的激活函数
深度学习笔记2-神经网络的基本内容
「学习内容总结自 coursera 和 udacity 的深度学习课程,部分截图来自 udacity 的课件」
caoqi95
2019/03/27
7050
深度学习笔记2-神经网络的基本内容
【深度学习项目二】卷积神经网络LeNet实现minst数字识别
项目链接:https://aistudio.baidu.com/aistudio/projectdetail/1928935
汀丶人工智能
2022/12/21
4240
【深度学习项目二】卷积神经网络LeNet实现minst数字识别
实现多层感知机
缩写:MLP,这是一种人工神经网络,由一个输入层、一个或多个隐藏层以及一个输出层组成,每一层都由多个节点(神经元)构成。在MLP中,节点之间只有前向连接,没有循环连接,这使得它属于前馈神经网络的一种。每个节点都应用一个激活函数,如sigmoid、ReLU等,以引入非线性,从而使网络能够拟合复杂的函数和数据分布。
用户11315985
2024/10/16
1500
实现多层感知机
斯坦福CS231n - CNN for Visual Recognition(5)-lecture5激活函数、神经网络结构
  在线性分类中,我们使用s=Wxs=Wx计算类别的评分函数,其中WW为一个矩阵,xx为一个列向量,输出表示类别的评分向量。而在神经网络中,最常用的是s=W2max(0,W1x)s=W_2max(0,W_1x),其中函数max(0,−)max(0,-)是非线性的,也可以使用其他的一些非线性函数。如果没有非线性函数,那么对于分类的评分计算将重新变成关于输入的线性函数。因此,非线性函数是改变的关键。参数W1,W2W_1,W_2通过随机梯度下降来学习,他们的梯度在反向传播过程中,通过链式法则求导得出。类似地,一个三层地神经网络评分函数为s=W3max(0,W2max(0,W1x))s=W_3max(0,W_2max(0,W_1x))
李智
2018/08/03
5530
斯坦福CS231n - CNN for Visual Recognition(5)-lecture5激活函数、神经网络结构
深度学习(6)——卷积神经网络cnn层级结构CNN特点卷积神经网络-参数初始化卷积神经网络过拟合解决办法
前言:前面提到的神经元之间的连接都是全连接,当输入超多的时候全连接参数给定也会超多,计算太复杂,这样利用人观察事物的原理,既先抓住事物的主要特征(局部观看),而产生的cnn,不同和重点是加了卷积层(局部感知)和池化层(特征简化)。CNN的应用主要是在图像分类和物品识别等应用场景应用比较多 层级结构 数据输入层:Input Layer 和机器学习一样,需要对输入的数据需要进行预处理操作 常见3种数据预处理方式 1 去均值 将输入数据的各个维度中心化到0 2 归一化 将输入数据的各个维度的幅度归一
DC童生
2018/07/06
1.8K0
推荐阅读
相关推荐
Paddle 2.1 拟合线性函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档