「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-戻る([[ニューラルネットワーク]]、[[言語処理(AI)]])
--一般的なフツーのニューラルネットワーク
---[[順伝播型ニューラルネットワーク(FNN)>ニューラルネットワーク#mcd402f7]]
---[[ディープニューラルネットワーク(DNN)>ニューラルネットワーク#ge448516]]
---[[畳み込みニューラルネットワーク(CNN)]]
--再帰型ニューラルネットワーク(RNN)
---[[長短期記憶ニューラルネットワーク(LSTM)]]
---[[RNN Encoder-Decoder(Sequence-to-Sequence)]]
--[[生成モデル>機械学習の理論#p3f4e303]]系の[[ニューラルネットワーク]]
---[[自己符号化器(AE:オートエンコーダ)]]
---[[テキスト生成系(Transformer系)]]
---[[敵対的生成ネットワーク(GAN)]]

*目次 [#ha203f82]
#contents

*概要 [#z103dfa9]
(Recurrent Neural Network: RNN)~
≠ Recursive Neural Network(木構造を処理するネットワーク)

-[[再帰構造>#j7d0a856]]を持ち、[[2つの表記法>#dd0c8bfa]]がある。
-[[1対多、多対1、多対多のトポロジー>#vca3fbb0]]毎に用途が変わる。

-以下の発展形に繋がる。
--[[長短期記憶ニューラルネットワーク(LSTM)]]
--[[RNN Encoder-Decoder(Sequence-to-Sequence)]]

**特徴 [#e3900069]
-記憶があり系列データの可変長入力が可能な点が最大の特徴

-中間層に再帰構造(再帰セル)を追加したニューラルネットワークの総称。

-特に自然言語や音声データの時間的構造を学習する。
--時間順序を持つ可変長の系列データ入力を扱える。
--過去の系列を記憶した上で将来の予測ができる。
---一時刻前の中間層の出力を自らの入力に戻す。
---情報を一時的に記憶して振る舞いを動的に変化させる。

-長期に渡る特徴の学習は苦手。
--勾配消失・爆発の問題(の回避方法、[[BPTT法>#x324e38d]]が定着
--入力重み衝突、出力重み衝突(重み更新時、時系列を考慮できない)
---入力重み衝突:入力が重要なら重みを大きくするが、時系列を考慮できない。
---出力重み衝突:出力(再帰の入力)が重要なら重みを大きくするが、時系列を考慮できない。

**構造 [#be6b1a57]

***再帰構造 [#j7d0a856]

-入力層 → 隠れ層

-隠れ層(追加可能)
--隠れ層 → 隠れ層(再帰)
--オプション:(隠れ層 → 隠れ層(再帰))
--オプション:(隠れ層 → 隠れ層(全結合))

-隠れ層 → 出力層

***表記方法 [#dd0c8bfa]
-表記方法には2つのパターンが有る。

--時間軸で展開していない。

--時間軸で展開している(最大で入力する系列データ分展開)。

-書き方(上下左右)~
一般的には...
--上:出力
--下:入力
--左:展開(時系列の前
--右:展開(時系列の後

>上下が逆のケースもある。

|#ref(mlst_1403.png,left,nowrap,mlst_1403,30%)|

***トポロジー [#vca3fbb0]

-多対1(Seq2Vec)
--系列 → 符号化
--系列の意味を符号化する(Encoder単体)。
--例:記事のトピック分類や時系列データ予測

-1対多(Vec2Seq)
--符号 → 系列
--符号の意味を系列化する(Decoder単体)。
--入力が画像の場合ある意味、[[Encoder-Decoder>RNN Encoder-Decoder(Sequence-to-Sequence)]]
--例:画像のキャプション(見出し説明文)生成

-多対多([[Seq2Seq>RNN Encoder-Decoder(Sequence-to-Sequence)]])
--系列 → 系列
---入力系列と出力系列が対応している場合は1つのRNN
---入力系列と出力系列が対応していない場合は[[Encoder-Decoder>RNN Encoder-Decoder(Sequence-to-Sequence)]]
--例:文を入力すると翻訳文が返る。

**RNNでできること [#n7a4f037]
[[系列データ(順序関係に重要な意味のあるデータ)>#z98a730c]]の解析

***[[言語処理]] [#z44d533f]
-文章分類
-文章生成
-機械翻訳

***[[音声処理]] [#s07dc710]
-音声認識

***画像処理 [#j2ab51d7]
-[[動画>画像処理とコンピュータビジョン]]

***[[時系列予測>データマイニング(DM)- Python - RNN#cb8443fc]] [#f057fb05]
-株価変動
-購買履歴
-時系列異常検出

***その他 [#p849ed33]
-DNA配列

**系列データ [#z98a730c]

***時系列データの変動 [#y11573fa]
-長期変動(トレンド)
--通り長期に渡る全体的な上がり下がりの変動
--毎日(週/月/年)の、より長い期間で同じ傾向が見れられる。

-周期変動(季節性)
--一定期間ごとに繰り返される周期的な上下変動
--年単位や月単位、週単位の周期等が考えられる。

-不規則変動(残差)
--長期変動、周期変動を除去したあとに残った傾向
--ランダムに発生するであろうノイズ

***説明系列と目的系列、教師データ化 [#pafaec18]
-目的系列は1つの系列から成る。
-説明系列は複数の系列から成るケースがある。

-目的系列を教師データに変換するには~
元データからxタイムステップずらす。
--1ステップ先を予想する場合、x=1
--3ステップ先を予想する場合、x=3

-説明系列と目的系列は1つの同じ系列であるケースがあり、この場合、~
目的系列は説明系列をxタイムステップずらして教師データを作成する。

***時系列データのデータ分割 [#af105024]
-時系列を維持して訓練・テストのデータ分割を行う。
-ランダムとかシャッフルをして取り出さない

*詳細 [#uc5ee5c5]

**順伝播 [#a889091d]

***概要 [#ba42aaf8]
-Wh、Wx、bの変数の再帰的な学習が必要(xt, ht-1が入力、htが出力)
--h0=tanh(x0Wx+h-1Wh+b)
--h1=tanh(x1Wx+h0Wh+b)
--...
--hn=tanh(xnWx+hn-1Wh+b)

-重みは、WhとWxで別々に存在する。
-出力のhtは再帰の入力になる。そのまま順伝播する場合は、ht ≒ yt。
-なお、h0は0だが、[[RNN Encoder Decoder>#ye7bfc6b]]のDecoderでは0ではないケースも。

***ちなみに、 [#abeadeee]
-x, hはベクトルで、例えば言語系であれば、単語のベクトル表現が入力される。
-再帰セル以外は[[DNN>ニューラルネットワーク#ge448516]]と同じで、なんらかの層を積み重ねる。
--例えばDNNの全結合層や、別のRNNの再帰の層を積み重ねる事ができる。
--重ねない場合は、[[出力層(活性化関数+損失関数)>#z6651c85]]を設ける。

***出力層は... [#z6651c85]
-時系列だと回帰で恒等関数
-言語系だと分類問題なのでSoftmax関数
-損失関数も問題に合わせたものを選択する。

**逆伝播 [#x324e38d]
-学習で重みは誤差逆伝播法で更新されるが、~
全体を見ると以下の2つのパスがあるよね?
--[[DNN部分を遡るパス>深層学習の誤差逆伝播法]]
--[[RNN部分を遡るパス>#hb634528]]

-って、例えば言語系でコレで何を学習できんのよ?~
...と考えるがノード数が多いんだろうね?と~
([[何ノードあるのだろう?>言語処理(AI)#j3b25298]])。

|#ref(rnn_dnn1.png,left,nowrap,rnn_dnn1,30%)|#ref(rnn_dnn2.png,left,nowrap,rnn_dnn2,30%)|
|>|https://rikeiminimalist.blog.jp/archives/7095932.html|

***BPTT法 [#hb634528]
-Backpropagation Through Time: 通時的誤差逆伝播法

-DNNと同様に[[誤差逆伝播法>深層学習の誤差逆伝播法]]による学習ができる。
--二乗誤差関数(回帰)、クロスエントロピー誤差(分類)
--出力層から入力層へ遡る。再帰層は時間方向にも遡る。

-ただし、以下の再帰層の部分がDNNの[[誤差逆伝播法>深層学習の誤差逆伝播法]]と異なる。
--出力層から逆伝播した、それぞれの勾配の平均値を全体の勾配として使用しパラメタ更新する。~
(ただし、これって、系列 → 系列の場合の話だよね?という気がするが?)
--再帰層を遡るには、
---重みが2つあるので、...hn=tanh(xnWx+hn-1Wh+b)の微分を求めると、...
---再帰層は前再帰の勾配を算出して[[連鎖律>DS:数学的基礎 - 微分・偏微分#yf458e25]]に加える必要があり、全部遡って勾配を算出する必要がある。

-学習における問題と対策
--系列が長くなると問題が起きる(→ [[Truncated BPTT法>#m512f3ef]])
---全部遡って勾配を算出するので処理時間が長くなる。
---連鎖率で掛け算を繰り返すので[[勾配消失問題>ニューラルネットワーク#id252e38]]が起こり易く非効率。

--遠く離れた依存性を学習しなくなりRNNの利点を生かせなくなる(→ [[LSTM>#o836d6ff]])。

***Truncated BPTT法 [#m512f3ef]
-サンプル毎ではなく分割されたタイムステップ(再帰回数)の~
ブロック毎に[[BPTT法>#hb634528]]で重みを更新してから、次のブロックの処理に移る。

-[[BPTT法>#hb634528]]との違い

--逆伝播は分断されている。

--[[順伝播>#a889091d]]は分断されておらず前ブロックの記憶を次ブロックに引継いでいる。
---[[BPTT法>#hb634528]]も全体を通して記憶を引継いでいる。
---[[Truncated BPTT法>#m512f3ef]]では学習単位でh0が0でない。

--ミニバッチの入れ方が異なる。
---[[BPTT法>#hb634528]]でも[[Truncated BPTT法>#m512f3ef]]でも、どちらでもバッチ化はサンプル数を増やして実現。
---[[Truncated BPTT法>#m512f3ef]]では、サンプルをタイムステップで分割するが連続性を保つ必要がある。~
・行がバッチサイズのサンプル数、列がタイムステップ数の場合~
・n番目のミニバッチのx行目とのn+1番目のミニバッチのx行目は連続したサンプルになるように分割する。

***RTRL法 [#q5760441]
というものもあるらしい。

**RNNの原型・発展形 [#c141d604]

***[[RNN LM の Simple RNN>言語処理(AI)#j3b25298]] [#nfc75d38]
-順伝播~
A、Bはパラメタ。
 gt = xt(+)ht-1 ※ ベクトルの直和はベクトルの連結
 ht = tanh(A(gt))
 yt = Softmax(B(ht))

-[[逆伝播はBPTT法>#hb634528]]を使っていない。

***[[RNN Encoder Decoder>RNN Encoder-Decoder(Sequence-to-Sequence)]] [#ye7bfc6b]
[[Enc-Dec、Seq2Seq>RNN Encoder-Decoder(Sequence-to-Sequence)]]モデルとも呼ばれる[[トポロジー>#vca3fbb0]]

-入力の順序と出力の順序や長さが対応していない機械翻訳や質問応答タスクで使用されることが多い。

-RNN Encoderによってエンコードされた情報(≒[[LSTM>長短期記憶ニューラルネットワーク(LSTM)]]のコンテキスト)をRNN Decoderの始めの内部状態として入力。

***[[Bidirectional RNN>長短期記憶ニューラルネットワーク(LSTM)#xbfd6b86]] [#o8fd0b3d]
(バイディレクショナル リカレントネットワーク)

-前方向のRNN層に加え、逆方向のRNN層も追加。
-過去だけでなく未来の情報も利用し効果的に予測。

*参考 [#tc8c34c6]
-コンテンツへのリンク - OSSコンソーシアム~
https://www.osscons.jp/joho108j0-537
--深層学習についてのレポート(RNN編)~
https://1drv.ms/p/s!Amfs5caPP9r5jzVgO9xfbO2sbvkF
--機械学習・深層学習についてのNotebook~
https://github.com/OpenTouryoProject/DxCommon/tree/master/Notebook/Jupyter

-[[ゼロから作るDeep Learning 2 自然言語処理編>言語処理(AI)#s380107d]] 

**YouTube [#gdc35d56]

***[[某处生活_LiveSomewhere>深層学習(deep learning)#sf4a0e55]] [#r1c700a1]
-RNN入門

--PART1:概要・構造・特徴|記憶+可変長入力|時系列データ処理モデル~
https://www.youtube.com/watch?v=zrSBFri9sdw

--PART2:レイヤ・誤差計算・BPTT~
https://www.youtube.com/watch?v=DWectS03wg8

--PART3:Truncated BPTT・ミニバッチの入れ方~
https://www.youtube.com/watch?v=WIZKxSl3Pq4

***AIcia Solid Project [#u8f2a523]
-[[深層学習(deep learning)>深層学習(deep learning)#z59ed24b]]のカットから
-[[言語処理(AI)>言語処理(AI)#x1ea3efe]]のカットから

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS