糞糞糞ネット弁慶

読んだ論文についてメモを書きます.趣味の話は http://repose.hatenablog.com

ML Ops Study #2 参加した

ML Ops Study #2 - connpass
申し込んだら当たったので参加した.皆さんみたいにちゃんとした機械学習や深層学習がしてみたかった.

機械学習プロジェクトを頑健にする施策: ワークフロー、仮想化、品質向上、知識移譲 etc

機械学習プロジェクトを頑健にする施策 ML Ops Study #2 // Speaker Deck

  • 機械学習プロダクトは脆い.原因とその対策.
    • 実験スクリプトが動かない
    • 実験スクリプトが理解できない,実験した人がいなくなる
      • ソフトウェアエンジニアリングをちゃんとする
      • ソフトウェアエンジニアが書いてリサーチャーがレビューする
      • コードの整理は実験をした本人がやる
        • この話,金融機関における数理モデル研究から実用化に至るノウハウなどが(もしあるのならば)参考になるのではないかと思った
      • テストもちゃんと書く

質疑で「リサーチャーは Jupyter notebook が精一杯だったりする.リサーチャーがソフトウェアエンジニアの,ソフトウェアエンジニアがリサーチャーの素養がある程度ないと難しいのではないか」みたいな質問があり, Cookpad 社は両方素養がある人ばかりなのでコードレビューも問題無いという返答があった.Jupyter notebook ですらまともに使うことができない低レベルの人間なのでとても参考になった.
Github や Qiita に公開されている機械学習系のコードは品質がひどくて動かない事が多い」という話で自分を除く皆さんが笑顔になっていた.

ドローン点検・測量を機械学習を使って圧倒的に簡単にしました

  • SONYZMP が組んだエアロセンスではドローンによる測量をやっている
  • ドローンの GPS は誤差が酷いのでマーカーを併せて使うことが一般的だが
    • マーカーの正確な位置を手で測量しなきゃならない
    • 画像中のマーカーを手で特定しなきゃならない
  • そこでマーカーを独自開発する
    • 高精度 GPS と高さ計測をマーカー自身で実現
    • その上でドローンから空撮した画像中からマーカーを自動検出 (opencv による候補抽出 + tf 実装の VGG でマーカーかどうか分類) する
      • どうして一つのモデルで全部やらないかの質疑が聞き取れなかった
  • 結果手作業を 60% 削減できた

Kelner: 爆速で構築できる機械学習モデルサーバー

What is Kelner? | Kelner
学習済み機械学習モデルを用いた予測を簡単に REST API として公開するためのフレームワーク
機械学習といっても Keras と Tensorflow にのみ対応しており scikit-learn には未対応.よくわかっていないけれど kelner_model.KelnerModel を継承した SKLearnModel とか実装すればいいのだろうか.

このあたりで追加した頭痛薬が効かなくて帰った.

声優統計コーパスの利用事例暫定まとめ

日本声優統計学会 にて声優統計コーパスを公開してほぼ一年.個人団体を問わず問い合わせのメールを頂いている.

しかしよく考えたら Google Analytics の設定をまともに書いていなかったせいでどれぐらいダウンロードされたのか全く計測できていない.せめて,検索して見つけた範囲で利用されているブログ記事を集めた.

声優統計コーパスを使ってみる - 驚異のアニヲタ社会復帰への道
声優統計コーパスをアライメントしてみる | Hiho's Blog
日本声優統計学会の公開データを使って声優さんの声認識 – 京都の技術者ロードローラーさんのブログ
声優統計コーパスを使ったWaveNet音声合成/歌声合成に挑戦します - Monthly Hacker's Blog
声優統計のデータを使った、簡単なGMM声質変換のデモノートブック - Jupyter Notebook

@__dhgrs__さんからの指摘にもあるように,公式でアラインメントを提供すべきなのだろうと思っているけれどなかなか時間がない.今回言及した記事でも行われていたり,この方も行っていたりとあるにはあるのだけど,なかなか追いきれていないのと音声周りの知見がやはりまだ無いままなのでどうやるのが良さそうなのかよくわかっていない.

Shinnosuke Takamichi (高道 慎之介) - JSUT
また,これはブログ記事ではないけれど,東大猿渡研究室の高道助教によって作成されたコーパスに voiceactress100 として声優統計コーパスと互換のある音声が含まれている.
このコーパス[1711.00354] JSUT corpus: free large-scale Japanese speech corpus for end-to-end speech synthesis という形で論文にもなっている. Reference に [11] y_benjo and MagnesiumRibbon とあるのがいい.

その他,このように利用しているなどあったら教えて欲しい.とても嬉しい.

Dynamic Word Embeddings for Evolving Semantic Discovery (WSDM 2018) 読んだ

概要

[1703.00607] Dynamic Word Embeddings for Evolving Semantic Discovery
word embedding の時系列変化が見たい(これどこかの論文でも見た気がする).
例えば, apple という単語は昔は果物が連想されるだけだったが,今ではテクノロジー企業も連想されるだろう.
例えば, trump という人名だって「不動産」 -> 「テレビ」 -> 「共和党」と連想するものが時間と共に変化するだろう.
そういうのが見たい.

問題は,従来の embedding の方法は学習時に回転を考慮しないため,異なる時点での embedding を対応付けることができない.そこで,従来手法では,

  • 各時点での embedding を学習する
  • 時点ごとの embedding を対応付ける alignment を解く

という二段階のアプローチを行っていた.
この論文の手法は,全時点での embedding を解きながら embedding の時間変化に伴う滑らかさを正則化項として追加することで alignment を分割して説かなくて済む.

手法

ある時点での embedding については skip-gram や CBoW ではなく, PPMI (positive pointwise mutual information) 行列を行列分解することで獲得する.
結論から先に書くと,時点 における PPMI matrix を とし,分解後行列を とすると,最小化すべき目的関数は

となる.一項目は embedding そのものの誤差の最小化,二項目は embedding の正則化,三項目が時点間での滑らかさのコスト関数.で時点間の embedding がどれだけ近いかをコントロールする.
これにより,全ての embedding が全時点を考慮した状態で推定が可能となる,と著者らは主張している.
非常にシンプルな話.
勾配まで論文中に示してあるので実装も簡単にできそう.

結果

embedding を t-sne で可視化しつつある単語の変化の跡 (trajectory) を見る.27年分のデータで実験

  • apple が「果物」から「技術」に移動している.94年にスパイクが発生しているのは IBM との騒動があったため.
  • amazon は「森林」から「e-コマース」に移動し,「タブレット」など経て最終的には Netflix などのコンテンツ配信領域に落ち着いている.
  • obama は「学生」「市民」という領域から「議員」に移動し,最後には「大統領」に
  • trump は「オーナー」「不動産」から「大統領」に

Neural Factorization Machines for Sparse Predictive Analytics (SIGIR 2017) 読んだ & Chainer で実装した

[1708.05027] Neural Factorization Machines for Sparse Predictive Analytics

みんなが好きな Factorization Machines (FM) とニューラルネットワークを組み合わせて Neural Factorization Machines (NFM) を提案する.
FM とその派生手法がいくら変数間の交互作用を表現するモデルであったとしても,しかしそれは線形モデルのままであり,表現力に乏しい,というのがモチベーション.

FM

FM は という形で予測を行う.三項目で各特徴量をで低次元表現しつつその積で交互作用を扱う,というのが FM の特徴.

NFM

NFM では として, ニューラルネットワークにすることで交互作用を考慮しつつ非線形性を表現する.

ネットワークは

  • Embedding Layer
  • Bi-Interaction Layer
  • Hidden Layer
  • Prediction Layer

の四つから構成される.三つ目は複数階層のニューラルネットワーク,四つ目はただの 1 次元に落とす操作なので前二つについて書く.

Embedding Layer

FM や NFM が扱うのはたいていスパースなので,値がある次元をそれぞれ低次元に Embedding する.例えば, D 次元の入力のうち N 個だけが値を持っているとする時,K 次元に埋め込むとすると K 次元のベクトルが N 本作られる.またこの時,各次元の値を埋め込んだベクトルに掛けることを忘れないようにする.

Bi-Interaction Layer

続いて交互作用を考える. Embedding Layer から届くのは K 次元の N 本のベクトルなので,これを K 次元の一本のベクトルに変換したい.何も考えずにやると average pooling とか max pooling とかやる(例えば Learning Hierarchical Representation Model for Next Basket Recommendation (SIGIR 2015) 読んだ - 糞ネット弁慶 など.論文でも言及済)わけですが,ここでは陽に交互作用を考える.
すなわち, とする.ここで は埋め込みベクトルに元の特徴量をかけた K 次元のベクトルで, はベクトルの要素ごとの積.
これは としても計算ができる.

あとは batch normalization や dropout や residual unit なんかを Hidden Layer で入れることでモダンな感じになる.

実装

Chainer でやった.コードはこの gist にアップロードした.
ファイルは libsvm format で入力すると動作する.ひとまず classification がやりたかったので最後に sigmoid に通している.

「埋め込みを行いつつ元の値を掛ける」という操作をどうやっていいのかわからなかったので

  • 入力を「発火している特徴量の id を並べ,それ以外は -1 で padding したリスト」と「そのリストの各要素に対応する元の特徴量の値」に分ける
  • 特に後者は埋め込み後に掛ける必要があるので埋め込み次元に引き伸ばす

という方針でやる.

例えば特徴量が {0: 0.1, 3: 3, 7: 1} であり,特徴量の最大次元が10であり,3次元に埋め込む場合は

raw_fv = {0: 0.1, 3: 3, 7: 1}
# こんな感じで入力を書く
active_feature_ids = chainer.Variable(np.array([0, 3, 7, -1, -1, -1, -1, -1, -1, -1], dtype=np.int32))
feature_weights = chainer.Variable(np.array([[0.1, 0.1, 0.1], [3, 3, 3], [1, 1, 1], [0, 0, 0], ...], dtype=np.float32))

# 中略
# chainer の predict にて
# 'EMB': L.EmbedID(10, 3, ignore_label=-1) として layer を定義しておく

# まずは埋め込む
emb = self.EMB(active_feature_ids)

# 埋め込んだベクトルに元の特徴量の値をかける
emb = emb * feature_weights

# 組み合わせを考える
pairwise = F.square(F.sum(emb, axis=1)) - F.sum(F.square(emb), axis=1)
pairwise *= 0.5

# あとは何層か重ねる
pairwise = F.relu(self.l_pairwise_1(pairwise))
pairwise = F.relu(self.l_pairwise_2(pairwise))
pairwise = F.relu(self.l_pairwise_3(pairwise))

という感じで書いている.もっと綺麗に書く方法があると思うが書き慣れていないのでよくわかっていない.
これに加えてニューラルでない線形和の部分も chainer で推定させるために愚直にスパースな特徴ベクトルも渡している.綺麗に書きたい.

movielens のデータではそれらしく動いているのであとでちゃんと検証する.

冬のコミックマーケット2日目,30日東 F-55b にて「声優統計5, 6, 7, 8号」の在庫を頒布します

終わったはずの声優統計.しかし5号から8号までの前回の冬コミ在庫が若干部屋に残っていました.正直保存状態は悪いです.
@MagnesiumRibbonが30日東 F-55b Rei'n forcement にて松嵜麗さんの本を出す予定(松嵜麗さんのファンブックを出したいです - Rei'n forcement)ですが,そこで在庫の残りを頒布します.今度こそ終わりです.
各号の内容は日本声優統計学会をご確認ください.

NIMA: Neural Image Assessment (Arxiv) または『Googleが作った画像評価モデル』の元論文を読んだ

[1709.05424] NIMA: Neural Image Assessment

Google、任意の画像が技術的に審美的に美しいかを評価し1-10(10が最高得点)で採点するCNNベースの画像評価モデル「NIMA」を提案した論文を発表 | Seamless
Google AI Blog: Introducing NIMA: Neural Image Assessment

「写真を評価する人工知能」と話題になっていて,そんな研究いくらでもあるだろうと思ったので元論文を読んだ.
例えば似た話にニコニコ静画(イラスト)に投稿された175万枚の画像を用いて、閲覧数とお気に入り数を予測する回帰の問題としてchainerを用いて学習させた話とかある.

概要

画像を評価するニューラルネットを提案する.
前述の記事では「技術面と審美面」となっているけれど記事だけじゃ何が書いてあるのかまったく意味不明であり,画像処理にも詳しくないので intro を少し真面目に読む.
まず技術面 (technical quality) というのは技術というより品質の評価.画像がどの程度劣化しているかというのを評価するタスク.劣化前の画像がある場合と無い場合があって,劣化前の画像があるのなら PSNR や SSIM といった指標を用いることで劣化度合いが計算できる.が,劣化前画像が無いことが多いので「元の画像からどれだけ劣化したか」を予測する必要がある.
次に審美面 (aesthetic quality) はそのまま人間による評価.美しいか,独創的か,など.

両タスクにおいて用いる学習用データには,人手での評価が行われている.評価は 1 から 10 の 10 段階のように,段階で評価が行われているものとする.
既存手法では,評価の平均値に対する回帰や,高評価/低評価の分類を行なうものが多いため,評価の分布の情報を活かすことができていない.そのため,モデルによる評価が人間の評価と相関がそこまで高くなかった (言及している既存研究 ([1606.01621] Photo Aesthetics Ranking Network with Attributes and Content Adaptation) を見てもそこまで低くは見えないけれど).
NIMA では人間の評価により近付けるため,評価の分布そのものをヒストグラムとして扱って予測する.これにより, technical および aesthetic 両方において人間の評価と非常に相関が高い出力を得ることができた.

データセット

画像の美しさの評価はAVA: A large-scale database for aesthetic visual analysis - IEEE Conference Publicationを用いる.このデータセットでは画像ごとに 10 段階の評価が行われている.
画像の品質に関する評価はNikolay Ponomarenko homepage - TID2013を用いる.こちらも 10 段階の評価が行われている.評価データの作り方はちょっと工夫がされているので原文参照.

手法

画像から特徴量を抽出するネットワークは VGG16 や Inception-v2 といった既存のものを用いる.その上で,最終層を取り除き, full connected -> softmax で N 段階評価の N 個の多項分布を出力する.イメージとしては,各評価値 (bucket) に落ちる確率,と論文では表現されている.
しかしこの確率をただ学習する (例えば損失関数を cross entropy にする) のでは,評価値ごとの順序性が考慮されない.
「ならば回帰で解けばいいじゃないか」と思われるかもしれないが,しかし,分類ベースで解く方がいいと過去の研究でも言われている.
NIMA では損失関数を Earth Mover's Distance (EMD) にすることで順序付きの分類を適切に解く.

実験結果

前述のデータセットに対して予測実験を行っている.
この論文で一番よくわかっていないのは実験結果の見方で,人間の評価と相関が高いほど良いという話はわかっているのだけれど,そもそも比較しているほとんどの既存手法では相関が計算されていない.
なのでこの手法の良し悪しをどう評価しているのかが正直わからない.
Google Research Blog で取り上げられるほど優れた何かがあるのか,画像処理に詳しくないのでわからないままだった.詳しい人に聞きたい.

Deep Text Classification Can be Fooled (Preprint) 読んだ

Deep Text Classification Can be Fooled
入力を少し変化させるだけで機械学習によるモデルの推定結果を変えてしまう技術は Adversarial example と呼ばれている.
よく見るのは画像を用いた例だけど,それが文書分類でもできないかと思い探したところ,まずこれがでてきたので読む.

画像一般についてはこちらが詳しい.これを読むまで Deep Learning 特有の問題と思っていたが,実際はそうではないらしい.
はじめてのAdversarial Example

前提

文書 を入力として,その文書のクラス を推定するモデル があるとする.
そこで, に手を加えた によってモデルの出力を任意のクラス に誤分類 させたい.
画像と違うのは,入力が文書であるため,人間の目で見ても不自然でないように変更しなければならないということ.

手法

基本的には Explaining and Harnessing Adversarial Examples (FGSM) で提案されているように,コスト関数の勾配を用いる.
分類モデル Character-level Convolutional Networks for Text Classification で提案されている Character-level CNN.
文書の変更は挿入,修正,削除の3つの方法を適用する.それぞれ説明する.

挿入

各学習データ と目的のクラス および損失関数 に対して,勾配 を計算することで,各次元,つまりは各単語に対して勾配が得られる.
各学習データにおいてこの勾配が大きい単語上位100件を得,それを全学習データで数え上げることで, Hot Training Phrases (HTPs) を得る.
あとは HTP を挿入していくだけで誤分類できる.例えば Company 99.7% と予測していた文書に historic という単語を加えるだけで Building 88.6% と誤分類させることに成功している.
挿入位置も重要で,適当なところに入れると出力が変化しない.元クラスに強く寄与している,つまり が大きい単語の近くに挿入することで適切に誤分類できる.
複数の単語を挿入しなければいけない場合は HTP が含まれた文章を新たに追加する.もしちょうどいいものがなければ,読み手にばれにくい嘘の文章を追加する.

修正

修正といっても削除に近い.
元クラスに寄与している語を を使って探す.これを Hot Sample Phrase (HSP) と呼ぶ.
HSP に対して,元クラスへの損失関数 を増加させつつ,目的のクラスへの損失関数 を減少させるような修正を行なう.
単語の修正とは一体何かというと,

  • ススペルさせる (ミススペコーパスを事前に用意しておく)
  • 人間に見分けがつきにくいような置換を行なう.例えば l と 1 (おそらく置換ルールを用意しておく)

という二種類を行なう.
例えば comedy film property が HSP (Film, 99.9%) だった場合,flim と typo することで Company 99.0% にできる例が示されている.

削除

HSP が高い単語を削除するが,無闇に削除すると人間にばれる.よって形容詞と副詞を削除する.
論文中では seven-part British terevision series という HSP に対して British を削除することで Film 95.5% を 60.5% まで低下させている.

組み合わせる

これら三つを組み合わせることで飛躍的にうまくいく.

実験

例が作れたかどうかだけではなく,人間に読ませる実験も行っている.
変更を加えた文章も人間は適切に分類しており,うまく のみを騙せていることがわかった.
また,「人為的に変更した箇所と思われる部分を指摘せよ」という指示も出したが,精度 5.0%, 再現率 2.0% だったのでかなりばれにくいことがわかった.

シンプルだけどとてもおもしろかった.日本語でやるとすると見た目が似た漢字などが使えるのかもしれない.
日本語の多クラス分類データセットがあればすぐにでも実験できそう.
また, Adversarial example 自体は CNN 固有の問題でないので, GBDT などでも再現できるのではないだろうか.
(追記) 寝て起きて気づいたけれど,「挿入位置にセンシティブである」ということから bag-of-words で表現するモデルでは正しく動作しない気がしてきた.