[机器学习-李宏毅] 反馈神经网络笔记 (RNN、LSTM)

Recurrent Neural Network

  Recurrent Neural Network 是反馈神经网络,简称为 RNN 。与最基础的前向传播神经网络不同的是,RNN 是一个有记忆的神经网络,他把上一次的输出存了起来作为下一次的输入参数的一部分影响下一次的输出结果。为什么要这么做呢?让我们来看一个例子。

RNN 的背景

  假设有这样一个应用场景,我希望输入一段话给我的语音助手,例如 “I would like to arrive Chengdu on November 2nd” (意思是我将会在 11 月 2 日抵达成都),我希望我的语音助手能够识别出 Chengdu 是我的目的地,November 2nd 是日期,这样可以帮我自动设一个日程表或者是帮我查交通方式等等。

1-of-N Encoding

  我们知道神经网络的输入一般都是数值,没法处理这种字符,那么一个常用的方法就是 1-of-N Encoding 。在进行编码前,我们会有一个词汇表(lexicon)。下面举一个例子便于理解,假设我们的词汇表是: l e x i c o n = { a p p l e , b a g , c a t , d o g } \rm lexicon = \{apple,bag,cat,dog\} lexicon={ apple,bag,cat,dog} ,当我们的词是 a p p l e \rm apple apple 时,编码的结果就是 [ 1 , 0 , 0 , 0 ] [1,0,0,0] [1,0,0,0] ,同理若为 c a t \rm cat cat 时,编码的结果就是 [ 0 , 0 , 1 , 0 ] [0,0,1,0] [0,0,1,0] 。下图也是一个例子。

  独热编码还有一个改版叫做 Beyond 1-of-N Encoding ,就是在 1-of-N Encoding 的基础上多一个 o t h e r \rm other other 表示一个词未出现在词汇表中,例如词汇表还是上面的(没有 e l e p h a n t \rm elephant elephant),若一个词是 b a n a n a \rm banana banana 则会编码成 [ 0 , 0 , 0 , 0 , 1 ] [0,0,0,0,1] [0,0,0,0,1] 。改版之前是会有词无法进行编码的,因为没有出现在词汇表中,改版后所有词都能编码,但是如果词汇表设置的不好,则会有很多次都被归到 o t h e r \rm other other ,变的没有差别,这样训练出的网络可能会有问题。

Word Hashing

  还有一种编码方式就是 Word hashing ,他是把三个字母的组合作为一个维度,所以一共有 26 × 26 × 26 26 \times 26 \times 26 26×26×26 种组合,然后去看单词中的某一种组合是否出现,比如 a p p l e \rm apple apple 这个单词,就可以拆成 a p p 、 p p l 、 p l e \rm app、ppl、ple apppplple ,那么这三种对应的维度上就是 1 1 1 ,其他都是 0 0 0 。(有个问题是,要是有一个组合在单词中重复出现的话,不知道这个维度上是只记一个 1 1 1 ,还是记他的计数值,课上举的例子没有这个问题)

  解决了怎么把单词输入到神经网络中后,回到我们一开始那么问题,首先可以想到的是,我们可以把输出变成单词类型的类别,例如:输入 I \rm I I 输出是 o t h e r \rm other other ,输入是 C h e n g d u \rm Chengdu Chengdu 输出是 d e s t i n a t i o n \rm destination destination ,输入是 N o v e m b e r \rm November November 输出是 t i m e \rm time time ,输入是 2 n d \rm 2nd 2nd 输出是 t i m e \rm time time ,输出的类别一共有三种。似乎用一个普通的神经网络就可以解决这个分类问题了,根本不需要什么有记忆的 RNN 。但是如果问题变成我输入的一句话变成了 “I would like to leave Chengdu on November 2nd” 呢,输入这句话表示我将在十一月二号离开成都,那么我希望我的语音助手进行的操作肯定和原来是不一样的,比如提醒我走之前买纪念品。那么对于原来的无记忆的神经网络来说,是无法鉴别这个 C h e n g d u \rm Chengdu Chengdu 到底是 d e s t i n a t i o n \rm destination destina

### 李宏毅机器学习课程中关于RNN笔记内容概述 李宏毅机器学习课程中,RNN(循环神经网络)的相关内容涵盖了基础理论、实际应用以及解决梯度消失问题的方法。以下是相关内容的详细总结: #### 一、RNN的基本概念与结构 循环神经网络(Recurrent Neural Network, RNN)是一种用于处理序列数据的神经网络模型[^1]。其核心特点是能够保存先前计算的状态信息,并将其作为当前输入的一部分参与计算。这种机制使得RNN可以捕捉时间序列中的依赖关系。例如,在自然语言处理任务中,RNN可以通过记住前面的词来预测下一个词。 ```python import torch import torch.nn as nn class SimpleRNN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(SimpleRNN, self).__init__() self.hidden_size = hidden_size self.rnn = nn.RNN(input_size, hidden_size, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): h0 = torch.zeros(1, x.size(0), self.hidden_size).to(x.device) out, _ = self.rnn(x, h0) out = self.fc(out[:, -1, :]) return out ``` #### 二、双向RNN(Bidirectional RNN) 为了同时考虑前文和后文的信息,提出了双向RNN(Bidirectional RNN)。该模型通过两个独立的隐藏层分别从前向后和从后向前处理输入序列,最终将两者的结果合并以获得更丰富的上下文信息[^3]。 #### 三、长短时记忆网络(LSTM) 尽管RNN在理论上可以捕捉长距离依赖关系,但在实践中由于梯度消失或爆炸问题,通常难以有效建模长序列。为此,提出了长短时记忆网络(Long Short-Term Memory, LSTM),它通过引入门控机制(输入门、遗忘门、输出门)解决了这一问题[^2]。 #### 四、梯度消失问题及其解决方案 RNN在训练过程中容易遇到梯度消失问题,这会导致模型无法学习到长距离依赖关系。为了解决这一问题,除了使用LSTM外,还可以通过以下方法进行改进: - 使用残差连接(Residual Connections)。 - 应用正则化技术,如Dropout。 - 初始化权重矩阵以改善梯度传播[^4]。 #### 五、RNN的应用场景 RNN广泛应用于自然语言处理领域,包括但不限于: - 机器翻译:将一种语言的句子转换为另一种语言。 - 情感分析:判断文本的情感倾向。 - 文本生成:根据给定的前缀自动生成后续内容。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值