E資格の勉強⑥深層学習day4
目次
本投稿の目的
深層学習(day4)に関する学習のまとめ
Section1:強化学習
【要点】
強化学習:
最終的な報酬を最大化する、というエージェントを作ることを目的とした機械学習。
→ 競技プログラミングで例えると動的プログラミングのイメージ。
例:顧客が100人存在するとして、誰にキャンペーンのメールを送るか。
上記の場合、「キャンペーンの売り上げ - 送るコスト」 を最大化するようなエージェントを作成する。
・ 全員に送ると送るコストが不要に大きくなる。
・ 全員に送らないとキャンペーンの売り上げがない。
→ 最適な行動を見つける必要がある。
【実装演習】
実装演習が無いため、以下サイトを参考に、演習を行った。www.tcom242242.net
――――――――――――――――――――――――
演習①4×4の迷路。ゴールに到着=報酬100。トラップに到着=報酬-100。
――――――――――――――――――――――――
情報:迷路の状態
self.filed_type = {
"N": 0, # 通常
"G": 1, # ゴール
"W": 2, # 壁
"T": 3, # トラップ
}
self.map = [[3, 2, 0, 1],
[0, 0, 0, 2],
[0, 0, 2, 0],
[2, 0, 2, 0],
[0, 0, 0, 0]]
情報:使用した設定
# 定数
NB_EPISODE = 100 # エピソード数
EPSILON = .1 # 探索率
ALPHA = .1 # 学習率
GAMMA = .90 # 割引率
ACTIONS = np.arange(4) # 行動の集合
実行結果
→ 4×4のシンプルな迷路であるため、20回目ほどでエージェントが最大の報酬を獲得できるようになっている。
※試行回数をエピソードと呼ぶ。
――――――――――――――――――――――――
演習②4×5の迷路。(迷路を大きくする。トラップの数も増やす)
――――――――――――――――――――――――
情報:迷路の状態
def __init__(self):
self.filed_type = {
"N": 0, # 通常
"G": 1, # ゴール
"W": 2, # 壁
"T": 3, # トラップ
}
self.map = [[3, 2, 0, 3, 0],
[0, 0, 0, 2, 0],
[0, 0, 2, 0, 1],
[0, 0, 0, 0, 0]]
情報:使用した設定
# 定数
NB_EPISODE = 100 # エピソード数
EPSILON = .6 # 探索率 ※.1で確認した結果が良くなかったため修正。
ALPHA = .1 # 学習率
GAMMA = .90 # 割引率
ACTIONS = np.arange(4) # 行動の集合
実行結果①
→ 50回目くらいで、ようやく最適解を得れるようになった(難しくなった)
実行結果②探索率.1の場合
→ 最適解にたどり着けないまま終了している。
※パラメータ設定の重要性が分かる結果となった。
【関連記事レポート】
以下サイトには、実装演習のみでなく理論も記載されている。
→ 強化学習エージェントにて行動選択に使用される関数の説明も読み込んでおくべき。
・ε-greedy行動選択
ε-greedy法とは~制御工学の基礎あれこれ~
→上記サイトが分かりやすかった。まずはランダムに選んで、
結果を確認してから最適解を探していく・・というまさに貪欲法の手法。
・softmax行動選択
→ 高期待値の選択肢を選ぶ確率を上げていく手法。
Section2:AlphaGo
【要点】
AlphaGo:
教師有り学習と強化学習を使用して、3つのネットワークを学習させている。
※AlphaGo(Lee)は囲碁だが、後継のAlphaGoZeroは将棋やチェスも可能とのこと。
Alpha Go の学習ステップ:
①PolicyNetの教師あり学習
教師データ:3000万局面分の棋譜データ。教師と同じ手を指せるように学習。
※教師1、その他0とした19×19の配列を分類問題として学習させたとのこと。
②PolicyNetの強化学習
PolicyNetとPolicyPool(500イテレーション単位で強化学習の結果を保管した物)で対局を行い、その結果を用いた方策勾配法で学習。
※ミニバッチ学習(単位:128)を1万回実施したとのこと。
③ValueNetの学習
PolicyNetで対局を行い、途中まで①のモデル、途中から②のモデルを使用。
その勝敗結果をラベルとした教師データを作成して学習。
※ミニバッチ学習(単位:32)を5000万回実施したとのこと。
【実装演習】
実装演習が無いため、以下サイトを参考に、演習を行った。
※PythonでAlphaZeroを実装する場合のサンプル・・探すのに時間を要した。
囲碁の盤面(19×19)でなく、Connect4(6×7)の実装。※Connect4:4目並べ
(Google翻訳アドオンで日本語に訳している。今回はgoogle colaboratoryを使用。pipの対象バージョンを若干変えないと動かない・・)
実行結果(ニューラルネットワークの学習状態を確認)
【関連記事レポート】
AlphaGoの作成元であるdeepmindのページを読み込んだ。
・NNの内「ポリシーネットワーク」は、次に再生する動きを選択する。
もう1つのNNである「バリューネットワーク」は、ゲームの勝者を予測する。
→ 概要であるが、各NNの役割が記載されている。
・AlphaZero:チェス、将棋、囲碁のゲームをマスターする方法をゼロから学ぶ、かつ世界チャンピオンのコンピュータープログラムを打ち負かす、単一のシステム。
→ 要点、にも記載している内容。AlphaZeroは「Go」でない→ 囲碁以外でも利用できる。
・MuZeroとして知られる最新バージョンのアルゴリズムは、AlphaZeroのパフォーマンスに匹敵すると同時に、
ゲームのルールの説明なく、視覚的に複雑なゲームに対応する。
→ まだ開発初期の段階とのことであるが、より複雑なゲームにも対応できるモデル「MuZero」が開発中とのこと。
Section3:軽量化・高速化技術
【要点】
高速化:
分散深層学習:並列で学習を行うことで学習の時間を短縮する。
軽量化:
寄与度の低いパラメータの削除、パラメータの精度の削減などで精度を維持しつつ、メモリの使用量などを削減する。
――高速化1:並列化――
①データ並列化:
ワーカー(学習に使用する端末)にモデルをコピー。
データを分割して、各ワーカーで並列に学習を行う。
同期型:
全てのワーカーから結果が返ってくるまで待つ。
結果が帰ってから、平均の勾配を計算してマスターとなるモデル(親モデル)を更新。その後、各ワーカーが最新のマスターを使用して学習を行う。
非同期型:
各ワーカーから結果が返ってき次第、マスターに勾配を反映。
各ワーカーは、順次最新のマスターを使用して学習を行う。
→ 同期型は遅いが精度が高い。非同期型は早いが精度が安定しない。
現在は同期型が主流とのこと。
②モデル並列化
親モデルを分割して各ワーカーにコピー。(中間層を分割するイメージ)
各ワーカーで並列に全てのデータを学習する。
→データが多い場合がデータ並列化。
モデルが大きいときはモデル並列化。を使用するべき。
――高速化2:GPU――
GPU:元々は画像描画のための演算器。CPUより個々の性能が低いが並列処理は強い。
→ 並列化との相性が非常に良い。
――軽量化1:量子化――
パラメータの精度を落とす。(例:64bit浮動小数点 → 32bit)
NNはパラメータ数が膨大であるため、単純に半分にするだけでも効果が大きい。
なおかつ、64bit浮動小数点 → 32bit程度では精度が落ちない。
※落としすぎると極端に精度が落ちる。適切な調整が必要。
――軽量化2:蒸留――
高精度のモデルを基に、新たな軽量のモデルを作成する。
※高精度のモデルを教師に使用するイメージ。高精度のモデルの予測 と 新たなモデルの結果 の差異を利用して、新たなモデルの重みを更新する。
――軽量化3:プルーニング――
刈り込み、という意味。一定より重みが低い(= 寄与度の低い)パラメータを消してしまう方法。
※かなり大胆な削除も可能で、全体の90%近くのパラメータを削除 → 精度は90%以上を維持できる、という例もある。
【実装演習】
実装演習が無いため、以下サイトを参考に、演習を行った。
※テーマは色々あるが、今回は「量子化」の確認を行った。
量子化(64bit → 16bit)の効果を確認する。
実行結果
INFO:tensorflow:Assets written to: /tmp/tmpqrhrrf6i/assets
INFO:tensorflow:Assets written to: /tmp/tmpqrhrrf6i/assets
WARNING:absl:Buffer deduplication procedure will be skipped when flatbuffer library is not properly loaded
Float model in Mb: 0.08052444458007812 ← 量子化前。
Quantized model in Mb: 0.02333831787109375 ← 量子化後。(サイズが1/4となっている)
【関連記事レポート】
――注目した部分――
重要度に基づいて重みのプルーニングを行い、トレーニング プロセスの過程でモデル内の複数の重みを徐々にゼロに指定することで、モデルのスパース性を実現します。スパースモデルは圧縮しやすく、ゼロの部分については推論の際にスキップできるため、レイテンシを改善できます。
この手法では、モデルの圧縮により改善が行われます。将来的には、フレームワークでこの手法をサポートすることで、レイテンシを改善する予定です。モデル圧縮により、精度の低下を最小限に抑えながら、最大で 6 倍の改善が確認されました。
→ 高速化、軽量化、には様々な手法が存在するが、将来的には特に実装を意識しなくても、手法を利用できるようになると思われる。※少なくとも、プルーニングについては将来的にTensorFlowでフレームワーク化されるとのこと。
Section4:応用モデル
【要点】
以下の3つのモデルについて記載する。
・MobileNet
・DenseNet
・WaveNet
――MobileNet――
軽量化・高速化・高精度化を実現した画像認識のモデル。
スマートフォンなどで利用できる軽さが強み。(名前の由来?)
→深さ別の畳み込み、と点別の畳み込み、の組み合わせで軽量化している。
・深さ別の畳み込みのイメージ(1チャネル1フィルタ)
※資料が分かりずらかったので、処理数の削減が分かるように紫の線と囲みを追加。
・点別の畳み込みのイメージ
※資料が分かりずらかったので、処理数の削減が分かるように紫の線を追加。
通常の畳み込みの代わりに、上記の2つの畳み込みを使う事でほぼ同じ処理を高速に行っている。(Depthwise Separable Convolution)
以下の図が分かりやすい。
――DenseNet――
NNでは中間層が増えるほど、前の層の学習が難しくなる。(=勾配消失問題)
その対策を行ったモデルがDenseNet。
以下の様に、後半の中間層の入力に、前半の入力層の出力を使用している。
→ 逆伝搬の際、後半の中間層からダイレクトに前半の入力層に繋がる道がある。
→ 経由する層を抑えつつ、先頭の層に逆伝搬を行うことができる。
――WaveNet――
音声波形を作成するモデル。(Waveフォーマットが由来?)
特徴として、時系列データを畳み込むことで、広い範囲のデータを入力に使用している。(= 受容野を増やしている。)結果、時系列を考慮した非常に適切な出力を行うことができている。この畳み込みを「Dilated Convolution」と呼ぶ。
【確認テスト】
――①(あ)に当てはまる単語を選択する――
深層学習を用いて結合確率を学習する際に、効率的に学習が行えるアーキテクチャを提案したことがWaveNet の大きな貢献の1 つである。
提案された新しいConvolution 型アーキテクチャは(あ)と呼ばれ、結合確率を効率的に学習できるようになっている。
・Dilated causal convolution
・Depthwise separable convolution
・Pointwise convolution
・Deconvolution
→正解は一番上の「Dilated causal convolution」
――②(い)に当てはまる単語を選択する――
(あ)を用いた際の大きな利点は、単純なConvolution layer と比べて(い)ことである。
・パラメータ数に対する受容野が広い
・受容野あたりのパラメータ数が多い
・学習時に並列計算が行える
・推論時に並列計算が行える
→正解は一番上の「パラメータ数に対する受容野が広い」。
比較的少ないパラメータで、広い範囲の時系列を考慮した出力を行うことができる。
【実装演習】
実装演習が無いため、以下による演習を行った。
※今回はMobileNetを対象にした。
試した点
元々のプログラムは「パンダの画像をパンダと判定する」内容であるが、
動作の確認のため「猫の画像」に変更した。
使用した猫の画像(パンダと同様にWikipediaの画像を使用)
実行結果
――――――――――――――――――――――――
INFO:tensorflow:Restoring parameters from mobilenet_v2_1.0_224.ckpt
Top 1 prediction: 282 tabby, tabby cat 0.6503355
――――――――――――――――――――――――
画像を「tabby cat(トラ猫)」と判定できている。
【関連記事レポート】
MobileNetに関する資料(V2のリリースの記事)
――注目した部分――
MobileNetV2は、レイテンシ、サイズ、精度をトレードオフし、バッテリー消費を低減した低消費電力を実現しており、小規模、低遅延、低電力のモバイルファースト・コンピュータビジョンモデルとして機能させます。
TensorFlow-Slim Image Classification Libraryの一部としてリリースされます。クラウドに送るのではなく、モバイル上でニューラルネットワークを実行する利点としては、セキュリティ、プライバシ、レイテンシが緩和されること、そして、いつでもどこでもアクセスできるユーザーエクスペリエンスの向上が言えます。
→ MobileNetは軽量化・高速化・高精度化を実現した画像認識のモデル。と記載したが、その目的はここ。サーバへデータを投げることなく、スマートフォンなどの端末で機械学習が完結できるのであれば、サーバにデータを送り、処理を依頼する必要が無くなる。結果、通信の遅延やセキュリティの問題を気にする必要が無くなる。極端な話、オフラインでも利用する事ができるようになる。
Section5:Transformer
【要点】
Transformer:
Seq2seqよりも高速かつ高精度な翻訳に利用できるモデル。
Attentionを利用するのみで、RNNを利用しない。
Encoder-Decoder Model。Encoderで入力をencode → encode結果をDecoderでDecoderする。(どちらも6層を持つ)
Attention:
文中の単語の意味を理解する際に、どの単語をキーとすればよいか、という情報。
例:it という単語は単体では解釈できない。前後の単語(human、he、penなど)をキーとする必要がある。
【実装演習】
実装演習が無いため、以下による演習を行った。
Transformerのチュートリアル(提供元:TensorFlowコミュニティ)
実行結果
比較:Google翻訳の結果
→ 比較的簡単な文章であるものの、ポルトガル語を適切に英語に翻訳できている。
【関連記事レポート】
――注目した部分――
Googleは米国時間5月18日、自然言語分野における最新のブレークスルーとして、自然な会話を実現する新たな言語モデル「LaMDA」(Language Model for Dialogue Applications:対話アプリケーション用の言語モデル)について発表した。
最近の「BERT」や「GPT-3」といった言語モデルと同様に、LaMDAは「Transformer」をベースにしている。TransformerはGoogle Researchが生み出したニューラルネットワークアーキテクチャーであり、2017年にオープンソース化されている。
→ Transformerは2017年にオープンソース化してから、2021年、5年後の最新のモデルのベースにも使用されている。そのため、Transformerの動作の基礎を抑えておくことは、とにかく最新のモデルの仕組みを抑える、という方法よりも有益と思われる。
Section6:物体検知・セグメンテーション
【要点】
物体検知:
画像の中から、物体の場所、種類、数を検知する技術。
分類、物体検知、意味領域分割、個体領域分割などに分けることができる。
※それぞれのイメージは、確認テスト①を参照すること。
物体検知のデータセット:
VOC12、ILSVRC17、MS COCO18、OICOD18等、様々なデータセットが存在する。
※データセット:この場合、分類対象の画像や正解(ラベル)をまとめた物。
同じデータセットに対する結果 = モデルの性能を客観的に比較できる。
ただし、実務で使用するモデルを選ぶ際などは、用途に応じたデータセットに対する結果を参考にすること。
例えば、オークションの画像(≒ 中央に1つの物体)を識別するために、
自然の写真(≒ 様々な場所に様々な物体)に対する精度が高いモデルを使用しても、
想定通りの精度は得られない。
評価指標:
評価指標として、実際の結果(True or False) × 分析結果(True or False)の4パターンの
要素が土台となる。以下は必ず覚える必要がある。
クラス分類:
出力は「~が存在する確率※(0~1の範囲)」となる。
そのため、「~が存在すると断言する」閾値が変われば、同じモデルでも結果が変わる。
物体検出:
出力は「何が、どこに、どれくらいの確率※(0~1の範囲)で存在するか」となる。
※厳密には確率ではない・・。
物体検出の場合は、IoUという指標も評価に使用される。
一言で説明すると、「予測と実際の積結合 / 予測と実際の和結合」 の値。これも0~1の範囲となる。
FPS:
物体検知の場合、精度だけでなく速度も問題となる。
例:分析に100ミリ秒等を要するモデルの場合・・
定期的に物体の数を集計したい場合 → 十分な速度。
自動運転で障害物を検知したい場合 → 遅すぎる。
速度の指標として「FPS:Flames per Second」が存在する。
一言で説明すると、「1秒間で何枚の画像を処理できるか」
物体検知のフレームワーク:
大分類すると以下の2つに分類できる。
2段階検出器:
候補領域の検出とクラス推定を別々に行う。高精度だが遅い。
→ まず画像から物体を抜き出し、その後物体を分類、というイメージ。
1段階検出器:
候補領域の検出とクラス推定を同時に行う。精度が安定しないが早い。
→ 画像から物体の抜き出しと分類を同時に行うイメージ。
【確認テスト】
――①それぞれの物体認識タスクにおける出力は何か?――
→分類:
画像に対する単一or複数のラベル。
例:風船、窓、木など。
物体検知:
各物体の範囲を示す四角形
例:各風船を囲む四角形
意味領域分割:
各物体に対するピクセル単位のクラスラベル
例:風船に対する色付け
個体領域分割:
各物体に対するピクセル単位のクラスラベル
例:風船に対する色付け。なおかつ、風船ごとに異なる色を付ける。
(各風船を区別する)
【実装演習】
実装演習が無いため、未実施。
代替として、資料に記載されている確認テストを一通り学習した。
【関連記事レポート】
物体検知のフレームワーク(YOLO)の情報
――注目した部分――
CarND車両検出は、 Udacity自動運転車Nanodegreeプログラムのプロジェクトです。このプロジェクトの目的は、ダッシュカメラのビデオで車両を検出することです。この実装では、バッチ処理なしで21FPSを実現できます。
→ リアルタイム検知の重要性。例えば完全な自動運転の場合、
①物体検知(例:障害物がある)
②適切な処理の選択と実行(例:ブレーキペダルを押す)
③実際に動作が反映される(例:車が減速する) という流れになるが、
「①物体検知」が一番ボトルネックになると思われる。自動運転の完全化には、物体検知の速度の向上が一番重要なのではないだろうか。(もちろん精度も重要)
以上