神经网络基础组件

一、感知器

最简单的神经网络单元是感知器。感知器在历史上是非常松散地模仿生物神经元的。它是一种最简单的人工神经网络模型

1、基本组成

(1)输入权重(Input Weights):每个输入信号都与一个权重相关联。这些权重表示了输入信号对感知器输出的重要性。较高的权重值意味着该信号对感知器的影响更大。

(2)总和函数(Summation Function):感知器将每个输入信号乘以相应的权重,并将它们求和,得到一个加权总和。这个加权总和被称为感知器的激活值。

(3)激活函数(Activation Function):激活函数会对感知器的激活值进行处理,产生一个输出值。常用的激活函数有阶跃函数、sigmoid函数和ReLU函数等。激活函数决定了感知器是否激活并输出一个信号。

(4)阈值(Threshold):感知器的输出值需要与一个阈值进行比较。如果输出值超过了阈值,则感知器被激活,否则不激活。

2、工作原理

(1)输入信号被乘以相应的权重,并求和得到加权总和。

(2)加权总和经过激活函数处理,产生输出值。

(3)输出值与阈值进行比较,确定感知器是否激活。

(4)激活的感知器可以将输出信号传递给其他神经元或执行特定的任务。

3、示例代码

   实现一个感知器

import torch
import torch.nn as nn

class Perceptron(nn.Module):
    """ 感知机是一个线性层 """
    def __init__(self, input_dim):
        """
        参数:
            input_dim (int): 输入特征的大小
        """
        super(Perceptron, self).__init__()
        self.fc1 = nn.Linear(input_dim, 1)

    def forward(self, x_in):
        """ 感知机的前向传播

        参数:
            x_in (torch.Tensor): 输入数据张量。
                x_in.shape 应为 (batch, num_features)
        返回:
            结果张量。tensor.shape 应为 (batch,)
        """
        return torch.sigmoid(self.fc1(x_in)).squeeze()

感知器虽然简单,但它具有一定的局限性,例如只能处理线性可分问题。然而,通过堆叠多个感知器,可以构建更复杂的神经网络,进而解决更加复杂的任务。

二、激活函数

激活函数是神经网络中的一种数学函数,用于对神经元的输入进行非线性变换,并产生相应的输出。激活函数的作用是引入非线性特性,使得神经网络可以更好地拟合和表示非线性数据。在神经网络中,每个神经元接收来自前一层神经元的输入,并将这些输入加权求和后应用激活函数进行处理。激活函数的输出作为该神经元的输出,同时传递给下一层神经元。

1、sigmoid函数

Sigmoid函数是一种常用的激活函数,它将输入映射到一个取值范围在0到1之间的输出。其数学表达式为:

 函数实现:

import torch
import matplotlib.pyplot as plt

# 生成输入数据
x = torch.arange(-5., 5., 0.1)
y = torch.sigmoid(x)

# 绘制sigmoid函数图像
plt.plot(x.numpy(), y.numpy())
plt.show()

2、Tanh函数

  性质与特点

  1. 取值范围: 输出值在-1到1之间。
  2. 对称性: Tanh函数是关于原点对称的,这种对称性使得它在训练过程中比Sigmoid函数更有效,因为输出的均值更接近0,有助于减少偏移。
  3. 平滑性: Tanh函数是平滑且连续的,其导数也是连续的,有利于梯度下降算法的应用。
  4. 梯度问题: 虽然Tanh函数在某些方面优于Sigmoid函数,但它仍然存在梯度消失问题。当输入值非常大或非常小时,导数趋近于零,导致梯度更新变得非常缓慢。

函数实现

import torch
import matplotlib.pyplot as plt

# 生成输入数据
x = torch.arange(-5., 5., 0.1)
y = torch.tanh(x)

# 绘制双曲正切函数图像
plt.plot(x.numpy(), y.numpy())
plt.show()

3、ReLU函数

ReLU代表线性整流单元。这可以说是最重要的激活函数。

𝑓(𝑥)=𝑚𝑎𝑥(0,𝑥)

(1)图像和性质

   形状: ReLU函数的图像在输入大于或等于0时是一个45度的直线,而在输入小于0时是水平的。

   取值范围: 输出范围从0到正无穷。

   计算简便: 由于ReLU的计算是一个简单的阈值操作,它的计算量非常小,使得训练速度更快。

代码实现:

import torch
import matplotlib.pyplot as plt

# 创建ReLU激活函数实例
relu = torch.nn.ReLU()

# 生成输入数据
x = torch.arange(-5., 5., 0.1)
y = relu(x)

# 绘制ReLU函数图像
plt.plot(x.numpy(), y.numpy())
plt.show()

4、softmax函数

(1)性质

  归一化:Softmax函数可以将输入转化为概率分布,因为它确保了所有元素的和为1。

  增强大的值:Softmax函数会增强大的输入值,抑制小的输入值,使得最大的值更接近1,最小的    值更接近0。

  对输入敏感:Softmax函数对输入值的大小非常敏感,所以在实践中需要小心处理数值上溢或下      溢的情况。

函数实现

import torch.nn as nn
import torch

# 创建Softmax激活函数实例,指定维度为1
softmax = nn.Softmax(dim=1)

# 生成输入数据
x_input = torch.randn(1, 3)

# 将输入数据通过Softmax函数进行转换
y_output = softmax(x_input)

# 打印输入和输出
print("输入数据:")
print(x_input)
print("Softmax转换后的输出:")
print(y_output)
print("每个样本输出的概率之和:")
print(torch.sum(y_output, dim=1))

二、损失函数

损失函数是用于度量模型预测值与实际值之间差异的函数。在机器学习和深度学习中,损失函数是用来衡量预测结果与真实值之间的误差,并作为模型优化的目标函数。

1、均方误差

是一种常用的回归任务损失函数,用于度量模型预测值与实际值之间的差异。它计算预测值与真实值之间差值的平方的均值。均方误差越小,表示模型的预测结果与真实值之间的差异越小,模型的拟合效果越好。在训练过程中,通常使用梯度下降等优化算法来最小化均方误差,以更新模型参数,提高模型的准确性和泛化能力。

函数实现

import torch
import torch.nn as nn

# 创建均方误差损失函数实例
mse_loss = nn.MSELoss()

# 生成模型输出和目标值
outputs = torch.randn(3, 5, requires_grad=True)
targets = torch.randn(3, 5)

# 计算均方误差损失
loss = mse_loss(outputs, targets)

# 打印损失值
print("均方误差损失值:")
print(loss)

2、分类交叉熵损失

通常用于多类分类设置,其中输出被解释为类隶属度概率的预测。目标(y)是 n 个元素的向量,表示所有类的真正多项分布。如果只有一个类是正确的,那么这个向量就是 one hot 向量。网络的输出(ŷ)(ŷ)也是一个向量 n 个元素,但代表了网络的多项分布的预测。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值