FC2ブログ

子供の落書き帳 Remix

15/4/13:ひと月に一度更新するブログになってしまっている

scikit-learnとTensorFlowによる実践機械学習 輪読会4章
2018/06/24(日) 00:40:00

2018/06/15(金)に、scikit-learnとTensorFlowによる実践機械学習輪読会#4で発表してきた。

scikit-learnとTensorFlowによる実践機械学習/原題:Hands-On Machine Learning with Scikit-Learn and TensorFlow」の4.1 - 4.2の説明を担当した。資料はこちら!



勾配降下法の3つの方式:バッチ勾配降下法、確率的勾配降下法、ミニバッチ勾配降下法



この本では4.2.1でバッチ勾配降下法、4.2.2で確率的勾配降下法を扱い、その後の4.2.3でミニバッチ勾配降下法を取り扱っている。

scikit-learn_42.jpg

この順序で話が進むので、3種類の方法の関連性や相違点を把握しやすかった。

「関連性や相違点」を具体的に挙げると、「ミニバッチ勾配降下法はバッチと確率的の中間の特徴を持つ」という点である。また、ミニバッチでバッチサイズが1の特殊な場合が確率的勾配降下法であり、バッチサイズが全体の特殊な場合がバッチ学習である、という見かたもできると気づいた。

今までの理解では、「どうやら通常はミニバッチを使うらしい」ということは分かっていた。しかし、すべてのインスタンスについて勾配を計算して学習するバッチ学習と比べて、どう違うのかがきちんと理解できていなかった。

scikit-learnとTensorFlowによる実践機械学習」ではまずバッチ勾配降下法を説明して、その後で確率的勾配降下法が出てくる。その中で確率的の方は
・1回のイテレーションが高速
・アウトオブコア(=メモリに乗りきらないデータ)に対応している
・最適解で止まることがない
といった特徴があることに触れている。
また、4.2節の最後にはアルゴリズムの比較表があり、4.1と4.2の全体を見渡して概要をつかむことができる。全体的に説明の流れが上手いと感じた。

インスタンスの選ぶ方法による収束速度の違いについて


輪読の最中に「本に書いてある内容が分からない」と話題になった箇所がある。

P.120
(筆者補足:確率的勾配降下法では)インスタンスが無作為に選ばれるため、一部のインスタンスはエポックの中で複数回選ばれることがあるのに対し、ほかのインスタンスは全然選ばれないことがあることに注意しよう。各インスタンスですべてのインスタンスを処理するようにしたければ、訓練セットをシャッフルしてからインスタンスを逐次的に取り出し、終わったら再びシャッフルするという方法もある。しかし、この方法は、一般に収束まで余分に時間がかかる。
(※太字は筆者による)



本では、確率的勾配降下法でインスタンスを選ぶとき、2通りの選び方があるよ、と言っている。
1つ目は、毎回ランダムに選ぶ方法である。例えばインスタンスが5個で、1~5の番号がついているとしよう。(普通はもっと多いが、説明のため簡単にする。)選び方の例は以下のようになる。毎回、1~5の中からランダムで1つの数を選んでいる。

3, 5, 4, 3, 4, 2, 4, 1, 3, 4, 4, 3, 1, 2, 4, ……

2つ目は、インスタンスの集合を一度シャッフルして取り出して、終わったら再度シャッフルする、という方法である。さっきの例でいえば、選び方の例は以下のようになる。分かりやすいように5つごとにカッコでまとめた。カッコの中が1~5の並び替えになっている。

[2, 3, 1, 4, 5], [3, 5, 4, 1, 2], [1, 4, 2, 3, 5], ……

この2つの選び方では収束の速度に差があり、前者が速くて後者が遅いらしい。何でだろう?
直感的には、ランダムで選ぶ限り、どのような選び方だろうと収束速度に差は無いように思える。
輪読会に来ている方が知っているかなと思ったが、誰もその理由を知らないようだった。重要な箇所ではないからそれほど気に留めなくても良いとは思うが、ちょっと気になる。

GitHub上のサンプルコードについて



ありがたいことに、本に掲載されているコードはGitHub(下記)に上がっている。
GitHub - ageron/handson-ml: A series of Jupyter notebooks that walk you through the fundamentals of Machine Learning and Deep Learning in python using Scikit-Learn and TensorFlow.

残念ながら、スライドを作る方で手一杯だったので、
GitHub上のコードを見たりダウンロード・実行するところまで手が回らなかった。反省である。

ソースコードは全体的に平易であり、本の内容が理解できていればそれを素直にコードに直したものである。
とはいえ、コードが書けなきゃ実際の機械学習処理ができないので手を動かさなきゃいけない。
俺はコーディングよりも理論の方についつい寄ってしまうので、気をつけなければ……

それでは。
スポンサーサイト



  1. 2018/06/24(日) 00:40:00|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:0

kaggle初心者はカーネルを読むだけでも勉強になったよ
2018/06/17(日) 20:59:31

はじめに



機械学習を少しずつ勉強している。
その中で先月kaggleに登録して、そこから少しずつkernelを写して書いている。
「このやり方、結構いいんじゃないか」と思ったので、kaggleのkernelの良さについて書く。

対象読者



「kaggle登録はしたけどどうすればいいかよく分からん」
「いきなり問題を解けといったって、いい解法が思いつかない」
くらいの人を想定しています。
kaggleのコンペティションにガンガン出て順位を競っているような人は対象外です。

Kernelとは何か?



少し分かりにくいところにあるが、kaggle公式では以下のように説明されている。
Titanic: Machine Learning from Disaster | Kaggle

What are kernels?
Kaggle Kernels is a cloud computational environment that enables reproducible and collaborative analysis. Kernels supports scripts in R and Python, Jupyter Notebooks, and RMarkdown reports.

拙訳:
kernelとは何ですか?
Kaggle Kernelは、クラウド上の計算環境であり、再現性のある共同の解析ができます。RとPythonのスクリプト、Jupyter Notebook、そしてRMarkdown reportをサポートしています。

pythonに限れば、kaggle上でJupyter Notebook形式でコードを書いて実行することができる。
また、ここに他の参加者がソースコードを投稿・公開している。
上手い人のコードを読んで参考にすることができるというわけだ。

このkernelを見て学習をするメリットは以下のとおりである。

利点1:Pythonの各種ライブラリの実用的な使い方がわかる



俺自身はPythonを普段あまり使っていないので、文法や関数が分からないこともある。
たまにRubyの書き方をしてしまったりするし。
そもそもライブラリをどう使うか、どういったことが可能なのか、という知識があまりない。
機械学習をやっていく上では、Numpy・Pandas・Matplotlibなどのライブラリは避けて通れない。
機械学習の勉強を進めるときは素のpythonだけではなく、これらのライブラリも使えるようにならなければいけない。何種類かのライブラリの知識も必要になるという点は、ちょっとハードルが高いと思う。

kaernel上で、実際で使われているのを見ることで
「pandasってこういうことができるんだな」「numpyのこの関数ってこう使うのか」と分かる。
もちろんライブラリの公式ドキュメントを順番に見ても使い方を学ぶことはできると思うが、
しかしそれだと滅多に使わないものまで出てきてしまう。
実践に即した知識を習得できるのが良い点かと思う。

利点2:問題の解き方がわかる


kaggleでは機械学習のコンペティションが開催されている。
しかし「はい、これが問題です、解いてください」と言われても、初心者は解けないわけだ。
どういう解法でどういうパラメータを設定して解けば上手くいくかなんて分からないからである。

そしてある特定のアルゴリズムで解いてみようとしても、コードが上手く動かなくてエラーが出たりして、
「え、どこで間違えたんだ、分からない、困った」ということになる。
「解法が分からなくて詰む」「解法が分かってもコードが書けなくて詰む」の二重苦である。

SIGNATE(旧名:DeepAnalytics)というkaggleの日本語版のようなサイトがあり、同様にコンペティションが開催されている。
俺は3月に、初めてコンペティションに参加して
「取りあえず思いついた解法で解いて提出してみるか、きっと酷いスコアだろうけど」と思ってゼロから書き始め、
数多のエラーを喰らった末に疲労困憊しながら提出したが、予想していた以上に酷いスコアだった。
もちろん手を動かしたぶんの実力がついたとは思うが、しかし技術力をつける上では遠回りだった。

そこでkernelの出番である。

・(Jupyter Notebook形式の場合は)手法の説明+コードがある
・ちゃんと動くコードなので、エラーにハマらずに済む
・自分のkernelにコピー(fork)して動かせる
・そこから少しずつ書き換えてみて、どうなるかな、と試してみることも可能
といった利点がある。

なお、機械学習の初心者ではなく実力者であっても、
素晴らしく上手く解ける方法を最初から分かっているとは限らないので、
kernelに掲載された解法を参考にしているようだ。
以下の記事を参照。
Kaggleを取り掛かるまでにやったこととと、モチベーションの維持のために必要だったこと - にほんごのれんしゅう

どのkernelから見れば良いの?



コンペティションを決めていて、それに関する良い感じのkernelを探す場合は
ひとまずはVote数でソートすれば良さそうだ。
「このkerelは参考になった」と思った人がVote(投票)するので、Vote数の順にすれば人気のあるkernelを見られる。
(下の図の赤い四角の部分)

20180616_kaggle-kernels.png

投票数の多く人気のあるkernelの中でもどれを選ぶか、という点については、
タイトルやタグ名から以下のことが読み取れるので、それを参考に決めれば良いだろう。

・EDA:「Exploratory Data Analysis」の略、日本語に訳すと「探索的データ解析」となる。分かりやすくいうと「問題を解くより前に、入力として与えられたデータがどのようなものか、表やグラフに可視化しながら観察してみよう」くらいのニュアンスである。したがってこのタイトル/タグがある場合、問題そのものを解いていない場合が多い。
・解法名:「特定の解法を使って解いてるコードを見たいんだよなぁ」という場合にはそのアルゴリズムの名前があるものを選べばよい。
・スコア:そのkernelのコードを実行したときのスコアを表す。例えば上の図で上から2番目のkernelには「0.735」というタグが付いているので、submitすればそのスコアになるはずである。



参考・関連



kaggle初心者に向いている、kaggle内のコンテンツ、という切り口で考えると

Titanic コンペティションのtutorialをやる
Learn(機械学習やPandasやRなどの教材)をやる
あたりも良いだろう。

それでは。
  1. 2018/06/17(日) 20:59:31|
  2. プログラミング
  3. | トラックバック:0
  4. | コメント:0