いっしきまさひこBLOG

AI・機械学習関連、Web制作関連、プログラミング関連、旅行記録などなど。一色政彦。

PyData.tokyo One-day Conference 2018 聴講ノート

※これはセミナー聴講時の個人的なノートをそのまま公開したものです。誤字誤植や勘違いがある可能性があるのでご了承ください。

PyData.tokyo One-day Conference 2018 - connpass

Session1 データ分析のための Python パフォーマンスチューニングテクニック

NumPyを中心としたエコシステム

  • Pythonの標準ライブラリとして開発
  • 最初から公式と認識され、コミュニティが成長

NumPy言語仕様の発展の歴史

  • L[i , j, k]のような書き方はPyhton 1.4から。NumPy用に提案された
  • L[1:2, ..., 2:3]...(ellipsis)も同じバージョンから。NumPy用
  • matmul(A, B) -> A @ Bという書き方もPython 3.5から
  • C言語を使った拡張も作りやすい

Pythonの並列化

  • マルチスレッド、マルチプロセス、で速くなると期待し過ぎない方がいい
  • 計算量の削減やデータ量の削減が速度向上の基本
  • データ処理であればマルチスレッドが楽。マルチプロセスは複雑なので
  • GIL(Global Interpreter Lock):Pythonインタプリタは複数のスレッドで同時に実行できない。実行権をもつのは1つだけという仕組み。つまりマルチスレッドにしても性能は向上しない
  • GILが必要なところ(Pythonの部分)とそうでないところ(コンソール出力するところなど)がある

NumPyの並列化

  • NumPyはGILを解放するため、マルチスレッド化は有効になっている
  • numpy.add()をマルチスレッド化しても効果なし。行列サイズを1000*1000ぐらい巨大化するとようやく少し効果が出てくる
  • 速度はスレッド数に比例しない、という結論
  • CPUが速くても、メモリの性能が限界に達する

GPUを用いた並列化

  • CPUからGPUへはストリームを通じて演算を依頼する(CUDA)。この際、GPUでの演算は非同期に実行される
  • 複数のストリームで通信して並列実行できる
  • マルチGPUの場合、それぞれのGPUが独立してストリームを持っているので、多重化した通信を簡単に書ける。マルチGPUではスレッドが利く

Session2 PythonによるWikipediaを活用した自然言語処理

Wikipediaを自然言語処理に使う

  1. Wikipediaをテキストコーパスに使う
  2. Wikipediaから表記ゆれしやすい文字ペアを抽出する
  3. Wikipediaエンティティ辞書を活用する
  4. 単語のエンティティとベクトル表現を学習する

1. Wikipediaをテキストコーパスに使う

  • DBpedia NIF データセット
    • Wikiマークアップの除去は難しいが、そんなことしなくてもテキストが取れる
  • そのデータセットからコーパスを作成

2. Wikipediaから表記ゆれしやすい文字ペアを抽出する

  • Wikipediaリダイレクト:Wikipediaエンティティにアクセスした際に表記ゆれを抽出できる機能
  • Wikipedia2Vec

3. Wikipediaエンティティ辞書を活用する

  • 「アップル」というエンティティに対して、企業か、リンゴか、にマップする辞書
  • エンティティ辞書に有用な2つの指標:リンク確率(リンクとしての出現率)とコモンネス(特定のエンティティを指し示す確率。曖昧性を示す)

4. 単語のエンティティとベクトル表現を学習する

  • Wikipedia2Vec: word2vec(skip-gram)を拡張したモデルを採用
    • KG graph modelとAnchor context modelの2つのコンテキストをskip-gramに追加

Wikipedia2Vec

  • オープンソース化している。Pythonベースで実装し、実装の大半をCythonを用いてCに変換
  • gensimやfastTextと同等以上の性能を達成