ココアのお勉強ブログ

技術職の一般人です。趣味でコード書いたりソフト触ったり。

Auxiliary Training: Towards Accurate and Robust Models 自分用メモ

論文リンク

http://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_Auxiliary_Training_Towards_Accurate_and_Robust_Models_CVPR_2020_paper.html

アブスト

既存手法のほとんどはモデルの精度と頑健性のトレードオフに陥っている。
回転のような処理があると画像の劣化(破損)が見られ、加えてぼかし、雨、ノイズ等のような要因が増えるとニューラルネットに対して大幅な精度低下を招いてしまう。
つまり、少しでも上記のような変化を画像に加えると精度が落ちてしまうということだ。
モデルの頑健性を高めようとするときによく使用されるのは 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

X_cを学習データセットとする。まだ画像処理を行っていない綺麗な画像である。

Tは画像劣化処理のセット。

X_jは劣化画像を施した学習データセットとする。

綺麗なデータと劣化データを合わせたものをXとする。

f(x;\theta_f)を特徴抽出器の処理出力、g(x;\theta_g)を分類器の処理出力とする。

通常の学習法だと以下のように損失関数を最小化することになる。

今回の学習法だと以下のように損失関数を最小化することになる。

さらにペナルティ関数Ωとして

を追加する。

以上を用いて補助学習(auxiliary training)の損失関数は以下で定義される。

α, λ, γはハイパーパラメータ。
論文では補助学習(auxiliary training)はそこまでハイパーパラメータに敏感ではないと書いてあった。
特にγは以下の補助学習(auxiliary training)のアルゴリズムにもあるように、第1段階ではγ=0、第2段階ではγ=1としている(第2段階でL2ノルム損失を用いてペナルティを与えるため)。

結果

CIFAR100、ImageNetでの実験により、提案した補助学習によって精度と頑健性の両方において改善が確認された。
平均して、補助学習はCIFAR100で従来の学習方法と比較して、精度が2.21%向上し、頑健性が21.64%向上した。

感想

ぶっちゃけるとinput-aware self distillationが何で学習に良いのかよく分からなかった。

Live2D Cubism触ってみた

Live2D Cubismとは

こんな感じで1枚イラストにモーションを加えるようにできるソフトウェア。

www.youtube.com

難しそう...と思うかもしれませんが簡単な動きだったらそこまで難しくなかったです。

チュートリアルなども日本で開発されたものだからか日本語がほとんどなので英語読めない人でも大丈夫です。

使ってみた

今回は CLIP STUDIO PAINT PRO でイラストを描きました。

名前はひとまずkanadeちゃんと名付けました。

f:id:hotcocoastudy:20200225052958j:plain

描いたイラスト

レイヤー構成は公式チュートリアル動画を真似しました。

www.youtube.com

f:id:hotcocoastudy:20200225135454p:plain

イラスト編集画面

基本的に以下のサイトの「基本チュートリアル」の言うことを聞いていきます。分かりやすいです。

Live2D Cubism チュートリアル | Live2D Manuals & Tutorials

f:id:hotcocoastudy:20200225135530p:plain

 

とりあえず
1. , 2. , 3. を読みながら使ってみます。

f:id:hotcocoastudy:20200225135552p:plain

結果

実際にパラメータ調整をチュートリアル通りにやってみた結果です。

drive.google.com

感想

Live2D Cubism自体は難しくない(絵心いらない)。

日本語解説が多くて良い。

イラストを用意する方が難しい。

WSL(Windows Subsystem for Linux)で高速イメージビューアsxivを使うときメモ

sxivとは

malkalech.com

構築

WSLを開いてsxivをインストールする

$ sudo apt install sxiv

で、何か適当な画像(hoge.jpg)を見るため、画像を開くコマンド

$ sxiv hoge.jpg

を実行しようとすると

「sxiv: Error opening X display」

というエラーが出る。

そこで以下のリンクに従って「VcXsrv Windows X Server」を導入する。

orebibou.com

先程と同様に

$ sxiv hoge.jpg

と打つと表示された。

github眺めてて何だこのファイルってなったやつたちメモ(Python)

requirements.txt

note.nkmk.me

pipでPythonのパッケージ(ライブラリ)を管理している場合、設定ファイルrequirements.txtを使って指定のパッケージを指定のバージョンで一括インストールすることができる。

Pipfile、Pipfile.lock

qiita.com

Pythonで開発するときに,プロジェクト毎のパッケージ管理や仮想環境の構築を簡単に自動で行ってくれるツール

ちなみに自分はWSLを使っていてエラーが出て困ったので以下のリンクで対処しました

[python] WSLのpipenv install時になぜかWindows側のpythonが呼ばれる件 - Qiita

Makefile

qiita.com

<変数宣言>

<タスク名>:
<実行したいshell>

みたいに書いて自分が実行したいshellコマンドを組み合わせて自分用のコマンドを作れる...みたいな理解

 

他にも色々あると思いますがとりあえずこの3つ気になってたので調べました。よくみんな知ってますね。

Windows10でVScodeの設定メモ

サーベイ記事でも何でもありません。マジでただの自分のメモ書きです。

多分何も参考にならないと思います。

VScodeダウンロードとpythonの設定

VScodeのダウンロード

qiita.com

pythonで作業するための設定

www.sejuku.net

WSLダウンロード

VScode上でbashを使いたいのでWSLをダウンロード(git bashでもいいと思う)。

qiita.com

Remote-WSLダウンロード

VScodeでWSLを使うためにRemote-WSLという拡張を入れる。

syobon.jp

Remote Development ダウンロード

VScodeを開いてRemote Developmentと呼ばれる拡張を入れる。

これはVScodessh接続するために必要となるのでもしssh接続しないなら入れなくても良いです。

(今回は自分が多段sshをしたかったので入れた)

ここで既に多段sshの設定はできていて、設定ファイルや鍵が「C:/Users/ユーザー名/.ssh」に置いてあるとします。

dev.classmethod.jp

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のエラーチェックをしてくれるモジュールのラッパーのインストール。

qiita.com

 

上記のリンクでうまくflake8を構築できなかったらcornflakes-linterという拡張を入れると良いかもしれません(こっちの方が若干楽)。僕はこちらを採用しました。

f:id:hotcocoastudy:20200216141842p:plain

flake8の使用例

僕は何故かflake8の設定ができてもautopep8の設定ができなかったので、

Python-autopep8」と呼ばれる拡張機能を追加しました。

これは編集中のpythonファイルを開きながらコマンドパレットに「autopep8」と打つと整形してくれる。上記のリンクではautopep8の自動整形の設定まで書いてあるが自分はうまくいかなかったのでこちらを採用(なお会社のPCではうまくできた模様、謎)。

f:id:hotcocoastudy:20200215191440p:plain

なお先程入れたPythonの拡張に保存した際に自動整形する機能がついていたため無理にautopep8を入れなくてもよいかと思います。

その他拡張機能

qiita.com

www.hypertextcandy.com

上記のリンクから自分に良さそうな拡張を探して

などなど入れていきます。ここは完全に自由です。

ポチるだけなので楽しいです。買い物してる気分。

注意

ローカルとリモート間で拡張が共有されるわけではないのでそれぞれで拡張を入れる必要があります。

モジュールを入れ過ぎると補完機能(インテリセンス)が重くなるのがネックかなと思いました。「読み込んでいます...」という画面が出てしまう...みたいな時は補完できるまで4~5分待つと表示されたりします。一度補完されると後はスムーズに出てくると思うので最初だけ待たなきゃいけないような感じになることもあります。今後何とか軽量化したいです。というか解決できる人がいたら教えてほしい...。

半教師あり学習自分用にメモ

教師あり学習について調べようと思ったので、初歩的な手法としてTemporal ensembling、Mean teachers、UNSUPERVISED DATA AUGMENTATION(UDA)、MixMatchについて調べました。
間違いがあったら教えてください。

そもそも半教師あり学習って何?

現実問題、ラベルあり画像(教師ありデータ)を大量に用意することは難しい。
だけどラベルなし画像(教師なしデータ)を用意するのは簡単。
そこで少量の教師ありデータと大量の教師なしデータから学習する手法として半教師あり学習が提案されている。

Temporal Ensembling for Semi-Supervised Learning

arxiv.org

本報告ではΠ-modelとTemporal ensemblingが提案されている。

ここで
x_i:学習データ
y_i:正解ラベル
B:バッチサイズ
t:何エポック目か
w(t):時間に依存する重み。0から始めるramp up 関数 とする。

Π-model

確率的なData Augmentation と 確率的にDropoutの位置を変えるネットワークを用いる。

流れは以下のようになる。

上図にも書いてあるが損失関数は以下のように定義されており、前の項(黄色線)が教師あり損失関数項、後ろの項(赤線)が教師なし損失関数項となる。

アルゴリズム全体

TEMPORAL ENSEMBLING

流れは以下のようになる。

損失関数は先と同じ。
学習後、Z_i←αZ_i+(1−α)z_i を更新することにより、ネットワーク出力z_iがアンサンブル出力Z_iに累積される。

\tilde{z}生成するには、因子 (1−αt) で除算する。

アルゴリズム全体

Mean teachers are better role models:Weight-averaged consistency targets improve semi-supervised deep learning results

arxiv.org

構成と流れは以下の図のようになる。
TeacherモデルとStudentモデルは同じ構造をしている*1

classification cost

SoftmaxCrossEntropyを用いている。

consistency cost

Studentモデルの重みをθ、ノイズをη
Teacherモデルの重みをθ′, ノイズをη′ とすると以下のように書ける。

※この論文ではMSEを使ってるがKL-divergenceなどでも良い。

ちなみにモデルには3つのノイズが入っているが、詳しくは以下のような構成となっており、入力でははRandom Translation、Horizonal flip、Gauusian noiseを、中間層ではDropoutをノイズとして扱っている。

Mean Teacherでは、学習ステップtでのθ′_tを以下の式のようにした。
Teacherモデルの重みはStudentモデルの重みの 指数移動平均(Exponential Moving Average) を用いている。

ここでαはハイパーパラメータ。
確率的勾配降下法(SGD)を用いて各学習ステップでノイズη, η′をサンプリングすることによってconsistency costを近似できる。

総コストは以上2つのコストの加重合計としている(詳しくは以下)。

教師ありデータのとき


教師ありデータが入力にきたとき classification cost と consistency costを求める。
totalcost=classificationcost+w(t)×consistencycost

教師なしデータのとき

教師なしデータが入力にきたとき正解ラベルがなくclassification costを求めることができないため、consistency costのみを用いる。
totalcost=w(t)×consistencycost

こうすることでラベルなし画像もうまく学習に組み込むことができるため半教師学習であると言える。

UNSUPERVISED DATA AUGMENTATION FOR CONSISTENCY TRAINING

arxiv.org

今までは教師なしデータに対して、何かしらの摂動・ノイズ(例えばガウスノイズとかDropoutとか)を加えた。それらをモデルに入力した時の出力が(差の二乗和やKL-divergenceなどを使って)ばらつかないようにするというものであった。
この論文ではガウスノイズやDropoutなどではなく、より現実的なdata augmentationを用いる。

UDAの概略図

RandAugment

RandAugmentについてはよく分からないけど、Data Augmentationを自動で行うAuto Augmentを、学習と同時に行う手法らしい。

他の様々なタイプのノイズも(ガウスノイズ、敵対的ノイズなど)試したが、本手法のようにdata augmentationを用いたらより優れている結果がでたらしい。

MixMatch: A Holistic Approach to Semi-Supervised Learning

arxiv.org

ここでは
バッチサイズをB
教師ありデータをX=( (x_b,p_b) );b\in(1,...,B)
教師なしデータをU=(u_b);b\in(1,...,B)
とします。

step1

ラベルあり画像(教師ありデータ)x_bに対してdata augmentation(ランダム水平反転処理やランダムクロップ処理など)を行い新たな画像\hat{x}_bを作る。

step2

同様にラベルなし画像(教師なしデータ)u_bに対してもdata augmentationを行い新たな画像を作る。
ラベルなし画像をdata augmentationする時、K回行いK個の新たな画像\hat{u}_{b,k};k\in(1,...,K)を作る。

step3

step2で生成したdata augmentation後のラベルなし画像に対して、モデルでラベルを予測する。
data augmentation後のラベルなし画像はK個あるので、K個分モデルで予測することになる。

step4

step3の予測値を平均する。

これで得られる値を  \bar{q}_bとする。

step5

step4で出力した平均値をSharpen(エントロピーを小さく)する。
TはハイパーパラメータでT→0でonehotに近づくようになっている。

これにより得られる値をq_bとする。
q_b=Sharpen(\bar{q}_b,T)

step6

以下のようにラベルありデータは(画像,ラベル)のペア\hat{X}にする。
\hat{X}=( (\hat{x}_b,p_b ) );b\in(1,...,B)

以下のようにラベルなしデータは(画像,疑似ラベル)のペア\hat{U}にする。
\hat{U}=( (\hat{u}_{b,k},q_b) );b\in(1,...,B),k\in(1,...,K)

step7

ラベルありデータとラベルなしデータそれぞれをMixupする。
合成するデータはラベルありデータでもラベルなしデータでも良い。

これにより得られる合成後のラベルありデータを X' 、合成語のラベルなしデータを U'とする。

step8

(合成後の)ラベルありデータ x の予測値と(合成後の)正解ラベル p に対し、CrossEntropyを計算する(ラベルありデータの損失関数項)。
(合成後の)ラベルなしデータ u の予測値と(合成後の)生成したラベル qとの差の二乗和を計算する(ラベルなしデータの損失関数項)。
そしてそれぞれを加算し、損失関数とする。

ここで
λ_uはハイパーパラメータ
Lpの次元数
とする。

step9

step1~step8を繰り返して学習を行う。

MixMatchアルゴリズム

step1~step7をまとめると以下のようになる。

ReMixMatch

最近これの進化系ReMixMatchという論文が出たらしいです。
以下の記事が非常に詳しく書いていたのでここでは解説は省きます。

qiita.com

自分用用語メモ

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では潜在変数を用いる。  (a,z_b) (b,z_a) のペアのマッピングを学習させる(潜在変数の推論を行う)。

Let Z be a latent space with a standard Gaussian prior p(z) over its elements.

 (a,z_b) (\tilde{b},\tilde{z}_a)マッピングを行い、
以下の損失関数(論文ではMarginal Matching Lossと呼んでいる)に入れる

さらに以下のようにマッピングを行い

以下の Cycle-consistency lossに入れる。

逆の変換も同様に行う。

最終的には以下の損失関数を最適化することになる。

\gamma_1\gamma_2 はハイパーパラメーター

どうやって有効だと検証した?

議論はある?

次に読むべき論文は?

参考

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