文字認識をWatermarkで騙す手法の論文:「Attacking Optical Character Recognition (OCR) Systems with Adversarial Watermarks」

Attacking Optical Character Recognition (OCR) Systems with Adversarial Watermarks」という論文を読んだ。

概要

OCRシステムを騙すためのAdversarial Exampleを作成する手法の論文。OCRにかけるような文書は写真などとは異なり背景が白・文字が黒、となっているので写真データに対するAdversarial Exampleの手法を使うと、人間が見ておかしいことに気づく。
そこでこの論文ではWatermarkと呼ばれるスタンプを文書に付与することで、文書読み取りの結果を改変することを目指している。
Watermarkは例えば「Sample」や会社名みたいなスタンプを文書に重ね合わせる。そのWatermarkと重なる部分のピクセルを上手い具合に変えると、文書の意味を反転するような形でのAdversarial Exampleをいくつか作成できている。

基本的には評価はモデルがホワイトボックスだと仮定したうえで行っているが、ブラックボックスのOCRシステムとしてTesseract OCRに対してもWatermark を付与したAdversarial Exampleが働くことを確認している。ブラックボックスシステムに対しては、ホワイトボックスモデルに対してAdversarial Exampleを作成して、そのAdversarial Exampleを入力とすることで確認している。

アルゴリズム

具体的なアルゴリズムとしては、元文書とAdversarial Exampleのノルムを閾値以下である・Watermarkの中に含まれるピクセルをのみを変更する、という制約の下でCTC loss functionと呼ばれる最終層で出力される値から正解のデータ列になりうる確率を元に計算する損失関数を最小化するように最適化問題を解いていく。論文では、再急降下法+モーメンタムのようにして文書ベクトルを更新していくと述べられている。

実験結果

具体的な実験では以下の図のように、いくつかの文の意味を変えるように改変することができたことを示している。免許証の番号を変える例も示されている。

Future Work

この論文ではWatermarkの位置は固定なので、任意の箇所を改変できるようになっていないが、今後は自由な位置・形状でWatermarkを追加することも考えている。

所感

WatermarkがつけられたらそもそもOCRは上手くいかなさそうなので、Watermarkがついた部分は人間がチェックするべきではないかと思った。手法としてWatermark付与以外にも文字のエッジの部分を改変することで、印刷がかすれているように見せかけて人間とOCRを騙す方法も述べられており、これが進んでいくと悪用される可能性もありそうに思った。

論文読み:Squeeze-and-Excitation Networks

元論文:Squeeze-and-Excitation Networks

最近良くCNN関連のタスクでよく使われる手法なので、論文を読んでみたときのメモ。
ググると他にも詳しい解説記事があるので、あくまでも個人的なメモとして残します。

概要

Squeeze-and-Excitationブロック(SEブロック)というモジュールを導入することで、明示的にチャンネル間の相互作用をモデル化できる手法。
チャネル間の相互作用はイメージがつきにくかったが、例えばある特徴マップとまた別の特徴マップが同時に強く反応する場合に、特定のクラスと判定されるといったケースだろうか。チャンネル方向でSEブロックの処理を行うことで、チャンネル間の相互作用を表せるということのようだ。
SEブロックい色々なCNNに組み込んだSENetは様々なデータセットに対して効果的であったことを確認した。既存のCNNに少しの計算コストを追加するだけで性能を高めることもできた。

Introduction

CNNは画像認識の分野で広く使われている。CNNは畳み込みフィルタによって局所的な特徴をつかみ、層を重ねることで局所から大局までの広い範囲の画像特徴をつかむことができる。近年は高精度なネットワーク構造を作ることが研究のフロンティアであるが、いくつかの研究では既存のネットワークにモジュールを追加することで精度向上を目指す取り組みもある。

この論文で提案されたSEブロックはそのような取り組みの一つにあたる。SEブロックは特徴の再調整(論文ではfeature recalibrationと書かれている)を果たすように設計されている。

論文中Fig.1にあるように、SEブロックは特徴マップを受けとってチャンネルごとに空間情報を凝縮する(Squeeze)。そして、Excitationと呼ぶ操作によりチャンネルごとの重みづけを行ったベクトルとしてSqueeze後の情報を変換する。これによって生成されたベクトルを元の特徴マップにかけ合わせることで、特徴マップがチャンネル間の相互作用をモデル化することができる。つまり価値の高いチャンネルを強調することで表現の質を挙げることを目指している。
目的に応じてSEブロックをどこに配置するかを決めることもできる。例えば、ネットワークの初めの方の層にSEブロックを入れると、クラスに依存しない局所的な特徴を共有することができ、後ろの方の層に入れるとクラスに依存した特徴の相互作用を共有することができる。

Related Work

モジュールを追加することでネットワークの性能を向上させる手法は色々と研究されている。多くの手法はチャンネル間の相互作用はクラスに無関係な関数の合成で表すことができると仮定しており、チャンネル間の相互作用を取り入れていない。一方、この論文では、チャンネル間の相互作用を非線形の変換を用いて調整することで、効果的に学習を進めることができるようになるというのが著者らの主張。

Squeeze and Excitation Blocks

Squeeze: 各特徴マップはフィルタがかけられた局所的な部分の情報の集まりであり、大局的な情報を持っていない。そのためSqueeze処理でチャネルごとの統計情報を取得する。具体的にはGlobal Average Poolingをかける。もっと複雑な処理を使っても良いかもしれないと著者らは述べている。

Excitation: 非線形なチャネル間の相互関係を学習し、複数チャネルが強調されることを許可するような設計になるように、ReLUを挟んでSigmoidを使っている。2層の全結合層で途中で削減率rをもちいてネットワークをいったんくびれさせている。

そして最後に元の特徴マップにSEブロックの結果をかけ合わせることで、特徴マップを強調することができる。
前述の通り、SEブロックはCNNの特徴マップを出力するところなら組み込むことができ、VGG, Inception, RexNet, ResNeXtなどに適用できる。

Model and Computational Complexity

SEブロックを追加してもパラメータ数の増加はSE-ResNet-50で約10%程度。推論速度も数ミリ秒程度の増加に抑えられており効率的。
SEブロックをCNNの最後の方に置くと、特徴マップの枚数が多いため計算量がその分増えるが、最後の層にSEブロックを追加するのを止めても性能はそれほど変わらずパラメータ数を削減できると論文中で議論している。

Experiments

様々なデータセットでSEブロックを追加してあげることでSoTAを達成した。

Ablation Study

Ablation Studyとは構成要素を1つだけ抜いた手法を比較すること。他のパラメータを固定して、あるパラメータを変化させた場合の挙動を調査している。
Reduction ratio r: Reduction ratioを増やしていくと精度は落ちていくが、線形の関係ではない。Reduction ratioが小さいと精度が上がるがパラメータ数が増える。16くらいが精度とパラメータ数のバランスが良いと述べられている

Squeeze Operator: Global Average PoolingとGlobal Max Poolingを比較したが大差はない。ここの選択にはSEブロックは頑健

Excitation Operator: 最後のSigmoidをReLUやTanhに置き換えた結果が示されているが、Sigmoidが一番良い。

Different Stages: ResNetのステージのどこにSEブロックを入れるかで実験しているが、どこでも精度は向上する。どこに入れるかは互いに補いあう関係なので、複数個所入れると精度がさらに上がると述べられている。

Integration Strategy: SEブロックをどこに入れ込むか。大差がないので、入れ込む一に関しては頑健だろうと述べている。

Role of SE Blocks

SEブロックの役割を現実的なレベルで理解するための考察が述べられている。Global Average Poolingを行わないNoSqueezeというモジュールを構成し、精度を見るとSEブロックよりも下がる。これはSEブロックが特徴マップ全体の情報を活用していることを示している。また、Excitationの理解のために、ImageNetの異なるクラスの画像に対して特徴マップが各層でどのように反応しているかを見ている。

Conclusion

SEブロックは強力。チャネル間の相互関係を利用した精度向上手法であり、今後はこのような方向性の研究が出てくることを期待している。著者らは最後にチャネルの重みづけを、ネットワークの枝刈りに使えるのではないかと提案している。

所感

非常に簡単な構成で、精度が向上するのが驚き。Kaggleなどでも使われるようになってきており、解説記事も多いので理解はしやすかった。

Batch Normalization と Dropout は併用しない方が良いという話

Deep Learningのモデルを訓練していたところ、思うようにvalidation lossが下がらないことがあった。色々と調べた結果、Batch NormalizationとDropoutを併用していたのが原因であったので、誰かの為に書いておく。

この論文その解説にある通り、Batch NormalizationとDropoutを併用するとパフォーマンスが悪化することがある。原因は、「Dropoutを行うことで学習時と評価時で分散が変わってしまう一方、Batch Normalizationは学習で得られた分散を評価時もキープしてしまうため齟齬が生じることが原因」とあり、言われてみればなるほどという感じである。

結論としては、DropoutかBatch Normalizationのどちらか一方だけで試してみてvalidation lossを下げようとするのが良さそう。Deep Learningを使えばすべて解決するわけではなく、パラメータチューニングやモデル構造のチューニングが良いパフォーマンスを出すためには必要だと分かる事例の一つ。

ニューラルネットワークを利用した決定木:Deep Neural Decision Trees

引き続き、機械学習の解釈性についての論文を読んだ。今回読んだのは、「Deep Neural Decision Trees (WHI ’18)」。著者による実装のページはここ

決定木とニューラルネットワークを用いる他の論文などと同様に、決定木の解釈性とニューラルネットワークの精度の高さの両立を狙っている。特に表形式データの分類に有効と著者らは述べている。

この論文では、微分可能なsoft binningという関数を入力データにかませて、学習を重ねることでsoft binningのバイアス項の値を見ることで、各フィーチャーに対してどこで決定木を分岐すれば良いかが分かるという手法を提案している。soft binningで決定木の分岐を表現して、そのあとにクロネッカー積を取ることですべての分岐の組み合わせを網羅的に調べることが出来る。すべての層は微分可能なため、通常のバックプロパゲーションによりネットワークの学習を行うことが出来る。

著者らは複数の表形式データセットに対して、決定木、ニューラルネットワーク、Deep Neural Decision Tree、の三手法で精度評価を行っている。結果はデータセットによってまちまちだが、基本的にニューラルネットワークと同等程度の精度が出ている。実験の結果、DNDTでは全く推論に使われない特徴が検出できるなどの副次的な成果も述べられている。

GPUによる速度性能の確認も行われており、フィーチャー数が増えた場合でもCPUと比較して、あまり実行時間が増えないようになっている。

今後も機械学習の解釈性関連の論文を色々と読んでいく予定。

機械学習の解釈性とパフォーマンスの両立を目指して:Human-in-the-Loop Interpretability Prior

機械学習、特にニューラルネットワークなどのアルゴリズムを使った場合、出力された結果は何万・何十万次元のベクトル演算の結果であり、人間が直接解釈することは難しい。ニューラルネットワークの解釈性については近年様々な研究が行われている。一般的に解釈性の低いモデルは高い精度を出すことが多く、適度な解釈性と適度な精度のバランスが取れたモデルが必要なケースが考えられる。

この論文「Human-in-the-Loop Interpretability Prior」は機械学習モデルに対して人間がある尺度(論文ではHIS:Human Interpretability Scoreという、人間がモデルに従って入力から出力を予測するのにかかった時間の逆数)を事前確率として、データXが与えられた際にそのデータを最も適切に説明できるモデルMをp(M|X)をMAP推定することにより選択するという手法を用いている。著者らは4種類のデータセットで実験を行っており、タスクごとにreasonableな解釈性を持ったモデルを選択できていることを確かめている。

読んだ感想としてはHISの決め方が果たして、人間がかかった時間の逆数という尺度を使うのは解釈性の尺度として適切なのか?といった疑問や、新しいモデルを作るたびにユーザの評価が必要になり汎用性は低そうに思った。HISを何らかの尺度(例えば計算時間や消費メモリ)によって算出することが出来れば、この手法を人の手を介さずに適用することも可能なのではないかと考える。

大規模データのクラスタリングには Mini Batch K-Means を使うべきという話

タイトルの通りですが、大規模データをクラスタリングする際には単純なK-Means法ではなく、Mini Batch K-Means法を使うべきという話です。

とある大規模データ(150万件ほどの文章ベクトル)をクラスタリングしたいことがあったのですが、単純にScikit-learnのK-Means法に投げてクラスタリングを走らせていたところ、数時間経っても一向に終わる気配がありませんでした。色々と調べていると、大規模データのクラスタリングにはMini Batch K-Means法を使うべきという記述を見つけました。公式ドキュメントによると、大体1万件を超えるデータをクラスタリングする場合にはMini Batch K-Meansを使うべきとのことです。

APIとしては単純にKMeansをMiniBatchKMeansに置き換えれば動きます。理論的な背景としては、論文 “Web Scale K-Means clustering” D. Sculley, Proceedings of the 19th international conference on World wide web (2010)に書かれており、ざっと読んだところランダムサンプリングしてクラスタの中心を計算していくのですが、KMeansとは異なり、各点ごとに中心を逐次的にアップデートしていくことで計算量を減らしています。

論文に載っていた速度比較ですが、圧倒的にMiniBatchKMeansが高速です。図の青がMiniBatchKMeans、赤がKMeans、横軸が時間。

この手法を使ったところ、KMeansでは数時間経っても終わらなかったクラスタリングが、MiniBatchKMeansでは数分程度で終わりました。ということで、大規模データのクラスタリングにはMIniBatchKMeansを使うべきということを学んだという話でした。

RNNのDropoutはどこに入れるべきか?:Where to Apply Dropout in Recurrent Neural Networks for Handwriting Recognition?

タイトルの通り、RNNに対してDropout層を追加する場合、どこに入れるのが適切なのか?と思い少し調べてみました。

ことの発端は、KerasにあるLSTMとGRUの、GPUによる高速化版であるCuDNNLSTMとCuDNNGRUには、dropoutとrecurrent_dropoutというCPU版には存在するパラメータが無いため、これらの層の前後にDropoutを入れても効果あるのかな?と疑問に思ったことが始まりです。

以下のKerasのgithubでこれらのパラメータについての議論が行われており、作者のChollet氏は以下のように述べており、通常のDropoutはRNNに対して効果が無いように読み取れます。https://github.com/keras-team/keras/issues/8935

Recurrent dropout is not implemented in cuDNN RNN ops. At the cuDNN level. So we can’t have it in Keras.

The dropout option in the cuDNN API is not recurrent dropout (unlike what is in Keras), so it is basically useless (regular dropout doesn’t work with RNNs).

Actually using such dropout in a stacked RNN will wreck training.

その後、少し調べてみるとタイトルにある論文「Where to Apply Dropout in Recurrent Neural Networks for Handwriting Recognition?」を見つけたので読んでみました。この論文では、手書き文字認識タスクにRNNを使用して、DropoutをRNNの前、中、後に入れてみて汎化性能を試しています。何種類かのデータセットで実験を行っていますが、結果はまちまちで、傾向としてはRNNの前にDropoutを使うのが性能が良いことが多いが、中、後に入れる場合も性能が良くなることがあり何とも言えない感じの結論となっています。ただ、著者らは複数層のRNNモデルに対しても実験を行っており、その場合にはネットワークの最初と最後にDropoutを入れるのが良い性能の傾向があると結論付けています。

はっきりとした結論は言えそうも無く、結局はタスクによるんじゃないかという感じですが、この辺はやはりディープラーニングはハイパーパラメータチューニング職人の世界であるといわれる一因なんじゃないかと感じました。

 

CNNによる価格予測の論文:「The Price is Right: Predicting Prices with Product Images」を読んだ

タイトルの通り、CNNモデルを利用して、自動車・自転車の画像から価格を予測する論文、「The Price is Right: Predicting Prices with Product Images」を読んだ。

この論文を読んだ動機は、ネットを調べるとCNNを用いて画像を分類するという例は山ほど出てくるが、CNNを用いて画像から何らかの数値を出力するregression問題に取り組んだ例があまり見つからず、ちょっとそういったことをやる必要に迫られたので読んでみた。

自転車と自動車の画像からそれぞれの価格を推定するregressionタスクにCNNを用いた。ベースラインモデルである多クラスSVMと線形モデルに対して同等~高い精度が出た。VGGとMobileNetによる転移学習よりも精度の高いネットワーク構造PriceNetReg CNNを提案している。また、CNNモデルに関して、画像のどの部分が予測に効いているかをVisualizationすることにより示している。

CNNモデルが画像のどの部分に着目して判断を行っているかということをVisualizationしているのが面白い。次はこういった可視化技術の論文を読んでみたい。

まとめスライドはこちら。

The Price is Right Predicting Prices with Product Images_slide

CNNによるセグメンテーション論文:「U-Net Convolutional Networks for Biomedical Image Segmentation」を読んだ

タイトルの通り、CNNを用いて医療画像をセグメンテーションするU-Netというネットワーク構造の論文を読んだ。

2015年に発表されたネットワーク構造だが、その後セグメンテーションでは古典的な内容になっており、いくつか発展形のネットワークも提案されている。

論文のまとめは以下。

U-Net Convolutional Networks for Biomedical Image Segmentation_Slide

Kaggleで人気 XGBoostの論文 「XGBoost: A Scalable Tree Boosting System」を読んだ

タイトルの通りなんですが、Kaggleでとても人気のある手法のXGBoostがどういった仕組みで動いているのかを知るために次の論文を読みました。

XGBoost: A Scalable Tree Boosting System

詳しいことは、日本語で読める分かりやすい解説記事(こことか)があるのでそちらを参照していただきたいです。この記事は個人的な備忘録です。

要するにXGBoostとは決定木をすでに作った木の情報をもとにしながら何個も作ってそれらの結果を足し合わせることで、性能を向上させるBoostingの手法を効率的に実装したものと言えます。

基本的なポイントは単純ですが、決定木を作っていくうえですべての木の中から最も良いものを調べて選択するのは計算量的に難しいため、ある種の近似を用いて精度的に問題の少ない気を作っていき高速に実行可能なアルゴリズムとなっています。また、オーバーフィッティングを防ぐために、サブサンプリングや縮退化などの仕組みも導入されており、汎化性能が良くなるようになっていることもKaggleのコンテストで人気の理由の一つだと思います。

また、論文では並列化や分散処理をした場合の速度性能の評価が行われており、高い並列性能が出ています。提供されているライブラリではキャッシュが当たりやすくなるようになどの最適化が施されているので、自分で実装せずにライブラリを使いましょう。pipで簡単に入れられるようです。