
ZAF 2022 年 11 月 7 日
<本日のテーマ>
最近の宿題
数理クイズ解答編
ほか
ほか
目次
- [6:30 - 7:00] 前座
- [7:00 - 8:00] パート1 数理クイズ解答編
- [8:00 - 9:00] パート2 Diffusion Model ちょっと分かります
- 今日のおわりに
- 総合目次
YouTube のアーカイブ・ビデオはこちら
(
https://youtube.com/live/xQsF_8IQp-g)

(前座)その1
雑談、なにか
雑談、なにか
- 最近のツイッターのタイムラインから、その1
https://twitter.com/unk_stagram/status/1590708994514898945- ぼくの座右の銘(の一つ)(自作なんだけど)
犬のように生きろ!
- ぼくの座右の銘(の一つ)(自作なんだけど)
- 最近のツイッターのタイムラインから、その2
- 今年に入ってからだと思うけど、ツイッターで急に流行ったおじさん
(という、ぼくの認識)の秋田道夫さん
https://twitter.com/kotobakatachi/status/1583296537383571457 - これみて、「あぁ、ぼくとはかなり対極的な人なんだなぁ」と思った
- 自分の(人に対する)態度を変えよう(かな)と思った、ってこと
- この人は、いわゆる蘊蓄系のツイートを(読ませやすい形で)書く人で、
その内容をまとめた本が今日(11/30)発売されるらしい (おめでとうございます)
https://twitter.com/kotobakatachi/status/1597498172066402304
- 今年に入ってからだと思うけど、ツイッターで急に流行ったおじさん
(という、ぼくの認識)の秋田道夫さん
- 2022 年は、まだ、平穏に終わってはくれないようで……
- 音楽と数理ポッドキャスト
- 「code for math」おもしろそう
- ツイート (https://twitter.com/taketo1024/status/1594471697109094400)
- 数学とコンピュータは、重要だし、個人的に興味の中心であること
- コミュニティを作ろう、という動きとして、
また、 Discord を使うという部分
- オンラインのコミュニティにおいて、 特にイーロンマスクの Twitter 買収から、 いろいろ意識的に考えるようになって、 SNS とはなんだろうか、というのは考えていることではある
- ぼくの印象は、
コンテンツは各自が作れば良い(古き良きブログでも、ポッドキャストでも、
今風な YouTube でも)
それをみんなにみてもらうためのコミュニティ(告知場所)が Twitter であり SNS なんだな、と (当たり前のこと言ってるけど)
だから、運営会社がイヤでも(イーロンがいやとかマークがいやとかね) みんながワイワイ存在している「場」の方が大事 (だって告知版だから) - Discord は、コンテンツ寄り(クリエイター寄り)なのかな、 と思ってる(けど、よく使い方が分かってない)
- ツイート (https://twitter.com/taketo1024/status/1594471697109094400)
- 数理ネタ(?)
https://twitter.com/AtsuHattori/status/1590337468372774913
(前座)その2
音のはなし
音のはなし
- pop2piano
- ツイッター
- https://twitter.com/4wavetech/status/1596302672138625024
- MP4 といえば、パースしたなぁ
https://twitter.com/angealbertini/status/1596058494784110592 - https://twitter.com/nsmrnoak/status/1594205085462331392
- https://twitter.com/seitokisoukari/status/1591085172682002439
- https://twitter.com/incipitsify/status/1590076358767435777
- https://twitter.com/4wavetech/status/1596302672138625024
論文よんでみた
"Sinusoidal Frequency Estimation
by Gradient Descent"
"Sinusoidal Frequency Estimation
by Gradient Descent"
- ツイッターに流れたきた情報
https://twitter.com/syao_ming/status/1590991834352095234 - 論文 arxiv: 2210.14476
(local copy)
"Sinusoidal Frequency Estimation by Gradient Descent" (Ben Hayes, Charalampos Saitis, György Fazekas)
(軽く)読んでみた
- 背景としては、
- (1) オーディオ信号から周波数を取り出すというタスクで、
- (2) Deep Learning の技術(gradient descent)を使ってて、
- (3) なにやら革新的らしい
- 理由:
- (1) 〜ぼく自身の趣味であり興味
- 拙著『音楽と数理 - 才能にたよらない耳コピ』
(技術書典)
- 拙作オープンソース・プログラム WaoN
(https://github.com/kichiki/WaoN)
https://kichiki.github.io/waon/
- 拙著『音楽と数理 - 才能にたよらない耳コピ』
(技術書典)
- (2) 〜 ZENKEI AI FORUM としては注目でしょう!
- (3) 〜 WaoN は、古き良き frequency domain での解析
- phase の情報を活用することで精度アップを図った
- でも、もう一息って感じ
- (1) 〜ぼく自身の趣味であり興味
(軽く)読んでみた感想(読み取れた内容)
- オーディオ信号を近似したい
- αk : 振幅
- ωk : (角)周波数
- φk : 位相
- でも、これ、むずかしいよね、と
- 細かい振動がある波形をフィッティングしようとする
- 素朴に信号の間の MSE とかだと、 local minima がいっぱいで、
最適化問題としては難しい
- これは、信号を「実空間」(time domain)で扱っているせい、 というのが、古き良き世界の認識だと思う
- だから「波数空間」(frequency domain)で パターンをみよう、という流れ
- この(1)式の右辺のような cos によるフィッティングの代わりに、
sn という関数でフィッティングすると、 収束するぞ、というはなし(らしい)- 複素数 z を使います、と
- 三角関数(cos)を使う代わりに、 z のべき関数 (power function) を使いましょう、と
- 複素数のべきは、
複素平面での回転みたいなものであることに注意
もっと正確にいうと、- \(z\) の大きさ \(|z|\) は(実数なので) \( |z|^n\) となる(1のときは一定)
- \(z\) の偏角 \(\angle z\) は n 倍
- 上の sn は \(z^n\) の実部を取っているので、 \(|z_k|^n\cos\angle z_k\) となる、と
- 複素数 z を使います、と
- これで「めでたし、めでたし」か?というと、そうではない。
- 複素数の微分は、というか、 複素関数の微分可能性については、注意が必要
- (すごく大雑把にいうと……)
- 複素数は2次元ベクトルみたいなものだけど、
- 各成分について独立に微分を考えればいいわけではなくて、
- 「微分した後の量も複素数であれ」という条件が必要となる
- 「複素数であれ」というのは、 虚数を2乗すると実数になる、など
- その条件が「コーシー・リーマン方程式」で、
- それを満たす複素関数を「正則関数」と呼ぶ
- 何が嬉しいかというと、 留数定理とかで難しい積分がさくっと計算できたりする(など)
- (正確なことは、 きちんと「複素関数論」や「正則関数」の教科書を読んで 勉強してください)
- じゃ、 s で gradient descent すれば、終わり?
- 複素数から実部を取り出す「関数」は、正則関数ではない
- ならば、どうするのか?
- 関数 s は複素数をもらって実数を返す関数
- これを「複素関数」とみると正則ではない
- しかし Wirtinger's calculus というものを使うと
(実質的に)その微分を計算することができる(ということらしい)
- wikipedia: 「ウィルティンガーの微分」
(Wirtinger derivatives)
- 論文には、この辺の詳細については Kreutz-Delgado のプレプリが引用されている
arxiv: 0906.4835 (local copy)
"The Complex Gradient Operator and the CR-Calculus" (Ken Kreutz-Delgado) - じゃ、この Wirtinger の微分を実装すればいいのか?
- と思って pytorch の complex 型のページ
(COMPLEX NUMBERS) を見ると、
- なるほど
著者のコードによる解説
- 論文の著者がコードを公開していた
github: ben-hayes/sinusoidal-gradient-descent
試してみた
- ノートブック
- オーディオファイルを扱うために soundfile (PySoundFile)というライブラリを使ってみた
- これは(フォーマットやファイル I/O は) 古き良き libsndfile の python wrapper みたいなものらしい
- 著者のサンプルコードを真似て、1ショットの学習ルーチンを実装
- ターゲットは音楽ファイル(サンプルレートは 44,100 Hz)で、
N = 4096 で、2声 (K=2) で近似してみる
- 同じものを4声 (K=4) で近似
- 今度は6声 (K=6) で近似
- 振幅のパラメータを加えて、併せてフィッティングしてるが、
一部で負の値になってるな…… - 1セグメント(N=4096)の解析に3分かかるというのは、 ちょっと遅い……
- 振幅のパラメータを加えて、併せてフィッティングしてるが、
- 音楽の解析をシフトしながら行う(オーバーラップ 1/4 で)
- 採れてる音の評価とかは、まだできてない
(おまけ)Python 版 WaoN を実験してみた
- ノートブック
- ファイルのやり取りは(さっき使った) soundfile
- FFT は numpy に入ってるものをそのまま使うことに (あったんだね)
- FFT の動作確認
- 実変数の FFT はあれこれ慣習を覚えてらんないので、 いつものように複素数版を使う
- きちんと変換を逆変換してもとに戻ること確認
- ターゲットになるスペクトルを確認
- まずは各 bin に対して、パワー(振幅の2乗)と位相
- それからいつもの log-log プロット
- 赤点は1オクターブを表している
- frequency domain での操作を念頭に、
パワーと位相から信号を復元するコードをまとめる
- このペアで、きちんと信号が復元することを確認
- 位相の変化を周波数の補正に入れる復元コード
- 実質、これが WaoN でやってること
- n_sample = 8192, n_shift = 1024, n_voices = 8 で、
Bill Evans の "Ev'rything I Love" を解析 - 結果のオーディオファイル
(目次に戻る)
パート1
数理クイズ解答編
- 元々は前回の ZAF-2210 の前に、オンラインのグループ掲示板に出題した「数理クイズ」
- 解説(背景説明)などないと難しいかな、ということで、
ZAF-2210 では解答せずに、
「正式に出題」しました! - ということで、みなさんお待ちかねの
数理クイズ解答編
解答編
- 前回の説明(解説)でしゃべったように、要するに
Tupper の公式に
出題した巨大な整数を入れて
絵を書いてみよう!
- そのとき、あれだけ巨大な整数を扱うのに、
(ぼくが使ってた) GMP というライブラリがありますね、
という話をしました
- 以下が、ぼくが実装した Tupper の公式の計算です
- ちゃんと Tupper の公式が表示されてます(検算)
- で、正解ですが……
Python3 の整数型
- その前に、(すいません。じらします)
- あのあと、ぼくのツイッターのタイムラインに、以下のようなツイートが流れてきました
https://twitter.com/tokoroten/status/1593486217362169856- なんと、 python3 は素で(実質)無限長整数が扱えるらしい(知らんかった)
- つまり、 GMP (の wrapper)をインストールしなくても、 普通に計算できるってことですね。
- 論より証拠、ということで、実験したところ、
- 本当だ(まじで今まで知らんかった)
- でも、あれだけ、有理数は独自にやらんといかんのだろうな
- (つまり Jeffrey らの厳密解の計算が Python ですぐに書けるわけではない)
- ってことで、先に書いた Tupper の公式ルーチンを、素の Python で書き直した
- すっきり!
- 検算してみると、
- もちろん問題なし!
お待ちかねの正解発表!
- 以下の k の値
k =
を(Python でそのまま与えて)計算すると、
43978126172507707808745349168686271418731968199521663065543637044239873449524996 59829454393243564097819763019953699248969679512415847860233131861557294198784619 94770314820702010547215172154028757368144359850650246894230034763278100203068370 73057721437834876520073752898096408149636722415597132295523506856452928373694192 06578722937804513176189280937214211579464366642321178262728033845836565785125634 60948828067032694457239156851422178117088566954480660334313585524603281813995871 480699265233126537967924721425343815470951694336読めますか? - 日本人なら誰でも知ってる(?)
色は匂へど 散りぬるを
我が世誰ぞ 常ならむ
有為の奥山 今日越えて
浅き夢見じ 酔ひもせず
ん
- ここでは
4x4極小かなフォント
を使わせていただきました!
- 裏話としては(一人裏話だけどね)
17x106 のサイズに
最大限の情報を詰め込みたい!
日本人のぼくとしては、こうなりました
正解者の発表!
- 正解者!
- Atsushi さんは、 ZAF-2210 でも、
リアルタイムで YouTube にコメントいただいてました!
- 正解者の Atsushi さんには、 ZAF から(というか、ぼくから)
プレゼントを差し上げます(ご希望であれば)
- (1)幸せの黄色い『音楽と数理』ハンカチ
- (2)通常の3倍できれいになる『厳密な計算』メガネ拭き
- (3)A5 サイズの『ZAM 季報 VOL.2』フォルダ
- (4)いちきの未刊を含む『数理三部作+α』和紙フォルダ
次回の数理クイズは?
- さて、ここでみなさん、
不思議に思ったことはありませんか?
- そうです!
どうやって、描かせたい絵を表す整数 k を知るのか?
- 正直にいうと、 ZAF-2210 で出題した「いろはにほへと〜」の k は、
以下のウェブサイトに画像を突っ込んでゲットしたものでした
https://keelyhill.github.io/tuppers-formula/ - ということで、今日の「数理クイズ」です!
(問題1)エンコーダを実装してください。(任意の 17 x 106 の2値画像を復元する整数 k を求めるプログラム)
(問題2)任意のサイズの画像をエンコードする
エンコーダを実装してください。
- チラ見せ
k =
から生成された 64x64 画像
66840888410410889647815242073382104615757730867376199275996156511710873540299053 80699244321392257110292847490802624629639954903792506611387602464040930728812847 09653314188553950641469489694607033357645631793062026315391468157401523534365958 83206213716875193364324907984410510209020585301060532807992561875848766261154718 63101200198519934551551996503860562096546233940783610282700115790284165291395577 49320769866253610016940386951439798208035757750448091525505982265312233376427671 60999572270830984920678557748754712607705174453224619315820756019965741964258243 57936370633835381807740290756603355215882202652510539961809834722472671841027870 30795190581665389872079141793990010854028063005231811439313731273881249549705767 93296028104296699986594021156847599278453791108214735966769548165607352335739608 25147891056608616736362170178254440034222700322733261102920647237199142876287190 93415432075603005418902906452430807993604190585165120637204473575253558502225064 08372615626429623039585648359234582795874097969384112207333046957707629042658048 48900367640567649401206319859652366322201478952019546732267779034317515444138492 47350847186830392978282299733674305229064012782259674857599354635122150280128091 99177718944294272721606714712915904- かわいい
(目次に戻る)
パート2
Diffusion Model ちょっと分かります
Diffusion Model ちょっと分かります
- 最近のニュース
Jeremy Howard の FastAI 2022 のコース
- ふとユーチューブみてたら、 Jeremy のビデオがアップされていた
- 今回アップされていたのは
- Lesson 9
- Lesson 9A
- Lesson 9B
- Lesson 10
- Lesson 9
- このうち、最初の「Lesson 9」を一通りみた
パート2
Diffusion Model がちょっと分かってきた
次回予告
- すいません。時間切れです
- 「ちょっと分かってきた」を、今の理解レベルでまとめると……
- 構成要素はいくつかある
- (1) U-Net - denoising
- (2) Auto-Encoder - latent vector への縮約
- (3) CLIP - テキストによるコントロールのための embeddings
- (4) Scheduler - ノイズからの生成プロセス
- まず、個人的に興味の度合いが低いということで、以下の要素は落とす
- (2) Auto-Encoder - 小さい画像で実験するということで、スキップ
- (3) CLIP - プロンプトで条件付けとか、とりあえずしない
- ということで、ポイント
- (1) U-Net の denoising のポイントは、
(きれいになった)画像を予測(学習)するのではなく
ノイズの方を予測(学習)する
- (4) Scheduler の生成プロセスのポイントは、
Langevin 方程式などの(統計)物理的なアナロジーというよりは
Stochastic Gradient Descent のようなプロセス(?)
- 今のところの理解は、こんなところ
- これから、もうちょっと詰めていく予定
チラ見せ(その1)U-Net の denoising




チラ見せ(その2)ノイスからの生成過程

(目次に戻る)
今日のおわりに
……
今後の予定
- 次回 ZAF は 2022 年 12 月 21 日開催の予定です。
- ZAF 講演者、 ZAM 執筆者、絶賛、大募集中です!
お気軽にお問い合わせください!
総合目次
- 前座
- 第1部 数理クイズ解答編
- 第2部 Diffusion Model ちょっと分かります
- 今日のおわりに