The King's Museum

ソフトウェアエンジニアのブログ。

プログラミング Gauche:4章〜6章

プログラミング Gauche の4章〜6章のメモ。ちなみにコードはここ

4章: Gauche の開発スタイル

  • Read, Evaluate, Print, Loop => REPL
  • リテラル
    • 数値、真偽値、文字、文字列
    • 1, 3.14, 2/3 => 単一トークン
  • 真偽値
    • #t, #f => #f 以外の値はすべて真
  • 文字
    • #\a, #\あ
  • 文字列
    • "abcd"
  • 読み書き不変性(read/write invariance)
    • REPL の出力はそのまま Gauche に与えることができる
  • 手続き
    • (<手続き> <引数1> <引数2> ...)
    • まずすべての引数が評価される
  • 束縛(bind)
    • (define <変数名> <式>)
    • (define (<手続き名> <引数> ...) <式> ...)
    • 呼び出し => (<手続き名> <引数> ...)
  • 基本の開発スタイル
    • プログラムを書く
    • C-x C-f で読み込み
    • scheme バッファで動作確認
    • プログラムを修正
    • C-x C-e で修正を反映
    • scheme バッファにて動作確認
    • 戻る

5章: プログラムの書式

  • 「スクリプト」、「モジュール」、「パッケージ」
    • スクリプト:実行可能な形式
    • モジュール:再利用可能なライブラリ
    • パッケージ:モジュールやスクリプトを配布可能にしたもの
  • スクリプト
    • 書かれている式を順に評価
    • main という手続きがあればそれを呼び出し
  • コメント
    • ; ⇒ 1行
    • #| |# ⇒ 囲ってる部分
    • #; 後ろのS式が一つ捨てられる
  • 慣習
    • ; ⇒ コードと同じ行に書いて、その行の処理を説明する
    • ;; ⇒ インデントに対してコメントする感じ
    • ;;; ⇒ 大きなコメントブロック
  • 名前と予約語
    • 予約語はない。再定義可能。
  • use
    • use: モジュールの読み込み
    • (use srfi-1) リストモジュール
  • SRFI
    • Scheme Request for Implementation
    • srfi-1 のリストライブラリと srfi-13 の文字列ライブラリをよく使う
    • Gauche ではよく使うものは組み込みでサポートされている

6章:リスト

  • リストのふたつの顔
    • インタプリタは入力されたリストを常に手続きとして解釈
    • データとしてリストを渡したい時はクオートをつける
    • 「クオートが付いていたらデータ。付いていなければプログラムコード」
  • クオート
    • 一度クオートすれば内部もデータになる
  • リストの操作
    • car, cdr, '()
    • (list 1 2 3) ⇒ 1, 2, 3 のリストを作る手続きを実行
    • '(1 2 3) ⇒ 1, 2, 3 のリストというデータを直接与える
    • (cons 1 2) ⇒ (1 . 2) ドット対
    • null?: 引数が空リストかどうか
    • pair?: 引数が空でないリストかどうか
  • クオートと eval
    • eval: データとしてのプログラムとして解釈する
    • (eval '(+ 1 2) (interaction-environment)) ⇒ 3
  • リストの走査
    • fold を使う
    • (<手続き> (... (<手続き> (<手続き> (手続き <初期値>)))...))
    • 繰り返し構文は再帰呼び出しの syntax sugar。
  • 式の前で #?= をいれると式と評価値を出力してくれる
  • cond 式
  • 末尾再帰
  • プログラム自身もリスト

プログラミングGauche

プログラミングGauche

Gauche/Scheme を勉強する(三度目の正直)

過去二回挫折した Gauche/Scheme の勉強を再開したいと思う。

www.thekingsmuseum.info

www.thekingsmuseum.info

今までは少しストイックに勉強しようとしすぎて挫折してしまったきらいがあるので、ゆるく進めていこうと思う。

ついでに、Evernote にまとめたメモも載せていこう。

1章: Lisp と Scheme

  • LISP: 数式処理向けに開発
    • LISt Processing
  • 「リストで表現されたプログラム」を受け取って、それを解釈する
  • S 式
    • 基本要素、もしくは、S式を並べて括弧でくくったもの
      • 1 は数値ひとつの S 式
      • * は記号ひとつ S 式
      • (* 2 3) は記号*、数値2、数値3からなる S 式
  • プログラムとして S 式を次のように解釈
    • (<手続き> <引数> <引数>, …)
    • ⇒ もともとはデータ形式。プログラムとしては M 式があった
  • Scheme はシンプルな言語仕様で組み立てた
    • lambda 式は、「レキシカルな環境を保持した手続き」(クロージャ)へと評価される
    • 手続き呼び出しは継続を伴った引数付き goto である
  • Scheme プログラマは抽象構文木を扱える

2章: Gauche の特徴

  • 手軽にプログラムを書いて試せるスクリプト処理系
  • 実用規模のプログラムまで、機能、性能でスケールする
  • 他の言語のアプリケーションに埋め込み可
  • ネイティブ binding もある

3章: Gauche の設計思想や誕生の背景

  • Perl からの影響
    • 正規表現リテラル
    • 文字列補間
    • モジュールシステム
    • DBI/DBD
  • Common Lisp からの影響
    • キーワード引数
    • オブジェクトシステム
    • コンディション

プログラミングGauche

プログラミングGauche

『失敗の本質 - 日本軍の組織論的研究』を読んで

久しぶりの投稿。というか今年初投稿だ…。

失敗の本質―日本軍の組織論的研究 (中公文庫)

失敗の本質―日本軍の組織論的研究 (中公文庫)

  • 作者: 戸部良一,寺本義也,鎌田伸一,杉之尾孝生,村井友秀,野中郁次郎
  • 出版社/メーカー: 中央公論社
  • 発売日: 1991/08/01
  • メディア: 文庫
  • 購入: 55人 クリック: 1,360回
  • この商品を含むブログ (304件) を見る

日本軍の失敗の本質は『陸軍の白兵戦思想』と『海軍の艦隊決戦』という過去の成功体験から逃れられず、組織が過度に適応してしまい、変わりゆく環境に適応できなくなってしまったことにある。

本書の言葉を借りれば

適応は適応能力を締め出す

ということ。

全体としてちょっと冗長で読みにくかったかな。 戦史って文字で読んでも全然頭に入ってこないね。

あと、漫画のジパングでよく見た人物がよく登場した(当たり前)。 ジパング読んでた時にはあまり理解してなかったけど、この本を読んで、大本営、参謀本部、軍令部、陸軍省、海軍省あたりの違いが理解できた。

ジパング(1) (モーニングコミックス)

ジパング(1) (モーニングコミックス)

寄付

ちょっとしたきっかけで毎月一定額を寄付してる。

寄付先は World Food Programという団体。

理由は、

学校で給食が出るようになると、親にとっては子供を学校に行かせる大きなモチベーションになる

という話を聞いて「なるほど〜」と思ったから。

この世界をよくするためには教育が重要だと思いますので。

よもやま話

WFP には本家団体と日本の代理店的な団体がある。

日本の代理団体の方に寄付すれば税制上の優遇措置がうけられる。 一方、寄付額の 1/4 くらいは日本での活動費として使われるため、実際には寄付額の 3/4 しか寄付先には渡らない。

それを元に日本で活動することで日本企業からの大口の寄付を呼び込めたりするわけだから、意味のある費用だとは思う。 でも、自分の寄付がなるべく直接活動に使われた方が嬉しいなぁ、と思って本家に寄付してみてる。

たしか寄付額の 93% がそのまま活動に使われる、と書いてあった。

月数千円からできるので、ぜひあなたも寄付してみてはいかがでしょうか。

http://www1.wfp.org/donate-now

小さく理解する

ちょっと必要があって Tensorflow.js を勉強している。

Tensorflow のようなボリュームのある新しいフレームワークを目の前にすると、わくわくする気持ちがある反面、「自分には理解できるのだろうか」という不安にかられる。

その不安を前にどうするか。

少し前までは、一度に大きなことを理解しようとしてうまくいかないことが多かった。結果として「とりあえず動くものを作る」という方法で不安を解消しようとする。でも、この方法では不安は解消されない。なぜなら、結局のところ対象を理解していないから。

最近は「小さく理解する」ことでこの問題が劇的に改善した。

必ず、シンプルで悩まずとも理解できるようなコードから始める。そうすると「自分でも理解できるんだ」という小さな自信が芽生え、安心感が得られる。難しい問題に出会ったとしても蓄積した自信と安心感によって、挫けることが少なくなる。挫けることが少なくなると、理解できる可能性がずいぶんと高まる。

「小さく理解する」というツールはここ最近の自分にとって欠かせないものになった。

Tensorflow.js は、このページから始めるのが「小さく理解する」のにちょうどよかった。

https://js.tensorflow.org/tutorials/core-concepts.html

// 2x3 Tensor
const shape = [2, 3]; // 2 rows, 3 columns
const a = tf.tensor([1.0, 2.0, 3.0, 10.0, 20.0, 30.0], shape);
a.print(); // print Tensor values
// Output: [[1 , 2 , 3 ],
//          [10, 20, 30]]

これなら僕にも理解できるからね。

Coursera: Convolutional Neural Networks を修了したよ

Coursera: Deep Learning SpecializationCourse 4: Convolutional Neural Networks を修了しました。

f:id:hjm333:20180522131500p:plain

内容としては次の通り。

  • Convolutional Neural Network (CNN)
    • Convolution
    • Edge Detection
    • Padding & Stride
    • Pooling
  • Network Architecture
    • LeNet-5
    • AlexNet
    • VGG 16
    • ResNet
    • Inception Network
  • Object Detection: YOLO Algorithm
    • Object Localization
    • Sliding Windows
    • Intersection Over Union (IOU)
    • Non-max Suppression
    • Anchor Box
  • Face Recognition
    • Verification vs Recognition
    • One Shot Learning
    • Siamese Network
    • Triplet Loss
  • Neural Style Transfer
    • Content Cost Function
    • Style Cost Function

こうやって書いてみると四週間でなかなか頑張ったじゃないか、という感じ。 かといって毎週毎週量が多くて大変、ということはなく、楽しく勉強できたなーって思った。

ただ、今回のコースは今までと違って「さわりだけ押さえておく」って感じで、実務で使いたければもう少し勉強しないとだめかなーって印象。 でも、その「もう少し勉強するための下地」は身についた感じがあって、あとは必要に応じて教科書とか論文を読めばなんとかなりそう。

次は最後のコースで RNN。いろいろの都合で6末開始になりそうだなぁ。

Coursera: Structuring Machine Learning Projects を修了したよ

Coursera: Deep Learning SpecializationCourse3: Structuring Machine Learning Projects を修了しました。本当は1ヶ月くらい前に終わってたけど…。

f:id:hjm333:20180503081311p:plain

内容としては次の通り。

  • Machine Learning Strategy
  • Orthogonalization
  • Evaluation Metrics
  • train/dev/test distribution
  • Comparing human level performance
  • Error Analysis
  • Transfer learning/Multi-task learning
  • End-to-end deep learning

今回のコースはかなり実践的な内容で「AI プロジェクトはこうやって進めましょう」というような話がメイン。こういう実践的な内容はこの講義でしか受けられないんじゃないかなーと思った。

単一の Metrics を設定するとチームパフォーマンスが高まる、プロジェクトは iterative だからからシンプルなモデルをまずは実装しましょうとか、最初に Error Analysis をしましょう、とか。AI プロジェクトに限らないといえばその通りだけど。

Deep Learning はハイパーパラメータが特に多い中で、どのハイパーパラメータがどの Metrics を改善・悪化させるかを意識するのはとても重要。この講義ではそれを昔のテレビのチューニングノブに例えていた。複数のノブを同時に操作してしまうと、何が起きているか分からなくなってしまうので、どのノブがどんな影響を持っているか正しく把握して、それぞれ個別に操作していきましょう、という話だった。

(c) The King's Museum