当前位置: 首页 > article >正文

NLP中的神经网络基础

一:多层感知器模型

1:感知器

解释一下,为什么写成 wx+b>0 ,其实原本是 wx > t ,t就是阈值,超过这个阈值fx就为1,现在把t放在左边。

在感知器里面涉及到两个问题:

        第一个,特征提取:就是如何将问题的原始输入转换成输入向量x(其实就是数值如何表示文本)

        第二个,参数学习(参数优化或者模型训练):就是如何设置合理的w权重和b偏差项

感知器主要处理文本分类问题,比如识别一个句子的褒贬性。

2:线性回归

感知器输出的结果是离散的,除了感知器这类分类模型还有一类是回归模型(Regression),他的输出是连续的实数值。线性回归是最简单的回归模型。y = wx + b

3:Logical回归

线性回归的输出值大小是任意的,激活函数就是为了将其限制在一定的范围内

Logical函数形式为:

        y = L/ 1 + e^{-k(Z-Z_{o})}  其中,k控制了函数的陡峭程度。

如果 z = w_{1}x_{1} + w_{2}x_{2} + ...,此时的模型叫做Logical回归模型。虽然叫做回归模型但是常用作分类问题

原因:当L=1、k=1,z0 = 0 ,此时函数形式就是sigmoid函数

它的值域恰好在0-1,所以经过sigmoid函数归一化以后就可以认为是输入属于某一类别的概率值,除了可以输出概率值还有一个优点就是它的导数比较容易求得,有利于使用基于梯度的参数优化算法。sigmoid函数图像如下图:

4:Softmax回归

如果不只有2个类别,处理多元分类任务可以用Softmax回归操作。

Softmax回归就是对第i个类别使用线性回归打一个分数z_{i} = w_{i1}x_{1} + w_{i2}x_{2} + ... + w_{in}x_{n} + b_{i}。其中,w_{ij}表示第i个类别对应的第i个输入的权重。然后再对多个分数使用指数函数进行归一化计算,并获得一个输入属于某个类别的概率。

5:多层感知器(MLP)

以上介绍的都是线性模型,真实情况很多时候无法通过一条直线、平面、或者超平面来分割不同的类别,例如:异或问题(相同为0,不同为1)

多层感知器就是堆叠多层线性分类器,并在中间(隐含层)增加非线性激活函数

ReLU:

6:模型实现

(1):神经网络层和激活函数

线性层:输入为(batch,inputdim)输出为(batch,outputdim)

# 线性层
import torch
from torch import nn
linear = nn.Linear(32, 2)   # 第一个参数就是输入,第二个是输出
inputs = torch.rand(3, 32)  # 创建一个输入为3, 23 维度的随机张量  可以理解为3是batch
outputs = linear(inputs)
print("Linear:")
print(outputs)

batch就是一个批次,即为一次处理的张量数量。

这里grad_fn是张量(tensor)的一个属性,它记录了创建该张量的函数操作。

激活函数在torch.nn.functional中
 

# 线性层
import torch
from torch import nn
linear = nn.Linear(32, 2)   # 第一个参数就是输入,第二个是输出
inputs = torch.rand(3, 32)  # 创建一个输入为3, 23 维度的随机张量  可以将3理解为batch
outputs = linear(inputs)
print("Linear:")
print(outputs)
print("*****"*20)


from torch.nn import functional as F
activation_sigmoid = F.sigmoid(outputs)
print("activation_sigmoid:")
print(activation_sigmoid)
print("*****"*20)

activation_softmax = F.softmax(outputs)
print("activation_softmax:")
print(activation_softmax)
print("*****"*20)

activation_relu = F.relu(outputs)
print("activation_relu:")
print(activation_relu)
print("*****"*20)

activation_tanh = F.tanh(outputs)
print("activation_tanh:")
print(activation_tanh)
print("*****"*20)

(2):自定义神经网络模型

import torch
from torch import nn
from torch.nn import functional as F

class MLP(nn.Module):
    # 多层感知器的构建
    def __init__(self, input_dim, hidden_dim, num_class):
        super(MLP, self).__init__()
        # 线性变换:输入层-->隐含层
        self.linear1 = nn.Linear(input_dim, hidden_dim)

        # ReLU
        self.activate = F.relu

        # 线性变换:隐藏层-->输出层
        self.linear2 = nn.Linear(hidden_dim, num_class)

    def forward(self, inputs):
        hidden = self.linear1(inputs)
        activation = self.activate(hidden)
        outputs = self.linear2(activation)
        probs = F.softmax(outputs, dim=1)  # 获得每个输入属于某一类别的概率
        return probs


mlp = MLP(input_dim=4, hidden_dim=5, num_class=2)
inputs = torch.rand(3, 4)
probs = mlp(inputs)
print(probs)

二:卷积神经网络

1:模型结构

全连接层:又叫做稠密层,在多层感知器中每层输入的各个元素都需要乘以一个独立的参数的那一层叫做全连接层。 缺点:难以捕捉局部信息。

卷积操作:就是依次扫描输入的每个区域。每个小的、用于提取局部特征的稠密层被叫做卷积核或者滤波器。假设卷积核的大小为N,单词长度为L,那么卷积核的输出长度为L-N+1

卷积操作输出的结果再进行进一步聚合,这一过程就是池化。池化包括最大池化、平均池化、加和池化等。池化的优点:解决样本输入大小不一致的问题;可以保证最终输出相同个数的特征。

卷积核的构造方式大致有两种:1:使用不同组的参数,且不同的初始化参数获得不同的卷积核。2:提取不同尺度的局部特征(例如:提取不同大小N-gram)

卷积操作以后再经过一个全连接的分类层就可以做出最终的决策。将多个卷积层池化层叠堆叠起来形成更深层次的网络就叫做卷积神经网络(CNN)

前馈神经网络:信息从输入层经过隐藏层再到输出层,按照一个方向流动,就叫做前馈神经网络


三:循环神经网络


四:注意力模型


五:神经网络模型的训练


未完待续。。。。持续更新


http://www.kler.cn/a/453705.html

相关文章:

  • kafka的备份策略:从备份到恢复
  • Docker部署GitLab服务器
  • 对一篇单细胞RNA综述的评述:细胞和基因质控参数的选择
  • 【流量、洪水数据下载】网站介绍和下载经验....不断更新!
  • JS面试题|[2024-12-26]
  • 生成10级子目录,每个子目录下有100个不同大小的文件
  • CSS(二):美化网页元素
  • 前端:改变鼠标点击物体的颜色
  • CSS快速入门
  • flask后端开发(7):加载静态文件
  • v3+ts 批量引入组件
  • DDI-GPT:使用知识图谱增强的大模型对药物相互作用进行可解释的预测
  • PPO 可能出现 KL 爆炸等问题的详细分析(KL Explosions in PPO): 中英双语
  • 无问社区-无问AI模型
  • 从零开始掌握Spring MVC:深入解析@Controller与@RequestMapping注解的使用
  • iic通信底层讲解
  • Golang微服务-protobuf
  • Niushop开源商城(漏洞复现)
  • 基于人工智能时代政务智慧转型的实现前景初探
  • 实战分享:开发设计文档模版及编写要点
  • 【高等数学】空间解析几何
  • BFS【东北大学oj数据结构11-3】C++
  • 如何在 Ubuntu 22.04 上安装以及使用 MongoDB
  • 牛客网刷题 ——C语言初阶——BC112小乐乐求和
  • 详细讲解axios封装与api接口封装管理
  • 【漏洞复现】CVE-2014-3120 CVE-2015-1427 Expression Injection