Skip to content
2026-09-29 04:201414 字深度学习RNN循环神经网络

RNN 核心概念 ​

什么是 RNN ​

  • 定义:循环神经网络(Recurrent Neural Network, RNN)是专门处理序列数据的神经网络,通过 “循环” 结构保留前序时间步信息

    序列数据的核心是 “后序数据与前序数据存在关联”,RNN 通过隐藏状态实现这种时序依赖的建模。

    示例:

    • 文本:"我爱北京" → "北京"的理解依赖前面的"我爱"
    • 时间序列:明天的股价与今天相关
    • 语音:当前音素与前后音素相关
    • 视频:当前帧与前后帧连续
  • 核心:隐藏状态(​** **​ ) 传递时序上下文(区别于前馈神经网络无记忆性)。

    与前馈神经网络的区别:

    • 前馈网络:无记忆性,每个输入独立处理
    • RNN:有记忆性,当前输出依赖前序信息

应用 ​

  • 自然语言处理(NLP) :文本生成、语言建模、机器翻译、情感分析等。

  • 时间序列预测:股市预测、气象预测、传感器数据分析等。

  • 语音识别:将语音信号转换为文字。

  • 音乐生成:通过学习音乐的时序模式来生成新乐曲。

自然语言处理 ​

自然语言处理(Nature language Processing, NLP)让计算机能够理解、生成和处理人类语言,实现人与机器之间通过自然语言进行有效交互。

NLP涵盖了从文本到语音、从语音到文本的各个方面,它涉及多种技术,包括语法分析、语义理解、情感分析、机器翻译等。

词嵌入层 ​

作用:将离散词索引转为低维稠密向量(替代高维稀疏的 one-hot 编码),捕捉词间语义相似性,降低计算量,作为 RNN 的输入层。

将文本转换成向量

工作流程 ​

python



文本 → 分词 → 词索引 → 词嵌入层 → 词向量 → RNN
  1. 初始化词向量(随机 / 预训练如 Word2Vec / GloVe)

  2. 输入词索引

  3. 查找对应词向量

  4. 输入 RNN

API ​

python



nn.Embedding(num_embeddings, embedding_dim)



'''



num_embeddings:词的总数(词汇表大小)



embedding_dim:词向量的维度



'''

代码示例:

python



import jieba



import torch



import torch.nn as nn







def func():



    text = '北京冬奥的进度条已经过半,不少外国运动员在完成自己的比赛后踏上归途。'



    # 分词



    words = jieba.lcut(text)



    print(words)



    # 词嵌入层



    embedding = nn.Embedding(num_embeddings=len(words), embedding_dim=10)



    # 词对象索引



    for i, word in enumerate(words):  # enumerate()函数: 遍历列表,返回索引和值



        print(i, word)



        '''词索引 -> 词向量'''



        word_vector = embedding(torch.tensor([i]))



        print(word_vector)







func()

循环网络层 ​

  • 作用:循环网络层(RNN层)用于处理序列数据,通过内部的循环连接保留历史信息,使网络具备记忆能力。它在每个时间步结合当前输入和上一时刻的隐藏状态,逐步更新状态,从而捕捉序列中的时间依赖关系和动态模式。最终输出可以用于序列预测、分类或生成等任务。

RNN 单元结构图 和 公式 ​

  • :激活函数

  • :权重矩阵

  • :偏置矩阵

RNN 结构特点 ​

​

关键理解:

  • 虽然画了多个神经元,实际上只有一个神经元

  • "我爱你"三个字是重复输入到同一个神经元

  • 每个时间步共享相同的权重参数

核心公式 ​

  • 隐藏状态更新:

    • tanh:激活函数, :输出数据

    • :输出隐藏状态, :输入隐藏状态

    • :输入数据的权重, :输入隐藏状态的权重

    • :输入数据的偏置, :输入隐藏状态的偏置

  • 网络输出:

    当前时刻输出 = 输出层的权重矩阵 * 当前时刻隐藏状态 + 输出层的偏置项

    隐藏状态映射为当前时间步输出

  • 词汇表映射: 是一个向量,经过全连接层后得到 y_pred,其中每个元素代表当前时刻生成词汇表中某个词的得分(或概率)。概率最大的 → 最终预测结果​

API ​

python



RNN = nn.RNN(input_size, hidden_size,num_layers)



'''



input_size:词向量维度(输入数据维度)



hidden_size:隐藏层维度



num_layers:隐藏层数



'''
python



output, hn = RNN(x, h0)



'''



输入:x→[seq_len, batch, input_size]



       [句子长度, batch大小, 词向量维度]



输出:output→[seq_len, batch, hidden_size]



            [隐藏层的层数, batch大小, 隐藏层的维度]



初始隐藏状态:h0→[num_layers, batch, hidden_size]



最终隐藏状态:hn→[num_layers, batch, hidden_size]



               [句子长度, batch大小, 输出向量维度]



'''

代码示例:

python



import torch



import torch.nn as nn







def func():



    # 循环网络层



    rnn = nn.RNN(input_size=128, hidden_size=256, num_layers=1, batch_first=False)



    # 定义变量:输入 x



    x = torch.randn(5, 32, 128)



    # 定义变量:上一时刻的隐藏状态 h



    h0 = torch.randn(1, 32, 256)



    # 调用RNN,返回 预测值 output 和 隐藏状态 h_n



    output, h_n = rnn(x, h0)



    print(output.shape)



    print(h_n.shape)







func()

‍


每一篇文章,都是时间的标本