Open mizukihiraishi opened 2 years ago
深層学習day3 補助資料
data-augumentation(TensorFlow2)
data_augmentation_with_tf.ipynb https://github.com/mizukihiraishi/Study-AI/blob/e11d7f5a4fb04a736643dd067d8e032feb9a56d5/data_augmentation_with_tf_shusei1031.ipynb データの水増し 画像の水増しであれば反転、回転等を用いて画像を増やす TensorFlow/Kerasのライブラリを用いる Hue・・・色相をランダムに調整する、範囲は引数max_deltaで指定する
activate_functions(TensorFlow2)
activation_function.ipynb https://github.com/mizukihiraishi/Study-AI/blob/e11d7f5a4fb04a736643dd067d8e032feb9a56d5/activation_functions.ipynb 関数は一言でいうと変換器 データフロー図(データフローダイヤグラム) Keras 活性化関数はActivationで記述されている ステップ関数・・・閾値は0、ぴったり0のときは微分不可能だが、実装の際はぴったり0の時は無視する(別微分)、誤差逆伝播法では用いられない(微分が0になるため) シグモイド関数、tanh関数は勾配消失が発生しやすい ReLUの課題・・・導関数の入力値が負の値の時、学習が進まない 出力層の活性化関数 2値分類の出力サイズは2ではなく1であることに留意する 回帰問題は基本的に入力値を変換しない
Tensorflowでの実装 https://github.com/mizukihiraishi/Study-AI/blob/111e15cd1d2d46d530cd4991228268a93687b6b6/4_1_tensorflow_codes_after.ipynb 4_1の線形回帰をもとにパラメータのセーブとロードを行う https://github.com/mizukihiraishi/Study-AI/blob/e11d7f5a4fb04a736643dd067d8e032feb9a56d5/4_2_load.py https://github.com/mizukihiraishi/Study-AI/blob/e11d7f5a4fb04a736643dd067d8e032feb9a56d5/4_2_save.py Kerasでの実装 https://github.com/mizukihiraishi/Study-AI/blob/3dedf814b68881805baee6bf1613984868dc84b9/4_3_keras_codes_after.ipynb
本編
01_強化学習1
アプリなどの実装では軽量化・高速化の技術が重要となる 強化学習とは教師あり学習・教師なし学習・強化学習と分類される中の一つ 強化学習の目標は目的を準備して、目的をうまく達成するように機械学習で学習する 仕事をしているときに自力で仕事を解決し、やり方を改善していくような感じ 強化学習のイメージ 環境:職場、エージェント:労働者、エージェントの方策:仕事のやり方、報酬:ボーナス、状態: 流行りや季節など エージェントは方策に基づいて何かしら行動をすると環境から報酬を得られる エージェントの行動によって環境の状態が変化することがある 報酬をたくさんもらえるようにエージェントの方策を学習する
02_強化学習2
講義テキストP7のイメージ コストという負の報酬を小さくしつつ、売り上げという正の報酬を最大化する ピンポイントの顧客に抱き合わせ商品のキャンペーンメールを送る 最初は無秩序にメールを送って、徐々に顧客の傾向がわかるのでキャンペーンメールを送る相手を選ぶ 強化学習は不完全な知識をもとに行動しながら、データを収集して最適な行動を見つけていく(事前知識の少ない状態) 探索と利用のトレードオフ(講義資料P9を参照)
03_強化学習3
強化学習は方策と価値を学習する 価値・・・エージェントが心地いいと感じる価値(一時的に売り上げが上がっても後々コストがかかるならよくない方策である、など) 価値:実際は行動価値関数と状態価値関数があるが使われるのは行動価値関数がほとんど 強化学習と教師あり・教師なし学習との違い・・・目標が違う 教師あり・なし学習ではデータに含まれるパターンをどうにか見つけ出し、特徴量からモデルの学習では使わなかった未知のデータを予測する 強化学習は特徴量を知りたいのではなく、よりよく動く優れた方策(行動指針)を探し出すことが目標 従来は強化学習で解決しようとしている問題はホワイトカラー労働者がやっていたこと(知識・経験が必要)で、人間が考えられるパターンでしかできない 強化学習が進めば、人間よりも効率的なパターンを自力で探し出すことができるため注目されている 最近の強化学習は深層学習と組み合わせるため、非常に大きな計算量となる場合がある 関数近似法とQ学習を組み合わせる手法の登場により最近強化学習の注目が集まっている Q学習・・・行動価値関数を行動するごとに更新することにより学習を進める手法 関数近似法・・・入力に対して出力を返す関数を用いて学習する → 関数を用いれるということはニューラルネットワークで近似できる 昔の強化学習は大きなリスト(何が入力されたら何を出力するか)を用いて学習を行っていた
04_強化学習4
価値関数 強化学習では価値関数、方策関数が重要 価値関数は2種類あり、状態価値関数と行動価値関数 Q学習では行動価値関数を用いる 状態価値関数、行動価値関数の違い・・・価値を決めるとき、何がエージェントにとって良いのか(エージェントの目標設定) 状態価値関数・・・環境の状態のみが価値を決める対象(エージェントの行動、方策は関係ない)、囲碁であれば盤面しか見ていない 行動価値関数・・・状態とエージェントがとった行動の2つによって価値が決まる、囲碁であれば盤面に対してどこに碁を打つかを見ている 方策関数・・・エージェントがどのような行動をするのか決める関数、価値関数が出した価値を最大化するような方策をエージェントに取らせる 価値関数:状態関数V(s)・・・価値を決めるときに使う値は状態sのみ、行動価値関数Q(s, a)・・・状態s+エージェントがとる行動aを基に価値を決める 囲碁であれば一手をどこに打つかを決めるのが方策関数、最終的に勝てそうかどうかを考えるのが価値関数
05_強化学習5
状態関数が最終的に方策関数のやり方を最後まで続けたら勝てるのか・良い結果となるのかを計算するのに対して方策関数は状態関数が一番理想的な状態(スコアが高くなるように、報酬が大きくなるように)今どうしようか決める 方策関数を学習させる方法 価値関数は将来にわたる目標を考えるイメージ、方策関数は目標設定に基づいて今どうするかを考えるイメージ 方策勾配法・・・方策関数をニューラルネットワークにして学習する Θ^(t+1) = Θ^t + ε∇J(Θ)・・・tは時間、εは学習率、Θは重みWと同様のイメージ、Jは誤差関数と同様のイメージ Θ^tはt時刻の重み ニューラルネットワークの重みの更新式場合は更新量がマイナスになっているが方策勾配法はプラスになっている 方策関数はπで表す πは重みをΘでとるニューラルネットワークである NNは教師データとニューラルネットワークの出力が一緒になるように学習するため、誤差関数を最小化するように学習する(更新式をマイナスする) 強化学習ではなるべく報酬をたくさん得られる方向に学習するため、期待収益を最大化するようにがうしゅうする(更新式をプラスする) J・・・期待される報酬(期待収益)の関数 ∇J(Θ)の計算 もとの式:Σの中身をΘで微分している πΘ・・・方策関数(エージェントがとる行動を示す) Qπ(s,a)・・・ある状態の時なにかしらの行動をとった時の環境から得られる報酬 エージェントが環境の中でとる行動は選択肢が複数あり、それぞれの選択肢に対して価値が決まっている すべての行動パターンに対して得られる価値を足しているのがΣとなっている 参考:https://qiita.com/fridericusgauss/items/aa5215c29646963bda29#%E6%96%B9%E7%AD%96%E5%8B%BE%E9%85%8D%E6%B3%95
06_AlphaGo1
囲碁の強化学習 2種類のAlphaGoがある・・・AlphaGo Lee、AlphaGo Zero AlphaGo Lee・・・二つのニューラルネットワークが出てくる:PolicyNet(方策関数)、ValueNet(価値関数)、畳み込みニューラルネットワークで構成されている PolicyNet 入力:19×19(碁盤の盤面)の48チャンネル(48チャンネルの詳細はテキストP20の表) 着手履歴・・・1チャンネルは1つのみ1が立っている 2次元のデータには畳み込むのが基本 19×19の中でどこに打つのがベストかの予測確率を出力する(2次元) ValueNet 入力:19×19(碁盤の盤面)の49チャンネル(49チャンネルの詳細はテキストP20の表)、PolicyNetのチャンネルに手番のチャンネルを加えたもの 出力:現在の勝率を-1~1で表現したもの(一つの数字、1次元) 出力が1次元のため、Flatten・全結合の処理をしなければならない 2次元で特徴量を計算して、それに基づいて勝つか負けるかを判定する
07_AlphaGo2
AlphaGoの強化学習のステップ 教師あり学習によるRollOutPolicyとPolicyNetの学習 → 強化学習によるPolicyNetの学習 → 強化学習によるValueNetの学習 PolicyPool・・・PolicyNetをたくさん保存したもの 強化学習のみを行うとうまくいかない(工夫が必要) RollOutPolicy・・・高速に学習するための工夫(PolicyNetより1000倍速い)、現在の盤面の状態からどこに石を置けばいいか出力する(入力と出力はPolicyNetと同じ)、NNではなく線形の方策関数 NNで畳み込み演算が含まれている場合、計算量が多くなる
08_AlphaGo3
最初にRollOutPolicyとPolicyNetに教師あり学習を行い、方策の学習をする 教師あり学習では過去の人間対人間の対局を入力する モンテカルロ木探索 強化学習の学習方法 価値関数を学習させるときに用いる手法 RollOutPolicyを用いてモンテカルロ木探索を行う
09_AlphaGo4
AlphaGo Zero 教師あり学習を一切行わずに強化学習のみで作成 Leeの場合は取れる石の数など人間が役に立つと思う入力を決めて入力データで決めている Zeroは石の配置のみを入力としている PolicyNetとValueNetを1つのネットワークに結合している Residual Netを導入した ネットワークは一つ(PolicyValueNet)になったが、Policyの出力(方策関数)とValueの出力(価値関数)は2つ必要となるため、途中で二股にネットワークを分ける
10_AlphaGo5
Residual Block ネットワークにショートカットを入れることによってネットワークの深さを抑えるルートが追加されるため、非常に深いネットワークでも勾配の爆発、消失を防ぐことができる ショートカットするルートとショートカットせずにネットワークを通るルートの2つができるため、何層も繋げるといろいろなネットワークを通った出力が表現できる(アンサンブル効果) AlphaGo ZeroのResidual BlockはResidual Block基本形(テキストP32)を1ブロックとして39個結合している Residual Blockの工夫・・・Bottleneck、PreActivation(AlphaGo Zeroの論文で取り上げられている←E資格にはこういう問題が出てくる)テキストP33 Network構造の工夫・・・WideResNet、PyramidNet 基本的なニューラルネットワークの知識と基本的なものを組み合わせたものに名前がついているものを切り分ける 畳み込み、プーリング、RNN、Attention → 活性化関数の流れが基本
11_AlphaGo6
ResidualNetworkの性能(テキストP34論文の切り抜き)・・・ImageNetの画像分類に対しててきようしたときの性能が示されている AlphaGo Zeroのモンテカルロ木探索(テキストP35,36)
12_データ並列化
軽量化・高速化技術 モデル並列・データ並列・GPU・・・モデルを高速に学習させる技術 量子化・蒸留・プルーニング・・・モデルの軽量化 分散深層学習 毎年十倍のペースでデータの量やモデルの複雑さが増えている 対策・・・コンピュータの数を増やす、並列・分散でモデルを学習させる データ並列化 モデルをワーカーのコンピュータそれぞれにコピーし、データを分割して各ワーカーに計算させる ワーカー一つ一つが一つのコンピュータのイメージ ワーカーを増やしてネットワークでつないで同時並行に学習させる 演算器・・・CPU、GPU、TPU、量子コンピュータ コンピュータは1台で、演算器を増やす手法もある ワーカーがバラバラなので、どのようにモデルに反映させるか・・・同期型、非同期型 同期型の学習の流れ 各ワーカーを同時に子モデルの誤差(勾配)を算出させる → 勾配をすべて集めて平均を求め親モデルに学習させる → パラメータ更新後の親モデルを子モデルに反映させる 非同期型の学習の流れ 各ワーカーバラバラに子モデルを学習させる → 学習が終わった子モデルをパラメータサーバに格納する(Push) → 新しく子モデル学習する際にはパラメータサーバの一番上にある(最後の格納されたモデル)モデルを使って学習する(Pop) 非同期型は処理が速いが、ベストの最新のモデルで子モデルが学習できないので学習が不安定になりやすい スマートフォンなど、いつ電源が切れるかわからないようなもので学習するときは非同期型がよく用いられる
13_モデル並列化1
モデルを分割してそれぞれのワーカーに分割されたモデルを学習させる 親モデル・・・一連のモデル、子モデル・・・分岐しているものやブロックのつながっている部分で分割されたモデル 枝分かれしたモデルの枝分かれ部分を別の計算器に学習させることが現在はよく用いられている データ並列化は違うコンピュータを用いていることが多い モデル並列化は一台のコンピュータに何台かGPUを接続して使われることが多い モデルを分割した際、出力層の結果をもとに誤差関数を計算しなければならないので、モデルを集めなければならないため、たいていの場合一台のコンピュータでモデル並列化は利用される
14_モデル並列化2
モデル並列化の効果 大きなモデル(パラメータが多い)ほどモデル並列化した際の速度向上の効率がよくなる 通信速度との兼ね合いでモデル並列化を利用するか考える 大きなモデルで分割がうまくいく場合に利用する 参考論文:Large Scale Distributed Deep Networks Tennsorflowでは並列処理が部分的にサポートされている GPU(高速な機械)による高速化 CPU・・・複雑な演算、処理が得意(いろいろな種類の演算ができる)、高性能のコアが少数で構成されている(少数精鋭)、CPUの高性能化は18~24ヶ月で2倍(遅い) GPU・・・簡単な並列処理が得意、低性能なコアが多数 ニューラルネットワークは足し算掛け算の単純な行列演算が主なため、GPUで非常に高速化する GPGPUを用いる際の開発環境 CUDA・・・NVIDIA社が開発しているGPUのみで使用可能 Tensorflow、Pytorchを使えばGPUでのディープラーニングは実装できる
15_量子化1
量子化・・・軽量化の手法、パラメータの浮動小数点数の精度を下げる ネットワークが大きくなるとパラメータが大量になり、学習や推論に多くのメモリと演算処理が必要 VERT・・・0.3~0.6GB程度メモリを使う、数十億個重みがある メモリを消費する原因・・・重みの情報(レイヤー数が多いため)を一つ一つ記憶しなければならないため 重み・・・浮動小数点数で表されている
16_量子化2
64bit → 8byte、32bit → 4byte、16bit → 2byte 64bitから32bitで重みを表現できるようになると消費メモリが半減する 64bitで量子化する、32bitで量子化するというような言い方をする 1bitは2進数(1か0) 浮動小数点のコンピュータにおける表現 前半のexponentで桁数の表現、後半のfractionで小数を表現する 0.24683(fraction) × 10^8(exponent) 16→64bitの浮動小数点になることで特に小数の表現できる桁数が増える(精度の良い表現になる) 量子化の精度・・・何bitで表すか
17_量子化3
量子化の利点と欠点 利点・・・計算の高速化(計算量が少なくなる)、省メモリ化(メモリの消費が少なくなる) 欠点・・・精度の低下 64bit、16bitどちらもすべてのbitについて演算するため、16bitの方が計算コストが低くなる 16bit・・・半精度浮動小数点、32bit・・・単精度浮動小数点、64bit・・・倍精度浮動小数点 倍精度の演算は単精度の演算器を2つ用いて演算する GPUの性能(FLOPS:Floationg Operations)・・・単精度は倍精度の丁度2倍 深層学習を行う場合は半精度(16bit)で十分計算できる上に、半精度は非常に高速に計算できるため、16bitで演算することが有効となっている 重みの値が非常に小さくなる場合には高い精度で小数を表現しなければならない(最低限の精度が必要)
18_量子化4
速度の実験結果 32bitと6bitのモデルの比較 テキストP59の表はオブジェクトを見つける作業の速度比較 精度の実験結果 テキストP60の表は求めるオブジェクトを囲んだ範囲の精度比較 参考資料 https://cloud.google.com/tpu/docs/bfloat16 浮動小数点のbitの割り当てを変えて機械学習に適した表現にするやり方もある
19_蒸留
精度の高い(パラメータ数が多く巨大な)ニューラルネットワークはメモリ消費や演算処理が大きくなる 蒸留・・・精度の高いモデルの知識を引き継いで軽量なモデルを精度の高いモデルから作る 精度の高いモデルはレイヤーが多い レイヤーが多いモデルの精度に近い軽量なモデルを作りたい 基本的にデータの複雑さに応じた大きなモデルが必要 蒸留の構成・・・教師モデルと生徒モデルから構成される 教師モデル・・・大きくて複雑で高精度のモデル 生徒モデル・・・教師モデルを基に軽量でそれなりに精度のあるモデル 蒸留の流れ ①データの入力を教師モデル(学習済み:重みは固定)と生徒モデル(学習対象)に通す ②教師モデルと生徒モデルそれぞれの誤差を算出する ③教師モデルと生徒モデルの誤差を足し合わせる ④足し合わせた誤差を基に生徒モデルの重みを更新する 教師モデルは固定の誤差(学習が完了した状態の誤差)のため、教師モデルの誤差を引き継ぎながらそれに合わせるように生徒モデルを学習することができる 蒸留の利点 テキストP67図はCifer 10(画像認識のデータセット)に対する学習を行ったグラフで、横軸がレイヤー数、縦軸が精度(エポック数はすべて同じ) 赤い三角・・・通常の誤差逆伝搬法でモデルを学習したときの精度 青い四角・・・教師と生徒のモデルを使って学習させたときの精度 緑色の丸・・・論文で提案されているHint Trainingを用いて学習させたときの精度 全て軽量なモデル(レイヤーが5~11層)についての学習精度
20_プルーニング
ネットワークが大きくなるとパラメータが大量となるがすべてのニューロンの計算が精度に寄与しているわけではない そのため、必要なパラメータだけ残して残りを削減する → プルーニング ピンポイントに使われているニューロンだけを残す ニューロン削減の手法 重みが閾値より小さい(0に近い)ニューロンを削除する 閾値より重みが小さいものを消した結果ニューロンが途中までつながっているが、最後までつながっておらず出力に寄与しないニューロンも全て削除する プルーニングの結果(ニューロン数と精度) テキストP73論文の資料(左表と右表はつながっている) パラメータを約50%減らしても精度は92%程度出ている 軽量化の手法 量子化・・・重みの精度を下げる 蒸留・・・複雑で精度の良い教師モデルから軽量な生徒モデルを学習させる プルーニング・・・必要のないニューロンを削除する
21_応用技術_MobileNet1
有名なネットワークはE資格によく出る 参考資料:https://qiita.com/HiromuMasuda0228/items/7dd0b764804d2aa199e4 MobileNet・・・画像認識で軽量化・高精度化したモデル、畳み込み演算を工夫している テキストP78~ RGBの情報を基に4枚のフィルターで4つの出力をする(1つのフィルターごとに入力のチャンネルすべてまとめて畳み込みしている) 計算量はH W C(入力のサイズ) K K(畳み込みカーネルのサイズ) * M(出力チャネル数) 一般的な畳み込みレイヤーは計算量が多いため、MobileNetはDepthwise ConvolutionとPointwise Convolutionの組み合わせて計算量を削減
22_応用技術_MobileNet2
Depthwise Convolution カーネルに特徴がある フィルター数は1固定でカーネルのサイズは任意 入力の1チャンネルにつき1つのフィルターで畳み込んでいる 入力のチャンネル数と出力のチャンネル数は同じ 計算量はH W C K K Pointwise Convolution カーネルのサイズを1×1固定でフィルタ数は任意 入力のチャンネル数に関わらず任意のチャンネル数で出力できる 計算量はH W C * M DepthwiseとPointwiseを組み合わせることで一般の畳み込み演算と同等の計算ができるのではないかという考え方
23_応用技術_MobileNet3
Depthwise Separable・・・DepthwiseとPointwiseに分割するやり方 分割することによって計算量を削減できる テキストP86 計算量の問題 (い)H W(入力サイズ) C Dk Dk (う)H W C * M
24_応用技術_DecseNet1
DenseNet・・・画像認識のネットワーク、畳み込み演算のネットワークにDense Blockを組み込むという特徴がある Dense Blockはレイヤーを通り抜けるごとにチャンネル数が増えていく Dense Blockの計算 入力データに加えて、DenseNetの前のレイヤーで計算した結果を付け加える Dense Blockのレイヤー内の一つの畳み込みでk個フィルターがあるとすると、レイヤーを1つ通過するとk個チャンネルが増える Transition Layer・・・各々のDense Blockの間に挟まれていて、畳み込みとプーリングをすることでチャンネル数をDense Blockに入ってくる前の数に減らす チャンネル数を元に戻すことで次のDense Blockに行く際に同様のDense Blockで演算ができる 各ブロック内で特徴マップのサイズは一致する
25_応用技術_DenseNet2
DenseNetとResNetの違い どちらもSkip Connectionが存在する DenseBlockでは前方の各層からの出力を取り込む RessidualBlockでは前の層からの情報しか取り込まない DenseBlockでは成長率(Growth Rate)というハイパーパラメータがある 成長率は各ブロックのフィルターのチャンネル数kのこと
26_応用技術_BatchNorm1
Batch Normalization データの分布をミニバッチ単位で平均が0、分散が1となるように正規化 問題点・・・バッチサイズに影響が受けるため、バッチサイズが小さい場合は用いられない ミニバッチ・・・ハードウェアによってミニバッチのサイズを変えざるを得ない(CPUは多く、GPUは少なくなる・・・など) ハードウェアによってBatchNormの効果を測りずらくなる バッチサイズが小さい場合はLayer Normalizationなどを使う テキストP99の図は縦が画像1枚の1チャンネル分のデータ、Cがチャンネル、H,W * Cが一つの画像のデータ(畳み込み後でチャンネルが増えている)、N・・・ミニバッチ数(図の場合は6画像分) Batch Normalizationは全ての画像の一つのチャンネルに対して正規化(ミニバッチのサイズに影響される) Layer Normalizationは一つの画像のすべてのチャンネルに対して正規化(一つの画像単位) Instance Normalizationは一つの画像の一つのチャンネルに対して正規化
27_応用技術_BatchNorm2
Batch Normalization RGBの場合は赤で1セット、緑で1セット、青で1セットで正規化を行っている 演算器の性能によってシビアにミニバッチ数が決まってしまう(GPUであれば数枚~数十枚) Layer Normalization 一枚ごとの画像でRGBに対して正規化を行っている Batch Normalizationは同じようなデータの集まりで正規化している Layer Normalizationでも有効な効果が出る
28_応用技術_LayerNorm・WaveNet1
Layer Normalizationは入力データに数値を掛けたり、重み行列に対して数値を掛けたりシフトしてずらす操作を行って数値を動かしても出力に影響が出ない(ロバスト) Instance Normalization 各画像の一つのチャンネルに対して正規化、RGBであれば一つの画像の赤、一つの画像の緑、一つの画像の青といった感じ 正規化はデータの特徴を同じような数値に揃える、対象を変えてもなぜかうまくいく WaveNet WaveNet・・・音声生成モデル、CNNで構成している 音声データは高頻度の振動を記録している テキストP105の青い点は音声の一つ一つのデータ(1秒間に何万個単位)で非常に短い時間のサンプリング Dilated causal convolution 次元間で繋がりがあるため畳み込みを行える 何時刻か前に得られたデータをうまく活用しながら出力を計算できる 出力は何時刻かをまとめたものになる WaveNet・・・飛ばし飛ばしで畳み込む、過去のデータを増やしつつも情報量を一定に保つことができる、より時間的に幅広いデータを用いながら一つの出力を得られるネットワークを組める
29_応用技術_WaveNet2
結合確率を効果的に学習できるConvolution型アーキテクチャ・・・Dilated causal convolution Depthwise separable convolution・・・MobileNetで使われる、フィルター数は一つで一つのチャンネルに対して任意のカーネルサイズで畳み込み演算を行う、出力は入力のチャンネル数と同じ Pointwise convolution・・・MobileNetで使われる、カーネルサイズは1×1のフィルターを任意の数ですべてのチャンネルに対して畳み込み演算を行う、出力のチャンネル数はフィルターの数と同じ Deconvolution・・・逆畳み込み → 普通の畳み込みは小さな特徴量になるが、小さな画像を大きくする(pixel数を増やす)畳み込み演算、画像や動画の解像度を上げるのに用いられる Dilated causal convolutionを使う利点・・・パラメータ数に対する受容野が広い(より長い時間的範囲のデータをうまく使える)
物体検知とセマンティックセグメンテーション(SS)の解説
物体検知とSS解説_1
物体検知とセマンティックセグメンテーションの論文を読むうえで、技術を身に着けていく際の共通で知っておくべき知識について学ぶ 導入 物体認識とは 入力:画像(カラー、モノクロを問わず) Classification:分類・・・画像1枚全体に対しクラスラベルを出力 Object Detection:物体検知・・・バウンディングボックス(どこに物体があるか、どこに何があるか、物体の検出位置) Semantic Segmentation:意味領域分割・・・各ピクセルにクラスラベルを割り当てる(テキストP4、P5の画像であれば青い部分が風船、それ以外は背景) Instance Segmentation:個体領域分割・・・各ピクセルにクラスラベルを割り当て、同じクラスラベルの中でも振り分ける(テキストの図であれば、風船の中でさらに区別する) 今までの分類では画像に対して物体が何かを分類していたが、物体認識では画像の中の物体がどこに何が写っているかを出力 インスタンス・・・物体個々を区別するかどうか テキストP9・・・バウンディングボックスとクラスラベル、数字は確率 代表的データセット 物体認識で共通で用いられる代表的なデータセット データセットで意識すべきこと・・・クラス数、Train+Val(学習用データと検証用データ)のデータ数、Box/画像(1枚の画像にいくつ物体が写っているかの平均) VOC12・・・日常で代表的な20クラス、VOC:Visual Object Classesの2012年版、コンペティションで用いられたデータセット、470380、Box/画像が少ない ILSVRC17・・・ImageNet(21841クラス、1400万枚以上)のサブセット、コンペティションで用いられたデータセット、ILSVRC(ImageNet Scale Visual Recognition Challenge)、500400、Box/画像が少ない MS COCO18・・・COCO(Common Object in Context)、Microsoft社が作成、640*480、Box/画像が多い OICOD18・・・Open Images V4(6000クラス以上、900万枚以上)のサブセット、OICOD(Open Images Challenge Object Detection)、コンペティションで用いられたデータセット、画像サイズは一様でない、Box/画像が多い Instance Annotation・・・物体個々にラベリングが与えられている、上であればILSVRC17以外 Box/画像が少ない・・・アイコン的な写り(物体が少ない)で日常とはかけ離れている Box/画像が多い・・・部分的な重なりなども見られる、日常生活のコンテキストに近い、物体が小さく映っていることもある 目的に応じたBox/画像の選択・・・複数の物体が写る物体認識なのか、物体が少ないものなのかを判断する クラス数が大きい方がよいかを考える・・・ImageNetでは同じノートパソコンの画像でもLaptopとNotebookに分かれている ImageNetのクラスが適切でない場合があった 評価指標 通常の分類問題の評価指標 Confusion Matrix(混同行列) 数式中の略語 TP・・・True Positive(Positiveと予測して真値がPositiveだった:予測は正解) FP・・・False Positive(Negativeと予測して真値がPositiveだった:予測は不正解) FN・・・Fasle Negative(Positiveと予測して真値がNegativeだった:予測は不正解) TN・・・True Negative(Negativeと予測して真値がNegativeだった:予測は正解) 予測があっている:True、予測が間違っている:False、Positive:真値がPositive、Negative:真値がNegative Accuracy | どれだけ正確に予測できているか (TP + TN ) / (TP + FP + TN + FN) Recall | どれだけ取りこぼしなく予測することができたか TP / (TP + FN) Precision | 正と予測したものがどれだけ正しかったか TP / (TP + FP) 復習の参考 https://qiita.com/K5K/items/5da52e99861483cae876 confidenceの閾値(threshold value=カットオフポイント:cutoff points)・・・確信度(モデルが判断するデータがどのくらいPositiveかどうかの確率)の閾値、確率が50%以上で陽性としたい場合は閾値を0.5にする 閾値を上げた場合にPresition(適合率)の値が上がり、Recallの値が下がる、これは閾値を上げた場合一般的に分類モデルが確実にPositiveだと判断した場合にPositiveと予測し、実際にPositiveでもNegativeだと判断する場合が増えるため(スパムメールの判断の場合こちらの方がよい・・・確実にスパムメールの場合だけ削除ないと、スパムメールっぽい大事なメールも削除してしまうため) 閾値を下げた場合にRecall(再現度)の値が上がる、これは閾値を下げた場合一般的に分類モデルが少しでもPositiveと判断した場合にPositiveと予測し、実際はNegativeでもPositiveだと判断する場合が増えるため(がん検診の場合こちらの方がよい・・・陽性と医者が判断しないと精密検査を受けられないので、実際は陰性でも陽性の要素がある場合は陽性だと判断した方がよい。また、陽性の場合が極端に少ないため) confidenceの閾値を全ての場合について予測した結果をグラフにするとPrecision-Recall curveを描くことができる Precision-Recall curveの面積が少ないほど良いモデルとなる 復習の参考 https://ontheblink.hatenablog.com/entry/2019/05/06/080623 https://atmarkit.itmedia.co.jp/ait/articles/2103/04/news023.html 閾値変化に対する分類結果・検出結果の振る舞い クラス分類 Thresholdを0.5に設定するとconfidenceが0.5以上のものはPositive、0.5以下のものはNegativeと分類結果(予測)として出力される Thresholdが変化しても予測の数は変化しないため混同行列のどのマスに何個入るかは変わらない 物体検出(テキストP30の表のP1~P6はそれぞれバウンディングボックスを表す) Thresholdを0.5に設定するとconfidence(確信度)が0.5以上のもののみ検出結果(予測)として出力される そのため、Thresholdを0.8に設定するとconfidenceが0.8以上の自信があるバウンディングボックスしかでてこない 物体検出はThresholdを上げた場合混同行列に入る全体の予測の数が減少する IoU 物体検出においてはクラスラベルの正確さに加えて物体位置の予測精度も評価したい IoU = Area of Overlap / Area of Union Area of Overlap:真のバウンディングボックスと予測したバウンディングボックスが重なっている領域 Area of Union:真のバウンディングボックスと予測したバウンディングボックスの合計の領域 IoU・・・Intersection(領域の共通部分) over Union(領域の和集合) IoU = TP / (TP + FP + FN)・・・別名Jaccard係数 予測と真のバウンディングボックスが重なっている領域がTP、予測したバウンディングボックスの中で重なっていない領域がFN、真のバウンディングボックスの中で重なっていない領域がFP 真のバウンディングボックス(Ground Truth-Bounding Box:GT-BB) IoUの直感的解釈は難しい 真の領域のうちどれだけ正解していた或いは予測した領域のうちどれだけ正解していたかの方が解釈しやすいように思えるが、これは定義とするのは誤り 真の領域の正解率:真の領域を大まかにすべて囲んだ予測でもよいとなってしまう 予測した領域の正解率:真の領域の中でほんの一部だけを囲んだ予測でもよいとなってしまう 物体検出ではconfidenceに加えてIoUの閾値を設ける IoUの閾値による正解・不正解の判断 IoUが閾値を超えた場合・・・TP(正しく検出できている) IoUが閾値を超えていない場合・・・FP(検出したが間違っている) IoUが閾値を超えているが、すでにそれよりconfidenceが高いBBの検出があった場合・・・FP 同じ物体に対してバウンディングボックスを複数検出する場合もある Recall・・・バウンディングボックスが検出されなかった物体があった場合、FNとする Average Precision(AP) cofidenceの閾値を小さい場合から高い場合(βを変化させて)までのPrecisionとRecallを計算してPR曲線を描く、IoUの閾値は固定(基本的に0.5) AP・・・PR曲線の下側面積 APの参考資料 https://qiita.com/tmtakashi_dist/items/863e1781b5252e453b47 mean Average Precision(mAP) クラスラベルごとにAPは計算できる mAP・・・すべてのクラスラベルに対するAPを合計してクラス数で割る MS COCOで導入された指標 IoUの閾値を0.5から0.95まで0.05刻みでAPとmAPを計算して合計したものを平均する(10で割る) IoUが高い・・・予測したBBがGT-BBにしっかり重なっている、IoUが0.95・・・ほぼほぼ重なっている IoUの閾値を0.5から0.95まで0.05刻みに上昇させる・・・だんだん位置を厳しく評価していっている Flames per Second:FPS 物体検出においてリアルタイム検出の場合、検出精度に加え検出速度も重要となる FPS・・・1秒間あたりに処理できるフレーム数、もちろん多い方がいい データセットによって良いとされるAP(mAP)は変わってくる inference time・・・1フレーム推論するのに何秒かかったか inference timeのグラフがはみ出してる理由 https://kikaben.com/yolov3/ 検出速度のグラフ・・・横軸が違う場合があるので注意 物体検知の大枠 SIFTの参考文献 https://www.cs.ubc.ca/~lowe/papers/iccv99.pdf 物体検知のフレームワークは2つに分かれる 2段階検出器・・・候補領域(どこに物体があるか)とクラス推定(物体は何なのか)を別々に行う、画像を入れたら位置をまず検出して位置を基にクラス推定を行う、1段階検出器より精度が高く、計算量が大きく推論が遅い傾向にある 1段階検出器・・・候補領域の検出とクラス推定を同時に行う、画像を入れたら特徴量抽出が行われ領域の検出とクラス推定を行う、2段階検出器より精度が低く、計算量が少なく推論が速い傾向にある → リアルタイム検出向き Two Stageの場合、物体位置を把握した後切り出して分類気に流し込んでクラス推定をする One Stageの場合、画像を入力したらどこに何があるかを出力する
物体検知とSS解説_2
SSD Single Shot Detector・・・One Stage Detector まずはDefault BOX(適当に決めたBB)を用意する → Default BOXを変形してconfidenceを出力する VGG16はSSDのベースアーキテクチャ、16はConvolution+ReLUとFully connected+ReLUが合計16層あることを示す、max poolingを介することで特徴マップが小さくなっている(解像度が落ちている)ことに注意する 入力サイズ・・・300300(SSD300)、512512(SSD512) VGG16のFully connected層(FC)2層をConvolution層(Conv)に変更し、最後のFC層を削除している マルチスケール特徴マップ(複数の解像度の特徴マップから出力を作る)・・・途中の層からも出力を作っている 基本的に1つの特徴量につき複数のDefault BOXが存在する 特徴マップのサイズがmnでk個のDefault BOXを用意したときの出力 k (#Class(クラス数:クラス数分のCofidence) + 4(形状オフセット項)) mn 特徴マップごとに存在するDefault BOX数 = k mn Default Boxの数は計算量との兼ね合いで決める VOCデータセットではクラス数20に加えて背景に1クラス割り当てるため、クラス数は21となる そのため、一つのDefault Boxにつき21+4の出力がある SSDのデフォルトボックス数は8732 特徴マップについて、物理的なサイズと解像度を混同してしまう・・・サイズが小さくなるのではなく、解像度が小さくなる → 細かく描画されているか(どれだけのピクセルが含まれているか)が変わってくる(解像度が低いとモザイクがかる) 解像度が高い場合、小さい物体を検出する 解像度が低い場合、大きいものを検出する(1*1の場合画像全体に対する検出) 多数のDefault Boxを用意したことによる弊害 Non-Maximum Suppression・・・一つの物体しか映っていなくても複数のPredicted Bounding Boxが出力されてしまう → 冗長である 解決法:IoUを計算し、一定以上のIoUのBBが重なっている場合Confidenceの大きなBBを残す、IoUが低いBBが存在する場合 → 違う物体を検出している可能性がある(馬の上に人が乗っている場合など) Hard Negative Mining・・・背景クラスを加えているため物体として写っているものより背景と判断される、Negativeクラスに属するPredicted Bounding Boxが多数存在する、そのため背景(Negative)と非背景(Positive)の数が非均衡になる 解決法:PositiveとNegativeの比を1:3などの制約を付与することによりNegativeのバウンディングボックスの数を減らす その他の工夫・・・Default Boxのアスペクト比の選び方やData Augmentation(データの水増し) SSDの損失関数 LocationとConfidenceに依存していることに着目する Lconf(x, c)・・・Confidenceに対する損失関数 Lloc(x, l, g)・・・Location(検出位置)に対する損失関数 原著 https://arxiv.org/abs/1701.06659https://arxiv.org/abs/1801.05918https://arxiv.org/abs/1711.06897 SSDの進化・・・Base Networkの改良(VGG16→ResNet)など 論文ごとの違いについて追うとアルゴリズムの強み弱みがわかる
物体検知とSS解説_3
Semantic Segmentation(SS)の概略 SSに共通している問題、壁 ConvolutionとPoolingを重ねることにより解像度が落ちる → 入力と解像度が違うため元の解像度に戻す操作が必要(Up-sampling) VGG16のネットワーク図をみるとmax poolingを経るごとに特徴マップの解像度が落ちていることがわかる なぜPoolingしているのか・・・受容野の大きさを確保するため 物体の小さい1部分だけ見ても普通は何かわからない 正しく認識するためには受容野をある程度大きくする必要がある 受容野を広げる手法・・・深いConvolution層(多層化に伴う演算量・メモリの問題)、プーリング&ストライド 受容野を広げる・・・一つのカーネルで画像内の多くの情報を得る FCN(Fully Convolutional Network) VGG16の最後のFully connection層をConvolution層に置き換える 出力はチャンネルごとに物体のヒートマップを得ることができる Deconvolution、Transposed convolution ・通常のConvolution層と同様にカーネルサイズ、パディング、ストライドを指定する
- 特徴マップのピクセル間隔をストライドだけ開ける(講義では緑色の×)
- 特徴マップの周りに(kernel size - 1) - paddingだけ余白を作る(テキストP114では余白1と計算されるため講義では赤枠)
- 畳み込み演算を行う(講義ではオレンジ斜線部分) 注意点:逆畳み込みと呼ばれるが畳み込みの逆演算ではないことに注意 → poolingで失われた情報が復元されるわけではない Poolingを繰り返すことにより大まかには捉えられるがローカルな情報(輪郭)が失われていく 低レイヤーPooling層の出力をelement-wise additionする(要素ごとに足し算する)ことでローカルな情報を補完してUp-sampling U-Net・・・低レイヤーの情報を伝達する方法 特徴マップを小さくしていく部分をEncoder、大きくしていく(入力サイズに戻す)部分をDecoderと呼ぶ 単純にUp-samplingするのではなくPooling前の情報を伝達するSkip-connectionを構成している FCUとの違い・・・Up-samplingした後の低レイヤー情報の結合する部分が違う U-Netは低レイヤーの情報をチャネル方向に結合している DeconvNet & SegNetも小さくなった特徴サイズを元に戻している DeconvNet & SegNetで用いられている手法・・・Unpooling Poolingした時の位置情報を保持しておく どこが最大の値だったかを保持する(switch variables) switch variablesを元にUnpoolingを行う Dilated Convolution Convolutionの段階で受容野を広げる工夫 カーネルとカーネルの間に隙間を入れることで隙間を入れた分の受容野を確保する(33のカーネルの間を1ピクセル開けることで実質55のカーネルと同じ範囲の受容野となるが、計算量は33の計算量) rate=2・・・間が1マス、rate=4・・・間が3マス 1515の入力に対して3*3のConv層のみで同じ受容野を獲得しようとした場合7層必要なのに対して、Dilated Convolutionでは3層で実現する
Transformer
BERT1_Seq2seq
BERTを理解する Transformerをユニットにしてたくさん並べる Transformer:Encoder-DecoderモデルにAttentionモデルを掛け合わせたもの Seq2seq:系列(Sequence)を入力として系列を出力する、Encoder-Decoderモデルとも呼ばれる 系列データ・・・自然言語や音声など Encode:入力した系列を内部状態(隠れ状態)に変換し、Decode:内部状態から系列に変換する RNNの復習 再帰処理は時間軸方向に変換できる・・・系列情報を壊さずに内部状態に変換できる 最終的に内部状態ベクトルを出力する 言語モデルの復習 単語の並びに確率を与える 単語の並びがどれだけ自然かを確率化(尤度)する → 自然であればあるほど数値が高くなる RNNでは時刻t-1までの情報で時刻tの事後確率を求めたい → 時刻tでの同時確率を求めたい、同時確率は事後確率で分解できる argmaxP(I, have, a, w)・・・I have a の後に続く単語で確率が一番高いものはどれか 言語モデルでのRNN・・・単語情報が与えられたときに次にどの単語が来れば自然かを判断するタスク ある文があった時に次にどの単語が来れば自然かという確率を学習する 言語の自然な並びを学習すると先頭単語を与えれば文章を生成することも可能 Seq2seq・・・RNNが2つ並んでいる Encoder・・・自然文が与えられたときに先頭から入力し内部状態ベクトルhに変換する(符号化、Encode) Decoder・・・Encoderから渡された情報とトークン(
(Biginning of Sentence))を受け取ってふさわしい文章を順々に生成していく 単純なRNNとの違い・・・Decoderに内部状態ベクトルが渡されている 単純なRNNの場合は初期値が決まっている DecoderのOutput側に正解を付与すれば教師あり学習がEnd to endで行える 教師データとの差分が取れればlossを測ってback propagationができるため、重みの更新ができる コードでの確認 lecture_chap1_exercise_public.ipynb https://github.com/mizukihiraishi/Study-AI/blob/76ce4820f3b9723077ae4ec0ad9cccf758c69e0a/lecture_chap1_exercise_public.ipynb 今回は英語 → 日本語の変換 データを見ると英語と対応した日本語が入っている load_dataをした時点で文章が単語に分割されている 特殊トークンの定義 PAD・・・短い系列の末尾を埋める、BOS・・・系列の始まり、EOS・・・系列の終わり、UNK・・・語彙に存在しない単語 何度か生成するとめちゃくちゃな文章と何となく整った文章が出てくる
BERT2_Transformer
Self-Attention(自己注意機構)に焦点を当てる ニューラル機械翻訳・・・長さに弱い(長い文章ほどBLEUが下がる) 翻訳元の文章を一つのベクトルに圧縮するため Attention 情報量が大きくなった場合に何に注意を払うべきか学習する 各隠れ層の状態ごとに重みを分配する 対応関係において何に注意を払って何に注意を払わないべきかを学習する Attentionは辞書オブジェクトのイメージ keyに対してqueryを入力すると対応するvalueが取り出される Transformer 従来の基本であったRNNを全く使わずSelf-Attentionを使ったモデル 入出力は系列でEncoder-Decoderが存在する Attentionは二種類ある Source Target Attention・・・受け取った情報に対して狙うべき情報が近いものをAttentionベクトルとして取り出してその情報だけ注目する Self-Attention(自己注意機構)・・・Query、Key、Value全てが同じ場所から来る CNNのイメージに近い・・・ひとつの単語を入力した際に文章の単語全ての情報をConvolutionして一つのoutputとする 系列をインプットして位置情報を失わないままSelf-Attention層を通過して内部状態に変換される Feed Forward Network・・・位置情報を保持したまま順伝播させる全結合層 Scaled dot product Attention・・・全単語に関するAtteintionをまとめてスケーリングする dk(次元数)に応じてスケーリングする Multi-Head Attention・・・8個のScaled Dot Product Attentionの出力をConcat それぞれの独自の注意の掛け方を学習して総合的に良い注意の掛け方とする Decoder Multi-Head Attentionが2つある理由・・・Self-Attention(図の下)とSource Target Attention(図の上)が使われている Add & Norm Add・・・入出力の差分を学習させる、出力に元々の入力を加算する Norm・・・Layer Normalizationで正則化 Position Encoding・・・入力(Embedding)に語順の情報を追加する Transformarの注意状況を確認すると言語構造を捉えていることが多い 計算量のわりに表現力が豊かになる コードでの確認 lecture_chap2_exercise_public.ipynb https://github.com/mizukihiraishi/Study-AI/blob/a57e55b77985352794b4bee66756e49dece6e5e5/lecture_chap2_exercise_public.ipynb Seq2seq、Transformerそれぞれについてコードは読み返す
GANとは GAN・・・GenerativeAdversarial Nets 生成器(Generator)と識別器(Discriminator)を競わせて学習する生成&識別モデル 生成モデルと識別モデルが同時に学習される Generator・・・乱数からデータを生成する Discriminator・・・入力データが真データ(学習データ)であるかを識別する テキストP3右下のグラフは真データの確率分布を表す 左下のグラフは一様確率(サイコロを振ったらどの目も1/6の確率で出る) 左上のグラフはG(z)のグラフ横軸のxは真データと同じ範囲ということを表す(画像であればサイズや画素数、RGBなど) GeneratorはDiscriminatorが出力する確率を見ながら生成するデータの確率分布を変えていく Discriminatorは確率の判別を正しく判断したい(Generatorを選択した場合は0に近い確率、真データを選択した場合は1に近い確率) GeneratorはDiscriminatorに誤判別させたい 価値関数Vに対してDが最大化、Gが最小化を行う min maxV(D, G) 価値関数Vはバイナリークロスエントロピー(テキストP5) yはGT(Ground Truth)を表す 最適化方法 Generatorのパラメータを固定してDiscriminatorのパラメータを勾配上昇法で更新その後Discriminatorのパラメータを固定してGeneratorのパラメータを勾配降下法で更新 GANでは一般的にDのパラメータを複数回更新してGの関数を1回更新する 生成データと真データの確率分布が同様であれば生成データは真データとほぼ同一 確率分布はΣでなく∫ 二つの値の近さの指標・・・JSダイバージェンス JSダイバージェンスの性質・・・非負(負の値にならない)で分布が一致するときのみ0の値をとる JSダイバージェンスを価値関数の数式から抜き出す DCGAN:Deep Convolutional GAN GANを利用した画像生成モデル GANに構造的制約を設けることで生成品質を向上している Generator・・・最終層は取りうる値の範囲を決めたいのでtanh、その他はReLUで活性化 Discriminator・・・最終層は確率を出力したいのでsigmoid関数で活性化、その他はLeakyLeLU 中間層(Generatorの最初の部分とDiscriminatorの最後の部分) Generator・・・転置畳み込み層により乱数を画像にアップサンプリング(LSUNを対象としたGではRGB3チャンネルの64*64の画像) Discriminator・・・畳み込み層により画像から特徴を抽出し、最終層をsigmoid関数で活性化 応用技術 Fast Bi-layer Neural Synthesis of One-Shot Realistic Head Avatars 顔写真を入力して、このように顔を動かしたい(Driver)と指定するとDriverの動きをする動画像が出力される study-ai-team/Face_App imagesとtargetに画像を入れてcreate.pyを実行するとresultsに出力される
深層学習 day3
深層学習day3-1
深層学習day3-2