1 概念
循环神经网络 (Recurrent Neural Network, RNN) 是一类具有短期记忆能力的神经网络. 它与深层神经网络、卷积神经网络不同的是, 它不仅接收其他神经元的信息, 同时也可以接收自身的信息, 形成了一种具有闭环的网络结构, 这也是它”循环”的来由.
具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中, 即隐藏层之间的节点不再无连接而是有连接的, 并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出.
RNN目前应用领域:
-
语音识别: 输入的语音数据, 生成相应的语音文本信息. 比如微信的语音转文字功能.
-
机器翻译: 不同语言之间的相互转换. 像有道翻译、腾讯翻译官等.
-
音乐生成: 使用RNN网络生成音乐, 一般会用到RNN中的LSTM算法 (该算法可以解决RNN网络中相距较远的节点梯度消失的问题).
-
文本生成:利用RNN亦可以生成某种风格的文字.
-
情感分类: 输入文本或者语音的评论数据, 输出相应的打分数据.
-
DNA序列分析: 输入的DNA序列, 输出蛋白质表达的子序列.
-
视频行为识别: 识别输入的视频帧序列中的人物行为.
-
实体名字识别: 从文本中识别实体的名字.
2 隐层
给定一个输入序列 X = { x 1 , x 2 , … , x t } \mathbf{X} ={x_1, x_2, \dots, x_t}X ={x 1 ,x 2 ,…,x t }, 循环神经网络通过下面公式更新带反馈边的隐藏层的 活性值 h t h_t h t :
h t = f ( h t − 1 , x t ) h_t = f(h_{t-1},x_t)h t =f (h t −1 ,x t )
其中 h 0 = 0 h_0=0 h 0 =0, 函数 f f f 为一个非线性函数, 可以是一个前馈网络.
也可以写成
h t = g ( w h x x t + b h x + w h h h t − 1 + b h h ) h_t=g(w_{hx}x_t+b_{hx}+w_{hh}h_{t-1}+b_{hh})h t =g (w h x x t +b h x +w h h h t −1 +b h h )
激活函数 g g g 通常为 tanh \tanh tanh.
那么输出序列 Y = { y 1 , y 2 , … , y t } \mathbf{Y} = {y_1, y_2, \dots, y_t}Y ={y 1 ,y 2 ,…,y t } 中 y t y_t y t 为
y t = w y h h 0 + b y h y_t = w_{yh}h_0 + b_{yh}y t =w y h h 0 +b y h
注意, 此处不再有激活函数
; 3 例子
Train a model to learn (with pytorch):
- “hello” —> “ohlol”
import torch
import torch.nn.functional as F
inputSize = 4
hiddenSize = 4
batchSize = 1
word = ['e', 'h', 'l', 'o']
xData = [1, 0, 2, 2, 3]
yData = [3, 1, 2, 3, 2]
xOnehot = F.one_hot(torch.tensor(xData), len(word))
xOnehot = xOnehot.float()
inputs = xOnehot.view(-1, batchSize, inputSize)
labels = torch.LongTensor(yData)
class Net(torch.nn.Module):
def __init__(self, inputSize, hiddenSize, batchSize, numLayers=1):
super(Net, self).__init__()
self.numLayers = numLayers
self.inputSize = inputSize
self.hiddenSize = hiddenSize
self.batchSize = batchSize
self.rnn = torch.nn.RNN(self.inputSize, self.hiddenSize, self.numLayers)
def forward(self, input):
hidden = torch.zeros(self.numLayers, self.batchSize, self.hiddenSize)
out, _ = self.rnn(input, hidden)
out = out.view(-1, self.hiddenSize)
return out
model = Net(inputSize, hiddenSize, batchSize, numLayers=1)
lossFunction = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.05)
for epoch in range(15):
optimizer.zero_grad()
predict = model(inputs)
loss = lossFunction(predict, labels)
loss.backward()
optimizer.step()
_, index = predict.max(dim=1)
index = index.data.numpy()
print("Predicted:", "".join(word[i] for i in index), end='')
print(", Epoch[%d/15] lossAll= %.4f" % (epoch + 1, loss.item()))
输出部分
Predicted: ohhhh, Epoch[1/15] lossAll= 1.3558
Predicted: oholo, Epoch[2/15] lossAll= 1.2035
Predicted: oholl, Epoch[3/15] lossAll= 1.1030
Predicted: oooll, Epoch[4/15] lossAll= 1.0328
Predicted: ooool, Epoch[5/15] lossAll= 0.9791
Predicted: ooool, Epoch[6/15] lossAll= 0.9326
Predicted: ohool, Epoch[7/15] lossAll= 0.8878
Predicted: ohool, Epoch[8/15] lossAll= 0.8444
Predicted: ohool, Epoch[9/15] lossAll= 0.8042
Predicted: ohlol, Epoch[10/15] lossAll= 0.7684
Predicted: ohlol, Epoch[11/15] lossAll= 0.7366
Predicted: ohlol, Epoch[12/15] lossAll= 0.7081
Predicted: ohlol, Epoch[13/15] lossAll= 0.6821
Predicted: ohlol, Epoch[14/15] lossAll= 0.6580
Predicted: ohlol, Epoch[15/15] lossAll= 0.6354
Process finished with exit code 0
https://blog.csdn.net/qq_32241189/article/details/80461635
https://www.jianshu.com/p/aca535702242
https://www.bilibili.com/video/BV1Y7411d7Ys?p=12
Original: https://blog.csdn.net/weixin_48320163/article/details/121517980
Author: uodgnez
Title: 初识循环神经网络(RNN)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/531694/
转载文章受原作者版权保护。转载请注明原作者出处!