1974年の仮想化技術の論文についてLTしました
8月に毎月恒例の社内LT大会があり、テーマがVMだったので、1974年の仮想化技術の論文を紹介しました。 そのときのスライドを公開します。
取り上げたのは次の論文です。
この論文は、コンピュータアーキテクチャの効率的な仮想化が可能であるために命令セットが満たすべき必要条件を定理として形式的に証明したもので、仮想化技術の界隈では知る人はいないほどの重要な論文とのことです。
テーマがVMに決まった時はネタが思い浮かばず、しばらくWikpediaを眺めていたら面白そうな内容でしかも発表が1974年(!)ということで、LTの題材に決めました。
仮想化技術については全くの素人が付け焼き刃で勉強して論文を読んだだけなので、専門家から見ればいろいろツッコミが入りそうな内容ですがご容赦ください。
参考
■
修論と学会終わって成績表も確認したのでやっと気分が落ち着いた。
普通はこういうとき旅行とか行くのだろうけど、高校~大学で日本の8割ぐらいの都道府県は行ったし、海外は面倒なので、特に大きな計画はしてない。 近場で鳥取だけまだ訪れたことがないので、日帰りか1泊ぐらいでふらっと行こうかと思ってる。 地元にいるのもあと3週間くらいなのでのんびりしたい。
最近はiPad miniのKindleでマンガ読むのが楽しみで、ランキングの無料のやつを片っ端からダウンロードして気に入ったシリーズを全巻大人買い、という完全にAmazonの家畜みたいな消費してる。 気が付いたら沈黙の艦隊と太陽の黙示録がライブラリに揃っててやばい。
勉強はしてて、ちょっと前に話題になったGoogleのTensorFlowを使ったコースを始めて今3つ目の課題に取り掛かったところ。 最近のDeepLearningについては、シグモイド関数の代わりにReLUを活性化関数にした多層NNという程度の理解しかなくて、まとまった時間がとれたら勉強しようと思ってたのでちょうど良かった。 前やったCourseraのやつと違ってクリアしたらなんかもらえるみたいなのはないので少しモチベーションはちょっと下がる。
あとは引越に向けて持ち物の整理してる。 minikuraっていうサービス使ってて、段ボール一箱月250円ぐらいで預かってくれるのですこぶる便利。
学習アルゴリズム以外のscikit-learn便利機能と連携ライブラリ
Pythonで機械学習を使う場合、scikit-learnには何かとお世話になる。 豊富な学習アルゴリズムの実装を利用できるのが長所だが、実はアルゴリズムそのもの以外にも、前処理や評価のための様々な便利機能を有している。 これらを知らずに使っていると,車輪の再発明をしてしまうことになる。
また、機械学習関連のPythonライブラリはscikit-learnと連携できるAPIをもつものも多い。 scikit-learnを中心とするエコシステムが成立しているとも言える。 中にはコードをほとんど書かずに簡単なモデリングができるようなツールまである。
この記事では個々の学習アルゴリズムではなく、scikit-learnに予め用意されている便利機能やscikit-learnと連携できるライブラリなどを紹介する。
便利モジュール・パッケージ
前処理や評価で使われる一般的なテクニックの多くは既に実装されているので、自分で実装する前にまずは API Reference を眺めてみるとよい。 たいていの道具は見つかると思う。
自分がよく使うモジュール・パッケージをいくつか紹介する。
feature_extraction
画像やテキストなどの生データからの特徴抽出・ベクトル化を提供する。 自分の場合、テキストをよく扱うので次のようなクラスをよく使う。
- DictVectorizer: dictをarrayに変換
- FeatureHasher: feature hashingによってdictをarrayに変換(テキストデータのオンライン学習等で使う)
- CountVectorizer: テキストを語の出現回数でBoWベクトル化
- TfidfVectorizer: テキストをTF-IDFでBoWベクトル化
preprocessing
特徴ベクトルに対して前処理を適用する。
- scale: 標準正規分布にスケーリング
- minmax_scale, maxabs_scale:
[0, 1]
[-1, 1]
などの範囲にスケーリング - normalize: 各ベクトルのノルムを正規化
- label_binalize: カテゴリ特徴を二値化
- LabelEncoder: ラベルを数値にエンコード
- PolynomialFeatures: 多項式による組み合わせ特徴を生成
cross_validation
(k-fold) cross validationを手軽に扱う。
- train_test_split: データセットを訓練セットとテストセットに分割
- cross_val_score: k-fold cross validation により各foldの評価スコアを算出
metrics
各種評価指標の実装。
- accuracy_score: 精度
- f1_score: F値
- precision_score, recall_score: 適合率, 再現率
- auc: AUC
- mean_squared_error: MSE
grid_search
グリッドサーチによるパラメータを最適化する。
- GridSearchCV: 与えられたグリッドから最適なパラメータを自動で選ぶモデルを生成
外部ライブラリ
外部ライブラリは細かく挙げていくとキリがないので、主なものだけ紹介する。 もっと調べたい場合は以下のドキュメントを参照。
Related Projects — scikit-learn 0.17.1 documentation
Scikit-Learn Laboratory(SKLL)
用意した設定ファイルに基づいて、モデルの学習や評価などを自動実行する。 簡単な評価程度ならPythonコードを全く書かなくてもいいほど。
設定ファイルはPython configuration file形式で記述する。 以下はTitanicデータセットに対してRandomForest, 決定木, SVM, 等で学習を行い評価するタスクの設定ファイル一例(ここから引用)。
[General] experiment_name = Titanic_Evaluate_Tuned task = evaluate [Input] train_directory = train test_directory = dev featuresets = [["family.csv", "misc.csv", "socioeconomic.csv", "vitals.csv"]] learners = ["RandomForestClassifier", "DecisionTreeClassifier", "SVC", "MultinomialNB"] label_col = Survived id_col = PassengerId [Tuning] grid_search = true objective = accuracy
タスクの実行はCLIで行う。
$ run_experiment evaluate.cfg
結果は次のように出力される。
Fold: Model Parameters: {"max_depth": 10, "compute_importances": null, "min_density": null, "bootstrap": true, "n_estimators": 500, "verbose": 0, "min_samples_split": 2, "max_features": "auto", "min_samples_leaf": 1, "criterion": "gini", "random_state": 123456789, "max_leaf_nodes": null, "n_jobs": 1, "oob_score": false} Grid Objective Score (Train) = 0.8089887640449438 +---+-------+------+-----------+--------+-----------+ | | 0 | 1 | Precision | Recall | F-measure | +---+-------+------+-----------+--------+-----------+ | 0 | [101] | 14 | 0.871 | 0.878 | 0.874 | +---+-------+------+-----------+--------+-----------+ | 1 | 15 | [49] | 0.778 | 0.766 | 0.772 | +---+-------+------+-----------+--------+-----------+ (row = reference; column = predicted) Accuracy = 0.8379888268156425 Objective Function Score (Test) = 0.8379888268156425
sklearn-pandas
pandasのDataFrameを上記のsklearn.preprocessing等を用いて学習用の入力データに変換する。
これを
data = pd.DataFrame({ 'pet': ['cat', 'dog', 'dog', 'fish', 'cat', 'dog', 'cat', 'fish'], 'children': [4., 6, 3, 3, 2, 3, 5, 4], 'salary': [90, 24, 44, 27, 32, 59, 36, 27] })
こうして
mapper = DataFrameMapper([ ('pet', sklearn.preprocessing.LabelBinarizer()), (['children'], sklearn.preprocessing.StandardScaler()) ]) np.round(mapper.fit_transform(data.copy()), 2)
こうじゃ!
array([[ 1. , 0. , 0. , 0.21], [ 0. , 1. , 0. , 1.88], [ 0. , 1. , 0. , -0.63], [ 0. , 0. , 1. , -0.63], [ 1. , 0. , 0. , -1.46], [ 0. , 1. , 0. , -0.63], [ 1. , 0. , 0. , 1.04], [ 0. , 0. , 1. , 0.21]])
(ここから引用)。
auto-sklearn
データを与えるだけでアルゴリズム選択・パラメータチューニングを全自動で行い、適切なモデルを生成してくれる。
サンプルコードにあるとおり、人間がやるのは AutoSklearnClassifier
のインスタンスを生成して fit
するだけという便利なのか乱暴なのかよくわからない代物。
手っ取り早くベースラインのモデルを作るにはいいかもしれない。
その他
scikit-learnにはないトピックモデルや構造化学習などのアルゴリズム実装もいろいろある。
自分ではあまり使ったことのないライブラリも含んでるので参考程度にどうぞ。
- https://github.com/ariddell/lda/:lda: LDA
- PyStruct: CRF等の構造化学習
- HMMLearn: 隠れマルコフモデル
- sklearn-compiledtrees: 決定木のアンサンブルモデル(RandomForest, GradientBoostedTree)をコンパイルして高速化
追記
2016-02-26: scikit-learnにもトピックモデルの実装は含まれているとのこと。 id:another16javac さん、ご指摘ありがとうございます。
学習アルゴリズム以外のscikit-learn便利機能と連携ライブラリ - yubessy.hatenablog.com実はscikit-learnにもトピックモデルあります http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html
2016/02/25 01:56
Coursera の機械学習コースを完走して修了証を取得した話
昨年の10月から12月にかけて Cousera の機械学習オンラインコース "Machine Learning" を受講し、無事完走することができた。
コースは無料で受講できるが、修得したことを公式に認定する修了証 (verified certificate) を取得するためにはお金がいる。 機械学習コースの取得料は$49と安くはないが、記念と思って取得してみた。 取得すると以下のようなパーマリンクがもらえて、修了証が閲覧できるようになる。
https://www.coursera.org/account/accomplishments/verify/WX835R39AB77
もともとアルバイトをしていたはてなでこのコースを利用した勉強会が開催され、それに参加させてもらったのが受講のきっかけだった。 運営の id:takuya-a さんをはじめ皆様にはお世話になり、ありがとうございました。
せっかく修了証の取得までこぎつけられたので、全体を通しての振り返りを書き残しておきたい。
コースについて
講師は著名な機械学習の研究者である Andrew Ng 先生で、コースはスタンフォード大学によって提供されている。 ボリュームは全部で11週分あり、完走には2.5ヵ月ほどを要する。
コースは一人でも進められるように設計されていて、きちんと講義を見ていれば課題で詰まることはあまりない。 ただ、11週の講義を完走するモチベーションを継続させるのはそれほど簡単ではない。
詳しい内容については、例えば以下のリンク先などで既にいろいろな人が書いているので、ここでは個人的な感想を書く。
内容
大きく分けて教師あり学習・教師なし学習・機械学習応用の3パートからなっているという印象。 難しい内容を省きつつ、基本的なアルゴリズムについて丁寧に教えてくれる。
受講にあたって機械学習の知識は全く必要ないが、数学についてはある程度の素養が必要。 最低限の数学の復習はしてくれるが、少なくとも大学の一般教養の線形代数ぐらいは理解していないとその後ついていくのは厳しい。 必要な知識は 線形代数 > 微積 > 確率・統計 という感じ。
講義ビデオ
毎週の講義は10-15分ほどのビデオの数本からなる。 ビデオではスライドを流しながら Andrew 先生がカラーペンでポイントを随時書き込んだりして説明してくれる。
自分の場合、SVMやK-meansなど講義で扱っていた多くのアルゴリズムについては既に基礎的な知識を持っているつもりだったが、それでも得るものは多かった。 特に Andrew 先生が随所で紹介してくれる実践的なTIPSが面白かった。 例えば正則化係数のパラメータを最適化する際にどんなステップで値を変えるべきかといった、経験と勘に基づく秘伝のタレを伝授してもらえる。 異常検出で変数を無理やり式変形して正規分布っぽくするのには笑った。
有志の方が日本語字幕をつけてくれているのもありがたい。 講義が進むとだんだん先生がお茶目になってくるのだけど、訳も追従していて楽しい。
課題
課題は小テストにあたる quiz とプログラミング問題の exercise の両方が毎週出題される(exerciseは無い週もある)。 全て英語。
quiz は1本につき5問の選択問題で、毎週2-3本が出題される。 選択とはいえ講義をきちんと理解していないと合格点は取れない。
excercize はプログラミング形式で、課題提出ファイルをダウンロードし、インストラクションに従って該当部分を実装して提出すると自動採点される。 言語は GNU Octave というあまり馴染みのないものだが、課題をこなすだけなら習得はそれほど難しくない。 多くの課題でアルゴリズムの本質的な部分以外はすでに実装されており、お膳立てが整っているので、1ステップずつ進めていけば自然に実装が完了するようになっている。
自分の場合、これまで本を読んで機械学習を勉強する機会はあったものの、利用する際には scikit-learn などのライブラリを使うことがほとんどだったので、様々なアルゴリズムを実装するのはいい経験になった。 講義ビデオもそうだったが、このコースは理論と実践をスムーズに接続してくれる工夫があってとても良かった。
勉強会について
先に述べた通りコースに沿った勉強会という形で受講を進めており、講義はみんなで見て課題は各自でやるというのを基本にしていた。 総じて一人で進めるよりも圧倒的に実りがあった。
講義
基本的に大きなディスプレイに講義ビデオを写してみんなで見る。 自分は同時にマイPCでもサイレントでビデオを流しておいて、数式が理解しにくい場合などにいちいち止めたり巻き戻したりしていた。 2画面使えるので便利。
ビデオの前後や合間には、参加者の間で適宜疑問点などを口頭やホワイトボードで議論した。 参加者のほぼ全員が現役エンジニアなので、このアルゴリズムを実際の問題に適用するとパフォーマンスはどうかみたいな実践的な話もいろいろ聞くことができた。 また、機械学習がド専門のという人は居なかったものの、コンピュータサイエンスの他分野で学位を取った人が複数人いたので、理論的な面を解説してもらえたりした。
Slack
勉強会専用に参加者全員が居る Slack チャンネルを用意してもらっていた。 次のように様々なことに使えて便利だった。
- 視聴中のビデオを遮らずに随時疑問点を共有できる
- ビデオの合間の議論の内容を書き残せる
- 参考リンクを共有できる
- リモート参加できる
- 諸連絡に使える
修了証について
冒頭に書いたように、このコースでは修了証を $49 で取得できる。 日本円だとクレジットカードの海外決済手数料を含めて6000円ぐらいになるので、学生の身としては少しためらったが、お金払ってもいい内容だと思ったので取得を決意した。
修了証を得るためには最初に本人確認情報を登録し、課題を提出する度に本人確認を行わなければならない。
本人確認情報の登録
本人確認のためには以下の3つの情報を登録する必要がある。
- タイピングパターン
- 自分の顔写真
- 免許証やパスポートなどの本人確認書類の写真
これらは一度 Coursera に登録すればその後は他のコースの修了証をもらうときにも使えるので、手間としては大したことはない。 ただし注意点として、この最初の本人情報登録の前に課題をやっても、修了証の取得条件をクリアしたことにならない。 コースを数週間分課題までやってから初めて修了証を取得するために本人確認手続をする場合、それまでにやった課題は全て再提出しなければならない。 Exercise はソースコードを保存しておけば一瞬で再提出できるが、 quiz はイチからやりなおしになってかなり面倒。
また、修了証に記載してもらうために登録する自分の名前は、原則として本人確認書類に記載されたものでなければならない。 公開される修了証に記載されるのは名前だけで、顔写真などが記録されるわけではないのだが、ニックネームなどは使用できない。 また本人確認書類として免許証を使用する場合、ローマ字が記載されていないので、修了証の記載名もローマ字ではなく日本語名を登録することになる。 個人的にはローマ字が良かったのだけど、残念ながらパスポートを持っていなかったので漢字になった。
課題提出時の本人確認
毎回の課題提出時には必ず本人確認ステップを踏まなければならない。 PCの場合、 Coursera Honor Code に従いますという内容の英語の一文をキーボードから入力することでタイピングパターンを照合する。 照合が失敗することは無かったが、 quiz でも exercise でも毎回入力しないといけない。 スマホ・タブレットで quiz をやったときはタイピングパターンの代わりに毎回顔写真を撮る必要があった。
修了証を取得したこと自体は後悔していないが、本人確認書類を提出した後はもう少し確認ステップを簡単にしてほしい。 ちなみにタイピングパターンの照合の話がコース中の異常検出の話で出てきており、 Coursera のシステムも機械学習を利用しているっぽい。 なので学習データを多く集めるために毎回パターンを入力させていると考えれば納得できなくもない。
後日談
修了証をLinkedInに資格として登録できるというので登録しておいたら、スペインのベンチャー企業からリクルートメールが届いた(丁重にお断りした)。
ブログ
昨日書いた今年の目標に書きそびれたけど、今年は積極的にブログ書いていきたい。 形から入るタイプなのでテーマも変えてみた。
今までこのブログは時折思い出したようにぽつんと投稿するだけで、ほぼ放置状態だった。 理由は単純で、特に書くことがなかったからである。
心変わりしたのには、最近アルバイトをしたり勉強会に参加したことが少なからず影響している。 まだ大したことはないものの、自分にも共有できる知見があるかもしれないと感じることが多くなった。 今は研究が忙しいけれど、落ち着いたら機械学習の話とかいろいろ書きたい。
また昨年はアルバイトを中心に多くの人にお世話になったので、環境が変わってもちょくちょく近況報告できる場所がほしいというのも理由のひとつ。 SNSはそれはそれでいいのだけど、ブログは時間の流れがゆるいので、Twitterフォローするほどでもないけどたまにブログを覗いてみるみたいなことができてよい。
とここまで神妙に書いてみたものの、ぶっちゃけブログチャレンジやりたかったのが一番の理由です。
ブログチャレンジで「Lv.9 疾風の蒼穹のyubessy」になりました https://t.co/9VE3rj8WAM #はてなブログチャレンジ
— 柚餅子 (@yubessy) January 1, 2016
「ブログを3日継続」をクリアしました。