#Julia言語 もう何度目になるか分かりませんが、私もdual numbersを実装してみた。

添付画像2の @ code_warntype と @ btime の結果に注目。この2つの確認は必ずやった方がよい。続く

ソースコード↓
nbviewer.jupyter.org/gist/genkuroki…
#Julia言語 自動微分の仕組みのdual numberパートは易しい部分。

難しいのは大量の函数を合成してできる函数の微分をどのように効率的に求めるか。

行列A,B,C,Dのサイズによって、A(B(CD))と((AB)C)Dで計算にかかる時間が大きく違う場合がある(そのことは行列の積の定義さえ知っていれば理解可能)。
#Julia言語 Juliaで積極的に計算を遅くするには、

① グローバル変数の値を引数を経由せずに函数の中で中で使う。

② structを

struct Foo
a
b
end

のように定義して使う。もしくはこれのバリエーション。

あとほとんどの場合に mutable struct は必要ない。
#Julia言語 解決法の例

① 問題を記述するデータを1つの変数にまとめて、函数に常に引数として渡すようにする。

② structを

struct Foo{A, B}
a::A
b::B
end

のような形式で定義し、aやbの具体型をjuliaに自動的に決めてもらうようにする。

@ code_warntype と @ time での確認必須。
#Julia言語 @ time での確認では、実行時間だけではなく、メモリアロケーションの回数にも注意を払う。無駄にメモリアロケーションが多くなっている場合には、ほぼ確実に型安定性が崩れている。
#Julia言語 注意を払っていないと、数百倍遅いコードになってしまっているのに気付かない場合がある。
#Julia言語 逆行列を求めさせるにはabsとislessも実装する必要があった。Real dual numberの場合にしか実装していない。

absは少なくともComplex dual numberの場合には実装しておくべきなのだが、そこはサボっている。

興味を持った人はやってみるとよいと思う。

nbviewer.jupyter.org/gist/genkuroki…
#Julia言語 以下のリンク先の言い方は正確でなかった。

@ timeで測ったメモリアロケーションの回数が異様に多い原因は

① 型安定性が崩れている。特にグローバル変数やstructに注意。

② ループの内側で無駄にメモリ割当が生じるコードを書いている。

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 黒木玄 Gen Kuroki

黒木玄 Gen Kuroki Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @genkuroki

25 Mar
#数楽

多項式f∈ℝ[x]に「a∈ℝをf(a)∈ℝを対応させる函数」を対応させる写像は単射なので、多項式fとそれに対応する実数の函数を区別しなくも大丈夫。(無限体でもOK)

有限体F上の多項式g∈F[x]に「a∈Fをg(a)∈Fを対応させる函数」を対応させる写像は単射でないので、それらを同一視できない。
#数楽 例えば二元体𝔽₂={0,1} (1+1=0)について、𝔽₂上の多項式としてxとx²は異なるが、𝔽₂上の函数としてはどちらも恒等写像になって等しくなってしまう。

xとx²を𝔽₂の2次拡大𝔽₄=𝔽₂[α] (α²=α+1)上の函数とみなしたものは互いに異なる。

こういう具体例がノータイムで出て来ることが大事。
#数楽 面倒なのは有理函数(多項式環の分数体の要素)に対応する「函数」の場合。

有理函数ごとに定義域も変わるので、異なる定義域を持つ函数達を同時に扱うための「処理」が必要になる。(これには複数の処方箋がある。)

結果的に、無限体の場合には、有理函数と対応する「函数」は同一視可能になる。
Read 7 tweets
25 Mar
大学生相手であっても、必要な数学の実力は結構高いので、統計学を教えるのに苦労しています。

高校生相手に検定が「お墨付きが得られる道具」であるかのように教えられてしまうようになったら最悪。

あと、信頼区間がモデル依存であることも(大学生と同様に)教えることにならないと思う。
現実には世界的にかなり悲惨なことになっていて、論文を日常的に書いている研究者であっても、統計的検定を「お墨付きが得られる道具」扱いしている人達が沢山いるんじゃないか?

そういう現状は若くて優れた研究者が育つことを妨害していると思う。

こういう問題を維持固定しないような教育が必要。
まだ高校生なのに、「統計的に有意である!」を水戸黄門的な「ひかえおろう!」と同じ意味で使うようになったら最悪(笑)
Read 24 tweets
25 Mar
#Julia言語 リポジトリの方の公式マニュアルに以下が追加されましたね。

* 引数の型の過剰な制限はよくある間違いです。疑わしいなら引数の型を書くのをやめましょう。

* Juliaでは戻り値の型宣言はほとんど使われません。一般に「型安定」な函数を書くべきです。

github.com/JuliaLang/juli… Image
#Julia言語 具体的には

fib(n::Int) = n ≤ 2 ? one(n) : fib(n-1) + fib(n-2)

はよくある間違で、

fib(n)::Int = n ≤ 2 ? one(n) : fib(n-1) + fib(n-2)

も誤りです。どちらでもBigIntによる計算が不可能になる。よく分からないなら

fib(n) = n ≤ 2 ? one(n) : fib(n-1) + fib(n-2)

でよい。
#Julia言語 無用に引数の型を制限してしまううようだと、NASAでは仕事をできなくなります。(NASAでもJuliaを使っている)
Read 11 tweets
24 Mar
#Julia言語 (1-2^(1-s))ζ(s) は交代級数になりEuler変換が使える。Euler変換を使えば数十項でFloat64の精度を使い切った計算が可能。

①オイラー変換のウェイトのグラフ
②64項の和の計算結果
③正確な値との相対誤差の常用対数、横軸Lは項数

Euler変換はかなり強力。

nbviewer.jupyter.org/gist/genkuroki… ImageImageImage
#Julia言語 Euler変換とは、1つ前のツイートの1つ目の添付画像で示された謎のウェイト w^{(L)}_k をかけて (-1)^k a_k を k=0からL-1まで足し上げると、(-1)^k a_k のk=0から∞までの和の良い近似になるという魔法のような話。

1つ前のツイートのLは2^6=64.
#Julia言語 #数楽 (1-2^(1-s))ζ(s) のEuler変換は複素平面全体で収束するので、ζ(s)の近似計算にも使える。

効率はそんなに良くないが、リーマン予想の数値的確認や視覚化をそれで行うこともできる。

非自明な零点の周囲のプロットもオイラー変換を知っていれば容易に可能である。
Read 4 tweets
24 Mar
悪ふざけ論文のネタ:

* f(a,b,c,…)の中の個人aを特別扱いして、a.f(b,c,…) のように書き、函数fをaの所有物とするアイデアは極めて資本主義的。

* それに対抗する解放運動として多重ディスパッチが提案されて来たが、ことごとく資本主義に敗北して来た。

* 解放運動にとってJuliaは(略)
上のツイートはネタ(冗談)なので要注意。
axiom of equality を「平等の公理」だと誤解させて(本当は「等号の公理」)、さらに axiom of choice を「(産むか産まないかの)選択(を認める)公理」と読ませることに成功したパロディ論文は有名。
physics.nyu.edu/faculty/sokal/…

他にも滅茶苦茶で笑えるのですが、アクセプトされて大騒ぎになった。
Read 4 tweets
24 Mar
#Julia言語

ODEProblem: du/dt = f(u, t)

HamiltonianProblem: 正準方程式

では、後者は特別な構造を持っています。その構造を使えばデフォルトのソルバを前者より「よいもの」にできる可能性があり、実際にどうなっているのか確認していませんが、きっとそうなっているのだと思いました。
#Julia言語 DifferentialEquations.jlではどちらの型の問題もsolve(prob)の形式で解くことになるのですが、probの型が違っていると(ディスパッチによって)違うアルゴリズムで問題が解かれることになる。

問題の特殊な構造を反映した型のオブジェクトで問題をsolve函数に与えた方が得な場合が多い。
#Julia言語 関連

solve : problem → solution の形式にコードを整理せずに、問題を記述するパラメータをグローバル変数にべた書きして、問題を解く函数の中でそのグローバル変数達をナマで使用するスタイルはそろそろ止めた方がよいと思う。

Read 8 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!