mits58のメモ

メモ 参考にしないでください

LDAを使った特徴量ベクトル生成

先輩の修論を覗き見た( :hanzai: :shushi: :yuushou: )

 

研究背景

  • グラフを入力、その活性を予測する教師あり学習をしたい
  • 化合物に対してある特徴量ベクトルを計算して、それを用いて教師あり学習してる
  • この作り方として部分グラフの有無を管理するビット列のベクトルを使ってる事が多いよ
  • 問題点として、全部の部分グラフを考えると組み合わせ爆発を起こしちゃうし、特徴ベクトルの次元が大きくても学習に時間かかるのでつらいなぁ
  • 部分グラフを取り出す範囲をr-近傍のみに着目して取り出してるとかやるけど、冗長な情報だったりスパースな特徴ベクトルになりがち

 

研究目的

  • まずビットの衝突と精度の関係について調べた
  • 部分グラフの有無の特徴ベクトルを作成するときに、ハッシュ取ってるけど、そこをLDA使った方法にして、情報を残しつつうまく次元数を削減してみたよ

用語

  • 頂点vr-近傍 : vからパス長rで到達可能な全ての頂点集合からなる誘導部分グラフ
  • FingerPrint : 分子構造のグラフからなんらかの部分構造特徴の有無を計算して特徴ベクトルを表現したもの
  • Path-Based Finger Print : 与えられた分子グラフに対して、ある決まった長さまでの含まれるパスを全列挙して、得られたパスをハッシュして固定長の特徴ベクトルとしたもの
  • ECFP(Extended Connectivity Finger Print)
    ・化合物に含まれるそれぞれの原子について整数の識別子を与え、各構成原子について0近傍、1近傍、2近傍……の近傍グラフを順に取り出す。
    ・全ての部分グラフをMorgan法により、立体構造も考慮した一意の整数に変換
    ・得られた整数を特徴ベクトルの次元数dで剰余を取り、得られた値をjとして、x_{ij}を1とする(化合物ij番目の特徴量)
    ・RDKitで求めるFingerPrintはこれと類似
  • トピックモデル : 文書中の単語は文書のトピックに基づき出現していると仮定して、文書に出現する単語の頻度から文書を生成するモデル(LSA, LDAなどがある)
  • LDA : Bag of Wordsという単語と出現回数のペアの集合を文書と考える
    ・各文書には複数のトピックがあって、それぞれのトピックごとに異なる単語の出現確率があるとする
    ・それぞれを確率分布として、1単語ごとに、トピックを選んで、そのトピックから単語を生成するってのを繰り返していけばよい(ディリクレ分布が用いられるけど、単語やトピックは離散値なので多項分布でよしなにやる)
    ・学習方法として → 変分ベイズ法、周辺化ギブスサンプリングなど
  • 崩壊型ギブスサンプリング : トピック分布と単語分布を積分消去してよしなにやるやつ 変分ベイズ法と比較し実装が容易で計算速度が速い
  • sLDA : 教師ありのトピックモデル、LDAと生成モデルは同じ

 提案手法

  • 低分子化合物の特徴ベクトル : 離散値、高次元でスパース性あり
    自然言語処理で扱うデータの特徴と類似しているので応用できるのでは
  • 分子グラフを1文書とし、その分子グラフに対する各部分グラフを1単語として捉える
  • 部分グラフとその出現回数を集合とするBag of Subgraphを導入して、確率的トピック分布を作成して、それを特徴ベクトルとする
  • RDKitのFingerPrintで出てくる部分グラフIDと出現回数をBag of Subgraphとして使用して、各分子グラフに対するトピック分布θを特徴ベクトルとするベクトル長は事前に設定したKで、各ビットの値は実数値

 

どうやって比較してる? : 普通のFingerPrintをつかうやつ あとLDAsLDAを比較させてる

 

実験で使ったデータセット : PubChemのDatabaseから以下を使用

  • NCI : がん細胞に化合物を投与、何割の細胞が死ぬかという実験から得られたデータセット(データ数多・分子グラフ大)、負例が多い
  • Mutag・CPDB : 化合物が突然変異誘発性を持つかという実験により得られたデータセット(データ少)

 

LDAを使って特徴ベクトルを生成させた後突っ込む学習モデル

  • Random Forest : 決定木ベースなので離散値と相性が良い
  • SVM(rbfカーネル) : 2クラス分類問題を解く際の代表的手法である 実数値と相性がよい

 

Comment

  • LDAを使うって発想は自然だしいいと思うんだけどなんで精度出てないんだろう(チューニング足りてない?)
  • ただチューニングで大きく差が開くとは思わんしやっぱりダメなんかなぁ……

Less is More: Compact Matrix Decomposition for Large Sparse Graphs

□Five Cs

  • Category? : グラフデータマイニングとか(隣接行列を行列分解することで特徴・異常を検出)
  • Context? : SVD/PCA、CURなどの行列分解方法とか、この方法自体はCURを改良したって感じ?
  • Correctness: 論理の流れは妥当
  • Contributions: CURと同精度で、1/10程度メモリを削減できるCMDと呼ばれる方法を提案し、その、理論的解析や、静的グラフマイニングや動的グラフマイニングへの応用を提案した
  • Clarity: 論文自体は読みやすいような(dramaticallyとか、つょぃ……言葉がよく出てきてるなという感じはしたけど)

隣接行列からGraphのパターンや異常を検出するって方法の1つっぽい
もう少しうまく使えれば面白そう(クラスタリングでグラフラプラシアンとか出てきてるからその辺と関連付けるとか?

第2フェーズはそのうち読む(投げやり)

How to Read a Paper

読んだ(http://blizzard.cs.uwaterloo.ca/keshav/home/Papers/data/07/paper-reading.pdf)
タイトル : How to Read a Paper
著者 : S. Keshav, David R. (Cheriton School of Computer Science, University of Waterloo)

これなに?

  • 実用的で効率的な論文の読み方である"Three-Pass"って方法の紹介
  • "Three-Pass"を文献調査へ応用する方法の紹介

この"Three-Pass"って方法のよいところ

  1. 論文の概観がつかみやすい(大意を掴む前に細部にハマることがない)
  2. 論文の読む時間が大体わかる
  3. 時間やニーズにあわせて理解度を調節できる

"Three-Pass"ってなんぞや?
→論文を読む工程を3段階に分解

  1. その論文に書かれてる一般的なアイデアを得る
  2. 論文の内容を掴む(証明などを省いて)
  3. 前段階より深く論文を理解する(頭の中で論文を再構築できるくらいに)

 

まず1段階目の概要理解フェーズ

  1. タイトル + アブスト + イントロ をじっくり読む
  2. 節と小節の見出しを読む
  3. 論文の数学的内容を見て、基礎的理論を把握
  4. conclusionを読む
  5. リファレンス読んで、一度読んだ論文をチェック

これが終わった後以下の質問(Five Cs)に答えられないといけない

  1. Category: この論文はどんな分野の論文? 何かの評価?既存のシステムの解析?研究のプロトタイプの解説?
  2. Context: 他の関連する論文は? どの基礎理論が用いられている?
  3. Correctness: 論文における考察・論理は妥当?
  4. Contributions: 主な貢献は何?
  5. Clarity: 論文はうまく書かれている?読みやすい?
  • この情報を使って、次の手順に行くかどうか、この論文が必要かどうかを決める
  • 大体かかる時間は5分から10分くらい
  • 逆に、ここで読みにくい・わかりにくい論文はバッサバッサ切られていくと思え(論文を書くときの参考として)

 

2段階目のじっくり読むフェーズ

とりあえず証明みたいな詳細を除いてちゃんと論文を読んでいく
以下のポイントに注意

  1. キーポイントやコメントを余白にメモする ex)わからない言葉・質問したいこと
  2. 図やイラストを注意深く見る
  3. 特にグラフはめっちゃみる(軸ラベル・データから導き出される結果と結論が統計的に妥当?
  4. 未読の関連文献にマークを付ける
  • 熟練の研究者でもこの手順は1時間以上かかる
  • この手順を終えた後、論文の内容を把握できて、その要旨を根拠とともにまとめられて人に伝えることが出来るレベルにならないとダメ(所謂ちょうどいいレベル)

これを経てもわからないときは?

原因は?

  • テーマが自分に取って新しい
  • よく知らない専門用語や略語が多い
  • 知らない実験技術とか根拠がある
  • 証明されていない主張とかがあって論文自体がダメ
  • 疲れた状態で読んでる

対策として

  • 論文を閉じてさよなら(今後の人生でいらないと考える)
  • 背景についていろいろ調べて再度読む
  • 次のステップに行く

 

3段階目(再構築フェーズ)

  • 論文を脳内で再構築していくフェーズ
  • 再構築したものと実際の論文を比較することで以下の点に気づけて自分の物にできたりするっていう利点がある
  1. 論文の新規性
  2. 論文に隠された誤りや考察
  3. 論文における証明技法・表現技法
  • このフェーズで将来の研究へのアイデアを書き留めたほうがよい
  • 熟練の研究者でも1〜2時間以上はかかるフェーズ
  • この手順を終えた後は以下のことができる(らしい)
  1. 短所と長所がわかる
  2. 記憶から論文の全体構造を再構築できる
  3. 隠れた仮定や紐付けられていない関連研究がわかる
  4. 実験的・解析的な技法の潜在的問題点を指摘できる

 

文献調査への応用
(第1段階) : その分野での研究の感覚をつかむ

  1. Google ScholarとかCiteSeerで、調べたい分野でめちゃくちゃ引用されている3〜5つの論文を見つける
  2. その論文に概要理解フェーズを適用、研究の感覚を掴む
  3. 関連研究の欄からサーベイ論文だったり、その分野の研究のまとめっぽい論文を探して読んでいく

(第2段階) 有名な論文・著者、トップカンファレンスを見つける

  1. よく文献で出てくる論文・著者名を見つける
    (これがこの分野における有名な論文や研究者)
  2. 見つけた有名な研究者のサイトへ行き、最近どこで発表しているかを確認
    (これがこの分野におけるトップカンファレンス)

(第3段階) トップカンファレンスの最新の論文と最初の論文を合わせる

  1. トップカンファレンスの最新の論文を調査
  2. 第1段階で見つけた論文、第2段階で見つけた著名な論文、トップカンファレンスの論文を合わせて最初のサーベイとして、これらの論文に対し、「概要理解フェーズ」、「じっくり読むフェーズ」を適用

 

 

  • 概要理解→じっくり読み→脳内再構築の3段階ってのは頭に入れないとなぁ
  • 論文の読み方がなんとなくわかった(気になっただけかもしれないけど)
  • surveyの方法がわかれば読むだけだもんなぁ、これに従って
  • ただこれは情報系に対応して書いたってわけじゃないからところどころ直さないと行けないと思うけど

More than machines - Nature Machine Intelligence Vol.1 Issue 1

 今月から出るジャーナルのEditorialを読んだ。
このジャーナルはだいたい下の3つのテーマについて書かれてるっぽい。
  1. Machine Intelligenceを構築するためのハードウェアやアルゴリズムの研究開発
  2. 他分野へのDeep LearningシステムのようなMachine Intelligenceの応用
  3. 社会・産業・科学におけるMachine Intelligenceの影響の研究
 以下感想
  • 大規模なデータを、収集・共有・保存できるようになったのがデカイなぁ
  • それを計算能力が高いコンピュータでババッと処理できるようになったのがBreakthroughの要因だよね
  • Deepは"狭い"けど、その狭さってのは急激な進歩につながってるってのはわかる
    だって、人間より正確に人間っぽいことできるのは強いよなぁ
  • だけど、社会的な影響の危険性とか倫理的な懸念とかも触れないとアカンよね
他にも記事があったので卒論の合間にかいつまんで読みます
 
 

あけましておめでとうございます

今年もよろしくおねがいします。
2019年は色々がんばります(海外に行きたいです)
まあ……難しいですね。

 

前見つけたサイト

Data Structure Visualization

データ構造とアルゴリズムの可視化してる
めちゃくちゃおもろいやん……
Treeの辺りは参考になる(Skew Treeとか実装楽やん)

 

Gentoo

つかおうかなぁ Macデュアルブートしようかなぁとか思ってます