Section1 再帰型ニューラルネットワークの概念
・RNN(Recurrent Newral Network)
時系列データを処理するためのネットワーク
音声、テキスト、株価の変化等
中間層からの出力を次の入力に使用する構造をもつ
$u^t=W_{(in)}x^t+W_z^{t-1}+b$
$z^t=f(W_{(in)}x^t+W_z^{t-1}+b)$
誤差逆伝搬法の際に、時系列をさかのぼる過程で勾配消失が起きるという問題がある
・実習(3_1_simple_RNN.ipynb)
なぜバイナリ加算を学習しようと思ったのか謎
tから(t+1)への更新部分
u[:,t+1] = np.dot(X, W_in) + np.dot(z[:,t].reshape(1, -1), W)
z[:,t+1] = functions.sigmoid(u[:,t+1])
y[:,t] = functions.sigmoid(np.dot(z[:,t+1].reshape(1, -1), W_out))
グラフが正解率からコスト関数に変わってるので、低下してるほうが学習できている
・演習メモ
構文木で2つの関係を見るときは、特徴ベクトルを左右にそのまま連結し、必要に応じて数を圧縮する
・Backpropagation Through Time(BPTT)
RNNの誤差逆伝搬法をこう呼ぶ
特徴として、時系列のつながりを逆伝搬するため、t-1の状態をt状態で表す式が必要
・実習(3_1_simple_RNN_after.ipynb)
delta[:,t] = (np.dot(delta[:,t+1].T, W.T) + np.dot(delta_out[:,t].T, W_out.T)) * functions.d_sigmoid(u[:,t+1])
# 勾配更新
W_out_grad += np.dot(z[:,t+1].reshape(-1,1), delta_out[:,t].reshape(-1,1))
W_grad += np.dot(z[:,t].reshape(-1,1), delta[:,t].reshape(1,-1))
W_in_grad += np.dot(X.T, delta[:,t].reshape(1,-1))
t+1からtにさかのぼり、勾配を求めている
Section2 LSTM
RNNが勾配消失により、長い時間の学習が困難であった問題をネットワークの構造により解決
計算量が多いという問題がある
・勾配爆発
勾配消失の逆で、遡る過程で勾配が無制限に大きくなる現象
LSTMの全体図(かいつまんで表現するのはあきらめ)
CEC、入力ゲート、出力ゲート、忘却ゲートが特徴
青い点線は時間的なループの接続、黒い点線部分が中間層
・CEC (constant error carousel)
情報を記憶しておくだけのノード。学習と記憶を切り離し、勾配を1に固定し消失が起きないものを作った
・入力ゲート
CECへの情報の入力を学習するためのノード
今回の入力値と入力ゲートの出力を演算して、CECの記憶を更新する
入力ゲートには、今回の入力値に対する重み$W_i$と前回の出力値に対する重み$U_i$をもつ
・出力ゲート
CECの情報をどう使うかを学習するためのノード
CECの情報と出力ゲートの値を演算して出力層へ伝える
CECの出力: $c(t) = i(t) a(t) + f(t) c(t-1)c(t)=i(t)a(t)+f(t)c(t−1)$
*1項目は今回の入力、2項目が前回の出力
・忘却ゲート
CECの不要な情報を削除する機能を学習
言葉の予想に影響を及ぼさない単語を削除していく(確認テスト)
・覗き穴結合
CECから各ゲートへの伝搬。あまり効果はない
Section3 GRU
LSTMはパラメータが多く計算量が多い課題があったため、精度をあまり落とさずに軽量化したもの
CECを廃止して、隠れ層の$h(t)$に情報を保存
更新ゲートとリセットゲートを持つ
・更新ゲート
隠れ層からの出力を制御
・リセットゲート
過去及び現在の値から隠れ層の情報を制御
*$h(t)$が2か所にあって定義がほかの資料と違う気がするので、あとで要整理
隠れ層の中にあるほうは誤り?
Section4 双方向RNN
RNNの応用。過去の情報だけではなく未来の情報も利用
文章など、前後の情報を利用して判断できる場合に使用
通常のRNNのネットワークと逆方法のRNNを並列に接続した構造を取る
・演習チャレンジ
np.concatenate([hf, hb[::-1]],axis=1)
axis=1 で2つを時間的に同じもののペアで組み合わせる
Section5 Seq2Seq
Seqはシーケンスのこと
シーケンスからシーケンスを作るという意味で、翻訳等で利用
EncoderとDecoderの組み合わせ
・Encoder
文章から意味を集約。文脈を読み取る
・Decoder
Encoderの情報から対となる文章を生成。翻訳や対話等
・Embedding
単語はOne-hotベクトルで表現するが、単語数分の次元が生まれる
それを類似した単語同士の距離が近くなるように特徴量(ベクトル)を表現し、次元圧縮
・MLM(Masked Launguage Model)
文章から単語をマスクして、そこに適切な単語が入るように学習させる
文章から単語を隠すだけで学習データが生成できるため、データを集めやすい
・HRED
Seq2Seqの拡張。
Seq2Seqは文章に対して文章を返す単純な構造でしかない
HREDは過去の文脈を次に引き継ぐ(RNNと同様の構造)を持った
しかし、どんな文章に対しても、当たり障りのない回答をするように学習してしまう課題を持つ
・VHRED
HREDの拡張
潜在変数の利用により、より多様な応答をできるようにした
・オートエンコーダ
教師なし学習。次元削減
元データを情報量を圧縮し、重要な特徴をもった潜在変数を抽出し、そこから元のデータを復元するように学習させたEncoder-Decoder
・VAE
オートエンコーダの拡張
潜在変数が確率分布の形式になるように誓約
VAEの学習では、Encoderの出力にノイズを加えることで、汎化性能を向上させる(データ拡張の考え方)
Section6 Word2vec
Embeddingの手法
単語をあらわすone-hotベクトルをEnbeddingの系に変換する重みWを学習させる
・分散仮説:「単語の意味は、周囲の単語によって形成される」というアイディアによりその単語の周囲に出現する単語の傾向から学習させる
Section7 Attention Mechanism
文章の中から注目すべき重要な単語を見つけ重みづけるメカニズム
文章の中でなくなっても意味に影響が低いもの、高いもの等、関係性に重みづけをする
Seq2Seqの特性として長さにかかわらず、同じサイズの情報に圧縮されるため、情報の重要度を判別する必要がある
現在、自然言語処理では最も重要する仕組み
Section1 強化学習
教師なし学習、教師あり学習と並ぶ学習の種類の一つ
教師あり、教師なし学習がデータの特徴を学習していたのに対し、強化学習は目的に対して振る舞いを学習する
環境に対し、価値(行動の価値と状態の価値)と方策を学習し、最終的な報酬を最大化する
はじめはランダムや不完全な知識を元に行動をとり、その結果を見つつ効果的な行動をとれるようになる
未知の行動をとるとそこから新たな知識が得られる。しかし、未知の行動ばかりでは過去の学習が生かせない。トレードオフ関係がある。
・Q学習
TD学習(Temporal-Difference Learning)の一種。行動1回単位で価値関数を更新
行動価値関数Qを学習(ある状態で、こういう行動をとったら、どれだけの報酬をもらって、どういう状態になる)
ex)囲碁で、どういう石の並びで(状態)、どこに石を打ったら(行動)、どうなるか(報酬、次の状態)
近年は、状態だけによって決まる状態価値関数より、行動価値関数のほうがよくつかわれる
・方策関数
実際に次ぎどうするかを決める関数
これによって決められた行動を、行動価値関数で評価する
現在は、この方策関数はニューラルネットワークで近似する
誤差関数の代わりに、期待収益を最大化するように学習
Section2 AlphaGo
Googleの囲碁AI。強化学習。Alpha Go Lee と Alpha Go Zero がある
Leeは人間を棋譜による教師あり学習との組み合わせ
Zeroは教師あり学習なし
・Alpha Go Lee
方策関数(畳み込みNN)
入力: 盤面 19x19 を 48チャンネル
自分の石、敵の石、空白、着手履歴8手、シチョウ等のデータ
出力: 盤面 19x19 の最適手の確率
学習:当初、教師あり学習(棋譜データ)で学習(後述のRollOutPolicyも同様)
保存された過去の方策関数とランダムに対戦し評価
価値関数(畳み込みNN)
入力:方策関数+手版
出力:勝率-1~1
学習:通常の方策関数(CNN)は計算コストが高いため、RollOutPolicyという線形で高速な学習用方策関数を使用
・Alpha Go Zero
教師あり学習をせず強化学習のみ
シチョウ等の情報を入れず、盤面のみの入力
方策関数と価値関数のネットワークを統合(途中で分岐)
ResidualNetwork
入力と出力を直結するショートカットをもつブロック。
これを39個重ねることで勾配消失。また、ショートカットをするのとしないので違うネットワークのように動作し、アンサンブル効果が期待される
Section3 軽量化・高速化技術
「いかに早く学習させるか」と「いかに軽量化し軽易な端末で動作させるか」がある
・学習高速化
分散深層学習:複数の計算資源を使って並列処理
データ並列化、モデル並列化、GPU
データ並列化:データを分割し、複数の機材で学習、学習結果を統合する
同期型:各勾配がそろってから平均し学習(計算資源が管理ができるときはこちら)
非同期型:各計算資源ごと結果を出しそれをプールし、相互に利用(様々な計算資源を使うときはこちら)
モデル並列化:巨大なモデルをブロックに分けて、計算資源に分担
結果を相互に利用する必要があるため、データの流れに応じて適切に分割する必要がある
GPU:安価な演算を大量に並列化
GPGPU:グラフィック以外の汎用計算ができるように設計
GUDA(GPGPUの開発プラットフォーム)
TPU:DL用の計算に特化
・動作軽量化
量子化:データの精度を落とす。64bitの浮動小数点より、32bit、16bitへ
計算資源に応じて高速処理できるものへ。メモリも節約
精度を落としても意外と性能は落ちない
蒸留:高性能な大きなモデルから、軽量なモデルを作成
教師モデル(巨大、高性能、高コスト)から生徒モデル(軽量、低コスト)を作成。学習済みの教師モデルの出力と比較しながら学習
プルーニング:大きなネットワークの中から影響の小さい(重みが小さい)ノードを削除する
重みの小さいネットワークの大半を削除しても性能はあまり落ちない。ex)重み0.1以下は削除
全結合層の9割以上を削減しても十分に機能(精度90%ほどを維持)
Section4 応用モデル
E資格のシラバスにある代表的なネットワークの特徴を確認しよう!
・MobileNetwork
画像認識モデル、畳み込みを軽量化(精度は上がりきったので、軽量化が現在のテーマ)
情報を大きく捨て計算量を減らしたDepthwiseConvolution、PointwiseConvolutionの2つの畳み込みを組み合わせる
DepthwiseConvolution:フィルタを1つしか使わない(チャネル方向の相関を捨てる)
チャンネルごとにのみ畳み込みを行う
PointwiseConvolution:フィルタサイズが1×1(空間方向の相関を捨てる)
画素ごとのみチャネル方向に畳み込みを行う
・DenseNet
画像認識モデル。レイヤーが進むたびに、過去のレイヤーの情報を追加チャネルとして使うDenseBlockが特徴
grouth-rate:何層までチャネルを追加するか
DenseBlockごとにその後、畳み込みとプーリングで同じサイズに戻す
・正規化
データの正規化により学習時間の短縮や初期値への依存低減、過学習の抑制が期待できる
Batch Norm:ミニバッチ単位で正規化を行う(バッチサイズは計算機により制約を受ける)
Layer Norm:画像データ内で複数チャンネルを正規化
Instance Norm:画像データ内の単一チャネル内だけで正規化
データの特性を捨てている気がするが、案外うまくいくらしい
・Wavenet
2016年、音声生成モデル
RNNではなくCNN(時系列への畳み込み)
Dilated causal convolution:層が深くなるにつれて畳み込みのリンク(間隔)を開くことで、より広いレンジに対応(受容野が広い)
Section5 Transformer
Encorder-Decorder + Attention
RNNを使わずにAttentionだけでEncorder-Decorderを構成。
時系列データを順番に処理する必要がないため、並列処理に強い。最近の流行
・言語モデル
単語の並びが自然か確率で出力
・Self Attention
Source Target Attentionと異なり、入力ソース内の単語間の関係性の重みづけを実施
・Position Encording
RNNではないため付与した位置情報を保持して処理することが必要
・Multi-Head attention
重みのことなる8個のAttentionを並列することで、複数の観点から処理(アンサンブルのようなイメージ)
・BLEUスコア
翻訳家の翻訳データとの一致度で機械翻訳の性能を評価
類語などを評価できない表面的な評価しかできないので留意
・実習
*lecture_chap1_exercise_public.ipynb は単体で動かないので環境構築に注意
from wheel.pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag
lecture_chap2_exercise_public.ipynb
小さなデータセットでも訓練に5分半ほどかかった
Section6 物体検知・セグメンテーション
・物体検知、セグメンテーションの種類
分類:画像の中に分類クラスのものが含まれているかの確率
物体検知:BB(BoundingBox)で物体のある矩形エリアを解くて
意味領域分割:Semantic Segmentation ピクセル単位でクラス認識
個体領域分割:Instance Segmentation ピクセル単位でクラス認識及び個体認識
・データセット
様々な画像データセットがあるが、使用するデータセットの特性に留意
*クラス数が多くても、ラベル付けに誤りや揺らぎなどが多い場合もある
VOC12:クラス数20、画像数11,540、物体数平均2.4
ILSRC17:クラス数200、画像数476,668、物体数平均1.1
MS COCO18:クラス数80、画像数123,267、物体数平均7.3
OICOD18:クラス数500、画像数1,743,042、物体数平均7.0
*動画のデータセット名は誤記が多いので注意
・評価基準
IoU : Intersection over Union。分子に「真のエリアと予測エリアの重複」、分子に「両エリアの和」
*予測エリアを極端に大きくしたり、小さくしても不当に評価が上がらない指標
Precision/Recallの考え方:重複検出は2回目の検出以降をFPとして分類することに留意
AP (Average Precision):物体検出は閾値によって、正誤判定が変化する
閾値を変化させ、クラスラベルごとにPrecision/Recallを計算
mAP (mean Average Precision):全クラスで平均をとる
FPS (Frame per Second):処理速度を評価
・SSD:Single Shot Detector
1段階検出器(検出と分類を同時に実施)
デフォルトのBBを複数設置し、それの変形で検出
基本構造:Convolution 層が 13, 全結合層 3 層
出力:(DefaultBox係数)×(クラス数+4)×(特徴マップのサイズ)
*デフォルトボックスの数(DefaultBox係数)×(特徴マップのサイズ)
同一物体の検出については、最も確率が高いものを残しBBを削除
背景に属するBBも偏りすぎないように減らす
評価関数:確率と位置に関する誤差の和