ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

オンライン機械学習

機械学習プロフェッショナルシリーズのオンライン機械学習を読みました。

タイトルはオンライン機械学習となっていますが、機械学習の基本的な学習アルゴリズムについて説明されている本です。特にオンラインでしか通用しない話だけでなく、半分くらいは基本的な説明が書かれています。

最初に読んだときは、勾配の求め方とループしか書いていない全然意味が分からない本扱いしてしまいました。courseraのMachine Learningコースを受講後に読んでみて、始めていろいろと意味が分かりました。この本をぱっと取ってみて良く分からないと思ったら、courseraから始めることをお勧めします。誤差関数と正則化を足した物がコスト関数で、このコスト関数を最小化させることが目的、くらいが頭に入っているだけでも全然理解が違いました。

AdaGradよりもモーメンタムを使った方が良いケースが紹介されているなど、実践を通した中での理論を厳選して紹介しているような本です。

性能評価のリグレット解析が良く分からなかったので、また勉強したら戻ってこようと思います。機械学習の本棚に置いておきたい一冊です。

Writing Compilers and Interpreters: その12

定数宣言のパースができるようになった。こういう定数の宣言をパースしてクロスリファレンスをかえると、

CONST
    epsilon = 10;
    limit = -epsilon;
BEGIN
END.

こんな感じで、integerということとその値が表示されるところまで来た。

***Definition.PROGRAM dummy_program_name ***

Identifier        Line numbers   
----------        ----------- 
epsilon         002 003 
                                Defined as: 1
                                scope nesting level: 1
                                Type form = 0, type id = integer
                                Value = 10
limit           003 
                                Defined as: 1
                                scope nesting level: 1
                                Type form = 0, type id = integer
                                Value = -10
				

少しずつ前へ。

Writing Compilers and Interpreters: その11

chap9は型システム。想像していたより難しい。一歩ずつ行かないと。

PROGRAM Test;
CONST
    epsilon = 1.0e-6;
TYPE
    rec = RECORD
            a : real;
	    x, y : integer;
	  END;

こういうコードに対して、シンボルテーブルをスタックにする。

Level 0がInteger等の組込型が定義されているglobal scope。Level 1がプログラムで使用する変数が定義されている Program Scope。
Lebal 2 がレコード型の変数が定義されているScope。レコード型が出てくる度にスコープを新しく作り、フィールドに他と同じ名前の変数を使えるようにする。

Writing Compilers and Interpreters: その10

chap8が終了。
for文などが動くようになった。面白くなってきた。

CASE文の処理で caseのラベルをキーにして処理を辞書に入れておくと、caseラベルが増えても一定のコストでジャンプできるハック。その辞書をメモ化するまでがセット。面白いが、いまいち速度的な意味があるのかよくわからない。

Writing Compilers and Interpreters: その9

chap6が終了。制御構造とか何にもないけど、変数の代入ができるようになった。
ふと気が付いたんだけど、定数の畳み込みの最適化って、実際にはインタプリタの実装と同じだ。

変数のスコープ、演算子の優先順序、型変換等、言語仕様にそって動く物がないと、最適化前、後で結果が変わってしまう。

整数と浮動小数点数の演算や、浮動小数点数同士の演算の順序とか、想像していたよりシビアで意外に最適化むつかしいなと気が付いた。

Writing Compilers and Interpreters: その8

手書きパーサー作成中。

BEGIN
    BEGIN {Temperature conversions.}
        five  := 3;
    END;
END.

これのパース結果をxmlで出力できるようになった。こんな単純なのだと良いけど、これから複雑になってきたときにxmlで良いのかは良く分からない。

<COMPOUND line="1">
    <COMPOUND line="2">
        <ASSIGN line="3">
            <VARIABLE id="five" level="0" >
            <INTEGER_CONSTANT value="3" >
        </ASSIGN>
    </COMPOUND>
</COMPOUND>

あとは少しずつパスカルのソースを複雑にしていく。