糞糞糞ネット弁慶

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

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン) 読んだ

www.amazon.co.jp

訳者よりご恵贈いただきました.8年前に kaggle のアカウントを作ったきりの人間であるため,この文章にさほど価値があるとは思えませんが感想を書きたいと思います.

ロジスティック回帰や決定木,ランダムフォレストやニューラルネットワークなどの機械学習アルゴリズムにどのようにデータを入力するか,ただのデータをよりアルゴリズムのパフォーマンスが改善するように加工する作業を「特徴量エンジニアリング」と呼びます.

本書はその特徴量エンジニアリングの基礎である

  • 変数の値をそのまま使うのか,二値化するのか,区分に分けて離散化するのか,対数を取るのか,値を一定の区間に揃えるのか
  • テキストをどのように特徴量にするのか,どう処理すべきか,どう重み付けるのか
  • カテゴリ変数をどのように扱うのか,カテゴリの数が増えた時にどう対処するか
  • 変数の数が多い時にどう減らせば良いのか
  • k-means クラスタリングを用いることで非線形な特徴量抽出が可能になること
  • 画像の特徴量をどう取り出すのか,そして深層学習がどのように特徴量を抽出するのか

といった内容を,「なぜこの加工を行う必要があるのか」「どう嬉しいのか」「どのように問題があるのか」を踏まえながら紹介しています.

また,最後には類似論文の検索アルゴリズムについて,仮説構築,データ加工,実験,仮説の再検証の 4 ステップを繰り返すことでこれまで取り組んできた内容の実践を行っています.

僕が読んでいて面白かったトピックを取り上げます.

  • 5章. カテゴリ変数の取り扱い
    • 僕が日々扱うデータはカテゴリ変数であることがメインであるため,この章は非常に示唆深いものでした. Hasing を用いたカテゴリ変数はどうにも飲み込めていなかったため,本書の説明で理解が明瞭になりました.
    • また,ビンカウンティング (このような呼び方をするのも学びです) についても,次に予測モデルを構築することがあったらぜひ試そうと思えるものでした.
  • 7章. 非線形特徴量の生成 : k-means を使ったスタッキング
    • 「目的変数と説明変数に非線形な関係がある時,または説明変数が非線形多様体上に分布している時 (余談ですがこの『多様体』という単語の使い方は多様体を専門にしている人にとっては許されるものなのでしょうか) 線形モデルでそれをどのように表現するか」という時の対応策として,説明変数に k-means クラスタリングを適用することにより,非線形特徴量が抽出できることを説明しています.
    • この操作がどの程度効果があるのかは図7-7 を見れば一目瞭然です. k-means によって説明変数が割り振られたクラスタを説明変数に追加することにより,ただのロジスティック回帰がランダムフォレストや SVM などに匹敵する AUC を示しています.
    • すぐにこの操作に飛びつかぬよう,計算量の問題やデータリークが起こることへの言及がなされている点も良いと思います.
  • 9章. バック・トゥ・ザ・「フィーチャー」 : 学術論文レコメンドアルゴリズムの構築
    • 単にこれは僕がステップ・バイ・ステップで作業を進めながら検証を行う様子が好きなのでこの章に言及しました.

おそらく,本書に最も価値があるのは「何気なくやっている操作を言語化・テキスト化した」という点ではないでしょうか. 大体の場合僕たちは何も考えずに対数を取ったり正規化をしたり TF-IDF を計算するわけですが,では「なぜその操作を行うのか」「そのデメリットは何か」を説明しようとした時,たとえば入社一年目の新人に聞かれた時,少し戸惑ってしまうのではないでしょうか (説明が全く無理とは言っていません). 「Python は書けるし scikit-learn のドキュメントも読めるので予測モデルを作ってみたい」という入社一年目の新人に「一通り抑えてほしい内容が書かれているのでまずは全部読んでくれ」とこの本を渡し,可能であればそれぞれ試してみて精度や計算時間,メモリ使用量がどう変わるかを試してもらうのが良いのではないでしょうか (本書の例でも必ずしも精度がめざましく改善する,つまり,特徴量エンジニアリングがいつでも「銀の弾丸」となるわけではないことが示されており,ここにもリアリティを感じます).

しかし,わがままを言えば,更に突っ込んで欲しかった話題があります.それは「ニューラルネットワークや勾配ブースティングのような十分複雑なモデルを用いる上で特徴量エンジニアリングはどれだけ貢献するのか,貢献するものとしないものがあるのではないか」というものです.先程述べたような k-means による特徴量変換はロジスティック回帰に投入することで精度の改善を説明していますが,同じ特徴量を Random Forest に投入するとどうなるのでしょうか.さすがに kaggle のような競技プログラミングや実務に寄り過ぎた話題であるため本書の範疇外だとは思いますが.kaggle の kernel を読めという話なのかもしれません.

300 万ノード 1 億エッジからなる日本語版 Wikipedia のリンク構造から学習した見出し語の node2vec (分散表現) を公開しました

タイトルの通りです.Wikipedia 本文を用いた埋め込みは

がありますが,リンク情報を用いた埋め込みは見かけなかったので公開します.このデータが誰かの何かの役に立てば幸いです.

ダウンロードリンク

2 種類のファイルを用意しました.

手法

グラフ埋め込み (Graph Embedding) はノードとエッジからなるグラフデータを入力とし,ノードごとの埋め込み表現 (分散表現, Embedding) を得る手法です.グラフからなんらかの手法でサンプリングを行うことで,順序のあるノードの系列を複数生成し,これを文とみなした上で Skip-Gram with Negative-Sampling を用いてノードに対する分散表現を計算する,というのが現状の僕の理解です.一昨年から自分の中で注目している分野です.

今回は Jure らによって提案された node2vec (node2vec: Scalable Feature Learning for Networks, KDD 2016) を使います.node2vec の説明は元論文を読むか, nzw さんによる node2vec: Scalable Feature Learning for Networks を参照してください.

データ

2019 年 1 月 21 日時点における日本語版 Wikipedia のリンク構造を用います.Wikimedia Downloads に公開されている

  • jawiki-latest-pagelinks.sql.gz : リンク構造が格納されたファイル
  • jawiki-latest-page.sql.gz : ページ ID とそのタイトルが格納されたファイル

の二つを用いることで,日本語版 Wikipedia に存在するすべてのリンク関係のうち,リンク先のページにタイトルが振られているものを全て残しています.

細かい話をすると,jawiki-latest-pagelinks.sql.gz におけるリンク構造は「ページ ID (from_id と呼びましょう)」から「ページタイトル (to_title と呼びましょう)」への形式で記述されているため,to_title に対応するページ ID を jawiki-latest-page.sql.gz から見つけなければなりません.しかし,これらのファイルには

  • from_id に対応するタイトルが jawiki-latest-page.sql.gz に存在しない
  • to_titlejawiki-latest-page.sql.gz に存在しない

といったよくわからない状態が発生します.前者については from_id を新たなタイトルとして扱い,後者についてはそのエッジおよびノードを削除しました.

結果的に,ノード数 3,361,556 件 (ユニークタイトル数 2,953,052 件)*1,エッジ数 118,369,335 本の重み無し有向グラフを構築しました.

構築においては MySQL のダンプファイルを一度データベースにインポートするのではなく, jamesmishra/mysqldump-to-csv: A quickly-hacked-together Python script to turn mysqldump files to CSV files. Optimized for Wikipedia database dumps. を用いて(一部改変して) TSV ファイルに変換しました.これは便利.また作業の都合上,"!'\ といった記号を全てタイトルから削除しています.

計算

実装は Jure らによる実装 (snap-stanford/snap: Stanford Network Analysis Platform (SNAP) is a general purpose network analysis and graph mining library.) を用いました.

計算環境は Google Compute Engine を用いました.特に今回の計算は,

  • コア数が増えれば増えるほど計算が早くなる実装である
  • メモリを非常に消費する (450GB 程度)

といったことから vCPU x 96 / メモリ 624 GB という高スペックなマシン (n1-highmem-96) を使用しました.このマシンは 1 時間あたりの費用が $3.979 と比較的高額ですが,これまで利用していなかった $300 のクレジットがあったので 10 時間ほどかかりましたがどうにか自腹を切らずに済みました.ありがとう Google

デフォルトのパラメータではなぜかすべての値が -nan になってしまうため,# of negative sampling を 4 に,SGD の初期学習率を 0.01 としました (snap-adv/word2vec.h にハードコードされています.引数で変更できるようにしてほしい.).その他のパラメータは node2vec の実装のデフォルト値を設定しています.

得られた埋め込みはどうか

では,得られた埋め込みを使ってみましょう.

jawiki_n2v.w2v_c_formatword2vec C format で記載しているのでそのまま gensim で読み込むことができます.

>>> import gensim
>>> model = gensim.models.KeyedVectors.load_word2vec_format("./jawiki_n2v.w2v_c_format")
>>> model.most_similar("大久保瑠美", topn=3)
[('高橋李依', 0.9941796064376831), ('阿澄佳奈', 0.99155592918396), ('斉藤壮馬', 0.9913237690925598)]
>>> model.most_similar("乃木坂46", topn=3)
[('欅坂46', 0.9911350607872009), ('生駒里奈', 0.9882588386535645), ('シュートサイン', 0.9879196882247925)]
>>> model.most_similar("新宿駅", topn=3)
[('池袋駅', 0.9909403324127197), ('渋谷駅', 0.9906771779060364), ('上野駅', 0.989866316318512)]
>>> model.most_similar("アボカド", topn=3)
[('デヒドロアスコルビン酸', 0.9737377166748047), ('ビタミンB2', 0.9736371636390686), ('ルテイン', 0.9733775854110718)]
>>> model.most_similar("バナナ", topn=3)
[('キャッサバ', 0.9832699298858643), ('ヤムイモ', 0.9814094305038452), ('パパイア', 0.9809246063232422)]

なんとなく本文から学習された埋め込みと違う結果になっていることがわかります. 特に「バナナ」では果物ではなく,「主食」という意味合いでキャッサバやヤムイモが類似していることがわかります.面白いですね.

*1:なぜユニークカウントをしているかというと,異なる namespace に所属している同じタイトルが異なるノードとして扱っているためです.

MovieLens dataset や ImageNet や CaboCha 付属モデルファイルはそのままでは商用利用できない

タイトルそのままです.
機械学習領域において有名なデータはよくライセンスを確認してみるとそのままでは商用利用ができないことがしばしばあります.
ブログや Qiita に書いたり,大学研究者であれば問題になりにくいとは思いますが,なんらかの企業に所属して研究開発やシステム開発を行っている場合には注意が必要になることがあるかもしれません*1
色々あってライセンスについて少し調べたのと,ウェブ上での言及を見かけなかったのでここにメモを残します.

MovieLens dataset

MovieLens | GroupLens
MovieLens dataset (以降 MovieLens) は GroupLens によって収集・公開されている映画の評価データです.
このデータはそこそこの量があること,映画という馴染みの深い題材であることから,協調フィルタリングや行列分解を用いた推薦問題を解く際のサンプルデータとして有名です.
MovieLens のライセンスには

The user may not use this information for any commercial or revenue-bearing purposes without first obtaining permission from a faculty member of the GroupLens Research Project at the University of Minnesota.

とあり,許可を取らなければ商用利用できないことがわかります.

ImageNet

ImageNet
ImageNet は画像とタグの集合のペアが大量に入ったデータです.深層学習による画像分類を行う上で定番のデータではないでしょうか.
ライセンスを確認してみると

Researcher shall use the Database only for non-commercial research and educational purposes.

とあります. MovieLens と違って交渉の余地が無さそうです.

CaboCha

CaoboCha: Yet Another Japanese Dependency Structure Analyzer
CaboCha は taku910 氏によって開発・公開がされている係り受け解析を行うためのソフトウェアです.
CaboCha にはモデルファイル (CaboCha が用いている機械学習モデルのパラメータ) が付属されていますが,これは通称毎日新聞コーパスという有償の言語資源を用いて学習が行われています.
そのため,

そのため配布しているモデルをそのままの形で使うことは, 研究目的, 個人利用に限られます. 誤解ないように言っておくと, これは, CaboCha の利用が研究目的に限定されていることを意味しません。 ご自身で用意なさったコーパスを基に, 独自にモデルを学習, 作成した場合は研究目的以外の利用が可能です。

と明記されています.

CaboCha を用いた商用システム開発,たとえば企業のチャットボットが内部で係り受け解析を行うには付属のモデルファイルをそのまま使うことができません.みずから言語資源(日本語文章と,それらに対応する形態素や構文情報など)を整え,モデルを学習する必要があります.自然言語処理には詳しくないのですが京都大学テキストコーパスに類するものを再生産する必要がありそうです.なかなかハードルが高い.

Yelp Dataset

Yelp Captcha
Yelp はレストランや美容院など,さまざまな店舗を対象にしたレビューサイトです.
Yelp dataset では POI (Point Of Interest) へのチェックインやレビュー情報などが含まれています.
こちらも

4. Restrictions You agree that you will not, and will not encourage, assist, or enable others to:
  B. use the Data in connection with any commercial purpose;

とあり,商用目的での利用が不可能です.

そもそもデータの商用利用とはなにか

法律の専門家ではないので何が商用利用で何がそうでないのかがわかっていません.たとえば

  • ImageNet の画像を加工して商用サイトの素材に用いる
    • これはさすがに商用利用に該当しそう
  • 書籍に商用利用不可のデータの一部を掲載する
  • 書籍に商用利用不可のデータを分析した結果を掲載する
  • 書籍に CaboCha 付属のモデルファイルで係り受け解析した結果を掲載する
    • これもさすがに商用利用に該当しそう
  • アドセンスアフィリエイトを備えたブログにおいて商用利用不可のデータを分析した結果を掲載する
    • 商用利用に該当しそうな気がしますがどうでしょう
    • ちなみにこのブログのアマゾンアソシエイトは hatena-blog-22 なのでこれまで一円も儲かったことがない
  • 企業研究者が ImageNet の画像を使って機械学習モデルを構築する
    • これは研究活動として認められるのか
    • しかし企業研究者は研究を行うことで企業から給与を得ているので商用利用ではないのか
    • ImageNet の non-commercial research とはなにか
  • 企業研究者が ImageNet を使って機械学習モデルを構築し,自社の商用システムにデプロイする
    • これはさすがに商用利用に該当しそう
  • 大学研究者が ImageNet を使って機械学習モデルを構築し,そのパラメータを公開している場合に,企業研究者がそのパラメータを商用システムに利用する

という話がよくわかっていない.
ソフトウェアのライセンスだと研究者であろうが企業に所属している時点で「商用利用」として扱われている印象があります*3.また,フォントのライセンスであればモリサワのように商業利用の例について明記されていることが多いのでないでしょうか (参考 : 商業利用について | フォント製品 | 製品/ソリューション | 株式会社モリサワ).

弁護士による 進化する機械学習パラダイス ~改正著作権法が日本のAI開発をさらに加速する~ | STORIA法律事務所改正著作権法が日本のAI開発を加速するワケ 弁護士が解説 (1/7) - ITmedia NEWS といった記事もありますが,焦点は著作権法であり,商用利用不可としたデータについての利用についての言及はありません.

また,話は少し変わりますが,以前の言語処理学会におけるデータセット著作権チュートリアルにて「元の内容が復元できない(たとえば形態素解析済みのもの)であれば著作物に該当しないから公開して構わない」といった話があった,と聞いた記憶があります*4.このあたりもどこかに資料がまとまっていたりしないでしょうか.

わからないことだらけなので有識者の見解が欲しいですし,なんらかの判例があるならば参考にしたいです.

「調べてみました!……いかがでしたか?結論はよくわかりませんでした!」という最悪な大量生成ブログと同じ終わり方になりました.

*1:他の企業がどのように対処しているのかわからないので非常に遠回しな言い方になってしまいました.

*2:Amazon で「集合知プログラミング」を開いたら「お客様は、2008/12/5にこの商品を注文しました。」と出て懐かしい気持ちになりました.10年以上こういうことをやっている.

*3:印象でありソースがあるわけではありません.また,現業においてそのようなソフトウェアと関わりが薄いという理由もあります.

*4:又聞きです.

Predicting Audio Advertisement Quality (WSDM 2018) 読んだ

[1802.03319] Predicting Audio Advertisement Quality

Spotify や Pandora などの音楽配信サービスにおいて挿入される音声のみの広告の品質を機械学習で推定する.
方針としては,音声から handcrafted な特徴量を抽出し,代理タスクを解く.
論文の著者は Pandora.

どうやって品質を定量化するか

一番いいのは被験者に聴き比べてもらうことですが現実的じゃないので代理のタスクを解く.
Web 広告の文脈では CTR (クリック率) を用いることが多いが,データを見ると音声広告経由でランディングページを開いたものの 90% が 5 秒以内に閉じている.バナーがクリックされた位置のほとんどが「閉じる」ボタンの近くであることも踏まえると,ほとんどが誤クリックであることが推測できる.
そこで,単純な CTR ではなく,ある一定の秒数以上ランディングページを開いていたクリックを表示数で割る Long Click Rate (LCR) を広告ごとに計算する.これがこの論文の新規性の一つ.

予備調査

ユーザがどのような音声広告を好ましいと思うのか調査を行う.5つのカテゴリごとに,LCR の分布の異なる分位点から広告ペアを選び,どちらが優れているか,またその理由は何かをユーザに尋ねるのを繰り返した結果, Audio Aethetic (直訳すると音楽の美しさですがこの指標の例が「BGMや話者の性別,会話,単一話者」などと書いてあってよくわからない) と Clarity of Message (内容が明確であること),Quality of Sound (BGMと声とのバランスが取れていること)が重要であるとわかった.

なのでここからはそういう特徴量を取ることにする.

特徴量

特徴量は大きく分けて三種類.それぞれの定義は詳細が書かれていないので参照されてる論文を読む必要がある.音声処理についての知識がないのでこれらの特徴量がそれぞれを表現していることがわからないままだった.
これらをすべて合わせると 2440 次元の特徴量ができあがる.

  • Timbre (音色)
    • TFD, MFCC, Delta-MFCC, MSP
  • Rhythm (リズム)
    • TEMPO, TG_LIN, TGR{B, T, H}, BPDIST{B, T, H}, Mellin
  • Harmony (ハーモニー)
    • SIHPCP, MODE, SICH/SICHC/SIKC

予測

タスクとしては広告が good か bad かの二値分類を解く.

モデル

ここからよくわからない記述が出てくる.ベースラインとしては logistic regression や random forest を用いる.
「多重共線性などがあるので PCA や Kernel PCA などの次元削減を行う」という記述があるがここが完全に意味不明.その後 PCA の文字列が出てくることもないし,その後の特徴量解釈が不可能になる.たとえば Figure 5 では L1 logistic regressio でどの特徴量が選ばれたかの議論をしているのでこれを行うためには次元削減をしてはいけない.また,そもそも当初のモチベーションは「handcrafted な特徴量を構築することで音声広告をどのように改善すればいいかを知ること」だったはずなので次元削減したらいくらモデルが interpretable でも意味がなくなる.
何のためにこの記述が存在しているのか全く理解できない.あとやたらと文字数が多い.

また,2440 次元を入力とする多層パーセプトロンだけでなく, Audio Spectrogram を入力とした CNN による推定モデルも提案している.しかし音声を入力とした識別問題に CNN を用いるモデルは Automatic tagging using deep convolutional neural networks (ISMIR 2016) で提案されており,そこまで違いがあるわけではないのでこれ自体に新規性があるとは思えない.
何のためにこの記述が存在しているのかわからない.あとやたらと文字数が多い.

目的変数である good or bad をどう決めるか

この部分がこの論文において一番問題だと考えている.
方針としては LCR を降順にソートし,ある閾値(たとえば top30 と lower 30)を設けて上位と下位をそれぞれ good と bad に割り振ることで目的変数を作る.
ではどうやって閾値を決めたかというと, chose the percentiles whith highest prediction accuracy と言っている.どういうことかというと,異なる閾値で実験を行い,どの値が「もっとも見た目の精度が高いか」で決めている.
そもそも閾値を変えながら精度を比較していることに何の意味もなく (top/lower が変わるのでサンプルサイズも変わる),どの閾値にすることで見栄えが良くなるかの違いでしかない.これで「提案手法は AUC が 0.79 だった」と言われても「それは最も見た目の精度が良くなる閾値を選んだからだろう」と興ざめしてしまった.
極端な話,どの特徴量がどのように good/bad に寄与しているかを知りたいだけならば閾値は決め打ちし, AUC の見た目の精度に言及せずに選択された特徴量についてのみ議論をすればいいはず.
このような方法で閾値を決める論文をはじめて見たので面食らってしまった.世界は広い.

タイトルで面白いと思い読んだけれど特徴量抽出部分で置き去りにされ,Section 5 で完全に意味がわからなくなった.

Applying Deep Learning To Airbnb Search (preprint) 読んだ

[1810.09591] Applying Deep Learning To Airbnb Search

Airbnb における Search に Deep Learning を導入した話.「機械学習のシステムが既にあってそこにニューラルネットワークを導入したい人」に向けて書かれている.
論文調ではないのでまとめも箇条書き.

モデルの概要

  • 既存の GBDT -> 4層 (中間層は32個,ReLU で活性化) の NN (17年4月) -> Lambdarank NN (17年6月) -> GDBT/FM NN (18年3月) -> Deep NN (18年6月) と段階的に本番環境に導入してきた
    • 最初の NN は損失関数を二乗誤差にしていた
    • Lambdarank NN : 損失関数を Lambdarank のそれにして学習した
    • GBDT/FM NN : 既存の NN に対して以下の特徴量を追加したもの (なぜならそれらのモデルの出力は NN によるものと異なっていたため)
      • GBDT feature : それぞれの木においてどこの leaf に落ちたかを categorical feature として得る
      • FM feature : 32 次元に落とした Factorization Machine の出力を連続値として得る
    • Deep NN : 4層 (195-127-83-1) の DNN.feature engineering はほとんど行っていない.

失敗した試み

代表的なものをふたつ.

  • 物件 ID (Listing ID)
    • Listing ID を embedding して使ったところ overfitting してばかりで精度が下がった
      • 同じ Listing ID が重複して booking log として登場しないため
  • long view (多分ある listing を長い時間閲覧していること) と Booking probability をひとつのネットワークで同時に学習させる multi-task learning (最終層を 2 つにする)
    • long view と booking にある程度の相関があったため
    • また,long view には Listing ID が複数登場するため先程失敗した embedding も効くのではないか
    • しかし実際には long view のみを改善し booking には変化が無かった
      • long view が発生するのは高価な物件,説明文が長い物件,珍しかったり面白い物件といったような booking に直接関係しない要素が原因だったため

Feature engineering

  • 特徴量の値を [-1, 1] に変換する
  • モデルの sanity check として特徴量の値を 2,3,4 倍 としていった時に NDCG が変化しないかを見るといいらしい
  • 位置情報は少し工夫する
    • 物件の緯度軽度は検索時に表示されている地図の中央の緯度経度を基準に変換するだけでは値が中央によりすぎるので,その上で log を取る
      • 相対的な位置情報に変換することで特定の位置情報ではない特徴量が得られる
  • 分布が連続にならない特徴量も組み合わせることで連続になる
    • ひとつの例として,ある時点からの未来における予約率が特徴量として効きそう(人気の物件ほど速く予約が埋まる)が分布が連続ではないので困った
    • 物件ごとに最低日数が設定されており,これが原因で分布がおかしくなっていた
    • 物件ごとの平均利用日数と組み合わせることで分布が連続になった
  • より大域的な位置情報をどう扱うか
    • level 12 の S2 cell で位置情報を取得する
    • その上でクエリと組み合わせて Hash にする
      • 例えば "San Francisco" というクエリに対して Embarcadero のある物件の S2 cell が 539058204 だった場合 `{"San Francisco", 539058204}` を Hash 化して 71829521 という値を得る.これを categorical feature として用いる
      • ここの Hash についてはこれ以上の記述はなし

System engineering

  • パイプラインは Java で構成されている
  • GBDT 時代に CSV を受け渡していたパイプラインを使いまわしていたら学習時間のほとんどを CSV ファイルの変換に使っていることがわかったので Protobuf を使うよう再構築したところ学習も高速化されたので学習に用いるデータを一週間から一月に増やすことができた
  • モデルの学習は Tensorflow で行うがスコアリングは Java で独自に構築した NN ライブラリで行う

IBIS 2018 行った

IBIS2018 | 第21回情報論的学習理論ワークショップ, 2018.11.4〜7, 札幌(かでる2.7・北大)
先月にアンダーライブツアー北海道シリーズで行ったばかり.札幌がちょうどいい気温だった.チュートリアルの日は特に晴れていて,北大内にあるセイコーマート2階のテラス席がとても気分が良かった.
会議以外だと円山動物園が想像以上に見応えがあって良かった.

チュートリアル

深層学習入門

「入門」と称して積分表現の話をするのかと怯えていたら本当に入門で終わった.

転移学習 : 基礎と応用

共変量シフトと密度比推定の話が良かった.

データ駆動型科学のための統計的推論法

ポスター発表でも selective inference が頻発していた.

クエリ可能な確率的組合せ最適化問題
  • 連続緩和して解くみたいな話だった.
  • 「この設定は臓器交換・オンラインデーティングなどに応用をもつ」とのことでしたがチュートリアルでは腎臓交換の例ばかりだったような.マッチング業者の立場から「確率的にマッチするかどうかがわかるけどカップルが成立したら取り消し不可能(臓器交換しなきゃならない)」という問題設定だと確かにそのままだった.
  • レコメンデーションなどと組み合わせられるかと思ったけれど確率的にマッチするかどうかというのは少し違うのではないかと考え直した.

1 日目

離散構造処理系 : その概要と最近の研究状況について

ZDD の紹介.数え上げ(複雑な目的関数を取れない)のイメージがあったのである尤度比について枝刈りを行うことで高速化できるという話が面白かった.

グラフ集合を圧縮して活用するためのデータ構造とアルゴリズム

ZDD のテクニックの話だった.

離散構造処理系の機械学習への応用
  • arm を複数まとめた super arm を考える組み合わせバンディットに活用できるという話が面白かった.

2 日目

公平性に配慮した学習とその理論的課題
  • 「差別」という単語を定義しないまま最初から最後まで話が進んでいたので引っかかる部分が複数あった.おそらく,集団 / 個人公平性が満たされていないことを「差別が発生している」と定義しているのだと思う.
  • 機械翻訳における差別」という話で「性差の無い言語から英語に翻訳すると『XXはYYである』という文が YY によって XX の he/she が変わるのは差別だ」というエピソードが紹介されていた.この例もよくわからなくてどういう翻訳が出力されたら差別ではないのかがわからない.
  • 「US の全件調査データにおいて女性の収入が低いことはバイアスである」という話があったけれど文字通り全件調査ならバイアスではなくそれが事実なのではないか.データが本当に偏っているのか,調査の過程でバイアスが生じたのか(アメリカ大統領選挙の番狂わせ(前編)〜 標本調査における偏り�@|統計学習の指導のために(先生向け), みたいな話ですね) の例でこれは違うのではないかと思った.
  • 「少数クラスをモデルが無視してしまうので偏った数字が出ることで学習におけるバイアスが発生する」と言われていて,これは学習器が無限に賢くなったら解決される差別なのだと思う.
  • 集団公平性 (group fairness) と個人公平性 (indicidual fairness) というふたつの視点が紹介されていたが「どちらの観点から裁判になることが多いのか」という質問が出ていたのが良かった.
  • 社会正義や公平性を満たすためにデータやモデルを無視しなければならないとしたらそれはもはや学習理論が扱う範疇の話ではなくて質疑でもあったように裁判で決める話なのだろうと思いながら聞いていた.

3 日目

コンピュータビジョンにおける無教師学習の進展とその課題

無教師学習とは何かと思ったら最初から最後まで GAN の話だった.

音声分野における敵対的学習の可能性と展望

JSUT コーパスでもおなじみの高道氏による話.

  • GAN で高精度になるしもっと発展が見込めるみたいな話だった.
  • スライド中に「こんなことができるのではないか」と語られていたアイデアがすでに arxiv にあるという話がタイムラインに流れていてそんなペースで論文が出る界隈は死ぬほど大変そうだと思った.

ポスター

去年の東大よりは歩きやすくて聞きやすかった.

  • D1-05: 巨大ランダム行列を用いた構造の変化点検知
    • シンプルな話で面白かったので論文で読みたい.
  • D1-66: 患者情報の季節性と検索クエリに基づくトレンドを用いたインフルエンザ患者数予測
    • 他の人に対して説明しているのを聞いたところ,2 つのデータを分けて推定させたほうが精度が出た,みたいな話が聞こえてよかった.
  • D1-79: 日時が曖昧に記録されたイベント列の解析
    • RBM を時間方向に無限に伸ばすみたいな話だった.最近 accept されたみたいな話だったと思う.
  • D2-72: 教師付解釈学習
    • いい話だった.

IRGAN (SIGIR 2017)→GraphGAN (AAAI 2018)→CFGAN (CIKM 2018) を読んで GAN による購買予測/協調フィルタリングを学ぶ

CFGAN (CIKM 2018) を読もうと思ったら「そもそも発想としては IRGAN (SIGIR 2017) と GraphGAN (AAAI 2018) が先にあって……」と触れられていたので順に読むことにする.
そもそもタイムラインで「CFGAN がはじめて商品推薦に GAN を使っていてすごい」という風潮で取り上げられていて,「2018年まで誰も思いついていないとかまさかそんな馬鹿な話があるわけないだろう」と思ったのがきっかけ.

結論から言うと

  • 商品推薦に GAN を用いるのは CFGAN が初出ではなく IRGAN が初出であり, GraphGAN でも実現している
  • CFGAN は IRGAN/GraphGAN における「真のデータを Generator がサンプリングしてしまうことで Discriminator が混乱して精度悪化を引き起こす」という問題に対して「離散的に点をサンプリングせずに連続なベクトルのサンプリングを行う」という方式を採用することで精度を改善した

この 2 点.

IRGAN: A Minimax Game for Unifying Generative and Discriminative Information Retrieval Models (SIGIR 2017)

[1705.10513] IRGAN: A Minimax Game for Unifying Generative and Discriminative Information Retrieval Models
SIGIR18 IRGAN Tutorial

概要

GAN で IR (Information Retrieval) を行う.IR は query q に対して関連がある document d を得るタスク.
読むまで「どのように Generator で document を生成するのだろうか」と思っていたらそういうわけではない.

  • Generator : query q から document d が生成される確率 p(d|q, r)
    • 真の確率 p_{\textrm{true}}(d|q, r) は学習データで与えられているとする (というより関連のある pair (q, d) が与えられている)
    • p_{\textrm{true}}(d|q, r) を模倣する p_{\theta}(d|q, r) を学習したい
  • Discriminator : query q に document d が関連がある場合に 1 を返すような識別的な関数 D(d|q) を学習したい
    • D(d|q)=\sigma(f_{\phi}(d, q))

の 2 つを用意して

J=\textrm{min}_{\theta} \textrm{max}_{\phi} \sum_{n=1}^N \mathbb{E}_{\sim p_{\textrm{true}}(d|q_n, r)} \log D(d|q_n) + \mathbb{E}_{d \sim p_{\theta}(d|q_n, r)} \log (1 - D(d|q_n))

を学習する.
\textrm{min}_{\theta} \textrm{max}_{\phi} の気持ちは

  • Discriminator は真に関連がある (q_n, d) pair に高いスコアを振り, Generator が提示してくる (q_n, d) pair に対して低いスコアを振るように頑張る
  • Generator は q_n に対してなるべく関連がありそうな d をサンプリングできるように頑張る
    • もう少し丁寧に書くと p_{\theta} (d|q, r)=\frac{\exp(g_{\theta}(q,d)/\tau)}{\sum_{j\in \mathcal{I}} \exp(g_{\theta}(q,d)/\tau)} という感じで g_{\theta} を学習する必要がある
  • Discriminator および Generator は pair (q, d) に対するなんらかの特徴ベクトルを受け取るニューラルネットワークで構築する
    • あとで実験を行いますが特に Generator を linear なモデルにすると予測精度が低いままになってしまう.馬鹿な Generator では Discriminator の役に立たない.

という状態.

学習においては Discriminator は普通に勾配を求める. Generator はサンプリングが関係するので policy gradient based reinforcement learning を使う.

自分の解釈

ナイーブに考えると関連がある pair を正例,関連が無い pair を負例として識別的に Discriminator のみを学習すればいいわけですが, query と document それぞれが非常に大量にあり,かつ,関連がある pair が非常に少ない時,まさか全組み合わせを使って負例を作るわけにはいかないし,そもそも「関連がある」わけではないペアがすべて「関連がない」わけではなく, unobserved だけれども 関連する pair も存在している.なので unlabeled なデータを使って Generator で効率的に識別面に近い負例を生成し, Discriminator の学習を補助している,という解釈でいる.

とはいえ Discriminator を Pre-train するという記述があってどうやって負例を作ったのかがわかっていない.実験の項を見ると関連度順に 0, 1, 2 とつけられたラベルと -1 の「関連度無し」というラベルについて 1 と 2 を関連するラベルとして,それ以外を unlabeled として扱っている.そもそもIRにおいて positive だけがある状態で学習する話がわかってない.情報系の素養が何もない.

実験

実験結果を見ると既存の手法を上回る精度を出している.
また,この枠組みは商品推薦にも使うことができる. IR タスクでは特徴ベクトルが与えられる状態でしたが query/document を user/item と読み替えて特徴ベクトルの代わりにそれぞれの latent vector (論文中では user/item matrix に対する matrix factorization) の内積を用いることで同じように実験ができる. Movielens と Netflix で実験して BPR (pairwise な loss を考えるやつ) を上回る精度を出している.よって少なくとも IRGAN によって GAN を用いた商品推薦が実現していることがわかる.

GraphGAN: Graph Representation Learning with Generative Adversarial Nets (AAAI 2018)

[1711.08267] GraphGAN: Graph Representation Learning with Generative Adversarial Nets
今度はグラフに対して GAN を行う.何を生成するかというと

  • Generator : vertex ( vertex ) v_c から vertex v に対して edge (枝) が存在する確率を返す関数 G(v|v_c; \theta_G)
    • 真の確率 p_{\textrm{true}}(v|v_c) は入力におけるグラフにて vertex ペア (v, v_c) 間に edge が存在しているかで表現されている
    • p_{\textrm{true}}(v|v_c) を模倣する G を学習したい
  • Discriminator : D(v,v_c;\theta_D) は vertex ペア (v, v_c) 間に edge が存在しているかを識別する関数であり,vertex 間に枝があるかを学習させる

といったように

  • Generator は edge がありそうな vertex pair を返す
  • Discriminator は真に edge が存在する vertex pair かどうかを返す

を繰り返す(馬鹿みたいに考えるとグラフを丸暗記すればいいわけですが後述するように vertex の embedding/latent vector内積で表現するのでそういうわけにはいかない).
vertex を query と document として考え, edge を relevant として考えると IRGAN と同じ枠組みであることがわかる.

IRGAN の時と同様に

  • Discriminator D(v, v_c) = \sigma(\mathbf{d}_v^T \mathbf{d}_{v_c}) として \mathbf{d}_v, \mathbf{d}_{v_c} を vertex ごとの k 次元の潜在表現pとして学習
  • Generator G(v|v_c) = \frac{\exp(\mathbf{g}_v^T \mathbf{g}_{v_c})}{\sum_{v \neq v_c} \exp(\mathbf{g}_v^T \mathbf{g}_{v_c})} として \mathbf{g}_v, \mathbf{g}_{v_c} を vertex ごとの k 次元の潜在表現として学習
    • この時,ナイーブに softmax を取るとグラフ構造を活かすことができないのでグラフ構造を反映して v_c から Breadth First Search で tree を作ってそこにおける path を使って確率を構成する graph softmax を導入する (eq 7が追えてないので詳細は後日ちゃんと読む)
    • さらに G からのサンプリングを効率的にするために online sampling strategy を導入する

とする.

実験

実験は link predicton, Node Classification,それと Recommendation をやる.当然 vertex を user と item とみなせば link prediction は recommendation として考えられるため行うことができる.

IRGAN / GraphGAN における素朴な疑問

ここまで IRGAN と GraphGAN を読んできて一点分からないことがある.
Generator は「真にありそうなもの」を提示し, Discriminator はそれを reject しなければならない.もし Generator が「学習データにおいて relevant がある / edge がある」ものを引き当てた場合, Discriminator はそれに対して低いスコアをつけなければならない.
論文中でも「 Generator が真に学習できていたらそれは p_{\textrm{true}} と区別がつかない」と書かれていてそれが理想なのだろうけど,しかし矛盾する事例を引き当てた場合は無視するのだろうか,もしくはそもそも引き当てることが少ないという前提なのだろうか,いう点が引っかかっていた.

CFGAN: A Generic Collaborative Filtering Framework based on Generative Adversarial Networks (CIKM 2018)

CFGAN: A Generic Collaborative Filtering Framework based on Generative Adversarial Networks

モチベーション

IRGAN と GraphGAN によって GAN による推薦が可能になったとはいえ,これらの手法は「要素を 1 つ離散的にサンプリングしてそれの真偽を問う」という手続きを取っているために問題がある.
なぜなら,真の要素を Generator がサンプリングしてしまった時, Discriminator は矛盾するラベル(同じ要素が true でもあり false でもある)を受け取って学習するために混乱してしまうからだ(思い浮かんだ疑問点で回収されて少しうれしい).
実際にこれがどの程度起こっているか実験で確かめる.両モデルで推薦タスクを解いてみると epoch を増やすにつれ Generator と Discriminator の精度は上がるが,ある一定の epoch を超えると突如として Discriminator の精度が異常に悪化し始めることがわかる.同時に, Generator が真のデータをサンプリングしてしまう確率が非常に高くなっていることがわかる.これはすなわち

  • 学習が進むことで Generator が賢くなって真の分布に近づく
  • それによって矛盾したデータを Discriminator が受け取る
  • Discriminator が混乱して精度が下がる
  • Generator に Discriminator からの信号が伝播しなくなり学習が止まる

という状態に陥っていることがわかる.

CFGAN

著者ら曰く, IRGAN/GraphGAN の問題点は Generator が離散的にサンプリングを行うことであるらしい.
そこで CFGAN では

  • Generator はユーザ u ごとに
    • u状態ベクトル \mathbf{c}_u とランダムノイズ \mathbf{z}^2 を入力として,商品数 n の次元を持つ購買ベクトル \hat{\mathbf{r}}_u を生成する
    • その後 u が購買していた商品 i の要素 e_{ui}=1 となるマスクベクトル \mathbf{e}_u と要素積を取る
      • これは既存の購買予測における「購買していた(学習対象の)要素に絞る」という観点と一致する
  • Discriminator は購買ベクトルが真であるか偽であるかを推定する
    • この時,入力には真の購買ベクトル(購買履歴) \mathbf{r}_u または Generator が生成した購買ベクトルをマスクしたもの \hat{\mathbf{r}}_u \odot \mathbf{e}_u とユーザの状態ベクトル \mathbf{c}_u とを連結したものを与える
    • Generator / Discriminator ともに適当なニューラルネットワークで学習する

として Generator を連続的にサンプリングする.
しかし, \mathbf{e}_u でマスクを取るならば全てについて \hat{\mathbf{r}}_{ui} = 1 となるような購買ベクトルを学習するのがもっとも単純な解であるが,それでは商品間の好みの関係が全く学習されない.
そこで,一部の購買していない商品をサンプリングし,それぞれ j について

  • zero-reconstruction regularization : \hat{\mathbf{x}}_u=\textrm{concat}(\hat{\mathbf{r}}_u \odot \mathbf{e}_u, \mathbf{c}_u) として \hat{\mathbf{x}}_{uj} を 0 に近づける項を目的関数に追加して学習させる
  • partial-masking : \mathbf{e}_u でマスクする時に \mathbf{e}_{uj}=1 として購買していない商品についても Discriminator に値を渡すことで学習させる

のという両方の工夫を行う.

実験

実験でSOTAという触れ込みで流れてきたけどこういう比較で SOTA を名乗っていいのかと思うような実験だった.そもそも movielens での現状の SOTA を並べて比較しているサイトがなかったり,皆がそれぞれの基準でデータのフィルタリングを行っているのでまともに比較ができないと思うのですが,140文字未満の論文ツイートだけ読んで論文を理解する人々に言ったところでどうしようもない話だった.
当初の疑問だった「矛盾したラベルはどうなのか」とう話は, CFGAN でも発生はしているがそれでも Discriminator はしっかり見分けていて学習がしっかり見分けている.これはベクトルをサンプリングしているからである(と著者は主張している).多分ですが目的関数を計算する時に矛盾する一点のみではなく矛盾するベクトルかどうかで取り扱っているので後者の方が緩いから,とかそういうことだと思う.