記録は作業の証

鉄道とコンピュータ

2024-01-01から1年間の記事一覧

ゼロから作るDeep LearningをCommon Lispで書き直す(ステップ19)

ステップ19 変数を使いやすく このステップでは次の機能を実装する。 変数に名前を付けられるようにする。 変数から配列の形状を知ることができるアクセサを実装する。 プリティプリンタを実装する。 変数に名前を付ける <variable>クラスにnameスロットを足し、コンス</variable>…

ゼロから作るDeep LearningをCommon Lispで書き直す(ステップ18)

ソースコード ステップ18 メモリ使用量を減らすモード 計算の途中で得た微分は不要な場合が多いため、用が済んだら消去するように改良する。 また、逆伝播を無効にするモードも実装する。 モード切替を実装するにあたり、backward総称関数にキーワード引数を…

ゼロから作るDeep LearningをCommon Lispで書き直す(ステップ17)

ソースコード ステップ17 メモリ管理と循環参照 弱参照を使うことで、循環参照を解消し、メモリ使用量を減らす。 循環参照があると、参照カウント方式のメモリ管理では解放が難しいという。ガベージコレクタの方式によっては循環参照になっているオブジェク…

ゼロから作るDeep LearningをCommon Lispで書き直す(ステップ14~16)

ソースコード ステップ14 同じ変数を繰り返し使う 微分を累算して、同じ変数を使っても結果がおかしくならないようにする。 オリジナルのコードにある次のコード片をCommon Lispにどう翻訳するか少し悩んだ。そのままだと(@gradient x)という式があちこちに…

ゼロから作るDeep LearningをCommon Lispで書き直す(ステップ11~13)

ソースコード ステップ11 可変長の引数(順伝播編) 可変長引数を取り扱うため、callやforwardのシグネチャを変更し、関数の入力も出力もリストとなるよう変更する。 総称関数の特性上影響が大きく、コンパイルエラーを参考に直していくことになる。 ステップ1…

ゼロから作るDeep LearningをCommon Lispで書き直す(ステップ9~10)

ソースコード ステップ9 関数をより便利に まず、呼び出し側が毎回gradientに全要素が1の配列を設定しなければならないのを直す。 ユーティリティ関数として次のようなものを定義する。 (defun full-like (array fill-value) (let ((dims (array-dimensions …

ゼロから作るDeep LearningをCommon Lispで書き直す(ステップ4~8)

ソースコード ステップ4 数値微分 Common Lispでは0.942のような浮動小数点数リテラルを読み取ると、デフォルトで単精度浮動小数点数型(single-float)として扱ってしまう。この挙動は (setf *read-default-float-format* 'double-float) という行を挿入すれ…

ゼロから作るDeep LearningをCommon Lispで書き直す(ステップ1~3)

はじめに Common Lispで深層学習コンパイラを作っている人に感銘を受けたので、プログラミングの練習のためにと自分もCommon Lispで似たものを書いてみようと思い、この本を買った。 ゼロから作るDeep Learning ❸ ―フレームワーク編作者:斎藤 康毅オライリー…

Common Lispの開発環境を構築する

はじめに プログラミングを始めるには、どの言語でも開発環境の構築が必要である。この記事ではCommon Lispの開発環境をEmacsというテキストエディタとSteel Bank Common Lisp(以下SBCLと呼ぶ)という言語処理系を用いて説明する。 まず、SBCLをインストール…