平和に暮らしたい 👋

@chizu_potato

教養としての決済を読んだ  [draft]

memo 決済とは 負債の免除である 負債を積極的に発行することは、流動性の高い決済手段を作り出すことになる 決済の課題 リスク 決済リスク 取引が成立するか心配 デフォルト 詐欺リスク 盗難カード 偽物を売りつける 流動性 適切な種類の、適切な場所にあるお金 銀行は、資本としてのお金の価値を維持し続けなければならない 慣習 支払い方法の合意 新しい決済方法の導入は容易くない 現金 足がつかない ドルやユーロ紙幣の大半は海外にある 調査が難しい 高額紙幣の課題 地下経済(犯罪に使われる)で多く流通 簡単に紙幣を廃止させられない。混乱を招くので。 現金を廃止すべきか 現金 メリット 貧困層を救える 情報に疎い人も多い デメリット 流通のコストが高すぎる ATMの維持管理 輸送の警備 クレジットカード...

September 5, 2022 · 1 min · chizuchizu

IFモデルを活性化関数としたSNNモデルを訓練する

IFモデルを訓練させます。重みが狙った方向に変化することだけを確認したいので、意味のないタスクを設定しています。(出力がすべて0になることを期待) 要件 入力 0 or 1の乱数 ターゲット すべて0 モデルの構成 入力 ループ(タイムステップ分) 全結合層 IFモデルを挟む(活性化関数の役割)。 0 or 1の値を伝播させる。 得られたスパイク値の総和をとり、Loss計算に回す。 torchinfoというライブラリ1で表示したモデルの構成を示しておきます。RNNモデルですね。 ‌ ========================================================================================== Layer (type:depth-idx) Output Shape Param # ========================================================================================== Model [10, 500] -- ├─Linear: 1-1 [500] 150,500 ├─IF: 1-2 [500] -- ├─Linear: 1-3 [500] (recursive) ├─IF: 1-4 [500] -- ├─Linear: 1-5 [500] (recursive) ├─IF: 1-6 [500] -- ├─Linear: 1-7 [500] (recursive) ├─IF: 1-8 [500] -- ├─Linear: 1-9 [500] (recursive) ├─IF: 1-10 [500] -- ├─Linear: 1-11 [500] (recursive) ├─IF: 1-12 [500] -- ├─Linear: 1-13 [500] (recursive) ├─IF: 1-14 [500] -- ├─Linear: 1-15 [500] (recursive) ├─IF: 1-16 [500] -- ├─Linear: 1-17 [500] (recursive) ├─IF: 1-18 [500] -- ├─Linear: 1-19 [500] (recursive) ├─IF: 1-20 [500] -- ========================================================================================== Total params: 150,500 Trainable params: 150,500 Non-trainable params: 0 Total mult-adds (M): 752....

September 4, 2022 · 2 min · chizuchizu

IFモデルをPyTorchで動かす

都合よく微分を構成したHeaviside関数の実装については、別記事で紹介しています1。 ここで使っているIFモデルについても、別記事で紹介しています2。 IFモデルのPyTorch実装 IFモデルを実装すると次のようになります。 import torch # https://pytorch.org/docs/stable/generated/torch.autograd.function.FunctionCtx.save_for_backward.html class Heaviside(torch.autograd.Function): def forward(ctx, input_): out = (input_ > 0).float() ctx.save_for_backward(out.bool()) # 保存する return out def backward(ctx, grad_output): (out,) = ctx.saved_tensors # {0, 1} grad = grad_output * out # {0, 1} return grad class IF(torch.nn.Module): def __init__(self, threshold=1): super().__init__() self.threshold = threshold def forward(self, input_, v_previous, s_previous): x = v_previous * (1 - s_previous) + input_ spikes = Heaviside....

September 3, 2022 · 2 min · chizuchizu

SNNにおけるHeaviside関数の微分の構成(PyTorch実装)

ここで語らないこと。 なぜSNNでHeaviside関数が必要なのか SNNをSurrogate Gradient法で学習させるという前提条件をおいてます。 なぜ微分しなければいけないのか 誤差逆伝播法を使いたいからです。 Heaviside関数は微分できない Heaviside関数は次のように定義されます。 $$ H(x)= \begin{cases} 1 & (x > 0) \ 0 & (x \leq 0) \end{cases} $$ Heaviside関数はいわゆるステップ関数の一種で、原点で微分ができない関数です。 無理やり微分を構成しようと思っても、$x=0$で傾きが無限大に飛ぶようなものでしょうか。 $$ \dfrac{dH(x)}{dx} = \delta(x) $$ Heaviside関数の微分をどう構成するか より多くの場所で微分係数が0以外になってほしい 勾配消失してしまうのを防ぐためです。 SNNの特性から仮定をおく 「ニューロンが発火するとき(H(x)のxが0を超える時)にはxは0に近い」という仮定をおきます。一見意味不明かもしれませんが、次のIFモデルのシミュレーションの図を見てください。 上のシミュレーションでは、閾値を1としています。ニューロンが発火する時点で膜電位はほぼ1です。つまり、この時点で何かしら意味のある傾きの値を与えても良さそうです。 このような仮定から、次のように構成するのが一つの解決策になります。snnTorchというライブラリもこの方法を採用しています1。 $$ \dfrac{dH(x)}{x} = H(x) $$ 以上を踏まえて、$H(x)$と、その微分係数をプロットしてみました。意味不明ですが、これでいいんです。 PyTorchでの構成 公式ドキュメントの実装2を参考に自動微分に対応したHeaviside関数を作成してみました。 import torch class Heaviside(torch.autograd.Function): def forward(ctx, input_): out = (input_ > 0).float() ctx.save_for_backward(out.bool()) # 保存する return out def backward(ctx, grad_output): (out,) = ctx....

September 3, 2022 · 1 min · chizuchizu

SNN寄りなIFモデルの定義とPythonのデモ

Integrate-and-Fire(以下IF) neuron modelは、ニューロンの動きを簡単にモデル化したものです。 このチュートリアルでは次の事を書きます。 SNNよりなIFモデルの定義 IFモデルをシミュレートしたコードの紹介 IFモデルの定義 そもそも、IFモデルの定義は色々あります。こういうニューロンモデルは医学寄り(神経科学的な視点)と工学寄り(NN的な視点)のものがあるので、一意に定まりません。工学寄りでも論文によって定義が違うこともよくあります。もちろん、基本となる考え方は同じですが。 参考までに医学寄りと工学寄りなIFモデルの差を示しておきます。これは主観です。 医学寄りなモデルの特徴1 時間は連続的 積分で表現される 入力は時間依存した電流 適切な初期値を割り当てる 静止膜電位は-75mVみたいに 工学寄りなモデルの特徴 時間は離散的 総和で表現される 入力は過去のシナプスの発火ベクトルと重みベクトルの内積 NNと同じ 計算しやすい定数を用いる 静止膜電位は0にすることが多い あるSNNの論文2に登場したIFモデルの定義です。 $$ x^{t+1,n}_{i} = \sum_j w_{ij}^{n} o^{t+1,n-1}_i $$ $$ u^{t+1,n}_i = u^{t,n}_i (1-o^{t,n}_i) + x^{t+1,n}_i $$ $$ o^{t+1,n}_i = H(u^{t+1,n}_i - V_{th}) $$ 式中に出てくる変数は次のとおりです。 $u^{t,n}_i$は時刻$t$における、$n$層の$i$番目のニューロンの膜電位を表す。 $x^{t,n}_i$は時刻$t$における、$n$層の$i$番目のニューロンの入力(電流)を表す。 $w^{n}_{ij}$は、$n-1$層の$i$番目のニューロンから、$n$層の$j$番目のニューロンへ伝播する際の重みを表す。 $o^{t,n}_i$は時刻$t$において、$n$層の$i$番目のニューロンが発火したかを表す。(0か1) $V_{th}$はニューロンがどれだけの膜電位に達したらニューロンが発火するかを表す。 $H$はHeaviside関数を表す。 IFモデルのシミューレーション IFモデルのシミュレーションを次に示します。...

September 3, 2022 · chizuchizu