Auxiliary Training: Towards Accurate and Robust Models 自分用メモ
論文リンク
アブスト
既存手法のほとんどはモデルの精度と頑健性のトレードオフに陥っている。
回転のような処理があると画像の劣化(破損)が見られ、加えてぼかし、雨、ノイズ等のような要因が増えるとニューラルネットに対して大幅な精度低下を招いてしまう。
つまり、少しでも上記のような変化を画像に加えると精度が落ちてしまうということだ。
モデルの頑健性を高めようとするときによく使用されるのは Data Augmentation だが、劣化させた(Data Augmentation処理を施した)画像を学習データにそのまま加えると、元の綺麗な画像だけで学習した時よりも精度の低下を引き起こす。
また、それぞれ異なる画像処理を施した劣化画像は相互に影響を及ぼしてしまう。
例えばガウスノイズを加える処理をData Augmentationとして用いるとモデルはノイズによる劣化に強くなるが、コントラストや彩度が異なる画像に対しては頑健性が低下する。
綺麗な画像上で精度を低下させることなくモデルの頑健性を高めることが最近の研究のトレンドになっているが難しい。
本研究では、劣化させた学習サンプルに対して補助分類器(auxiliary classifiers)を導入する学習方法を提案する。
学習段階では、主分類器が補助分類器からロバストな情報を学習できるようにするために、入力を意識した自己蒸留(input-aware self distillation)という新しい蒸留法を提案する。
これに伴い、劣化させた画像の負の影響からモデルを守るために、新しい正規化手法である選択的バッチ正規化(selective batch normalization)を提案する。
また主分類器と補助分類器の重みが同一になるように、L2ノルムペナルティを適用する。
技術や手法のキモ
本研究では、2種類の学習サンプルからなるニューラルネットワークの学習フレームワークを提案している。
以下の図は本手法の全体の流れをまとめてある。
まず2種類の学習サンプルについて、
1つ目は劣化処理を行っていない綺麗な画像。
2つ目は綺麗な画像に劣化処理(ノイズ、ぼかし等のような処理)を加えた画像。
特徴抽出層は共有するが、分類層のコピーである補助分類器を主分類器の学習補助として追加する。
第1段階
学習の第1段階では、代表的な特徴を得るために、2種類の画像を同じconv層(特徴抽出層)に入力した後、それぞれ個々の分類器がある種類の劣化からの学習サンプルによってのみ学習される。
難しい言い方をしてしまったが以下の図を例にすると、
綺麗な画像は綺麗な画像用の主分類器に
ノイズ劣化画像はノイズ画像用の補助分類器に
ぼかし劣化画像はぼかし画像用の補助分類器に
送られるということである。
第2段階
第2段階では、主分類器と補助分類器間の重みが同一の重みになるように、L2ノルム損失を用いてペナルティを与える。
その結果、補助分類器は不要となるので削除し、主分類器のみで良くなる。そのため、元のネットワークの形を変更せずに済む。
さらに、モデルの学習のために、入力を意識した自己蒸留(input-aware self distillation)と選択的バッチ正規化(selective batch normalization)を導入している。
input-aware self distillation
input-aware self distillation では,主分類器をteacher model、補助分類器をstudent modelと見なす。綺麗な画像から劣化した画像へ知識を伝達し、主分類器が補助分類器から頑健な情報を学習できるようにする。
selective batch normalization
selective batch normalization は、綺麗な画像と劣化画像の平均と分散をそれぞれ計算し、綺麗な画像のみでパラメータを更新することで、劣化画像からの負の影響を抑えることができる。
(Zhouらが、batch normalizationを行ったモデルが、batch normalizationを行わないモデルよりも優れた性能を発揮しない可能性があることを示した(特にData Augmentationを利用した場合)。)
※各記号については後述。
batch normってなんだっけ?→Normalization Layers
式
を学習データセットとする。まだ画像処理を行っていない綺麗な画像である。
は画像劣化処理のセット。
は劣化画像を施した学習データセットとする。
綺麗なデータと劣化データを合わせたものをとする。
を特徴抽出器の処理出力、を分類器の処理出力とする。
通常の学習法だと以下のように損失関数を最小化することになる。
今回の学習法だと以下のように損失関数を最小化することになる。
さらにペナルティ関数Ωとして
を追加する。
以上を用いて補助学習(auxiliary training)の損失関数は以下で定義される。
はハイパーパラメータ。
論文では補助学習(auxiliary training)はそこまでハイパーパラメータに敏感ではないと書いてあった。
特には以下の補助学習(auxiliary training)のアルゴリズムにもあるように、第1段階では、第2段階ではとしている(第2段階でL2ノルム損失を用いてペナルティを与えるため)。
結果
CIFAR100、ImageNetでの実験により、提案した補助学習によって精度と頑健性の両方において改善が確認された。
平均して、補助学習はCIFAR100で従来の学習方法と比較して、精度が2.21%向上し、頑健性が21.64%向上した。
感想
ぶっちゃけるとinput-aware self distillationが何で学習に良いのかよく分からなかった。
Live2D Cubism触ってみた
Live2D Cubismとは
こんな感じで1枚イラストにモーションを加えるようにできるソフトウェア。
難しそう...と思うかもしれませんが簡単な動きだったらそこまで難しくなかったです。
チュートリアルなども日本で開発されたものだからか日本語がほとんどなので英語読めない人でも大丈夫です。
- パソコン(今回は Windows10)
- グラフィックソフト(photoshop, CLIP STUDIO PAINT 等)
- Live2D Cubism Editor
使ってみた
今回は CLIP STUDIO PAINT PRO でイラストを描きました。
名前はひとまずkanadeちゃんと名付けました。
レイヤー構成は公式チュートリアル動画を真似しました。
基本的に以下のサイトの「基本チュートリアル」の言うことを聞いていきます。分かりやすいです。
Live2D Cubism チュートリアル | Live2D Manuals & Tutorials
とりあえず
1. , 2. , 3. を読みながら使ってみます。
結果
実際にパラメータ調整をチュートリアル通りにやってみた結果です。
感想
Live2D Cubism自体は難しくない(絵心いらない)。
日本語解説が多くて良い。
イラストを用意する方が難しい。
WSL(Windows Subsystem for Linux)で高速イメージビューアsxivを使うときメモ
github眺めてて何だこのファイルってなったやつたちメモ(Python)
requirements.txt
pipでPythonのパッケージ(ライブラリ)を管理している場合、設定ファイル
requirements.txt
を使って指定のパッケージを指定のバージョンで一括インストールすることができる。
Pipfile、Pipfile.lock
Pythonで開発するときに,プロジェクト毎のパッケージ管理や仮想環境の構築を簡単に自動で行ってくれるツール
ちなみに自分はWSLを使っていてエラーが出て困ったので以下のリンクで対処しました
[python] WSLのpipenv install時になぜかWindows側のpythonが呼ばれる件 - Qiita
Makefile
<変数宣言>
<タスク名>:
<実行したいshell>
みたいに書いて自分が実行したいshellコマンドを組み合わせて自分用のコマンドを作れる...みたいな理解
他にも色々あると思いますがとりあえずこの3つ気になってたので調べました。よくみんな知ってますね。
Windows10でVScodeの設定メモ
サーベイ記事でも何でもありません。マジでただの自分のメモ書きです。
多分何も参考にならないと思います。
VScodeダウンロードとpythonの設定
VScodeのダウンロード
pythonで作業するための設定
WSLダウンロード
VScode上でbashを使いたいのでWSLをダウンロード(git bashでもいいと思う)。
Remote-WSLダウンロード
VScodeでWSLを使うためにRemote-WSLという拡張を入れる。
Remote Development ダウンロード
VScodeを開いてRemote Developmentと呼ばれる拡張を入れる。
これはVScodeでssh接続するために必要となるのでもしssh接続しないなら入れなくても良いです。
(今回は自分が多段sshをしたかったので入れた)
ここで既に多段sshの設定はできていて、設定ファイルや鍵が「C:/Users/ユーザー名/.ssh」に置いてあるとします。
SSHって?
SSHとは?仕組みとSSHサーバーの設定をわかりやすく解説します! | カゴヤのサーバー研究室
多段SSHって?
多段SSHの設定を.ssh/configにまとめる - Qiita
Windowsで生じるエラーによる対処
通常多段sshのconfigは以下のように設定するのが普通です。
Host 踏み台サーバ
HostName 踏み台サーバアドレス
User ユーザー名
IdentityFile 鍵のパス
Host 目的サーバー名
HostName localhost
User ユーザー名
IdentityFile 鍵のパス
ProxyCommand ssh -W %h:%p 踏み台サーバー名
ですがwindows10では「Could not establish connecting to "サーバー名"」みたいなエラーが表示されうまくいかないらしいので、
ProxyCommand ssh -W %h:%p 踏み台サーバー名
の部分を
ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p 踏み台サーバー名
と変更することで接続ができるらしいです。
引用:
Visual Studio Code - vscodeの多段SSHをしたい|teratail
flake8インストール
pythonのエラーチェックをしてくれるモジュールのラッパーのインストール。
上記のリンクでうまくflake8を構築できなかったらcornflakes-linterという拡張を入れると良いかもしれません(こっちの方が若干楽)。僕はこちらを採用しました。
僕は何故かflake8の設定ができてもautopep8の設定ができなかったので、
「Python-autopep8」と呼ばれる拡張機能を追加しました。
これは編集中のpythonファイルを開きながらコマンドパレットに「autopep8」と打つと整形してくれる。上記のリンクではautopep8の自動整形の設定まで書いてあるが自分はうまくいかなかったのでこちらを採用(なお会社のPCではうまくできた模様、謎)。
なお先程入れたPythonの拡張に保存した際に自動整形する機能がついていたため無理にautopep8を入れなくてもよいかと思います。
その他拡張機能
上記のリンクから自分に良さそうな拡張を探して
などなど入れていきます。ここは完全に自由です。
ポチるだけなので楽しいです。買い物してる気分。
注意
ローカルとリモート間で拡張が共有されるわけではないのでそれぞれで拡張を入れる必要があります。
モジュールを入れ過ぎると補完機能(インテリセンス)が重くなるのがネックかなと思いました。「読み込んでいます...」という画面が出てしまう...みたいな時は補完できるまで4~5分待つと表示されたりします。一度補完されると後はスムーズに出てくると思うので最初だけ待たなきゃいけないような感じになることもあります。今後何とか軽量化したいです。というか解決できる人がいたら教えてほしい...。
半教師あり学習自分用にメモ
半教師あり学習について調べようと思ったので、初歩的な手法としてTemporal ensembling、Mean teachers、UNSUPERVISED DATA AUGMENTATION(UDA)、MixMatchについて調べました。
間違いがあったら教えてください。
- そもそも半教師あり学習って何?
- Temporal Ensembling for Semi-Supervised Learning
- Mean teachers are better role models:Weight-averaged consistency targets improve semi-supervised deep learning results
- UNSUPERVISED DATA AUGMENTATION FOR CONSISTENCY TRAINING
- MixMatch: A Holistic Approach to Semi-Supervised Learning
- 自分用用語メモ
そもそも半教師あり学習って何?
現実問題、ラベルあり画像(教師ありデータ)を大量に用意することは難しい。
だけどラベルなし画像(教師なしデータ)を用意するのは簡単。
そこで少量の教師ありデータと大量の教師なしデータから学習する手法として半教師あり学習が提案されている。
Temporal Ensembling for Semi-Supervised Learning
本報告ではΠ-modelとTemporal ensemblingが提案されている。
ここで
:学習データ
:正解ラベル
:バッチサイズ
:何エポック目か
:時間に依存する重み。0から始めるramp up 関数
とする。
Π-model
確率的なData Augmentation と 確率的にDropoutの位置を変えるネットワークを用いる。
流れは以下のようになる。
上図にも書いてあるが損失関数は以下のように定義されており、前の項(黄色線)が教師あり損失関数項、後ろの項(赤線)が教師なし損失関数項となる。
アルゴリズム全体
TEMPORAL ENSEMBLING
流れは以下のようになる。
損失関数は先と同じ。
学習後、 を更新することにより、ネットワーク出力がアンサンブル出力に累積される。
生成するには、因子 (1−αt) で除算する。
アルゴリズム全体
Mean teachers are better role models:Weight-averaged consistency targets improve semi-supervised deep learning results
構成と流れは以下の図のようになる。
TeacherモデルとStudentモデルは同じ構造をしている*1。
classification cost
SoftmaxCrossEntropyを用いている。
consistency cost
Studentモデルの重みを、ノイズを
Teacherモデルの重みを, ノイズを
とすると以下のように書ける。
※この論文ではMSEを使ってるがKL-divergenceなどでも良い。
ちなみにモデルには3つのノイズが入っているが、詳しくは以下のような構成となっており、入力でははRandom Translation、Horizonal flip、Gauusian noiseを、中間層ではDropoutをノイズとして扱っている。
Mean Teacherでは、学習ステップでのを以下の式のようにした。
Teacherモデルの重みはStudentモデルの重みの 指数移動平均(Exponential Moving Average) を用いている。
ここでαはハイパーパラメータ。
確率的勾配降下法(SGD)を用いて各学習ステップでノイズ, をサンプリングすることによってconsistency costを近似できる。
総コストは以上2つのコストの加重合計としている(詳しくは以下)。
教師ありデータのとき
教師ありデータが入力にきたとき classification cost と consistency costを求める。
教師なしデータのとき
教師なしデータが入力にきたとき正解ラベルがなくclassification costを求めることができないため、consistency costのみを用いる。
こうすることでラベルなし画像もうまく学習に組み込むことができるため半教師学習であると言える。
UNSUPERVISED DATA AUGMENTATION FOR CONSISTENCY TRAINING
今までは教師なしデータに対して、何かしらの摂動・ノイズ(例えばガウスノイズとかDropoutとか)を加えた。それらをモデルに入力した時の出力が(差の二乗和やKL-divergenceなどを使って)ばらつかないようにするというものであった。
この論文ではガウスノイズやDropoutなどではなく、より現実的なdata augmentationを用いる。
UDAの概略図
RandAugment
RandAugmentについてはよく分からないけど、Data Augmentationを自動で行うAuto Augmentを、学習と同時に行う手法らしい。
他の様々なタイプのノイズも(ガウスノイズ、敵対的ノイズなど)試したが、本手法のようにdata augmentationを用いたらより優れている結果がでたらしい。
MixMatch: A Holistic Approach to Semi-Supervised Learning
ここでは
バッチサイズを
教師ありデータを
教師なしデータを
とします。
step1
ラベルあり画像(教師ありデータ)に対してdata augmentation(ランダム水平反転処理やランダムクロップ処理など)を行い新たな画像を作る。
step2
同様にラベルなし画像(教師なしデータ)に対してもdata augmentationを行い新たな画像を作る。
ラベルなし画像をdata augmentationする時、K回行いK個の新たな画像を作る。
step3
step2で生成したdata augmentation後のラベルなし画像に対して、モデルでラベルを予測する。
data augmentation後のラベルなし画像はK個あるので、K個分モデルで予測することになる。
step4
step3の予測値を平均する。
これで得られる値を とする。
step5
step4で出力した平均値をSharpen(エントロピーを小さく)する。
TはハイパーパラメータでT→0でonehotに近づくようになっている。
これにより得られる値をとする。
step6
以下のようにラベルありデータは(画像,ラベル)のペアにする。
以下のようにラベルなしデータは(画像,疑似ラベル)のペアにする。
step7
ラベルありデータとラベルなしデータそれぞれをMixupする。
合成するデータはラベルありデータでもラベルなしデータでも良い。
これにより得られる合成後のラベルありデータを 、合成語のラベルなしデータを とする。
step8
(合成後の)ラベルありデータ の予測値と(合成後の)正解ラベル に対し、CrossEntropyを計算する(ラベルありデータの損失関数項)。
(合成後の)ラベルなしデータ の予測値と(合成後の)生成したラベル との差の二乗和を計算する(ラベルなしデータの損失関数項)。
そしてそれぞれを加算し、損失関数とする。
ここで
はハイパーパラメータ
はの次元数
とする。
step9
step1~step8を繰り返して学習を行う。
MixMatchアルゴリズム
step1~step7をまとめると以下のようになる。
ReMixMatch
最近これの進化系ReMixMatchという論文が出たらしいです。
以下の記事が非常に詳しく書いていたのでここでは解説は省きます。
自分用用語メモ
Sharpen
Pseudo-label
*1:Temporal ensemblingはTeacherモデルとStudentモデルともに同じネットワークを共有するが、Mean teacherはそれぞれ別々のネットワーク(構造は同じ)を使うという点に注意
Augmented CycleGAN: Learning Many-to-Many Mappings from Unpaired Data
Augmented CycleGAN: Learning Many-to-Many Mappings from Unpaired Dataのメモです。超適当です。
どんなもの?
従来CycleGANはある画像を与えたら決まった画像が出力される。
(例えば以下の図のようにhorse→zebraの変換を行った時、1枚のhorseの画像からは決まったzebraの画像が出てくる。縞模様が多少変化して出力されるとかは起きたりしない)
本論文ではタイトルにもあるようにCycleGANに多数対多数の変換を学習させることに成功したというものである。
先行研究と比べてどこがすごい?
以下はエッジ→靴の変換の結果だが、様々な色の靴の画像が生成されていて、従来の一対一の変換ではなく多様な画像の生成ができている。
技術や手法のキモはどこ?
多様な画像を生成するなら、単純にCycleGANにノイズを加えればいいじゃ~んというノリでやると
Cycle-consistency lossが邪魔をしてうまくいかない時がある。
Augmented CycleGANでは潜在変数を用いる。
と のペアのマッピングを学習させる(潜在変数の推論を行う)。
Let Z be a latent space with a standard Gaussian prior p(z) over its elements.
→ のマッピングを行い、
以下の損失関数(論文ではMarginal Matching Lossと呼んでいる)に入れる
さらに以下のようにマッピングを行い
以下の Cycle-consistency lossに入れる。
逆の変換も同様に行う。
最終的には以下の損失関数を最適化することになる。
※ と はハイパーパラメーター
どうやって有効だと検証した?
議論はある?
次に読むべき論文は?
参考
http://proceedings.mlr.press/v80/almahairi18a/almahairi18a.pdf Augmented CycleGAN: Learning Many-to-Many Mappings from Unpaired Data on Vimeo
その他
著者実装(pytorch)がある。
https://github.com/aalmah/augmented_cyclegan