yoheikikuta / paper-reading

Notes about papers I read (in Japanese)
156 stars 4 forks source link

[2019] Combating Label Noise in Deep Learning Using Abstention #32

Open yoheikikuta opened 4 years ago

yoheikikuta commented 4 years ago

論文リンク

https://arxiv.org/abs/1905.10964

公開日(yyyy/mm/dd)

2018/05/27

概要

ラベルのノイズに対応するために、abstention (棄権) クラスを導入して(普通に学習してから後に対応するのではなく)学習時から不適切と思われるデータに対応する仕組みを提案。 提案する loss function は cross entropy にもう一つ abstention クラスを追加して拡張したものになっていて、ラベルが正しい場合は適切な方向に学習が進むことが保証される。あとは abstention の割合をコントロールするようなパラメタを調整しながら学習することで、構造的なノイズも非構造的なノイズもうまく捉えることができるモデルを構築することが可能となった。 各種実験で実際にうまく機能することが示されたが、性能向上のために一度学習してそれを使って怪しいラベルのやつを取り除いた上で新たに学習するというステップを踏まねばならなかったり、そもそも baseline がそんなに悪くなかったり、ということがあるので地道に性能を上げるための一つの手段という印象。

yoheikikuta commented 4 years ago

分類問題を実際に使ってみようという場合にはラベル回りで困難が生じる場合が多いのでこの辺は興味を持っている話題。

open set の問題などは特にその典型で昔ちょこちょこ論文を読んだりしていた。その中には、予測対象のデータが既知のカテゴリの平均からどれくらい離れているかを極値分布を使って測って reject する、という 論文 もあったがそれにまあまあ近いアプローチに感じる。

open set ではなくラベルノイズが存在する場合の話ではあるが、ちょっと眺めた感じ面白そうだったので少し詳しく読んでみた。

yoheikikuta commented 4 years ago

まずはモチベーションの話。

deep learning の成功は ImageNet に代表されるように大量のラベル付きデータの存在に依る部分も少なくないが、大量にラベルを作ろうとするとノイズは不可避となる。

クラウドソーシングでラベリングをする場合などは典型的で、コミュニケーションのミスや専門性の欠如や適当に仕事をする人の存在などで、ノイズが混入する。

機械学習モデルは大量にデータがあればノイズがあっても結構うまく学習してくれるものもあるけど、やはり学習には我々の意図をちゃんと反映した綺麗なデータを使いたい(一応書いておくけど、汎化性能を高めるための augmentation はノイズとは別物)。

ラベルが存在する状況でも頑健なモデルを作るというのは過去にも色々取り組まれているし、この論文で提案するような abstention を使うというものもある。

ただし、これまでは一回は普通に学習してそのモデルの softmax 計算する前の pre-activation に threshold を適用するみたいなものが主流だった。

この論文のモデルでは学習時から abstention ができる機構を取り入れたものになっている、という話。 (risk-vs-coverage を最適化するようなテクニックが最近はあってその流れを組むらしいが、それらはよく知らない)

yoheikikuta commented 4 years ago

ここまでノイズとはどういうものか言ってなかったが、具体的には以下の二つのタイプのノイズに注目している。

提案モデルは両方のタイプのノイズに強い。 著者らが主張するこの論文の貢献は、学習時から abstention を取り入れた deep abstaining classifier (DAC) を提案して両方のタイプのノイズに対する有効性を示した、という点。

話の流れから adversarial example にも有効なのではという気がしてくるが、この論文ではやってなくて future work とのこと。

yoheikikuta commented 4 years ago

提案手法を見ていく。まず基本的な決め事は以下。

ここで k+1 番目のクラスとして abstention クラスを導入する。 $ α > 0 $ のパラメタも導入して次の cross entropy を modify した loss function を提案。

まず、$ p_{k + 1} = 0 $ とおけば普通の cross entropy になる。これは abstention クラスを考えなければ普通の k クラス cross entropy に戻ってくれる、ということでいいだろう。

次に $ p_{k + 1} \rightarrow 1 $ にすると一項目は 0 に収束して二項目は ∞ に発散する方向。 これはつまり基本的には abstention と予測するのを妨げる方向ではあるが、これはパラメタ $ α $ の値をどう設定するかで学習に重要な効果を与える。

$ α $ がめちゃくちゃ大きい場合は $ p{k + 1} \rightarrow 0 $ にしようとして、$ α $ がめちゃくちゃ小さい場合は $ p{k + 1} \rightarrow 1 $ にしようとする。 その中間の値が重要で、$ α $ と $ p_{k + 1} $ の値に応じて正しいラベルでも abstention クラスと予測したりもする。この性質によって望ましいように学習が進んでいくのか、というのがポイントになる。

yoheikikuta commented 4 years ago

一番の問題はこの loss function で正しいラベルを持つデータの場合にちゃんと学習が進んでいくか否かという問題である。ラベルにはノイズがあるという設定なので、望ましくは「ラベルが正しい場合は学習がうまく進んで、ラベルが正しくない場合は abstention する」と振舞って欲しいが、本当にそうなるのか?

論文の Lemma 1 はラベルが正しい場合に学習がうまく進む、すなわち微分が負になって loss を減らす方向に学習が進んでくれるということを示している。

お、マジかということで証明を追ってみる。証明というほどでもないが愚直に微分して $ \log(1 + x) \leq x $ を使うのみである。 愚直に微分する計算はやったので一応貼っておく。

あとは第三項が負であり、第一項と第二項だけを取り出して $ \log (1 + x) $ の形を上から x で抑える形にすれば 0 以下になることはほぼ自明なので、全体で 0 以下となる。

は〜これは計算は難しくないけどなかなか面白いっすね。これを見ると、確かに α をうまく調整できればノイズありの状況でもうまく学習していけそうな匂いがしてくる。

yoheikikuta commented 4 years ago

上で示したのは正しいラベルの場合に勾配が適切な方向に設定されるということだったが、abstention の pre-activation が大きくなる方向に進む場合はどういう状況下も見ておく必要がある。

$ g = - \sum t_i log p_i $ とすると loss function の微分は以下のように書ける。

これが負になれば $ a{k + 1} $ が大きくなる方向に動くが、true label が j のデータの場合は $ α < (1 - p{k + 1}) (- \log pj / (1 - p{k + 1})) $ となれば負になる。 この関係式を意識し、始めのうちは α を小さくして自信のあるものだけで学習してそれ以外は abstention クラスに寄せ、徐々に α を大きくしていくという戦法が考えられる。

以上を踏まえた α の auto-tuning が以下である。 auto-tuning というと格好良い感じがするが、言ってしまえば initial (のパラメタ)と final の値を手で与えて変化させていくというだけに過ぎない。最初の L epoch は abstention なしで学習する準備段階が入っているのも全然 auto な感じがないので少し残念ポイント。

これが本丸のアルゴリズムである。 先にも述べたように、少しずつ α を大きくしていくことで、最初のうちは pre-activation がはっきりと大きい自信のあるものだけで学習し、ゆくゆくは学習対象を多くしていって abstention は確かに abstention すべきものしか捉えないようにする、というものになっている。

各種パラメタは tune してないっぽいし論文にはそこまで詳しく書いてない。 実装が公開されているのでこの辺のファイルを見ればよい https://github.com/thulas/dac-label-noise/blob/678e468464daf483410480f87870226330ccd241/train_dac.py

yoheikikuta commented 4 years ago

structured noise での実験。

データは STL-10 dataset で 96 × 96 の RGB 画像が train: 5000, test: 8000 ほどある。最近の deep learning の規模からいうと toy experiment 過ぎるという感じも受けるが... ネットワークは VGG を使用。なんか feature map の可視化とかするんだろうなということが予測される。

train, test 共に 10 % の画像に関しては汚れのようなものを付与し、そいつらのラベルは randomize しておく。ちょっと分かり易過ぎる気もするが、汚れがあったらラベルが noizy になっているという構造をモデルが検知できるかという問題設定になっている。結果は以下。

一番右のグラフ以外はこれまで言ったことやモデルが実際にうまく動いているぞという話で難しいこともないので割愛。

一番右のグラフは注意が必要だ。 これは threshold を動かしながら abstention するデータの量を変えることで accuracy-coverage を見ている。どうもこれが risk-vs-coverage であるらしいので特に難しいものではなかった。

まず、普通の DAC と Baseline DNN softmax (これは softmax に threshold 設定して abstention をするもの) は性能的に特に違いはない。拡張したとはいえ同じような loss function で学習してるので not surprising とのことだが、あ、そうなのという残念な感じ。

この学習した DAC をもとに怪しげなラベルのものを除いて、そのデータセットで改めて DNN を学習したものが post-DAC と書いてあるもので、これは性能が向上していると主張。(ちなみに SGR は selective guaranteed risk なる手法らしいがあまり変化はないのでここでは無視しておく。)

でもこれ普通の DNN の softmax threshold でも最初は同じような性能なんだから、普通の DNN でもその threshold 使ってはっきりと答えられないものは除いてもう一回 from scratch で学習すれば同じような結果になるんじゃないの? さすがにそうなってたらこのモデルの意味がなくなると思うので自分がどこか勘違いしているとは思うのだが、ちょっとまだ分かってないので寝かせておこう。


これはやはり普通の DNN の threshold ベースの方法でも同じ結果になるのではないか。多分問題が簡単過ぎるので違いが出ないのだろう。これは次の実験においては DAC と DNN w/ softmax threshold で違いが出ていることから推測。

yoheikikuta commented 4 years ago

もう一つ structured noise での実験。

猿のクラスが randomize されたという条件で、猿っぽいという特徴があるものはラベルが noisy になっている構造を見つけられるかという問題設定。結果は以下。

基本的にうまくいっているという話だが、普通の DNN との違いという意味では (d), (e), (f) が興味深い。 (d) は randomize したテストデータの予測結果でバラバラになっていて、(e) (f) を見ると softmax score > 0.9 に限っても色んなクラスに自信満々に間違えるので、threshold based ではうまくいかないということを示している。

自分でモデルを触っていもこういう自信満々に間違えるのでうまく処理できないということはあるので、これは自分の感覚とも合っている部分だ。

最後の二つは性能比較で、確かに DAC が良い。しかし、これでは期待するほどには差が離れていない感じがする(少なくとも自分にとっては)。

visualization の結果も載せておく。 (a) ~ (d) は汚れを付与したものはそこに注目するようになっていてそうでなければちゃんと猫の特徴量を抜き出すようになっている。(e), (f) は randomize したラベルで猿の画像を学習してもちゃんと猿の特徴量を抜き出せている(のでこういうものは abstention すべきだと判断できる)。

yoheikikuta commented 4 years ago

次は unstructured noise の場合。 設定としてはこちらの方がシンプルで、単純に学習データのラベルを一定の割合で randomize するというものになっている。

結果は以下。

そこそこ良い結果にはなっているが、Baseline 自体がそんなに悪くないなという気もする。 この手法を使うことでまるで解けなかった問題が解けるというものではないが、地道に性能を上げるには寄与するかなという感じですかね。

yoheikikuta commented 4 years ago

さらに randomized label の memorization の話が書いてあって、学習し過ぎると abstention mechanism がうまく機能しないという証明があるが、そこまで大した話でもないので割愛。

ということで一通り読んだ。 シンプルな枠組みで loss function の面白い性質とかが導けたところは面白かったが、一度学習したものを使って data をクレンジングするとか、そもそも baseline がそんなに悪くない、とかがあったのでとても面白いというものではなかったかな。