02 Jan 2018, 05:31

KaggleのためのMOOCがcourseraに!How to win a Data Science Competitionを受けた

kaggleの攻略法について、以前調査した。あまり、学習教材がなかった。

Kaggleを初心者が進めるには、とにかくコンペに参加してKernelを読むしかないのかなと思っていた。そんな自分に朗報!この courseraが提供するものこそ、自分が求めていたものだ。

その名も・・・

How to Win a Data Science Competition: Learn from Top Kaggler

特徴

ロシアのカグルマスターが講師

この講座では、Yandexというロシアのgoogleが講座をサポートしている。そのため、ロシア切ってのデータサイエンティストから学ぶことができるのだ。

また、catboostなどの、ロシア魂がこもったライブラリを紹介される。これはかのxgboostよりも強力だった。

難易度高い…

正直、難しいです。quiz, assignment, 解けなかった。

この講座は機械学習の手法を教える講座ではない。それらはすでに身についているものとして、コンペで使える技や知識を教えてくれる。

kaggle コンペで腕試し

習ったことは即試してみようということで、練習用のkaggleコンペが用意されている。

ロシアのIT企業の売上予測を行う。時系列データコンペ。

各週の内容

week1:

recap&introduction ということで、データ分析コンペについて紹介される。

基本的な手法はもう知っているよねということで、MLの手法はサラッと紹介されて終わる。

そのあと、前処理についての紹介。これはよくまとまっている。数値変数、カテゴリ変数、時間の扱いと位置の扱い、欠損値の扱い。これは大事なので、なんども復習したいところだ。

assignmentはpandasについての演習。groupbyを多用する必要があり、初心者サヨウナラ感がとてもする。

week2:

EDAについての解説。これも一通りの手法は紹介される。とはいえ、すべてを網羅できるわけではなく、自分で習ったことを実践してみないとこれは身につかない気がした。

次に Validationということで、データ分割の戦略について紹介される。データ分割がなぜ必要か(過学習を避けるため)、その手法と注意点について。

最後に、Data Leakageが扱われる。具体的な事例を元に、DataLeakageにどうやって気づくかなどが紹介される、が、

ここはよくわからなかったな。。。Assignmentも Data Leakageについてなのだが。

week3:

Metrix(評価指標)について学ぶ。回帰、分類それぞれでよく使われる指標を学ぶ。MetrixとLoss functionの違いについて説明。ココらへん、理解していなかったので参考になる。

続いて、mean encodingという手法について紹介される。カテゴリカル変数を変換するための方法で、label/one-hot-encodingよりも、強力だとか。そして、その実装がassignmentとして課される。

week4:

ハイパーパラメータのチューニングについて、まず紹介される。ランダムフォレストやxgboost, ニューラルネットワークのパラメータチューニングについての実践的なアドバイス。また、自動チューニングツールの紹介(hyperoptなど)

次に、特徴量エンジニアリングの小ネタ第二弾。

  • Matrix Factorization
  • Feature Interaction
  • t-SME

最後に、一番むずかしい話題、アンサンブル学習が紹介される。weight average, bagging, stacking, boosting, stacknet…ムズい。assignmentはstackingの実装。

week5:

過去のコンペティションで講師の人が上位入賞をどうやってしたか、カグルマスターがその手法の種明かしをしてくれる。

ただ、これらの動画はおまけのようなもので、最後の週の本題は、用意されたKaggleコンペで上位スコアを取ること。

Assignmentがスコアのcsvデータの提出。一定以上のスコアを超えていないと、クリアとみなされない。そしてこの水準がとても高い。MSE1.0より低くないと、どうやら合格できないよう。LBを見ると、そんな人は30人くらいしかいない。

それに加えて、ペアレビューがある。以下のフォーマットに従って、自分がどうやってコンペに望んだかを説明するレポートを作成して、コードと一緒に提出する。

提出がすむと、他の人のコードをレビューできるようになる。

おわりに

この記事を執筆している時点では、私はコースを完了していない。

QuizもAssignmentも終わらなかった。

ただ、とてもこのコースはとても充実していた。かけた時間は現在95時間。kaggleのための実践的なテクニックが豊富に紹介されていて、吸収することがたくさんある。mean encodingや stackingなど、ネットにはほんとど情報がないが重要な手法も紹介されている

(assignmentにもなっている)

さらに、その知識を実践するする機会もコンペという形で与えられている。MOOCをいろいろと受けてきたけれども、そのなかでもかなり楽しい講座だった。それは、自分が今興味があることがデータサイエンスであり、ちょうど知りたい内容だったからだ。

この講座の内容をよくよく復習し、今後もKaggleに取り組んでいこう。Kaggle用のマシンも購入したことだし、まずはそれでグリッドサーチやアンサンブルを試してスコアを上げる。

01 Feb 2017, 15:43

coursera の Machine Learning を受講してる

coursera で Andrew Ng 先生の Machine Learning の講座を受講してる。

本当は、修了時にブログ記事を書こうと思ったけれども、 勢いで半分終わった今(week5)、記事を書いてしまったので公開。

2 度挫折しました

MOOC の講座は 30 近く受講してきたけれども、 実は MOOC の代表ともいえるこの講座は手が出なかった。

なぜなら、、、難しいから・・・。

2 度挑戦して、2 度挫折しています。

  • 1 度目: 他の mooc(nand2tetris)を受けてて時間がなかったから week3 で挫折。
  • 2 度目: week5 の back propagation の難解さに挫折。

機械学習諦めようと、何度も思った。 でも、世間の風潮は AI まっしぐら。 エンジニアとして AI に興味を持たない人はモグリ的な空気を感じたので、 再び再起を決して ML に挑みました。

今回、挫折しないように以下を心がけました。

  1. 勉強カフェ 3 ヶ月プログラムに参加して、coursera ML を宣言
  2. ゼロから作る Deep Learning で Back Propagation を学習
  3. 日本語情報を漁った

3ヶ月プログラム

勉強カフェには 3 ヶ月プログラムというのがあり、それに参加した。 やる気のある人たちが集まって、お互いの目標の達成のために 励ましあいながら切磋琢磨するというもの。ここで、coursera の ML を目標に掲げた。

ゼロから作る Deep Learning

また、大ヒット中の書籍 ゼロから作る Deep Learning を 5 章まで読んで、 Back Propagation の仕組みを理解した。

この本は大変わかりやすくアルゴリズムを紹介していて、 この本がなかったら、2 度目の時のように挫折していただろう。

ただ、この本で紹介されている方法と、Lecture で紹介されている方法には ギャップがあり、現在その差異の理解について悩んでいる。 多分、同じことを行っているのだと思うのだが、いまいち理解できていない。

日本語情報

coursera の Machine Learning は、受講者が過去に大勢いて、 ネットでしらべれば、情報がたくさん出てくるところがいい。

英語で分からないときは、日本語情報に当たって理解を深めた。 とくに役に立ったのは以下の記事たち。ありがたい。これがなければ挫折していた。感謝。

講義の内容

“coursera Macnine Learning 修了” で 検索するとわんさか修了報告記事が引っかかるので、 ここでは、簡潔に書く。11week で以下のことを学んだ。

  • 機械学習とは
  • 教師あり学習と教師なし学習
  • 回帰問題と分類問題
  • 線形回帰
  • ロジスティック回帰
  • ニューラルネットワーク
  • サポートベクターマシーン
  • k-Means
  • 主成分分析(PCA)
  • 異常検知
  • レコメンデーションシステム
  • 機械学習の評価と改善
  • 機械学習を組み合わせる

などなど。じゃあ、学ばなかったアルゴリズムはなにか?手持ちの参考書を元にピックアップ

  • 決定木
  • EM アルゴリズム
  • ベイズ推定
  • 深層学習(Deep Learning)
  • 強化学習

たぶん、他にもたくさんあると思う。 網羅するには、このシリーズを読破すればよい(そんな人いるのか?)

そしてこれから先の学習プラン

coursera の Machine Learning を受講し終えた人たちはどこへ消えていくのか? せっかく修了したのに、ほとんどの人が、受講後、機械学習から離れていくように見える。

自分は、これからもせっかく頑張った機械学習の勉強を続けていきたい。

さて、これから何をするべきか?以下の記事が参考になった。

以下、思いついた学習プランを列挙。鬼速 PDCA を回しながら、2 年間かけて実行していく予定だ。

数学の勉強

大学の数学を忘れてしまったので、やり直したい。やり直しプランは以下に書いた。

他の MOOC を受講する

他の MOOC を受講してみるのもよいかもしれない。よきロールモデルを見つけた。

この人のように片端から MOOC を受けてみるのはよいかもしれない。

必ず挫折しそうだけれども、次はこれを受ける予定だ。

Neural Networks for Machine Learning

Hilton 先生は、Deep Learning のブームの火付け役の人。これはすごい。

Udacity にも Udacity 創立者の Sebastian Thrun 先生が講師の授業がある。

python で課題をやり直す

おもしろいリポジトリを github で見つけた。

まだ試していないけれども、README によると、python で Assignment を提出できるらしい。 このスケルトンリポジトリをつかって、python で 復習するのもよい。

また、ネット上には、多くのひとが Python で Assignment をやり直している。

この本も気になっている。ベストセラーの本。これを読みつつ、Python と戯れるのもいとをかし。

書籍での学習

簡単な書籍から入って深いところまで、勉強していくというルートもある。

なにしろ、変化が早い分野なので、矢継ぎ早に今年も良書が出版されるだろう。

Amazon や オライリーの動向を常にチェックしていよう。

TensorFlow で遊ぶ

勉強だけでは飽きてしまうので、自由に遊びながら学のもよい。

TensorFlow がブームなので、 TensorFlow のチュートリアルを読みつつ、DeepLearning を勉強しようか。

最後に

自分は、頭が悪い。具体的には、IQ が 80 台だ。 ある人が簡単に理解できることも、自分には難しい。 それでも、努力は才能で克服できると信じている。

そして、目指すは、PRML(パターン認識と機械学習)。 今のレベルでは、読めないので 1,2 年くらい回り道をしてから挑む。

PRML 読破後は、機械学習に関わる仕事をする。社内にあればいいのだが・・・。

これから数年間は、機械学習(と英語)に全力を傾ける。 大学生のときに遊んでいたつけを今こそ返すときだ。 本気で数学と機械学習の勉強をしよう。

なにはともあれ、coursera の Machine Learing を挫折しないで完走を目指す!!

追記

coursera Machine Learning 修了しました!! certificate

08 Jan 2017, 04:24

coursera で Programming Languages を受けた

coursera で Programming Languages を受けた。

概要

ワシントン大学の CS のコース。3 つの言語、SML、Racket、Ruby を通じて、プログラム言語のエッセンスを学ぶというコース。

なぜこの3つの言語かというと、以下のようなマトリックスで説明される。

                dynamically typed   statically typed

functinal Racket SML object-oriented Ruby Java/C#/Scala

  • ML: polymorphic type, pattern-matching, abstract type & module
  • Racket: dynamic typing, “good” macro, minimalist syntax, eval
  • Ruby: classes but not typed, very OOP, mixens

つまり、関数型言語、オブジェクト指向言語、動的型付け、静的型付けを バランスよく学ぶためにこの3つが選ばれたのだ。

講義は、関数型言語、オブジェクト指向言語、動的型付け、静的型付け の各特徴を比較しながら、コンセプトを解説していく。

感想

とてもハードな内容だった。StudyPlus で勉強時間を記録していたのだけれども、 各コースにかかった時間は以下のとおり. 150時間くらい。

  • Part A 72h
  • Part B 33h
  • Part C 52h

Assignment の目安は 3 時間となっているけれども、とてもそんな時間ではできなかった。

A,B,C を平行して受講したので、年末年始地獄を見た。全然時間が足りない。 1 日 12-15 時間くらいこれにかかりきりだった。

Assignment も難しく、何度もカンニングした。 本当は自力でときたかったけれども、力足らず解けなかった。 しかし、Assignment の内容は骨のある楽しい内容だった。詳しくは後述。

英語力がないことを痛感。 いろいろと力説していることの意味が把握できなかった。 この一年、英語力の向上に力を入れてきたのだけれども、それでもほとんどダメ。

関数型言語、オブジェクト指向言語、動的型付け、静的型付け、それぞれの特徴や比較が 興味深かった。言語もいろいろな特徴があり、一長一短あることを知った。

Emacs をエディタとして推奨しているところがいい。Emacs Love.

Part A

言語は Standard-ML を使う。 なぜなら、文法がシンプルで、初学者に使いやすいからとのこと。

SML を利用して、関数型ブログラミングのエッセンスを学んでいく。

week1

week1 では、プログラミングはしない。 コースの説明と、環境設定(Emacs や SML のインストール)まで。

week2

SML の基本文法を学ぶ。

  • 変数宣言
  • 関数宣言
  • if - then - else
  • 変数のスコープと内部変数(let)

基本データ型についても学ぶ

  • Pair
  • List
  • Tuple
  • Option(これが特殊)

Assignment は日付に関する関数を作成していく問題。これは難しくなかった。

week3

  • データ型(Datatypes)
  • パターンマッチ
  • 例外
  • 末尾再帰

パターンマッチの便利さに開眼。

Assignemnt は、文字列操作に関する関数を作成していく問題。

week4

  • 第一級関数
  • 高階関数
  • 関数クロージャ
  • 無名関数
  • map,filter
  • レキシカルスコープ

week5

  • type interface(型推論, ポリモーフィズム)
  • Mutual Recursion
  • modules
  • equivalence
  • Exam

Part B

Lisp 系の言語はいろいろ経験がある(Common Lisp ,Scheme, Emacs Lisp,Clojure) ので、それほど苦戦することはないだろうと思っていたが、とても苦戦した。

なにが苦戦したかというと、

week1

  • Racket の文法(cons, car , cdr … etc)
  • 遅延評価
  • ストリーム
  • メモ化再帰
  • マクロ(Optional)

Assignment でやたらとストリームが出てくる。手強かった。

week2

  • struct
  • インタープリタとコンパイラ
  • インタプリタの実装方法

Assignment は、MUPL という独自言語のインタプリタを Racket で書くこと。 意味が分からなすぎて泣きそうになった。

Honor Code とかもうどうでもいい(どうでもよくはないが・・)

github にある他人のソースコードを読んで理解するのがやっとだった。(理解すらできない!)

week3

  • 動的型づけ言語と 静的型づけ言語の比較.
  • Exam

Part C

week1

  • Ruby の文法
  • Duck Typing
  • Arrays, Hashs
  • block, proc
  • SubClass
  • Overriding, Dynamic Dispatch

Ruby は業務で使ったことがあるので、文法は問題なし。

assignment は テトリスのゲームの仕様拡張。 動作するコードが与えられて、継承を使って機能を追加する。 コードを読む力が試される。

と、ここでさっそくサンプルが動かない!Ruby2.3 では動かないみたい。 親切なおじさん現れて、解決用のスクリプトを公開してくれていた。

week2

  • Function Decomposition
  • Double dispatch
  • Multiple Inheritance
  • Mixins
  • Interfaces

Assignment は SML(FP)でかかれたコードを Ruby(OOP)にポートする。

week3

  • Subtyping
  • Final Exam

サブタイピングにについては、意味不明だった。

日本語情報もほとんどないから理解は諦めた。

最後に

今回、初めて MOOC にお金を払ってコースを受講した。 なぜなら、現在休職しているのだが復職の条件の一つがプログラミングの勉強をすることだからだ。 なので、certification があれば、プログラミングの勉強をしたという証明になると思った。

普段は途中で諦めてもいいやと思って受講していたけれども、お金を払うとやる気がでるね。

取得した cartification は以下。

19 Dec 2016, 03:14

成功は自分で決めて進むもの!coursera で Success を受けた

Success という講座を coursera で受講しました。

成功とはなにか?どのようにして成功するか?

成功とはなにか?それは、ひとそれぞれで異なる。人の数だけ、成功の定義がある。

大切なことは、自分の成功を自分で決めて、成功するために進むことだ。

この講義では、以下の質問対して回答を出すことが求められる。

  • Definition of success(成功とはなにか?)
  • Plan for Achieving Success(どのようにして成功するか?)

関連記事

ウォートン・スクールの本当の成功の授業

講義の内容は、以下の本を抜粋して説明されている。なので、英語が苦手な自分は日本語の本を参照しながら、講義に取り組んだ。

video のなかで、引用されるエピソードはほとんどすべて本の中に載っている。本がないと、自分の英語力では、自分は内容を理解できなかった。

感想

英語わかんねー。この一年英語に力を入れてきたので、問題ないかなと思っていたけれども、 半分くらいしかききとれなかったよ。本がなければ、挫折してた。 プログラミング系の講義はなんとなくわかるけど、人文系はまだまだついていくのがつらいことがわかった。

でも、この講義、受けてよかった。

現在、うつ病で会社を一年間休職している。 将来がまったく見えず、この先どうすればいいのか分からなかった。 強い言葉をつかうと、絶望的だった。毎日落胆し、落ち込んでいた。

そんなとき、一筋の光が見えた気がした。 安心感が芽生え、それと同時に自分への自信と将来に対する前向きな見通しが手に入った。 今は、とても清々しい気分だ。

成功の定義は決めた。計画は立てた。この先10年の見通しはたった。 あとは、実行するのみだ。人生がわくわくしてきた。よし、やるぞ!!

講義メモ

week1

簡単なガイダンスのあと、「6つの人生」の演習というものが課される。

6人の人物の経歴が紹介されて、それを読み、どれが自分の持つ成功の価値観に近いかを判定する。 それによって,自分にとっての成功のイメージを明確化できる。

また、成功には内的側面と外的側面があると説明される。内的側面とは、幸せ、満足感、愛。外的側面とは、地位、名声、金。

week2

成功するための素質について語られる。それは、身近なところにあり、探しに行くものではないといわれる。 そして、成功の様々な考えがしめされて、自分の成功を定義するように求められる。

また、” The Legacy Exercise: Reflecting on Your Family”という, pair-grade-assignment が課される。あなたが家族や親戚から受け継いだものについての英作文。

week3

Steve Jobs のスタンフォードスピーチが引用される。

成功とは、幸せになることか?3 つの幸せが紹介される。

  • Momentary Happiness(瞬間的幸せ)
  • Overall Happiness(総合的幸せ)
  • Deep Happiness(魂の幸せ)

Quiz として SAME と呼ばれる心理テストが課される。

自分の結果は以下。

社交的スタイル 行動傾向 思考傾向 感情的気質


内向性 100 計画型 25 実用型 50 情熱型 50 協調型 50 張り詰め型 50 分析型 50 現実型 75 平和型 25 決行型 50 革命型 75 感情抑制型 100 率直型 100 慎重型 50 特化型 75 ストレス虚弱型 50

week4

成功には二種類ある。

  • inner success … Happiness
  • outer success … Achevement

死を意識することで、人生に対するモチベーションが上がる。

お金を意識しなくすることで、新の人生のゴールが見えてくる。 人生のゴールを5,6個書き出してみよう。

仕事には3種類ある。あなたは、どの種類の仕事に従事しているか?

  • job 労働
  • carrior キャリア
  • calling 天職

PERFECT … あなたの仕事の気持ちを燃え立たせるもの

  • P: 個人 の 成長 と 発展
  • E: 起業家 的 独立 性
  • R: 宗教 的 または 精神的 アイデンティティ
  • F: 家族
  • E: アイデア・発明・芸術 を 通し た 自己 表現
  • C: コミュニティー( 大義 に 身 を 捧げ、 支援 の必要 な 人々 を 助ける
  • T: 才能 を 磨く 努力

3 つの名言

It is only when we have the courage to face things exactly as they are, without any self-deception or illusion, that a light will develop out of events, by which the path to success may be recognized. I Ching

Everything you need to be happy is simple EPICTETUS

The unexamined life is not worth living. PLATO

Final Assignment

以下に対する自分の考えを 500-700word のエッセイとして、提出することになっている。

  • Definition of success(成功とはなにか?)
  • Plan for Achieving Success(どのようにして成功するか?)

自分は以下のような回答を提出した。

My definition of success is below.
  - Earn money by using mathematics and programming, 
    contribute to the development of the technologies.
  - Make effort everyday, have a purpose and enthusiastic for my carrier.
  - Using English fluently, became a great software developer.
  - Have a comfortable family.

I am a software developer. I graduated from the university. 
My major is computer science and mathematics.
After graduated from the university, I have never used mathematics knowledges.
But What I really want to do is to apply mathematics knowledges to the technologies.
So I defined that my success is to earn money by using mathematics and programming.
This is outer success.

Inner success is to have a peaceful, comfortable family.
Now I'm single and don't have girlfriend.
But I'm 30 years old. I need partner and I want to have a children.

My Plan for Achieving Success
  - short-term goal
    - get TOEIC L/R 900 score
  - middle-term goal
    - Practice English writing and speaking skill.
    - Learning machine learning.
  - long-term goal
    - Get a job that is needed machine learning knowledge.
    - Contribute Open Source Software.
    - Get a state-of-the-art information from the Internet in English.

I am Japanese. I'm not good at English. 
English skill is necessary. So the most important skill for me now is 
learning English. TOEIC is suitable to measure my skill. 
But TOEIC can't measure writing and speaking skill.
So After I will get TOEIC 900, I shift my study plan to output my thinking in English.

And also, my definition is using mathematics and programming, machine learning is 
suitable for my dream. I plan to study machine learning by using MOOC.
And my goal is to change the Career that use machine learning skill.

And after change my career, I contribute to the development of the technologies.
And do some interesting and exciting things by using learned knowledges.

To Success, I always these word keep in mind.
  - go by short step, and reach big goal.
  - stable understanding is more important than speed.
  - when I don't study, think why I study.
  - to emphasize the process rather than result.
  - Motivate humiliation
  - Time is limited to reach the goals.
  - Don't compare myself to other people.
  - Believe myself and always believe my success.
  - Talent can be overcome with effort.
  - Believe that Effort is always rewarded.

these are my beliefs.My Success image is claiming the mountain.
step by step, I get a skill to do a big task.
As Steve Jobs says, I decided to think that today is the last day of my life everyday.
And make effort every day. I recently read the book, GRIT.
It says that Talent can be overcome with effort.
I am not smart. but I believe my possibility to success.


Finally, I am now not working. I take a sick leave because of depression.
I'm depressed patient.I don't work for 1 years. 
I really confused about my life. Before taking this class, I can't see my future.
But now I can see the future. My goal is clear. 
All I should do is to ride on the train that will go to the success.
Now I don't have any anxiety. I do my best. I have a confidence.

Thank you for the great MOOC course.

25 May 2015, 11:29

リアクティブプログラミングの世界観を垣間見!coursera で Principles of Reactive Programming を受けた

最近流行りの リアクティブプログラミング の講座が coursera で開講されたため、 ちょっと背伸びをして受講してみました。

結果から言うと、Scala の知識が足りずに途中で挫折しました。

一応感想を簡単に書いとくか。。〆(・ω・* )

内容

スーパースター講師勢ぞろい

まず、この講座の講師陣がすごい.

  • Martin Odersky … Scala 生みの親
  • Erik Meijer … へんなおじさん
  • Roland Kuhn … Akka チームリーダ

いずれも各分野におけるプロフェッショナル.

ちなみに、Oderskey さん、Erik Meijer さんの 講座は以前受けたことがあります.

Functional Reactive Programmig(FPP)

week1,2 で、Odersky さんが Functional Reactive Programming に関する 話題を説明します. よくネット上で話題になるのも、この辺の話.

RxScala

week3,4 で、Meijer さんが RxScala の話をします.

Meijer 氏いわく、以下の4つが 代表的な副作用なのだと. この 4 つの概念を順番に説明していくという内容.p

Try Emumerable


Future Ovserver

以下の動画でも、同じ話題が話されている.

Akka

最後に、week 5,6,7 で Roland Kuhn 氏が、Akka を通じて Actor モデルの説明をする.

また、その延長で 分散システムにおける フォールトトラレントなプログラミング手法に関しての話題がある.

感想

途中で挫折…

自分は、Scala の文法がよくわからないまま受講していたので、 途中で Assignment ができなくなって、挫折してしまった…

うーむ、基礎体力が足りなかった. とても悔しいので、もう一度この講座が 開講された時には、再び受講したいと思った.

リアクティブな世界を覗き見た

リアクティブプログラミングについて、概念的な話は知っていたが、 コードを通じてその世界をかいま見ることができた.

ネットで記事を読んでいると、

  • Monadic Programming はすごい!
  • Actor モデルは便利!

という話題をたまに見かけるのだけれども、ほんの入り口を体験した.

分散システムとリアクティブ

分散システムのシステム制御 は、これからも自分の仕事では関わり続けていく領域 なので、week6,7 で出てきた話題は、もう少し知りたいと思った.

今回は理解できなかったので、いつか理解しようと思って、書籍を購入. なんと、以下の書籍はこの講座を受講すると半額で購入できるとのことだったので、 衝動買いした。

また、この分散プログラミングで出てきた話題は、 つい先日まで受講していた 講座ともかぶる部分があった. 概念をコードから覗くことができた.

Akka や Erlang は 言語として フォールトトラレントな制御をサポート しているので、自力で分散システムのための仕組みをプログラミングした としても、それは車輪の再発明なんだなと思った. 世の中に転がっている OSS を理解し、自分の開発に取り入れねばと思った.

24 May 2015, 17:32

ハードウェアの仕組みを学ぶ!coursera で From Nand To Tetris Part1 を受けた

数か月前に コンピュータシステムの理論と実装 という本が発売された.

そして、この本の発売とちょうど同じタイミングに coursera で From NAND to Tetris の講義が始まった.

あまりにグッドタイミングなめぐり合わせに喜びつつ、講座を受けてみました.

FROM NAND TO TETRIS の紹介

有名なコンピュータ講義とその教材

これは、海外では有名なコンピュータ講義である

TED にも登場して講座の紹介をしているよう.

特徴

講座の特徴は、NAND というもっとも基本的な論理素子から、 毎週自分の手でコンピュータに必要な部品を作成していくところ. 難しく聞こえるかもしれないけれども、 そこはよく講座ができているので、なんとかなる.

実際の VHDL や C 言語などをつかうのではなくて、 学習用に開発された Hack 言語というものを利用する. この Hack 言語というものが、実際のコンピュータのエッセンスを残しつつ、 余分な仕様をはぎおとしてシンプルにしているため、 学習者は最低限の努力と知識で部品をつくることができる.

また、各週ごとに部品が完成しなくても、次の週に進むと、 あらかじめ用意された、前回までのツールが利用できるので、 途中で挫折することはない. 毎週、あらたな気分で挑戦できる.

著者直々の講義

Noam 先生と Shimon 先生直々に動画で説明をしてくれる. ここに、coursera とともに学習を進めることのうれしさがある.

自分は、動画を一通り見た後に、参考程度にコンピュータシステムの理論と 実装の本をながめるようにしていた.

coursera の講義は、Part1, Part2 にわかれて提供される. 今回は、Part1 で、ハードウェアの部分を学習した.

毎週の講義と参考書の章は 1 対 1 で対応していて、 毎週 1 章を読んでいく.

また、毎週 assignment として、部品の作成をして、 成果物は coursera の採点システムに提出する.

感想

山登りに似た達成感

コンピュータの部品を一歩一歩部品を作成して行くことで、 途中から自分の作成した成果を見直すと、山の頂上に立ったような達成感、 全能感を感じることができた.

抽象によるコンピュータの構築

また、NAND という単純なゲートから、徐々に部品を組み上げていく様は、 まるで、単純な公理から定理を導いていくような趣きもある.

一つの部品を作成すると、部品がどうやって動くのかということを ブラックボックスにすることができて、部品は何をするのかだけを知ればよい.

それは、ソフトウェアでもよくでてくる抽象化というやつだ。

邦訳の 抽象と実装 という意味を実感した.

ハードウェアがなんなのかということがわかった

自分は組み込みソフトの開発者なので、ハードウェアを理解していないこと で、話について行けなくなることがたまにある.

先日も、ハードよりの講演会に参加したのだが、話を聴いていてもまったく わからずに悔しい思いをした.

CPU, レジスタ, メモリ, などなど、説明を読んで理解していた気になっ ていた. 今回、自分の手で作り上げることによって、それらがいったいなに をやっているのか、理解できた気がした.

それらは知らなくてもいいこと

しかし、ハードウェアの知識はソフトウェア開発に必要かといえば、 必要ないことだ。

自分自身の人体の仕組みをしらなくたって、人間は生きていける. 機械語を理解することと、DNA を理解することは、 同じことだとともう. それらは、必要ない.

では、なぜ学ぶのかといえば、一つは好奇心、もう一つは不安感のため. 知らなくたってなんとかなるものの、得体のしれないブラックボックスの 中身を知らずに使いつづけるのもあまり気分がいいものではない. なので、不安感を解消するために、安定感を得るために、学ぶ.

自分の組んだプログラムがハードウェア上でどのようにして 動作するかを知ることにより、ソフトウェアに自信を得ることができる.

勉強メモ

以下、作成した部品のメモ.

week1: ゲートへ

論理ゲートとは、ブール関数を実現するための物理デバイス.

ゲートをまとめたものを回路, チップという.

トランジスタ

2 値のデータ表現を電気で実現する物理デバイス. スイッチング技術.

電気であることが一つのポイント. 別の物理性質を用いてゲートを作成することもできる.

NAND

もっとも基礎的な論理ゲート.

論理ゲート

すべてのブール関数は NAND NOT をつかって表現できる. (AND, OR, NOT ) を含む.

  • NOT (x) = (x NAND x)
  • AND (x, y) = NOT (x NAND y)
  • OR (x,y) = NOT (NOT (x) AND NOT (y))

NAND を実現した物理デバイスが自由に利用できれば, どのようなブール関数もハードウェアとして作成できる.

マルチプレクサ

ふたつ以上の入力をひとつの信号として出力する機構.

マルチプレクサによって、ハード的に if 文を表現することができる.

作成した成果物

これらの部品は、HDL で作成していく.

  • And
  • Or
  • Xor
  • Not
  • Not16, And16, Or16, Mux16 … 16 進数の 論理ゲート

  • Mux … マルチプレクサ

  • DMux … デマルチプレクサ

  • Mux8Way16, DMux8Way, DMux4Way .. 16 進数のマルチプレクサ

week2: ALU へ

算術ゲートは、算術計算をおこなうためのゲート.

コンピュータの命令は 2 進数の加算に還元できることが多い.

算術計算を行うゲートは、ALU という CPU 内部の論理算術ゲートに集約される

作成した成果物

  • HalfAdder … 半加算器
  • FullAdder … 全加算器
  • Add16 … 16 進加算
  • Inc16 … 16 進インクリメンタ
  • ALU … 論理算術ゲート

week3: Memory へ

この章で、*状態* という概念がでてくる.

順序回路

ひとつ以上のフリップフロップ回路が組み込まれているもの.

以下のような機能をもつ.

  • 状態を保つ
  • 状態を操作する

状態がかわるのは, クロックが次の周期に移行したとき. (c.f. 組み合わせ回路は即時)

(D) フリップフロップ回路

順序回路の中でもっともプリミティブなもの. NAND とともに, もっともプリミティブなものとして考えられる.

フリップフロップ回路の実装方法はいろいろある. NAND から構築する方法もある.

レジスタ

データを記憶したり取り出したりすることができる順序回路. - レジスタ (コンピュータ) - Wikipedia

メモリ(RAM)

レジスタがたくさんあつまったもの.Random access Memory.

各レジスタには、一位のアドレスが割り振られている.

作成した成果物

  • Bit, Register … レジスタ
  • RAM8, RAM16, RAM64, RAM512, RAM4K, RAM16K … RAM
  • PC … プログラムカウンタ

week4: 機械語へ

機械語

機械語とは、コンピュータの CPU で直接実行される一連の命令.

一つ一つの命令が行う仕事は極めて限定されており、 CPU のレジスタやメモリ上の単位データに対して、 読み込みやジャンプ、ALU といった操作を実行する。

機械語は, レジスタ、プロセッサを用いて、メモリを操作する.

作成した成果物

  • 乗算プログラム
  • 入出力操作プログラム

week5: コンピュータアーキテクチャへ

CPU

中央処理装置, プロセッサとも.

仕様で決められた一連の命令セットを実行できる.

記憶装置上にあるプログラムと呼ばれる命令列を順に読み込んで 解釈・実行することで情報の加工を行う.

ノイマン型アーキテクチャ

CPU を中心として、メモリデバイスを操作し、 入力デバイスからデータを受け取り、出力デバイスへデータを送信する.

  • メモリ
    • データメモリ
    • 命令メモリ メモリ上にプログラムを保持するところがノイマン的.
  • CPU
    • ALU
    • レジスタ
    • 制御ユニット
  • レジスタ
    • データレジスタ
    • アドレスレジスタ
    • プログラムカウンタレジスタ 次にフェッチする命令メモリ上のアドレスを保持して、 一つ命令を実行する度にインクリメントしていく.
  • 入出力装置 メモリマップド I/O によってメモリ操作のように制御

作成した成果物

  • CPU
  • メモリ
  • コンピュータ

week6: アセンブラへ

アセンブリ言語

機械語を人間にわかりやすい形で記述する、代表的な低水準言語である.

作成した成果物

  • アセンブラ

これは、Ruby で実装してみた.

12 Apr 2015, 13:43

仕事に関わる知識を MOOC で! Coursera で Cloud Computing Concepts Part2 を受けた

file:./../img/IMG_3914.JPG

はじめに

Coursera で, クラウドコンピューティングの講座を受けました. これは, Part2 です.

Part1 の感想は以下です.

内容

講義

以下の内容を扱う.

  • Leader Election, Mutual Exclusion
  • Concurrency Control, Replication Control
  • Stream Processing, Graph Processing, Structure of Networks, Scheduling
  • Distributed File Systems, Distributed Shared Memory, Sensor Networks
  • Security, Datacenter Outage Studies, Wrap-up

コースの進みかたは Part1 と同じだ.

たくさんのコンセプトや考え方が次から次へと紹介されるので, すべてを消化できない..そして, 早口の英語の説明が困る.. \^-\^;

内容や課題は, Part1 を引用していることもあり, Part2 は Part1 が終わってから取り組んだ方がよい.

宿題

プログラミングの宿題は, Key-Value Store の実装. この課題に取り組むことで,

  • replica の扱いかた,
  • key-value store の考え方.
  • quorum consistency level の考え方.

などが学べる. 言語は C++. 自分には難しくて, 満点をどうしてもとれずに途中で諦めた.

こころにのこった考え方

こころにのこった考え方をコメントともに書く.

Leader Election

こういうロジックを考える仕事をしていたので, Leader Election ロジック は感銘を受けた. 以下, 記事にした.

Replication Control

もともとがストレージ屋なので, レプリケーションの技術とは馴染みがある.

昨今, 急激に台頭してきた分散ストレージのなかで使われている KVS や Replication の知識を補充することができたことは価値があった.

以下, 勉強メモ.

分散 KVS

分散 Key-Value ストア. スケールアウト技術の基幹技術.

同じデータを複数のコンピューターに複製して保存し, それぞれのコンピューター上のデータに変更が起きていないかどうかを 随時チェックすることによって整合性を確保. リアルタイム性はない.

Key で担当サーバを分ける.

たいていはいくつかのサーバ上に複製 (replica) を作成することによって 耐故障性を高めている.

Replication

レプリケーション. 複製.

データ複製.オブジェクトをコピーし, ノード間で複製を保持することで 冗長性を高める手法.

システム障害時の継続運用が目的となります. 災害時に接続しているシステ ムが壊れてしまったとき, 遠隔地にある複製データを利用し事業継続を実現 する DR (ディザスタリカバリ) に有効.

コンテンツ配信する方法は二つある.

  • Passive Replicatoin .. Master Replica だけを更新
  • Active Replicatoin .. id ごとにすべてを更新.

Distributed File Systems

現在の業務は, SMB プロトコルの高速化についての研究開発.

講義では, NFS を例に, 分散ファイルシステムの特徴や, NFS における高速 化技術を解説していた. 仕事にからんでいる領域なので, きいていておもしろい. 印象としては, NFS は高速化のための仕組みがた くさん試されている用に見えた. SMB は….

以下, 簡単な勉強メモ.

分散ファイルシステムの特徴

分散ファイルシステムの目的は, ユーザから ファイルかリモートにあるかローカルにあるか意識しなくていいよう にすること.

2 つのアクセスモデルがある.

  • 遠隔アクセスモデル … リモートサーバにあるファイルを読み書き
  • アップロードダウンロードモデル … 一旦ローカルにダウンロードして 編集してからアップロード.

ローカルファイルにアクセスするときは, file discripter を指定する. file discripter には, read/write に必要な pointer が保持されているので, ユーザは, offset を指定しない.

リモートファイルにアクセスするときは file id と offset を指定する.

これからどうするか?

フォールトトラレントの情報をあつめる

信頼性の高い製品の開発に関わっていく以上, これからもフォールトトラレントは必要な, より深めるべき知識だろう.

フォールトトラレントについては, この領域で研究が盛んで本や論文もた くさんでている. こういうものをどんどん読み込んでいきたい.

特許ノルマが仕事で課せられているので, 集めた情報の Output として, 特許に結びつけたい.

日経コンピュータをよむ

今まで, お昼休みにフロアにおいてある日経コンピュータを読んでいた. しかし, 職場で席を引っ越したので, 現在日経コンピュータを読む 機会がない.

日経コンピュータは, クラウドコンピューティングの最新動向をつかむた めのとてもいい情報源なので, これからも読みたい. これはここでブログ に宣言することによって, 自分にプレッシャーを.

27 Mar 2015, 12:27

鮮やかにデータを可視化する! coursera で Exploratory Data Analysis を受けた

はじめに

R を利用してグラフを書く方法を学ぶために, coursera で Exploratory Data Analysis を受けた.

[toc]

R を利用してグラフを書く方を学べる内容

この講座は, 探索的データ解析を学ぶ講座. 探索的データ解析とは, 未知の関係性を データの可視化 によって探る方法.

といっても, 前半は グラフの書き方を学ぶ.

3 つの代表的なライブラリが紹介される.

  • Base: “artist’s palette” model
  • Lattice: Entire plot specified by one function; conditioning
  • ggplot2: Mixes elements of Base and Lattice

後半は, クラスタ分析を扱う. これもデータを可視化することで, データの関係性を調べる方法.

Exploratory Data Analysis:

未知の関係性を見つけることが目的.

可視化することで関係性を見つける.

  • To understand data properties
  • To find patterns in data
  • To suggest modeling strategies
  • To “debug” analyses

基本的な手法

  • Five-number summary
  • Histograms
  • Density plot (Scatter Plot)
  • Boxplots (for Numerical Data, ヒゲ)
  • Barplot (for categorical Data)

感想

部内意識調査アンケート

この講座をとったのは, 職場でアンケート調査をする機会があったから. これは, 学んだ統計的手法を生かす絶好の機会だと思った.

集計したデータをまとめて可視化するスキルの取得か急務だったので, 取り組んだ. こういう, 目的があるときは知識の吸収がはかどる ( \^ω\^ )

今まで, R に標準搭載されていた base package で グラフの描写を していたのだが, ggplot2 の qplot をつかうことで良さげなグラフがかける ことに喜んだ. 参考書には, 以下を利用した.

しかし, Excel に嫉妬…

R でグラフを書くには, スクリプトで設定を指定する必要があるので, 使いこなすまでに時間がかかる. なにを指定すれば, どんな図が生成され るのか, いまいちわからない. 試行錯誤しながらも, なんども試しつつ, ようやく一つのグラフをプロットできる. そんな繰り返しだ.

アンケート結果をなんとか R をつかって棒グラフで可視化してみた. しかし, すでに同僚が Excel をつかって帯グラフと折れ線グラフを ちゃちゃっと作成していた…

これには, ショックを受けた. 自分は, 結構苦労して R でグラフ をかけるようになるまでにけっこう時間がかかった. しかし, Excel つかえば, だれでも簡単に, それなりのグラフが作成できてしまうのだ.

Excel すごいと思うとともに, 嫉妬…

もしかしたら, 本格的なデータ解析をする場合以外は, R は必要ないのかも しれない.普通の一般人は, R をつかうよりも Excel を利用するほうが, 学習対効果においてよいのではないかと思う.

CLI と GUI

しかし, 自分はすでに中途半端に R を学んでしまった. こうなったら, い くところまでいこう. Excel にはもう戻れない, 戻らない!!

R と Excel の関係は, CLI と GUI の関係と同じ.

CLI は身につけるまでは苦労するが, 一旦身につければ GUi よりも高い 生産性が出せると信じている.

22 Mar 2015, 05:20

分散システムの専任アルゴリズム (Election Algorithms) の学習メモ

要約

分散システムにおける専任アルゴリズム (Election Algorithms) の学習メモ.

代表的なアルゴリズムには, 以下がある.

  • Bully Algorithm
  • Ring Algorithm

背景

以前の記事のつづき.前回は, 異常検出についての古典的なアルゴリズムを記事にした.

今回は, 異常を検出したあとの動作についてメモ. coursera で Election Algorithms を学習した.

Master 決定の論理でも, 古典的なアルゴリズムがすでに存在することに驚いたので 詳しくしらべてみた.

Leader Election

選任アルゴリズム.

通常, 分散システムでは, Coordinator が存在する. Coordinator で異常が発生したさい, 次の Coordinator を決定する必要がある.

また, 異常な Coordinator が復旧したときに Coordinator を戻す必要がある.

古典的な Coordinator を決定するためのアルゴリズムは以下.

  • Bully algorithm
  • Ring algorithm

実際の実装例.

  • Google Chubby
  • Apatch ZooKeeper

Bully Algorithm

Bully (ガキ大将) アルゴリズム. つよいものが勝つというもの.

3 種類のメッセージがある. * Election Message: Sent to announce faster election * Answer Message: Respond to the election message * Coordinator message: Sent to announce the identity of the elected process

手順は以下

  1. あるノードが Master の異常を検出したとき, Election を開催する. Master が異常状態から復旧したときも, Election を開催する.
  2. あるノードは自身よりも高い ID をもつノードにたいして, Election Message をおくる. (生存宣言)
  3. Election Message をうけとったノードは, Answer Message をかえす. そして, 自身よりも高い ID をもつノードにたいして, Election Message をおくる.
  4. 2, 3 が続いた結果, どのノードからも応答がない, 送信するノードがな い場合に, そのノードが Master となる. Master は Coordinator messag をおくる.

Ring Algorithm

リング上にノードの ID が割り振られる. あるノードは自身のとなりにならぶノードにメッセージを送る.

となりとなりにメッセージをおくることで, リングを一周したら, リングを構成するノードの生存確認がとれるので, もっとも高い ID をもつノードが Master になる.

Bookmarks

おわりに

以前はストレージ装置における異状検出機能を担当していたことはすでに書いた.

Master-Slave 構成において, Master で異常が発生した際に, 次期 Master を決定する必要がある.

自分の所属していたチーム内ではこのロジックを 次期 Master 決定論理 などど呼んでいた. 自分たちでなんとなく考えたものだった.

世の中をみわたせば, この領域は Election Algorithms と呼ばれていて, 研究も進んでいるのだった.

この分野は 自分がはじめて出した特許に関係する部分だったので, 自身の無知をしった.

07 Mar 2015, 11:56

システム制御は奥が深い! 井戸の中の蛙な自分.coursera で Cloud Computing Cocepts をうけた

はじめに

coursera で クラウドコンピューティングを学ぶ講座をとりました.

分量が多いので, Cloud Computing Concepts は Part1,2 に分かれている. 今回は, Part1 についての記事.

これは, クラウドコンピューティング 3 シリーズのなかのはじめに位置する講座です.

  • Distribute Systems
  • Cloud Application
  • Cloud Networking.

内容

内容は分散コンピューティングについての古典的な理論から, 最新の研究の話題まで, 幅広い.

Part1 では, 以下を学んだ.

  • Introduction

Clouds, Mapreduce, Key-value stores

  • Classical Precursors

Peer-to-ppeer systems, Grids

  • algorithms

Gossip, Membership, Paxos

  • Classical algorithms

Time and Ordering, Snapshots, Multicast

NoSQL や P2P の最前線の話題についても触れる.

動画がとても早口 (通常速度で x1.3-5 くらい?) あまり英語を聞き取れず. もっぱら以下の本の該当個所を読みながら進めた.

プロクラミングの課題もある. C++ で実装する.

感想

以前の仕事について

この記事とかぶる部分もあるが, もう一度.

今働いている会社の部署は, サーバやストレージ製品の制御ファームをつくっている. クラウドコンピューティングに関わる製品の設計開発だ.

そして自分はというと, 今でこそ名実ともに窓際族であるので 部署の仕事とまったく関係ない遊び人をしているが, かつてはストレージ製品の開発に関わってた.

自分の担当していた機能は, 異常検出.

2,4,8 ノードのそれぞれ独立した RAID コントローラが, それぞれを互いに監視しあう. あるコントローラで異常が発生したときは, 別のコントローラが異常をすばやく検出して, エラーリカバリを実施する.

なので, 以今回学んだことは前の仕事にかなり関わってた.

あまりに無知だった

8 ノードでの異常検出について自分の頭でいろいろ考えた.

自分の知らないところでは, そのような知識は体系化されて, 理論的な裏付けがされていて, 改良されていることなど, 想像だにしなかったことだった.これには, とても驚いた.

以下, 具体例をあげる.

Failure Detector/HeartBeating

異常検出については, 以前の記事でまとめた.

Membership List

自分の関わってきた製品は, 最大 8 ノードまでだったが, 今後はノードが動的に追加できる, スケールアウト型ストレージの需要がでてくるかもしれない.

今までは, 固定の構成で仕様を考えていたが, 動的に変更されるような構成で仕様を考えることになるかもしれない.

スケールアウト型の制御方法で王道的な制御方法として MembershipList による制御があることをしった.

Consensus

Master-Slave アーキテクチャで制御しているとき, Master であるノードで異常が発生したさいに, 次の Master ノードを決定する必要がある.

また, 複数ノード同時に異常を検出した場合, 被疑個所がノードにあるの か通信経路にあるのかを決定して, たのノードと合意をとる必要がある.

このような, 複数のノード間で単一の結果について合意を得るプロセス は Consensus 問題と呼ばれていて, それに対して効果的なアルゴリズム の研究がされている.

システム制御は奥が深い! そして自分は井戸の中の蛙だった

自分の所属している部署は, 自称システム制御を得意としているが, それは井戸の中の蛙のような気がしてきた. いったい, なにと比較して得意だといっているのだろうか? 年月だけ重ねても, 世の中についていけなければ意味がない.

他のクラウド製品が, フォルトトラレント性を確保するために どのようなことをしているのか, まったく無知である. それらは企業秘密ということもあり, 特許で防衛しているところもある.

しかし, 世の中では, 分散コンピューティングの理論やアルゴリズムが 日進月歩で開発されていて, Yahoo, Google, Facebook などの先端企業は そのような技術を取り入れている.

新しい技術に対して無知であることは, 世の中からとりのこされるばかりか, 自分たちの仕事すらなくなってしまうおそれのある, 非常に危険なことだ.

継続して技術動向を追いかけていくような態度が必要だ. それは, 自分にも必要だが, 組織にも必要だ.