自然言語処理お勉強教室-LSTM系列振り返り(RNN,LSTM,GRU)-(6)

はじめに

この記事では,これまで勉強してきたRNN,LSTMを振り返ります.その上で,ネット上で散見しているLSTMと似た構造であるGRUを勉強します.また,これらの内容はネットでかなりの情報があるので,この記事は私が勉強したという備忘録となります.新規性とかそういうのは特にありません.

RNN

f:id:tatsuya_happy:20210301183354p:plain 例えば,文章の

you say goodbye and I say hello

が与えられたとします.この時,RNNはyouという単語が来た場合,sayという単語を予測します.こうすることで,単語の時系列を学習することができ,単語の順序関係を考慮したモデルを構築することができます.また,過去の情報を次に渡すために,youのベクトル情報がsayに渡されるので,情報を保持することができます.

LSTM

LSTMはRNNの改良版です.RNNは文章が長くなればなるほど,最初の単語の情報量が失われます.そこで,LSTMは過去の情報をより保持するために,c,hにわけ,過去情報をうまく伝達するモデルです.短期と長期の記憶を分割している. f:id:tatsuya_happy:20210302131854p:plain これにより,RNNの情報が失われる欠点を補いました.

双方向LSTM

双方向LSTMは時系列の順序を逆にして,情報を後ろに流し,情報を増やす構造です.画像を作ろうと思いましたが,面倒だったので,以下のURLの画像を参考にさせていただきました. f:id:tatsuya_happy:20210311170746p:plain

cvml-expertguide.net

上記の構造では,右から情報が伝わるものと左から情報が伝わるものがあります.LSTMの構造がわかっていると,難しくはないと思います.o_t-1のところで,情報をconcatして一つのベクトル表現で表します.

lstm = nn.LSTM(3, 4, batch_first=True, bidirectional=True)#bidirectionalをTrueにするだけ.

PyTorchで使う場合は,通常のLSTMとはoutputの次元が異なります.丁寧に調べてくれている参考があったので載せておきます. qiita.com

GRU

f:id:tatsuya_happy:20210311171838p:plain GRUの構造はLSTMと違いc_tの部分を廃止しています.なので,すっきりとした形にはなっていると思います(LSTMと比べては).この記事ではどのようなoutputがあるかを記載だけしておきます.

import torch
import torch.nn as nn
gru = nn.GRU(3,3,batch_first = True)
sample = torch.rand(1,4,3) #(batch_size,sequence,dimention)
output,h = gru(sample)

print(output.size()) #torch.Size([1, 4, 3]) 
print(h.size())#torch.Size([1, 1, 3])

print(output[0][3] == h) # [True,True,True]

outputはそれぞれのセルで出力されたhの情報.hは最終のセルのアウトプット情報.なので,(output[0][3] == h)は一緒です.

終わりに

これまで色々なモデルを見てきました.これからはおそらく,Attentionベースの勉強をしていきたいと思います.LuongのAttentionはやったので,次はGNMTのgoogle translateのモデルを見ていこうと思います.