【ラビットチャレンジ】深層学習day3レポート

◆Section1:再帰型ニューラルネット

【要点のまとめ】
○RNN
時系列データに対応可能なニューラルネットワーク

時系列モデルを扱うには、初期の状態と過去の時間<t-1>の状態を保持し、そこから次の時間でのtを再帰的に求める再帰構造が必要になる。

時系列を遡れば遡るほど、勾配が消失していき、長い時系列の学習が困難なことが課題としてあげられる。

○時系列データ
時間的順序を追って一定間隔ごとに観察され
相互に統計的依存関係??が認められるようなデータ
音声データ・テキストデータなど

○BPTT
RNNにおいてのパラメータ調整する誤差逆伝播の一種

○勾配爆発
勾配が層を逆伝播するごとに指数関数的に大きくなっていく事象

【確認テストなど自身の考察】
RNNのネットワークには大きな3つの重み
・現在の中間層を定義する際にかけられる重み
・1つは中間層から出力を定義する際にかけられる重み


【参考図書・関連情報】
初期値を正しく与えないと勾配消失や勾配爆発が起きるが、
RNNでも起きやすい。
勾配爆発対策:勾配クリッピングという方法がよく使われる。
勾配クリッピングは勾配がある閾値を超えた場合、
ルールに従って修正する手法。

勾配消失対策:LSTM(Long short term memory)と呼ばれる手法がよく使われる。長い記憶も短い記憶も継続させることができる。


【実装演習】
時系列の処理が入る




↓その他参考サイト
https://toukei-lab.com/rnn


◆Section2:LSTM

【要点のまとめ】

○入力・出力ゲート
追加することでそれぞれのゲートへの入力値の重みを、重
み行列W,Uで可変可能→CECの課題解決

○忘却ゲート
CECは過去の情報が全て保管されている。
過去の情報不要となった場合、そのタイミングで情報を忘却する機能が必要→忘却ゲートの誕生

○覗き穴結合
CEC自身の値に、重み行列を介して伝播可能にした構造


【確認テストなど自身の考察】
文章をLSTMに入力し空欄に当てはまる単語を予測したいとする。
文中の「とても」という言葉は空欄の予測においてなくなっても影響を及ぼさないと考えられる。
このような場合、どのゲートが作用すると考えられるか。

入力ゲート

初めから不要な情報と判断されているなら、保持する必要がないため
と考える。

【参考図書・関連情報】
○CEC
誤差を保存するセル(Constant Error Carrousel)

<復習>
RNN(再帰型ニューラルネットワーク)には時間軸上に展開されていない表記と、時間軸上に展開されている表記の2種類がある。
BPTT(backpropagation through time)が用いて学習するが、長期的特徴を学習することは苦手という課題がある。

↓参考サイト
https://agirobots.com/lstmgruentrance-noformula/


【実装演習】




◆Section3:GRU

【要点のまとめ】
○GRU
従来のLSTMではパラメータが多数存在していたため、計算負荷が大きかった。GRUではそのパラメータを大幅に削減し、精度は同等またはそれ以上が期待できる。計算負荷が低いメリットがある。

【確認テストなど自身の考察】
LSTMとGRUの違い

GRUはパラメータを大幅に削減し、精度と計算効率向上が見込める。

【参考図書・関連情報】
GRUは一般的にLSTMより表現力は劣ると評価される傾向にある。
GRUの方がパラメータ数の少なさが可視化されている
↓参考サイト
https://wayama.io/article/ml/lec/text/gru/

【実装演習】






◆Section4::双方向RNN

【要点のまとめ】
○双方向RNN
過去の情報だけでなく、未来の情報を加味することで精度を向上させる
文章の推敲や、機械翻訳で実用


【確認テストなど自身の考察】
双方向RNNの順伝播を行うプログラムである。
順方向については、入力から中間層への重みW_f, 一ステップ前の中間層出力から中間層への重みをU_f、逆方向に関しては同様にパラメータW_b, U_bを持ち、両者の中間層表現を合わせた特徴から出力層への重みはVである。_rnn関数はRNNの順伝播を表し中間層の系列を返す関数であるとする。

np.concatenate([h_f, h_b[::-1]], axis=1)
双方向RNNでは、順方向と逆方向に伝播したときの中間層表現をあわせたものが特徴量となる

<復習>
axisは軸のこと
↓参考サイト


【参考図書・関連情報】
○双方向RNN
Bidirectional RNN
学習時に過去と未来の情報の入力を必要とすることから、
運用時に過去から未来までのすべての情報を入力してはじめて予測できるようになり応用範囲が限定される。


【実装演習】
参考サイトでコードを確認

ーーー
from keras.models import Sequential from keras.layers import Dense, SimpleRNN batch_size = 5  # バッチサイズ
n_in = 1  # 入力層のニューロン数
n_mid = 20   # 中間層のニューロン数
n_out = 1    # 出力層のニューロン数
ーーー

RNN層の追加
ーーー
model = Sequential()
model.add(SimpleRNN(n_mid, input_shape=(n_rnn, n_in), return_sequences=True)) model.add(Dense(n_out, activation="linear")) model.compile(loss="mean_squared_error", optimizer="sgd") SGD print(model.summary())
ーーー

↓参考サイト
https://omathin.com/rnn-basic/


◆Section5:Seq2Seq

【要点のまとめ】
○Seq2Seq
Encoder-Decoderモデルの一種
機械対話や、機械翻訳などに使用

○Encoder RNN
ユーザーがインプットしたテキストデータを、
単語等のトークンに区切って渡す構造

例:昨日 食べ た 刺し 身 大丈 夫 でし たか 。

○Decoder RNN
システムがアウトプットデータを、
単語等のトークンごとに生成する構造

○HRED
過去n-1 個の発話から次の発話を生成する。
Seq2seqでは会話の文脈は考慮されず応答されたが、
HREDでは前の単語の流れに即して応答されるためより人間らしい文章が生成される。
HRED は短く情報量に乏しい答えをしがちという課題がある。

○VHRED
HREDの課題をVAEの潜在変数の概念を追加することで解決した構造

○オートエンコーダ
教師なし学習
学習時の入力データは訓練データのみ

○VAE
データを潜在変数zの確率分布という構造に押し込めることを可能にした

【確認テストなど自身の考察】
seq2seqについて説明

NNを用いたEncoder-Decoderモデルの一種であり、機械翻訳などのモデルに使われる。

VAEに関する下記の説明文中の空欄に当てはまる言葉を答えよ。
自己符号化器の潜在変数に____を導入したもの

確率分布


【参考図書・関連情報】
Seq2Seqの技術はGoogle翻訳やチャットボットなどに活用されている

↓参考サイト
https://qiita.com/drken/items/17b3d32662ad862c03c5


【実装演習】
参考サイトでコードを確認

文章生成メソッド
ーーー
def generate(self, xs, start_id, sample_size): # 問題文をエンコード
hs = self.encoder.forward(xs) # 解答を生成
sampled = self.decoder.generate(hs, start_id, sample_size) return sampled
ーーー

↓参考サイト
https://www.anarchive-beta.com/entry/2021/03/29/150000


◆Section6:Word2vec

【要点のまとめ】

○Word2vec
学習データからボキャブラリを作成
大規模データの分散表現の学習が現実的な計算速度とメモリ量で実現可能にした。

【確認テストなど自身の考察】
確認テストはなし

以下のような表現を見ると、機械学習に触れていない人がとっつきやすい(遊びやすい、イメージしやすい)モデルなのかなと感じた。


↓参考サイト
https://www.pc-koubou.jp/magazine/9905
Word2Vecで「おじさん」と「お兄さん」を比較してみた

【参考図書・関連情報】
↓実用例
・レコメンドの分析
・レビュー分析
・機械翻訳
・質疑応答システム

  • ↓参考サイト

【実装演習】
参考サイトでコードを確認

↓類義語の検索
ーーー
from gensim.models import KeyedVectors wv = KeyedVectors.load_word2vec_format('./wiki.vec.pt', binary=True) results = wv.most_similar(positive=['講義']) for result in results: print(result)

('授業', 0.6795130968093872)
('講読', 0.6785069704055786)
('講演', 0.662272572517395)
('講話', 0.6550379991531372)
('聴講', 0.6494878530502319)
('講座', 0.6335989832878113)
('レクチャー', 0.6315985918045044)
('復習', 0.580752968788147)
('進講', 0.5763939619064331)
('大学院生', 0.5596680641174316)
ーーー

文字で判別していると思いきや「レクチャー」なども拾えており、
精度を確認できました。

↓参考サイト

https://qiita.com/kenta1984/items/93b64768494f971edf86



◆Section7::Attention Mechan

【要点のまとめ】
○Attention Mechanism(アテンションメカニズム)
「入力と出力のどの単語が関連しているのか」の関連度を学習する仕組み
予測モデルの入力を構成する特徴ベクトル集合に対して各特徴ベクトルの重要度か関連度を表した「アテンション係数」を潜在変数として追加で学習・推定する。
(Attentionは直訳すると「注意」)

【確認テストなど自身の考察】
RNNとword2vec、seq2seqとAttentionの違い

RNNの分散表現取得の課題を解決するため、分散表現の取得に特化したモデルがWord2Vec
seq2seqでは入力系列の情報をEncoderで圧縮したベクトルとしてしかDecoderに伝えることができないため、入力系列が長いと入力系列の情報をDecoderにしっかりと伝えることが困難になる。この点、Decode時に入力系列の情報を直接参照できるようにする仕組みにしたのがAttention

【参考図書・関連情報】

実用例
翻訳: 英語 ・ フランス語 のペアを学習。英語を入力するとフランス語に翻訳構文解析: 英語 ・構文木のペアを学習。英語を入力すると構文木を返してくれる
会話bot: 問いかけ・ 返答 のペアを学習。
     例:「ねむい」に対して「おやすみ」などと返してくれる


【実装演習】
参考サイトでコードを確認

Attention マスクを特徴量マップに掛け合わせ、重み付きの特徴量マップを取得
ーーー
def save_attention_mask(self, x, path):
B = x.shape[0]
self.forward(x)
x = x.cpu() * torch.Tensor([0.229, 0.224, 0.225]).reshape(-1, 1, 1)
x = x + torch.Tensor([0.485, 0.456, 0.406]).reshape(-1, 1, 1)
fig, axs = plt.subplots(4, 2, figsize=(6, 8))
plt.axis('off')
for i in range(4):
axs[i, 0].imshow(x[i].permute(1, 2, 0))
axs[i, 1].imshow(self.mask_[i][0])
plt.savefig(path)
plt.close()
ーーー

↓参考サイトhttps://www.softbanktech.co.jp/special/blog/cloud_blog/2019/0063/

この記事が気に入ったらサポートをしてみませんか?