※これはセミナー聴講時の個人的なノートをそのまま公開したものです。誤字誤植や勘違いがある可能性があるのでご了承ください。
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を活用した自然言語処理
- PythonによるWikipediaを活用した自然言語処理
- GitHub - ikuyamada/wikipedia-nlp: Sample code for natural language processing using Wikipedia
Wikipediaを自然言語処理に使う
- Wikipediaをテキストコーパスに使う
- Wikipediaから表記ゆれしやすい文字ペアを抽出する
- Wikipediaエンティティ辞書を活用する
- 単語のエンティティとベクトル表現を学習する
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と同等以上の性能を達成