(備忘+技術的な話題)/2.なブログ

まとめといたほうがよさそうだと感じたトピックについて記事を書きます。

異なるドメインへのfine-tuningは、Adam系+低いLR+no-freeze、がよさげ?

REVISITING FINE-TUNING FOR FEW-SHOT LEARNING

どんなもの?

few-shot learningにおけるfine-tuningについて、ネットワークの学習させかたの面から、よい方法を提案しているもの。

先行研究と比べてどこがすごい?

few-shot learningにおいて、baseclasses(imagenetみたいなもの)で学習させてpretrainedモデルを画像数が少ないnovelclassesへfine-tuningさせることは一般的であるが、単純にやると画像数が少なすぎでoverfitする。
overfittingを回避すべく、高度な手法(metric、meta、augmentation)に関して様々な研究がされているが、ナイーブなfinetuning(単純に学習させかたのようなものを指している)については調査があまりされておらず、この論文ではナイーブな方法でテスト精度を向上させる方法を提案している。

技術や手法のキモはどこ?

実験的に下記を示していること。
1. fine-tuningでは低LRで学習が安定する
2. fine-tuning時には、adaptiveな最適化の方がテスト精度が向上する
3. baseclassとnovelclassで大きなドメインシフトがある場合、ネットワーク全体を更新することでテスト精度を向上する(bn+fc以外凍結、fc以外凍結、と比較した結果。)

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

  • 低解像度mini-imagenetデータセットを用いた同一ドメインにおけるfew-shot learningにおいて、1-shotショットでは普通の手法よりは高い精度を達成し、5-shotではsotaとほぼ同等精度を達成
  • より実用性の高い高解像度の同一ドメインドメインの両方のタスクにおいて、他のfew-shotの手法よりも高い精度を達成(sota?)

議論はある?

  • 低解像度と高解像度のデータセットについてresnet152がvgg16に比べ低解像度の性能劣化がひどい。低解像度のデータセットは(多分過学習であるが)ロバスト性も気にする必要があるので、実験ぐらいにはいいけどfew-shotの性能評価に用いることが妥当か検討すべきと提起。

次に読むべき論文は?

Wei-Yu Chen, Yen-Cheng Liu, Zsolt Kira, Yu-Chiang Frank Wang, and Jia-Bin Huang. A closer look at few-shot classification. In International Conference on Learning Representations, 2019.

その他

  • この手法はweight imprinting(normalized classifier)との併用で特に効果あり、普通のFC(simple classifier)だとそんなに、、、
  • N-way K-shot learning : Nクラス、クラス当たりK枚での学習のこと
  • Kが大きければfreezeはさせないほうが精度は上がる
  • finetuningではLRはbaseの0.1倍している
  • この手法は別ドメインにおいては結構強い

ELSA System Graphでnvml.dllがないって怒られる。

結論

ドライバがちゃんと入っていればsystem32にnvml.dllがあるはず。これをコピーして/Program Files/NVIDIA Corporation/NVSMIを作成して配置すればOK。

細かい症状と対策

GPUの温度や電力などの使用状況の把握のために、ELSA System Graph(http://www.elsa-jp.co.jp/support/download/driver/elsa_system_graph/)をよく使っている。が、CUDAのバージョンアップなりGPUドライバ更新等を色々したせいか、ある時から起動時にnvml.dllがないって怒られるようになった。一応起動はして大部分の情報は表示されているが電力などが表示されていない。
ある時からnvml.dllの配置場所が変わったのだろうと想定されるが、ELSA System Graphが想定している/Program Files/NVIDIA Corporation/NVSMIにsystem32からnvml.dllをコピーして置いておけば動く。

std::lower_boundとstd::upper_boundの覚え方

以下、0-indexedで数列v[]=133557のどこを返すか。

lower_bound

lower_bound(3) => v[1]=3
lower_bound(4) => v[3]=5
x以上になる最初のidxを返す。

upper_bound

upper_bound(3) => v[3]=5
upper_bound(4) => v[3]=5
xより大きくなる最初のidxを返す。

要するに

[lower_bound(x),upper_bound(x)]で配列上でxとなる区間を抜き出せる。
vector.begin()は要素を指し、vector.end()は配列の終端+1を指す関係性に似ている。

有名アルゴリズムを一言で

ソートアルゴリズム

初等ソート

挿入

ソート済み配列の正しい位置に挿入していく。O(n2)

バブル

後ろから前に隣り合う要素の並びを揃えていく操作を、要素数分行う。O(n2)

選択

小さい順に前に持ってくる。O(n2)

シェルソート

K個飛ばしに挿入ソートを行う。Kを適切に減らして繰り返す。最後にK=1で普通の挿入ソートを行う。O(n1.25)

高等ソート

マージ

長さNの配列を、長さ1のソート済み領域N個と見なす。隣り合う領域のマージを繰り返すことで、領域の長さを倍に領域数を半分にしていくことで、最終的に長さNのソート済み領域1個となる。O(nlogn)

クイック

基準値を選び、基準値よりも小さい領域と大きい領域に分け、基準値を真ん中に持ってくる(=パーティション)。これで基準値は位置が確定し、それぞれの領域数が1になるまでこの操作を繰り返す。O(nlogn)

計数

要素の値の出現数を記録した配列を作成し、累積和をとる。この配列はソート後の位置になっている。改めて要素を見ていき、配列の値が指す位置に格納する。この時、一個格納するごとに値は減らす。O(n+k)

グラフアルゴリズム

プリム(最小全域木

行ったことのないノードへ行けるパスの中から最小の辺を選んでいく。O(ElogV)

クラスカル最小全域木

小さい順に辺を木に追加していく。追加によって閉路ができてしまう辺はスキップ。O(ElogV)

ダイクストラ(単一始点最短経路)

行ったことのないノードへのコストが更新できれば更新したのち、行ったことのない中で最小のコストで行けるノードへいく。O((E+V)logV)

ベルマンフォード(単一始点最短経路、負の辺があってもOK)

全てのエッジについてコストを更新していく操作を、|V|-1回を上限に更新がなくなるまで繰り返す。O(EV)

ワーシャルフロイド(全点対間最短経路、負の辺があってもOK)

あるノードを選び、全てのノードの組み合わせについてそのノードを通った方がコストが下がればそのノードを通るルートを採用する。これを全てのノードについて繰り返す。O(V3)

venv 仮想環境名が出ない activateされない

症状

  • venvで仮想環境(名前:venv)をactivateしてもターミナル先頭に(venv)が出ない
  • ↑の後pip listで見ると、別の仮想環境に入っている

環境

zsh

解決策

.zshrcの下記の行を消した

export VIRTUAL_ENV_DISABLE_PROMPT=1
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

原因

  • 仮想環境名が表示されない -> export VIRTUAL_ENV_DISABLE_PROMPT=1で消していた。
  • 指定した環境と別環境に入っている -> venvを使いたいのにpyenv、pyenv-virtualenv周りの設定が悪さしていた。

おまけ

pyenv周りを初めていじっていた時に、訳も分からず下記みたいな設定をやりまくっていたのが悪さした感じですね。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

ARC103 D問題 Robot Arms

掴み所がわからなかったけど理解すると面白そうな問題。

問題

atcoder.jp

i=1,...,Nについて(X_i, Y_i)が与えられる。

d_j (j=0,...,M)をある値で固定したとき、すべてのiについて(X_i, Y_i) = \sum_{j=0}^m d_jf(a_j)が成り立つようなa_j=\{0,1,2,3\}の選び方は存在するか。 ここで f(0)=(1,0), f(1)=(-1,0), f(2)=(0,1), f(3)=(0,-1)とする。

解法

座標変換->二進展開->貪欲法という流れで解いていく。

座標変換

マンハッタン距離の問題は、45°回すテクがあるらしい。
ここでは U=X+Y,V=X-Yとすれば、f(0)=(1,1), f(1)=(-1,-1), f(2)=(1,-1), f(3)=(-1,1)となる。
これでうれしいのは、g(0)=-1, g(1)=1としたときに] X_i=\sum d_j g(a_j)Y_i=\sum d_j g(b_j)のようにXとYを独立に考えられるようになったこと。
座標変換前はdjをXかYを足すか引くかという操作だったのが、Uには足すか引くか、Vには足すか引くかというように別々に考えてよくなったというのがわかる。

二進展開

d_0,d_1... = 1,2,4,8,16,...と選べば、X_i=\sum d_j g(a_j)について任意の奇数Xiが作れるらしい。
感覚的にそんな気はするけど、証明も今度あたってみよう。
偶数についてはdにもう一個1を追加すればよい。

貪欲法

djの大きいほうから足すか引くか決めていく。こちらも感覚的にはわかるんだけど。。。

感想

知らなきゃ解けない系???初見で解ける人はすごいと思います。