プログラミング言語Lispの方言の1つ。 1984年に当時主流だったLISP方言のうち、MacLISP系方言を主としてまとめられ、1994年に、ANSI Common Lispは、ANSI INCITS 226-1994として規格化された。(後に改訂されANSI INCITS 226-1994 (R2004) )
など
参考になるweb
cl-talib-apiをリリースしました。以前、本ブログで紹介したTA-LIB APIのCommon LispラッパーAPIです。 github.com
cl-jquants-apiをリリースしました。以前、本ブログで紹介したJ-Quants APIのCommon LispラッパーAPIです。 github.com
ハイコントラストのEmacsのテーマをインストールして、色々と検証してみたら、SlyのREPL画面が見づらいかったので変更方法をまとめてみました。 ミニバッファ上に以下のコマンドをタイプするとFaceと設定されている色のリストが表示されます。 M-x list-face-display 今回は、SlyのREPL画面のプロンプトとフォントの色を変更したいので、Slyで検索します。 pale turquoiseに変更して、Apply and Saveをクリック。 SlyのREPL画面のプロンプトとフォントの色が更新されました。 以前に比べ、Emacsのカスタマイズがかなり簡単にできるようになり、e…
ステップ19 変数を使いやすく このステップでは次の機能を実装する。 変数に名前を付けられるようにする。 変数から配列の形状を知ることができるアクセサを実装する。 プリティプリンタを実装する。 変数に名前を付ける <variable>クラスにnameスロットを足し、コンストラクタ関数から指定できるようにする。 (defclass <variable> () ((data :initarg :data :accessor @data) (name :initarg :name :initform nil :accessor @name) ; 名前を記録する (gradient :initform…
ソースコード ステップ18 メモリ使用量を減らすモード 計算の途中で得た微分は不要な場合が多いため、用が済んだら消去するように改良する。 また、逆伝播を無効にするモードも実装する。 モード切替を実装するにあたり、backward総称関数にキーワード引数を追加する代わりにスペシャル変数を定義することにした。 というのも、オリジナルのコードでretain_gradは一カ所しか使っていないし、enable_backpropとコンテキストマネージャの件はCommon Lispが持つスペシャル変数の典型的な用例ではないかと思ったからである。その特性から言って、総称関数はインターフェースとして安定している…
ソースコード ステップ17 メモリ管理と循環参照 弱参照を使うことで、循環参照を解消し、メモリ使用量を減らす。 循環参照があると、参照カウント方式のメモリ管理では解放が難しいという。ガベージコレクタの方式によっては循環参照になっているオブジェクトでも解放できるが、コストが高いらしい。マニュアルによればSBCLは世代別GCを持っているとのことである。 Common Lispでは弱参照がANSI Common Lispの範囲にないため、処理系ごとにAPIがばらばらに定義されている。そこで、統一的に扱うためのラッパーとしてtrivial-garbageというライブラリがあるので使うことにした。 Py…
ソースコード ステップ11 可変長の引数(順伝播編) 可変長引数を取り扱うため、callやforwardのシグネチャを変更し、関数の入力も出力もリストとなるよう変更する。 総称関数の特性上影響が大きく、コンパイルエラーを参考に直していくことになる。 ステップ12 可変長の引数(改善編) Common Lispの関数は、仮引数リストの中で&restを使うことで可変長引数を受け取れるようになる。 forwardは総称関数として実装しているので、すべてのクラスで同じシグネチャにしなければならない。 オリジナルを見ると、仮引数リストが異なる同名のメソッドが定義されており、これでも問題ないところに違いを…
ソースコード ステップ9 関数をより便利に まず、呼び出し側が毎回gradientに全要素が1の配列を設定しなければならないのを直す。 ユーティリティ関数として次のようなものを定義する。 (defun full-like (array fill-value) (let ((dims (array-dimensions array))) (make-array dims :initial-element fill-value))) (defun ones-like (array) (full-like array 1)) あとは次の行を書いておけば、gradientが未設定の時、初期値を設定でき…
ソースコード ステップ4 数値微分 Common Lispでは0.942のような浮動小数点数リテラルを読み取ると、デフォルトで単精度浮動小数点数型(single-float)として扱ってしまう。この挙動は (setf *read-default-float-format* 'double-float) という行を挿入すれば変更できる。自分はそうする代わりに0.942d0のようにリテラルで型を明示する方針を取った。 オリジナルのPythonコードでは__call__メソッドを利用することで、関数とDeZeroの関数を同じように扱える。そのため普通の関数を使って合成関数を表すことができる。Ruby…
はじめに Common Lispで深層学習コンパイラを作っている人に感銘を受けたので、プログラミングの練習のためにと自分もCommon Lispで似たものを書いてみようと思い、この本を買った。 ゼロから作るDeep Learning ❸ ―フレームワーク編作者:斎藤 康毅オライリージャパンAmazon 本のソースコードはここで公開されている。 github.com 先駆者の方々も何人かおられるようなので、参考にする。 msyksphinz.hatenablog.com github.com github.com 実装の方針 行列を表現するなら、PythonであればNumPy一択だが、Commo…