データサイエンティスト(仮)

元素粒子論博士。今はデータサイエンティスト(仮)。

Ubuntu16.04LTSにSparkを入れる

そろそろSpark弱者を抜け出したい。

経緯

データ処理や分析の一つの手段として、Sparkをある程度できるようにしたい、と思ってはいるのですが、なんだかんだ腰を据えて…という感じになかなかならない日々が続いていました。おかげさまであんまり使いこなせてない状況なんですが、そろそろいい加減弱者でいるのもアレなので、自宅の環境でもラフに試せるような状況にしてしれっとできるようになってる状態を目指したいと思います。

Sparkのインストール

今回、私の環境とインストールするSparkのVersionは以下です。

  • Ubuntu 16.04 LTS
  • Spark 2.3.0

JDKのインストール

JDKは、Java Development Kitの頭文字を取ったもので、Javaによるプログラミングで必要なものが一式揃ったパッケージみたいなものです。

$ sudo apt-get install -y openjdk-8-jdk

mavenのインストール

これは、Apache Mavenというもので、Java用のプロジェクト管理ツールです。

$ sudo apt-get install -y maven

Sparkのインストール

Sparkのダウンロードサイトから、入れたいVersionを指定してインストールすればよいです。
Downloads | Apache Spark

私は2.3.0を入れました。直接サイトからダウンロードするでもよいですが、コマンドラインからだと以下のような手順で行います。wgetでダウンロードして、解凍して実行しているだけです。SparkのHomeは/usr/local/sparkに指定しておきます(ここはお好み)。

$ wget http://ftp.riken.jp/net/apache/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2.7.tgz
$ tar zxvf spark-2.3.0-bin-hadoop2.7.tgz
$ sudo mv spark-2.3.0-bin-hadoop2.7 /usr/local/
$ sudo ln -s /usr/local/spark-2.3.0-bin-hadoop2.7 /usr/local/spark

次に、コマンドラインでSparkを簡単に実行するために、.bashrcに以下の文言を追記します。

export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin

ターミナルを再起動すれば、準備OKです。

Spark-shellの起動

実行すると、以下のような感じになります。
f:id:tekenuko:20180628222002p:plain

JupytetでPysparkを動かす

環境にもよりますが、.bashrcに以下の文言を追加すると私は大丈夫でした。

export PYSPARK_PYTHON=$PYENV_ROOT/shims/python #環境に合わせてパスを合わせること
export PYSPARK_DRIVER_PYTHON=$PYENV_ROOT/shims/jupyter
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"

ターミナルを再起動して、pysparkとうったらjupyter notebookが開きます。

$ pyspark

ここから先はやっていきです。

Ubuntu 16.04LTSにTexを入れる

ちょっとした自分用メモです。

経緯

最近、個人でGPU環境などを持っておきたいと思って、自宅のPCを新調しました。そのついでにデュアルブートUbuntu 16.04 LTSを入れ、そこで諸々環境を構築しています。それとは独立に最近、個人的な事情でTeX環境も整備しとく必要が出てきたのですが、今までLinuxTeXの環境を作ったことがなかったので、ここにメモ書きとして残しておきます。

環境(PC and TeX

手順

なにはともあれ、apt-getをupgrade

sudoが必要かどうかは今までどういうセットアップしてきたかに依存すると思います。

$ sudo apt-get update
$ sudo apt-get upgrade

TeX Liveのインストール

Fullで入れると3GBくらいあって結構時間がかかるので、気長に待ちましょう。

$ sudo apt-get install texlive-full

エディタ

UbuntuTeX Liveを使うときは何を使うとやりやすいかイマイチわかりません。私は何も設定していないとEmacsが起動するようになっていました。探してみると以下のページでKileというものを導入していたので、ここではそれを入れてみます。
www.kochi-struct-dynamics.rgr.jp

素直にapt-getでインストールします。

$ sudo apt-get install kile kile-l10n okular
Kileの設定

コマンドラインでkileと打つとKileが起動します。上部の設定からConfigure Kileを選択し、ツールのビルドにあるもののいくつかを変更します。
f:id:tekenuko:20180627222856p:plain
f:id:tekenuko:20180627222913p:plain

  • LaTeX
    • コマンド platex
    • オプション -synctex=1 -interaction=nonstopmode '%source'
  • DVItoPDF(デフォルトから変更しない)
    • コマンド dvipdfmx
    • オプション '%S.dvi'
  • ForwordPDF(デフォルトから変更しない)
    • コマンド okular
    • オプション --unique '%absolute_target'
  • BiBTeX
    • コマンド pbibtex
    • オプション '%S'
  • QuickBuild
    • ツールQuickBuildの設定を選択の部分がLaTeX+DVItoPDF+ForwordPDFとなるように下の全般の部分に適宜追加

これで、何かTeX fileを開いてQuickBuildすれば、TeX fileじたいに問題がなければコンパイルが通るはずです。エディタ周りは使いながら検討していきます。

NN論文の読み会でまた発表した

前回に続き、NN論文を肴に酒を飲む会で発表しました。

tfug-tokyo.connpass.com

今回の論文のテーマは、強化学習でした。DQN周りの発展を勉強するいい機会だと思い、炎上ラーニング戦法で発表を申し込みました。私が選んだ論文は、Google DeepMindが昨年の10月に出した、DQN以降の深層強化学習のモデルをうまく融合させたモデルである「Rainbow」という論文です。

www.slideshare.net

この論文のFigureがネタ的で趣深いので、興味あるかたはぜひ一読をおすすめします。論文のリンクは以下です。
[1710.02298] Rainbow: Combining Improvements in Deep Reinforcement Learning


ネタはさておき、論文投稿時点(2017年10月)でAtari2600というレトロゲームのスコアで最先端(State of The Art:SoTA)となっており、既存手法を圧倒する性能を獲得していました。

Rainbowもすごいのですが、現時点ではより性能のよいであろうモデルが提案されています。こちらもGoogle DeepMindから論文が出ており、Ape-Xと呼ばれるモデルになります。Rainbowで使われている手法の一部と、うまく並列処理する仕組みが組み合わされたもので、既存手法より効率的に学習することができるようです。最近までICLR 2018のreview中でしたが、acceptされたようです。
Distributed Prioritized Experience Replay | OpenReview

私の不勉強のため、発表しようと思っていた時点でこちらの論文を認識しておらず、結果として読み会はApe-Xの論文紹介で締めるというオチとなりました(笑)。かなりネタ的な発表だったかもと思いますが、個人的には最近の深層強化学習の発展を追う良い機会になりました。仕事ではDeep Learning関係を使っているわけではないので、こういう勉強して議論し合える機会は貴重だなと改めて感じました。今後も発表の機会があったら積極的にしていこうと思います。

PytorchでDeep Learning : CPU onlyでインストールする際のメモ

Deep Learningフレームワークの一つにPytorchがあります。

f:id:tekenuko:20180126093727p:plain

Facebookを始めとして、様々な企業や大学が開発に携わっているようです。
f:id:tekenuko:20180126093854p:plain


PytorchはPython上でDeep Learningを行うためのフレームワークです。Preferred Networksが開発しているChainerからforkされた(らしい)ため、書き方や、ニューラルネットワークの構築をデータを流しながら行う*1といったChainerの特徴が引き継がれたものになっています。2017年の初頭に公開されたあとはどんどん人気を博していき、Tensorflow, Keras, Caffeに続くフレームワークとなっています。

Pytorchに興味をもったきっかけは、研究者の利用が多いことです。例えば、以下の柏野さんの資料などにそのような記載があります。

www.slideshare.net

研究者の利用が多いということで、研究段階でPytorchを使ったり、調査の際にPytorchを使って実験するといった機会が多くなり、結果、Pytorch実装が早めに世に出やすくなると期待されます。ビジネス側でDeep Learningのキャッチアップを行っていきたいと考えたときに、Pytorchを知っておくと情報をいち早く得られるようになるのでは、と考えています。

というわけで、Pytorchについて調べてみようと思っています。

インストール

以下の例は、MacOS SierraでPython3.6(Anaconda利用)の場合です。Linuxで最初からGPUを利用できる環境を整えている場合はまた別の挙動になるのではと思います(未検証、GPU欲しい)。

雑にやりすぎで失敗した例

Pythonフレームワークということで、pipなどでコマンドを叩けばインストールできるだろうと考え、以下のコマンドを打ってみます。

$ pip install pytorch

そうすると、私の環境では、以下のようなエラーが出たあと、Pytorchのページに飛ばされました

f:id:tekenuko:20180126100901p:plain

そして、Get Startedの項目を見ると
f:id:tekenuko:20180126101143p:plain
のように、OSやGPUあり/なしでコマンドを適宜変えないといけないらしいことがわかります。

環境に合わせてインストール

自分の環境に合わせてどうなるか見てみます。
f:id:tekenuko:20180126101321p:plain

Anaconda入っているので、condaでも良い気がしますが、ここは好みで。CUDAとはNVIDIAが開発・提供している、GPU向けの汎用並列コンピューティングプラットフォームのことで、これが適切にインストール済みでないとNVDIAのGPUを使って計算することができません。自分の環境は、GPUに対応していないので、CPU onlyで使うためにCUDAの欄はNoneにしています。
(pip3とか推奨されているけど、pipでいいんじゃん?)

次に、推奨されたコマンド(pip3はpipに変えた)を打ってみます。

$ pip install http://download.pytorch.org/whl/torch-0.3.0.post4-cp36-cp36m-macosx_10_7_x86_64.whl 
$ pip install torchvision 

結果、以下のようになり、インストールが成功します。
f:id:tekenuko:20180126102009p:plain

インストールした時期によってバージョンは多少変化すると思いますが、pip listで

torch (0.3.0.post4)
torchvision (0.2.0)

というものが見れていればPythonでPytorchが使える状況になっていると思います。実際、ipythonあたりを雑に起動してみて
f:id:tekenuko:20180126102359p:plain
という感じで、問題なくimportできています。

Next Step

今回は、Pytorchのインストールについてのメモを紹介しました。雑にpip使っていきなりサイトに飛ばされてびっくりしたのですが、普通はサイトにいってインストール方法を読んでから実行しますよね。。単に自分のアホさを露呈しただけでした。

割りと趣味的な感じなので、ちまちまとやっていく感じにはなると思いますが、Pytorchを使って色々と試していきたいと思っています。仕事でDeep Learningをやる機会があったらPytorchを使ってみたいんですけどね。そういう機会があればいいなあ。

*1:Define by runという考え方です。このような設計にすると、ミニバッチごとに異なるネットワークを準備するなどが可能になります。

Pythonでデータ分析:Auto-sklearnについてのメモ

導入

最近、Meta Learningという考えに少し興味を持ちました。もともとは認知科学発祥の考えですが、機械学習の文脈だと

ある決まったバイアス,すなわち仮説空間の中から,事例に応じて,適切な仮説を獲得する普通の学習器をベース学習器という.その上位で,学習対象のタスクやドメインに応じて,学習器のバイアスを決定するためのメタ知識を獲得するのがメタ学習 (meta learning).

メタ学習 - 機械学習の「朱鷺の杜Wiki」
という概念のようです。ざっくりいうと、学習のためのメタな学習規則を学習する(Learning to learn)という感じなのかなと思います。

このMeta Learningですが、機械学習の自動化、つまりあるデータセットを投入すると「良い」機械学習モデルを自動で作成すること、とも関係しているようです。こういった背景のもと、そういえばAuto-sklearnってMeta Learningが取り入れられていなかったっけ、とふと思い出し、中の仕組みって大まかにどうなっているんだろうというのが気になりました。そういった経緯で、Auto-sklearnのベースになった論文を調べてみたメモを、備忘録として記事に残しておくことにしました。

Auto-sklearn

Auto-sklearnは自動で機械学習のモデルを構築してくれるPythonのライブラリです。
github.com

ざっくりした概要やインストール方法は、過去に自分が紹介していたようです。
tekenuko.hatenablog.com
この記事を見ると、詳しくは以下のページといって実質元論文に投げてしまってます。過去の自分はしょうもないことやってるな。

Auto-sklearnのベース論文

Auto-sklearnの仕様やパフォーマンスが紹介されている論文は、以下のNIPS 2015での論文です。
papers.nips.cc
概要はこれを見ると載っているのですが、細かい話は「Supplementary MaterialのTableやFigにある」という記載が度々見られます。Supplement Materialってなんだろうと思ってネット検索をしてみると、以下の文献がヒットします。どうやらこれがSupplementary Materialのようです。
https://pdfs.semanticscholar.org/699c/12c4b47b7dff4c9ae9b22b9326ae9a1dacca.pdf

Auto-sklearnの概観

Auto-sklearnの全体感は以下になります。
f:id:tekenuko:20171212230243p:plain
Auto-sklearnの自動化部分は図の「AutoML system」になります。大まかな構造は以下のようになっています。

  • Meta Learning部分
  • ML framework部分
  • Build ensenble部分

ML framework部分でベイズ的最適化を用いて良いモデルを選択する、という方法は、Auto-WEKAですでに取り入れられているようです。
Auto-WEKA
ただ、Auto-WEKAだと探索するパラメータが多すぎる、アンサンブルを取ったモデルも含めて探索する、といった非効率性が欠点としてあったため、Auto-sklearnではMeta Learning部分とBuild ensanble部分を加えた3部構成にしているようです。

Meta Learning

この部分は、「効率性」に着目した部位です。高精度の機械学習モデルを自動的に構築する場合、前処理、特徴量エンジニアリングの方法、機械学習アルゴリズム、ハイパーパラメータといった膨大な選択肢をしらみつぶしに探していかなければなりません。コンピュータのリソースや時間が潤沢にあればこういった探索を行ってもよいですが、実際にはリソースに限りがあることが多く、制約がある中で効率的に良いもの探していく必要があります。その際に効率的に探す指針を与えてくれるのが、このMeta Learning部分です。

大まかには、この部分では以下のような操作が行われています。

  • あらかじめ、OpenMLの140のデータセットhttps://www.openml.org/search?type=data)から、後述のMeta Feature、およびベイズ的最適化による「ML framework」(前処理、特徴量エンジニアリング、分類器選択のセット)を抽出
  • 新しいデータセット:今回モデル構築したいデータを投入した際は、データからMeta Featureを算出、Meta Featureの空間でOpenMLのデータセットとのL_1距離を計算
  • 距離が近いものから25種類のML frameworkを選択し、それらをベースに次段のベイズ的最適化へ移行

データセットから計算するMeta Featureは以下のようです。基本的には、要約統計量や次元圧縮に関連する量、エントロピーなどがMeta Featureとなっているようです。
f:id:tekenuko:20171212222410p:plain

ML framework

ここでは、前段で選択された候補に関して処理を行います。論文の図をべた張りですが、前処理や分類器の候補は以下になります。
f:id:tekenuko:20171212222927p:plain
これらと、前段で絞りこんだ情報をもとに、ベイズ的最適化によりよいものを選択します。評価に関しては、あらかじめ評価指標を設定しておきます。
f:id:tekenuko:20171212223245p:plain

Build ensenble

Auto-sklearnでは、結果をロバストにするために、ML framework部分で算出した結果のアンサンブル平均をとっています。単に足し合わせるのではなく、精度向上に効果があるものを貪欲に入れ込んでいく、としているようです。
f:id:tekenuko:20171212223424p:plain

Auto-sklearnの性能

(ここの解釈は、若干誤解しているかもしれませんので、修正が入るかもしれません。)
論文での性能比較の表は以下です。
f:id:tekenuko:20171212224314p:plain
f:id:tekenuko:20171212224345p:plain
上の表がアルゴリズム間での比較、下の表が前処理方法間での比較です。数字が低いほど良いという見方です。結果を見ると、最も良いパフォーマンスではないが、安定して良い結果になっているという印象です。なので思考停止的にデータを投入してもそこそこの結果が出て来るというものになっているようです。とっても個人的なバイアスがかかっている意見だと思いますが、DataRobotみたいだな、と思いました。
www.datarobot.com
(といいつつDataRobotは黒魔術モデルまで込みで一番いいのを頼む、という感じなので、Auto-WEKAに近しいのかな)

まとめ

今回は、Auto-sklearnについて大まかな処理内容を紹介しました。機械学習のモデルに関して詳細を知らなくてもそこそこ良い結果が出る仕組みを作ったのは素晴らしいことだと思います。さらに、論文が出た時点では分類問題のみが対象でしたが、現在は回帰についても取り扱えるようです。こういった簡単に機械学習ができる仕組みが発達していき、活用のハードルが下がった結果、機械学習の活用シーンが広がって行くことを期待します。