糞糞糞ネット弁慶

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

声優統計コーパスを歌にした PJS: Phoneme-balanced Japanese Singing-voice corpus が公開されました

PJS: Phoneme-balanced Japanese Singing-voice corpus

[2006.02959] PJS: phoneme-balanced Japanese singing voice corpus

Junya Koguchi さんと東大高道慎之介助教によって作成された,音素バランスを考慮した日本語歌声コーパスが公開されました.

このコーパスには声優統計コーパスの音素バランス文を歌詞としてメロディが付与された歌が含まれています.arXiv 原稿の

A native Japanese male in his twenties composed all the songs. He is not a professional composer but has work experience using his singing, composing, and recording skills.

という記述が良い.

握手会が延期になったので「効果検証入門」を読んで Python で (ほぼ) 実装した

ゴールデンウィークの握手会が延期になり気力が完全に尽きてしまい(そもそも2020年のほとんどのイベントが延期または中止になっているわけですが),同じく握手会が延期になった友人と「アイドルとシロクマのことを考えないでください状態になっていてつらい」「何か没頭できる事は無いの」という話になった結果,「効果検証入門」を読んだ.

「どうせ読むのならば短期集中で」ということで,一日目午後に1章と2章,二日目午前に3章,午後に4章,三日目午前に5章のペースで Zoom で交互に節単位を音読しながら進めた.2020年,30歳を過ぎて音読.

感想

数学力が低い自分でわかった気分になれる,非常に参考になった.明日からでも試したい.随所に「実際のビジネスの現場ではこんな滅茶苦茶なことが行われている」という記述が出てくるので考えさせられてしまう.「正しい効果を知るインセンティブとは何か?」に最後の章で触れていたのも良かった.耳が痛い.

脱落変数バイアスの概念はとても面白かったし,Difference-in-Differences はシンプルながら (その分平行トレンド仮定が強力ですが) 試したいと思えた.反対に causalimpact についてはそこまでモチベーションが湧かなかった.十分に学習された予測器にもとづいて何かをする,というのがどうにも受け入れにくい.回帰不連続デザインは話としては面白そうに見えたものの,「単に回帰をする」という話になっていて肩透かしを感じた.

そもそもが本書で紹介されているテクニックはどれも比較的シンプルでありながら多くの仮定のもとに成り立っており, AUC や Prec/Recall のようになんらかの定量的な「確からしさ」が出るわけでなく,セレクションバイアスは正負どちらにも発生するため,非常に扱いが難しいように思う.「今回の施策による効果量は『〜〜〜』という仮定が成立すると考えて計算していますが,『〜〜〜』というバイアスが排除しきれていない事は念頭に置かねばなりません.ですが,何も考えずに推定するよりは確からしいと考えられます」といったように,多くの留保にもとづいて説明するのが因果推論を用いた分析において取るべき態度なのでしょう.

いくつかのトピック,たとえば Conditional Independence Assumption や Post treatment bias や Bayesian Structual Time Series Model や合成コントロールについてはより詳しく知りたくなりました.また,因果ダイヤグラムやバックドア基準という単語も本文には登場しなかったので次はそのあたりを知っていきたい.

次は星野崇宏「調査観察データの統計科学」Pearl「入門 統計的因果推論」岩波データサイエンス Vol.3宮川雅巳「統計的因果推論」を読むべきなのでしょうが全部会社に置いたままです.

Python による実装

ybenjo/cibook_by_python にアップロードしました.注意点を書きます.

  • タイトルに「ほぼ」と入れたのは以下の実装を行っていないため
    • 各種図表の描画
    • 4章の causalimpact を用いた実験
    • 5章の Nonparametric RDD の実験
  • セレクションバイアスを発生させたメールデータの値が本文と一致せず,かつ,乱数の seed によっては本来の値とは逆のセレクションバイアスが発生してしまう
  • RData の読み込みは ofajardo/pyreadr が良かった
  • 3.4.4 の傾向スコアの推定において本文では re74re75 の二乗を共変量に追加しているが,実験したところ傾向スコアが著しく悪化したために除外した
  • 傾向スコアマッチングは greedy にやってしまった
  • pandas の使い方が全く分からなくて途中で挫折した. groupby() して sum() した結果の加工が本当に分かっていない
  • R と違って欠損のある行を明示的に除外している

誤植・不明点

他の人も指摘しているかも知れないけれどネタバレが怖くて他人のエントリを読んでいない.自分の勘違いも多く含んでいると思う.

  • 著者の実装は R を用いているわけですが,目的変数または説明変数に NA を含んだ場合,その行を除外して推定を行うのがデフォルトの挙動だと思うが,欠損値のある行を消してしまうのは新たなバイアスを産むのではないか
  • p31 recencyが3より小さい場合6より小さい場合 の誤り
  • p55 \beta_1 - \alpha_1 = \gamma_1 \beta_1\alpha_1 - \beta_1 = \gamma_1 \beta_1 の誤り
    • 関連して p57 の \beta_1 - \alpha_1 はすべて \alpha_1 - \beta_1
  • p87 相関が強いと分子は0に近づき相関が強いと分母は0に近づき の誤り
  • p108 共変量のバランス における 平均の差をその標準偏差で割ったその がよくわからない.検索したところこの値は Cohen の d と呼ばれているらしい
    • 自分の実装では一部の共変量がバランスしないままだった.そういうこともあると思いたい
  • p141 よって,この分析の結果による効果量はそれらの差分をとって-1,554若しくは-43%ということになり は何に対して -43% なのか,分母は何なのかが明示されていないために分からない
  • p142 1853年の〜 という記述は全て 1854年
  • p151 Cigar データセットの導入が面倒だったので github の著者レポジトリで配布して欲しいと思いましたがライセンスが GPL2 だから無理なのでしょうか
    • なぜか自分が構築したさまざまな R の環境では Ecdat パッケージのインストールに失敗し続けた
    • 最終的に RStudio Cloud 上でデータを抽出
  • p156 著者実装 ch4_did.Rcausalimpactselectdplyr::名前空間を指定しないとエラーが出る
  • p176 nonparametric RDD の説明がされておらず,このモデルは一体何を行っているのかが全くわからない
  • p180 5.4.1
    • 二つの施策を行う状況はそもそも RDD と関係無いのでは
    • では施策以外で非連続になる状況は何か

声優統計コーパスのバランス文を修正しました & 引用されている論文を列挙しました

音素バランス文の読みの修正

対応が遅れてしまい申し訳ありません.

GitHub の Issue でも指摘されていた (#6および#7) バランス文の読みを修正しました.該当箇所は 020,043,057,076,079,087 の読みと対応する音素です.変更差分はこの commit を参考にしてください.

声優統計コーパスを引用している論文の列挙

また,声優統計コーパスを利用してる論文を検索して列挙しました.名の知れた会議の原稿に y_benjo and MagnesiumRibbon と書かれているのを読むのは気分が良いものです.

高道さん以外の研究室でも使われているのを見かけて驚きました.

引用先を arXiv にしたい

しかし今更になって思うのですが引用先をホームページにするのではなく arXiv などの原稿にしておけば引用件数が Google に拾ってもらえたのではないでしょうか(検索結果に 被引用数 が表示されて欲しい).今からでも間に合うのでしょうか.誰か arXiv への投稿を承認してくれる人を探さなければならない.この日記を読んでいる承認可能で「承認してもいい」という奇特な方はご連絡ください.

ここまで書いたところで「そもそも arXiv は実名で無い名前で原稿を投稿できるのだろうか」と思い調べたところ

It is a violation of our policies to misrepresent your identity or organizational affiliation. 
Claimed affiliation should be current in the conventional sense: e.g., physical presence, funding, e-mail address, etc. 
Misrepresentation of identity or affiliation, for any reason, is possible grounds for immediate and permanent suspension.

とあるので y_benjo and MagnesiumRibbon 名義で原稿を投稿するのは無理ということが分かりました.誰か回避策をください.

Google Dataset Search への対応

これは些細なことですが, GoogleDataset Search に反映されるように schema を書きました.早くクローラに検出されたい.

Synthesizing Tabular Data using Generative Adversarial Networks (preprint) 読んだ

[1811.11264] Synthesizing Tabular Data using Generative Adversarial Networks]

GAN を使って表形式のデータを生成する論文は既に読んだわけですが,その発展形. 著者らによる実装も公開されており(DAI-Lab/TGAN: Generative adversarial training for synthesizing tabular data),実装を試した人もいる(テーブルデータ向けのGAN(TGAN)で、titanicのデータを増やす - u++の備忘録).

前述した tableGAN との違いは CNN を用いずに LSTM を用いていること,交差エントロピーを用いるのではなく KL divergence を使って周辺分布を学習していることの二点.

データ変換

データが n_{c} 個の連続値の変数 c_{i}n_{d} 個の離散値の変数 d_{i} で構成されているとし,各行の各列についてそれぞれが連続値の変数なのか,離散値の変数なのかを区別して話を進める.

連続値の変数について

多くの場合連続値の変数は多峰 (multimodal) である.なのでそのまま表現せず,次のような手続きを踏む.

  • (-1, 1) に変換する
  • それぞれの変数について混合数 m のGMM (Gaussian Mixture Model) を学習し,平均 \tau_{i}^{(1)},\tau_{i}^{(2)},\cdots,\tau_{i}^{(m)} および標準偏差 \sigma_{i}^{(1)},\sigma_{i}^{(2)},\cdots,\sigma_{i}^{(m)} を得る
  • i 番目の変数の j 列目の値 c_{i, j} が GMM の各要素から得られる確率 u_{i, j}^{(1)},\cdots,u_{i, j}^{(m)} を得る
  • c_{i, j}v_{i, j} = (c_{i, j} - \tau_{i}^{k}) / 2\sigma_{i}^(k) とする.この時 k=\textrm{argmax}_{k} u_{i, j}^{k} である.その後 v_{i, j}[-0.99, 0.99] に clip する

一言で言えば連続値の変数を m 個の正規分布クラスタリングし,一番当てはまりが良い分布に関する情報を持つ.論文では m=5 とし,もし単峰の変数だったとしても m-1 個の正規分布に対する重みがゼロになるから構わないとしている.この手続きの結果,連続値の変数 c_{i, j}u_{i, j}^{(1)},\cdots,u_{i, j}^{(m)}v_{i, j}m+1 次元で表現する.

離散値の変数について

  • i 列目の離散値の全要素を D_{i} として離散値 d_{i, j} を one-hot encoding して \mathbf{b}_{i, j} とする
  • \mathbf{b}_{i, j} の各次元 \mathbf{b}_{i, j}^{(k)}\textrm{Uniform}(0, 0.2) なノイズを加える
  • \mathbf{b}_{i, j} を確率に正規化する

これら二種類の処理により, n_{c} + n_{d} 次元のデータは n_{c}(m + 1) + \sum_{i=1}^{n_{d}} |D_{i}| 次元に変換される.

また,これから説明する GAN は上記の v_{1:n_{c},j},\, u_{1:n_{c},j}^{1:m},\, \mathbf{d}_{1:n_{d},j} を生成するわけですが,本来の値に戻すには次のように変換すればいい.

  • 連続値 c_{i, j} = 2v_{i, j}\sigma_{i}^{(k)} + \tau_{i}^{(k)},\ k = \textrm{argmax}_{k} u_{i, j}^(k)
  • 離散値 d_{i, j} = \textrm{argmax}_{k} \mathbf{d}_{i, j}^{(k)}

生成

Generator には LSTM を使う.LSTM を使う理由は we use LSTM with attention in order to generate data column by column. としか書かれていないが,気持ちを汲み取ると各変数間の相関などを陽に考慮したいからだと思う. LSTM の出力を h_{t} として hidden vector f_{t}=\textrm{tanh}(W_{h}h_{t}) を求め,更に \textrm{tanh}(W_{t}f_{t}) として各変数を出力する.その後,t+1 ステップの LSTM に f_{t} を渡す.連続値の場合は v_{i} を得,次に u_{i} を得る.また,離散値の場合は t+1 ステップにはそのまま渡さずに f_{t}' = E_{i}[\textrm{argmax}_{k} \textrm{d}_i ] として渡す(E_{i}|D_{i}| \times n_f 次元の embedding).

Discriminator には mini-batch discrimination vector 入りの MLP を用いる(Generator が LSTM なのだから Discriminator も LSTM で良かったのではないか).

通常の GAN の損失関数に加え, Generator 側の損失関数について連続値変数 u に関する KL divergence \sum_{i=1}^{n_c} \textrm{KL}(u_i', u_i) と離散値の変数そのものの KL divergence \sum_{i=1}^{n_d}\textrm{KL}(\mathbf{d}_i', \mathbf{d}_i) を追加することで学習が安定するらしい.

実験

評価は三種類.

  • 学習を生成したデータ,予測対象を元データとした時にどの程度精度を保つことができるかの Machine learning efficacy
    • 前回の論文で model compatibility と呼んでいたもの
  • 「変数間の相関が保存されているか」の検証として,連続変数を離散化して変数間の normalized mutual information を計算し描画
  • 「真のデータにどれほど近いか」の検証として,学習データとテストデータまたは生成データ全対の距離のヒストグラムを描画

Data Synthesis based on Generative Adversarial Networks (VLDB 2018) 読んだ

[1806.03384] Data Synthesis based on Generative Adversarial Networks

匿名化については micro aggregation (各行を集約することで架空の行を生成すること) や post-randomization (ノイズを載せる) などがあるわけですが, GAN でデータを生成すれば完全な匿名化 (Generator があまりに賢くなりすぎて元データと全く同じものを生成しない限り) が実現できる,というアイデアにもとづく論文.

匿名化および GAN による生成の対象は Kaggler では「テーブルデータ」と呼ばれる 1 行 1 データ.つまりネットワークは表形式のデータの各行を生成する.同様の GAN には後発の TGAN ([1811.11264] Synthesizing Tabular Data using Generative Adversarial Networks) が存在し,実装も公開されている.後者では LSTM を用いたより複雑なネットワークを提案しているが,特に匿名化については言及していない.

実験結果について理解できない記述が多い.査読者はちゃんと読んだのか疑問に思う.もしくは匿名化に関して知見や興味のある査読者がいなかったのではないかと思う.

  • 以下の問題意識が念頭にある
    • 生成したデータにおいて平均や分散といった統計量を保存したい
    • 変数間の整合性を保ちたい.たとえば身長 170cm なのに体重 30kg のデータが生成されると困る (十分に Generator が賢ければ避けられるのではないか)
    • membership attack に備えたい (とはいえモデル中で陽に備えるわけではない)
  • 生成対象の各行は 0 埋めした状態で正方形に形を変え,画像として扱う.いってしまえば MNIST の学習のような問題に落とす
  • 提案手法である table-GAN を次の 3 モジュールで構築する
    • Discriminator D : データの真偽を判定する
    • Generator G : 偽のデータを生成する
    • Classifier C : データの一部を label として (たとえば年収が平均値以上か否かの二値変数),真のデータで学習して偽のデータを判定させる.これによって変数間の整合性が保たれる (と著者らは主張しているが, classifier は xy の整合性を考慮するのであって x_ix_j の整合性が保たれるわけではないのでは?)
  • 損失関数を次の 3 項で構成する
    • original loss : 本来の GAN の損失関数である D と G の間で発生する損失
    • information loss : Discriminator D に真偽それぞれのデータを通して得られる最終層の dense vector の平均および分散の L2 norm.ここが一致していると平均および分散が保存されている (らしい.特定の minibatch における平均と分散を保存するのは難しいように思える).ここで hinge loss を導入して生成されるデータの品質 (どの程度真のデータに近づけるか,あるいはプライバシーを保護するか) をコントロールする
    • classification loss : Classifier C の損失
  • GAN に対する membership attack について考える.攻撃者が Generator G にのみアクセスできる状況において,当該 GAN を学習したデータに特定のデータが含まれているか否かの推定を以下の手続きで行う
    • G から大量のデータを生成する
    • その一部を使って複数の GAN を学習する
    • それぞれの GAN の Discriminator D に対して
      • 学習に使った生成データ x を通して D(x), in というデータを得る
      • 学習に使ってない生成データ x を通して D(x), out というデータを得る
        • 論文ではこの負例側を元の GAN の学習に使っていないデータを用いており (In our case, we use the test set prepared for the model compatibility test.) ,実際の検証としては不適切である (攻撃者が元の GAN の学習データを知っているという状況がおかしい).
    • 上記データを全て結合して in/out を学習することで membership attack を実現する
      • GAN の GAN の精度はどのようなものでしょうか
  • いくつかの方法で検証を行う
    • 実データと生成データの累積分布を見る
    • 実データと生成データそれぞれで構築した学習器での回帰および分類の精度を検証する (model compatibility の検証).これは「もし生成したデータが十分リアルならば,生成データで学習したモデルで元データの予測もうまくいくはず」という過程にもとづいている
      • 上記 2 項目については散布図を示すのみであり,「見ればわかるだろう」と言わんばかりに定量的にどの程度優れているか全く言及していない.確かに見ればわかりますがこんな雰囲気だけの結果でいいのか.
    • 元のデータに対してある匿名化されたレコード r とのユークリッド距離が最も近いレコードを検索し,その時のユークリッド距離 を DCR (distance to the closest record) と呼ぶ.DCR = 0.0 の場合元レコードと完全に一致しているので leak である,としている (この leak の定義がまず受け入れがたい.Quasi Identifier がわからなければそれ以外の値がどうなろうとどうでもいい話ではないか).各種匿名化手法について複数のレコードについて DCR を計算し,その平均と標準偏差を確認する
      • 反対に言えば, DCR が小さければ小さいほど真のデータに近いことを意味している?
      • と思ったが It is preferred that the average distance is large and the standard devision is small と書かれており,標準偏差が小さい方が嬉しいことはわかる (むらなく一定の品質で匿名化できていることを意味する) が平均距離が大きいほうが良い理由がわからない.DCR はデータの確からしさとプライバシー保護とのトレードオフなので一概に preferred とは言えないのではないか?
      • Table 5 を見る限り low-privacy な table-GAN が high-privay な table-GAN より DCR の平均値が小さい.それはそう
    • そもそもベースラインに設定している匿名化ツール ARX に関する記述が理解できないし,ベースラインとしてアンフェアな使い方をしているのではないか
      • 「ARX は micro aggregation するが sensitive attribute を変化させない.よって sensitive attribute に絞って最近傍探索を行うと DCR の平均と分散が 0 になる」と言及されている (そもそもの話として各データは職業や年齢,郵便番号といったそれらの列の値の組合せによって個人を特定しうる Quasi Identifier と,給料や疾病の状態 (十分 Quasi Identifier ではないか?) といったそれ以外の情報の列である sensitive attribute のふたつから構成されている).
      • しかし,ツールの理念として Quasi Identifier のみを匿名化するのならば sensitive attribute がいくら leak しても困らないはずであるし (そもそもそれを leak と呼ぶのか?),その時に DCR が完全に一致することは統計量が保存されているわけであり非常に望ましい性質ではないか
      • もし sensitive attribute が真に sensitive であり, leak して困るのならば sensitive attribute も含めた全ての列を Quasi Identifier とみなして k-anonymity を満たすように aggregate すべきではないか

プロ話者 (声優・俳優など) 100 名から得られたコーパスである JVS (Japanese versatile speech) corpus が東大の高道助教によって公開されました

Shinnosuke Takamichi (高道 慎之介) - jvs_corpus

このブログを読んでいる人間は全員知っているとは思いますが,東京大学の高道助教によって JVS (Japanese versatile speech) corpus が公開されました.

JVS corpus は 100名のプロ話者から得られた様々な音声が含まれていますが,特に "parallel100" ... 話者間で共通する読み上げ音声 100 発話声優統計コーパスバランス文を読み上げたものです.ありがとうございます.多種多様な「遺灰のほとんどは、スウェーデン西海岸の、ブーヒュースレーン地方の小島にある漁村、フヤルバッカ周辺の海に、散骨された。」を聞くことができて幸せです.

こんなことになるなら声優統計コーパスの原稿を無理やりにでも英語にして arXiv にアップロードすべきだった.今からでも間に合うかもしれない.これまで仕事で書いてきたスクリプトや作った予測モデルよりこの音素バランス文の方が数倍社会に貢献しているのではないかと思います.

Comprehensive Audience Expansion based on End-to-End Neural Prediction (SIGIR eCOM 2019) 読んだ

Comprehensive Audience Expansion based on End-to-End Neural Prediction (pdf)

もうひとつオーディエンス拡張の論文.特にモデルが目新しいわけでもなく,実験もよくわからない (Table 3 は何を行っているのか意味不明) だけど気になったところを書く.

オーディエンス拡張は広告を配信したい人から「この人たちに類似したユーザに広告を配信したい」という seed となるユーザ S を受け取り,全ユーザ U の中から S に類似したユーザを探す作業である.Finding Users Who Act Alike (KDD 2019)では教師なしの手法で取り組んだわけですがこの論文では seed を正例,U - S からランダムにサンプリングしたものを負例として教師あり学習で解くアプローチにもとづいている.

  • 負例をどの程度サンプリングすべきか
    • 詳細が不明な実験の結果 (Table 3 がどのように得られたのかの説明が全く無いのですごい),負例は正例の2倍程度が良い,と述べている
  • PU-Learning の枠組みとして捉えられるのではないか
    • Positive (seed) と Unlabeled (U - S) として考えることで,ランダムなサンプリングよりもかしこく負例を得る
    • 論文中で実験を行っているのは次の 3 手法
    • 実験の結果, Spy sampling が良いと述べているが Table 4 の要素がどういう理由で bold で記載されているのかが全く説明が無いのですごい
  • section 4 の実験は特に sampling strategy とは関係がない