ポタージュを垂れ流す。

マイペースこうしん(主に旅行)

なぜ計算量理論に離散対数問題は現れないのか

若干タイトル詐欺で、計算量理論と暗号理論で扱う問題の種類がなぜ違うのか?という自分が長い間感じていたが調べたり考えたりせずに放置していた疑問の話をする。あと厳密にはタイトルの言っていることは誤りだと思っていて、計算量理論の入門的な講義を受けた後に出る感想を想定している(もっと高度な講義なら、離散対数問題を扱う場合もあるかな?と思うため)。

計算複雑性の入門的な講義や、アルゴリズムとデータ構造の講義を受けたとする。すると、例えばNP完全問題ってのがあってハミルトン閉路問題とかがあるみたいなことを勉強することになる。P問題とNP問題の関係性とかNP完全問題の帰着とかを勉強すると、それで半期の講義が終了する。ところで、そういえば離散対数問題が難しいからそれが暗号とかに使われてるとか聞いたことあるな、でも授業で出てこない、みたいなことが起こる。

このような現象が起きるのは、計算量理論で扱われる問題の難しさと、暗号理論で扱われる問題の難しさの間にギャップが存在しているからである。

最悪時困難性と平均時困難性

計算量理論における難しさは基本的には最悪計算量の意味でで捉えられる(最悪時困難性)。この概念は、ある問題を解くにあたって最も都合の悪い入力に対するアルゴリズムの計算時間で、その問題の難しさを捉えるという方法である。一方で、暗号理論における難しさは平均計算量の意味で捉えられる(平均時困難性)。この概念は、ある分布から問題の入力がランダムに生成される場合のアルゴリズムの期待計算時間によって、その問題の難しさを捉えるという方法である。

競技プログラミング等ではある問題について、すべての入力について制限時間内に解が求められるようなアルゴリズムを設計することが目標となるため、最悪計算量で考えることが大事になる。

しかしながら、現実の応用例の中には、最悪計算量となってしまうようなコーナーケースが無視できるような確率であれば、必ずしも最悪計算量で考えなくてもよく、平均的によく解くことができればよいという場合も考えられる。問題の入力に対する計算時間の分布がロングテールでないことがわかっているとか、期待される場合にはこの考え方でも十分有用なはずである。

暗号の設計に適切な困難性はどちらか

さて、暗号を設計する場合に安全性の要件として要求するのはどちらにするのが良いだろう?

暗号の安全性要件として最悪時困難性を採用する場合を考えてみる。この場合、どんなアルゴリズムにとってもコーナーケースとなるような入力を鍵の生成に使うことになるが、そのようなコーナーケースを設計することはできないはずである。困難性の仮定の中に入力インスタンスの設計方法への言及はない。一方で、平均時困難性を安全性の要件として採用すれば、問題の入力の分布の生成方法に依存する、つまり設計可能性に言及されている形で安全性の担保ができて嬉しいということになる。

なお、平均だと安全ではないような入力がたくさん存在し得るんじゃないか?というような気もしてくるが、「ある問題が平均的に多項式時間で解ける」ということが「あるパラメータに対して、それに依存する多項式時間を超えるような入力となってしまう確率が、そのパラメータの逆数に比例して小さい確率になる」みたいなことと同値になることがわかっているため、そのパラメータを大きくすれば、安全にならないような入力が稀にしか起こらないことがいえる。

最悪時困難性を暗号の安全性保証に使いたい:耐量子暗号の構成に向けて

ところで、問題によっては、最悪計算量の意味で難しい問題から平均計算量の意味で難しい問題を構成できることが知られている。ということは、例えばNP困難な問題から構成できる平均計算量の意味で難しい問題があれば、その問題を暗号の設計に利用することで、非常に強い暗号が作れそうなことがわかる。NP困難な問題は量子計算でも効率的に解けないと考えられているので、耐量子暗号が作れるということになる。

このアイデアが使われているのが格子暗号といわれるグループの暗号たちである。格子暗号の多くの安全性に仮定されているLWE問題は、SVP問題というNP困難な問題...ではなくその近似問題を変換することでつくられる問題になっている。この近似が厳しいものであればNP困難に近く、緩ければ多項式時間で解かれてしまう。したがって、できるだけ近い近似問題を利用できればよいが、現状ではNP困難ではなく、クラスPでもない間の領域の近似が使われている。なお、その近似の程度が厳密にどのクラスに属しているものであるかは未解決問題となっている。

ところで離散対数問題はどの計算量クラスか

離散対数問題はNP-intermediateとよばれるクラス(NPに入るがNP困難でもPでもない)に属していると考えられている。暗号の安全性仮定に利用されている問題の多くはこのクラスの問題を利用している。多項式時間で解けてしまうことが分かっているような問題(クラスPに属する問題)を使うと安全性的にはマズいが、それより難しい問題で、入力の設計がしやすい問題の1つが離散対数問題含め、暗号に利用されている問題だといえると思う。

まとめ

ということで、結局言いたかったのは、次の2つに要約される。

  • 計算量理論は最悪計算量で考える理論。計算量理論はNPとかPとかクラスのどこに問題が属するか、みたいな特徴づけや問題同士の関係性が知りたくて、問題の入力の作り方は気にしない。

  • 暗号理論は平均計算量で考える理論。暗号理論は問題の入力を作る必要があって、ある程度難しいことがわかっていて、入力が効率的に設計できるような問題を利用しているので、そういう問題を使った議論が主になる。

ガウス過程回帰とカーネルリッジ回帰

ガウス過程回帰

確率過程からガウス過程へ

区間 $ \mathcal{I} $ に対して $ \mathcal{C}(\mathcal{I}) $ を連続関数 $\nu:\mathcal{I}\to\mathbb{R} $ の全体とする。

確率過程 確率空間 $(\Omega,\mathcal{F},P)$ 上に定義された実数値確率変数族 $Y=(Y(\,\cdot\,,t))_{t\in\mathcal{I}}=(Y_t)_{t\in\mathcal{I}}$ を $\mathcal{I}$ 上の確率過程という。

ここで $ Y(\,\cdot\,,\cdot):\Omega\times\mathcal{I}\to\mathbb{R} $ であり、各 $t\in\mathcal{I}$ ごとに $Y_t:\Omega\to\mathbb{R}$ は確率変数である。

ある確率1の事象 $ \Omega ^ * \in \mathcal{F} $ が存在して、任意の $\omega\in\Omega^*$ に対して $\mathcal{I}\ni t\mapsto Y_t(\omega)$ が連続であるとき、過程 $Y$ が連続であるというが、このことを仮定すると $Y:\Omega\to C(\mathcal{I})$ (a.s.)であり、以下でも連続性を仮定する。

ガウス過程 確率過程 $Y=(Y_t)_{t\in \mathcal{I}}$ を考える。任意の有限集合 $\mathcal{I}_d=\{t_0,\ldots,t_{d-1}\}\subset \mathcal{I}$ に対して $Y _ {\mathcal{I}_d}=(Y_t)_{t\in \mathcal{I}_d}=(Y_{t_0},\ldots,Y_{t_{d-1}})$ が多変量正規分布に従うとき、この確率過程 $Y$ をガウス過程という。

適当な条件をみたす関数 $ \mu:\mathcal{I}\to\mathbb{R} $ と $ k:\mathcal{I}\times \mathcal{I}\to \mathbb{R} $ が存在して、 $ Y _ {\mathcal{I} _ d}=(Y _ t) _ {t\in \mathcal{I} _ d} $ が

$$ \mu _ {\mathcal{I} _ d} = (\mu(t)) _ {t\in\mathcal{I} _ d}, Σ _ { \mathcal{I} _ d } = (k(t _ i,t _ j)) _ {t _ i,t _ j\in\mathcal{I} _ d} $$

で定まる多変量ガウス分布 $\mathcal{N}(\mu _ {\mathcal{I} _ d},Σ _ {\mathcal{I} _ d})$ に従うとき、$Y$ はガウス過程 $\mathcal{GP}(\mu,k)$ に従うといい

$$ Y\sim\mathcal{GP}(\mu,k) $$

と書く。$Y:\Omega\to C(\mathcal{I})$ であることから、$\omega\in\Omega$ をとってガウス過程のsample path $Y(\omega)=(Y _ t(\omega)) _ {t\in\mathcal{I}}$ を考えれば、これは $Y(\omega):\mathcal{I}\to\mathbb{R}$ となる。したがって、ある種ランダムシードの空間とみなせる $\Omega$ からシード $\omega$ を選んで関数 $y(\,\cdot\,)=Y(\omega,\,\cdot\,)$ を定めると、これはガウス過程に従う1つの関数となる、つまり $ y:\mathcal{I}\to\mathbb{R} $ となる。

ガウス過程の例

ウィナー過程はガウス過程の一例である。1次元の標準ウィナー過程 $W$ は $ \mu(t) = 0, k(t _ i,t _ j) = \min\lbrace t _ i, t _ j\rbrace $ によって定まる $ \mu, k $ を用いて $ W \sim \mathcal{GP}( \mu, k) $ と書ける。

記号の定義

以下では $X=(x_1,\ldots,x_n)^\top\in\mathbb{R}^{n\times k}$ や $y=(y _ 1,\ldots,y _ n) ^ \top\in\mathbb{R} ^ n$ とし、$\mu(X)=(\mu(x_1),\ldots,\mu(x_n))^\top$ や $(k(X,X)) _ {i,j}=k(x _ i,x _ j)$ で定める。また $k _ {\,\cdot\,X}=k _ X(\,\cdot\,)=k(\,\cdot\,,X)$ などで定め、$k _ {XX}=k(X,X)$ とする。

ガウス過程回帰

問題設定

ガウス過程回帰は、入力 $ x $ に対して出力 $ y $ を予測する回帰問題において、「入力が近ければ出力も近い」という依存関係を仮定したノンパラメトリック回帰モデルであり、 $y _ i=f( x _ i )+\epsilon _ i$ の $f$ をガウス過程に従うランダムな関数であると考えて近似するものである。

データセット $ \mathcal{D}= {(x _ 1,y _ 1),\ldots,(x _ n,y _ n)}\subset\mathcal{X}\times\mathbb{R},\mathcal{X}\subset\mathbb{R} ^ k$ が与えられたときに、回帰モデル

$$ y _ i=f(x _ i)+\varepsilon _ i,\quad\varepsilon _ i\overset{\textrm{i.i.d.}}{\sim}\mathcal{N}(0,σ ^ 2) $$

を考える。ガウス過程回帰は、この関数 $f$ が $\mathcal{X}$ 上のガウス過程に従うランダムな関数であると仮定して推論を行う(つまり $f:\Omega\times\mathcal{X}\to\mathcal{C}(\mathcal{X})$ であり $f(x):\Omega\to\mathbb{R}$ は確率変数となっている)。

予測

$f\sim\mathcal{GP}(\mu,k)$ であることを仮定する(事前ガウス過程)。この仮定のもとで観測されたデータ $\mathcal{D}$ は $y=f(X)+\varepsilon\sim\mathcal{N}(\mu(X),k(X,X)+σ ^ 2I _ n)$ に従う確率変数の実現値となる(尤度関数)。

このとき、未知の入力 $X ^ * = (x _ 1 ^ * ,\ldots,x _ m ^ * ) ^ \top $ に対応する出力 $ y ^ * = (y _ 1 ^ * , \ldots,y _ m ^ * ) ^ \top $ を予測することを考える。これらの観測値が得られた後の事後ガウス過程 $ f ^ * $ は

$$ \begin{split} \overline{\mu}(x) &= \mu(x)+k _ {xX}(k _ {XX}+σ ^ 2I _ n)^{-1}(y - \mu(X)),\quad x\in\mathcal{X} \cr \overline{k}(x,x') &= k(x,x')-k _ {xX}(k _ {XX}+σ ^ 2I _ n)^{-1}k _ {Xx'},\quad x,x'\in\mathcal{X} \end{split}
$$

なる $ \overline{\mu}, \overline{k}$ を使って $f ^ * \sim\mathcal{GP}(\overline{\mu},\overline{k})$ によって決まる。事後ガウス過程にノイズも加味する場合には、 $f^*+\varepsilon \sim\mathcal{GP}(\overline{\mu}, \overline{k}+σ ^ 2\delta)$ を考えることになる( $ \delta $ は $i = j$ ならば $ \delta(i,j) = 1$ であり、$i \neq j$ ならば$ \delta(i,j) = 0$ となるカーネル)。

カーネルリッジ回帰

カーネルリッジ回帰

カーネルリッジ回帰は、入力 $ x $ に対して出力 $ y $ を予測する回帰問題において、データを非線形ヒルベルト空間に写像し、写像先のヒルベルト空間上でリッジ回帰を行ってしまおうというものである。

回帰の中に現れるのは基底関数ではなくて内積カーネル)である。適当な性質をみたすカーネルをとれば、それは無限次元の基底関数により表現できることがわかる。したがって、カーネルを使うことでいわば無限個の基底を使って回帰しているのと同じことになる。さらに、推定に際しては、得られているデータによって計算される有限個のカーネルによって作れば、それが最適解であることが保証されている。

問題設定と推定

データセット $\mathcal{D}={(x _ 1,y _ 1),\ldots,(x _ n,y _ n)}\subset\mathcal{X}\times\mathbb{R},\mathcal{X}\subset\mathbb{R}^k$ が与えられたとき、(二乗誤差最小化のもとでの)カーネルリッジ回帰の最適化問題およびカーネルリッジ回帰推定量は以下で定まる。

$$ \hat{f}=\arg\min _ {f\in\mathcal{H} _ k}\frac{1}{n}\sum_{i=1} ^ n(f(x _ i)-y _ i) ^ 2+λ\lVert f\rVert _ {\mathcal{H} _ k} ^ 2 $$

これは無限次元空間での最適化問題だが、リプレゼンター定理により、有限次元の最適化問題に置き換えられることが知られている。この帰結として、最適解としては $\operatorname{span}\lbrace k(\,\cdot\,,x_i):x_i\in\mathcal{X},i=1,\ldots,n\rbrace$ の元を考えればよいことがわかる。この条件のもとで考えてとくと

$$ \hat{f}(x)=k _ {xX}(k _ {XX}+n\lambda I _ n )^{-1}y = \sum_{i=1} ^ n \alpha_i k(x,x _ i),\quad x\in\mathcal{X} $$

ただし

$$ (\alpha _ 1,\ldots,\alpha _ n) ^ \top=(k _ {XX}+n\lambda I _ n)y\in\mathbb{R} ^ n $$

で定まる。

理論的な背景

ここでは冒頭に述べた

回帰の中に現れるのは基底関数ではなくて内積カーネル)である。適当な性質をみたすカーネルをとれば、それは無限次元の基底関数により表現できることがわかる。したがって、カーネルを使うことでいわば無限個の基底を使って回帰しているのと同じことになる。さらに、推定に際しては、得られているデータによって計算される有限個のカーネルによって作れば、それが最適解であることが保証されている。

について保証している定理を紹介する。また、同時に上では記号の定義をしていなかったので、ここで詳しく述べる。

正定値カーネル $\mathcal{X}$ は空でない集合とする。入力となる2変数に関して対称な関数 $k:\mathcal{X}\times\mathcal{X}\to\mathbb{R}$ が正定値カーネルであるとは、任意の $n$ と $c _ 1,\ldots,c _ n \in\mathbb{R}$ と $x _ 1,\ldots, x _ n\in\mathcal{X}$ に対して次をみたすことである: $$ \sum _ {i=1} ^ n \sum _ {j=1} ^ n c _i c _ j k(x _ i, x _ j)\geq 0 $$

正定値カーネルは、見ての通り(半)正定値行列の無限次元への拡張のようなものである。なお、カーネルという名前の由来はおそらく関数解析積分方程式論のあたりから来ていると思われる。線形代数群論などのカーネルとは別物。

再生核ヒルベルト空間 $\mathcal{X}$ は空でない集合とし $k$ は $\mathcal{X}$ 上の正定値カーネルとする。内積 $\langle\,\cdot\,,\,\cdot\,\rangle_{\mathcal{H} _ k}$ を備える $\mathcal{X}$ 上の関数を要素にもつヒルベルト空間 $\mathcal{H} _ k$ が再生核 $k$ をもつ再生核ヒルベルト空間である(RHKS)とは次の2性質をみたすことである:
  • 任意の $x\in\mathcal{X}$ に対して $k(\,\cdot\,,x)\in\mathcal{H} _ k$
  • 再生性:任意の $x\in\mathcal{X}$ と任意の $f\in\mathcal{H} _ k$ について $f(x)=\langle f,k(\,\cdot\,,x)\rangle_{\mathcal{H} _ k}$ をみたす
  • 再生性は、$f$ の具体的な値は $k(\,\cdot\,,x)$ だけから計算できるということを言っている性質である。

    $ k $ が与えられたとき、$ \mathcal{H} _ k $ は次のように作ることができる。まず、 $ \mathcal{H}_0 $ を

    $$ \mathcal{H} _ 0 = \mathrm{span} \lbrace k(\,\cdot\,, x):x\in\mathcal{X}\rbrace = \left\lbrace f=\sum_{i=1} ^ n c _ i k(\,\cdot\,, x _ i): n\in\mathbb{N}, c _ 1,\ldots, c _ n\in\mathbb{R}, x _ 1, \cdots, x _ n\in\mathcal{X}\right\rbrace $$

    によって定める。さらに、これに対して次のように内積を入れる。任意の $ f = \sum _ {i = 1} ^ n a _ i k (\,\cdot\,, x _ i ) $ と $ g=\sum _ {j=1} ^ m b _ j k(\,\cdot\,, y _ j)$( $ n,m \in\mathbb{N},\, a _ 1,\ldots, a _ n, b _ 1, \ldots, b _ m\in\mathbb{R}$ と $x _ 1,\ldots, x _ n, y _ 1, \ldots, y _ m\in\mathcal{X}$)に対して

    $$ \langle f,g \rangle_{\mathcal{H} _ 0} = \sum _ {i=1} ^ n \sum _ {j=1} ^ m a _ i b _ j k ( x _ i, y _ j) $$

    によって定める。ノルムはこの内積から誘導されるものとして定める:$\lVert f\rVert _ {\mathcal{H} _ 0} ^ 2 = \langle f,f \rangle_{\mathcal{H} _ 0}$。さて、このノルムについて完備にした空間を $\mathcal{H} _ k$ とする:

    $$ \mathcal{H} _ k = \overline{\mathcal{H}} _ 0 = \left\lbrace f = \sum _ {i=1} ^ n c _ i k(\,\cdot\,, x _ i): c _ 1,\ldots\in\mathbb{R}, x _ 1, \cdots\in\mathcal{X}\, \textrm{s.t.}\,\lVert f\rVert _ {\mathcal{H} _ k} ^ 2 = \lim _ {n\to\infty} \left\lVert \sum _ {i = 1} ^ n c _ i k (\,\cdot\,, x _ i)\right\rVert _ { \mathcal{H} _ 0} < \infty\right\rbrace $$

    このとき、この $\mathcal{H} _ k$ は再生核ヒルベルト空間になっていることが示せる。さらに、一意であることも示せる。

    Moore-Aronszajnの定理 任意の正定値カーネル $k$ に対して再生核ヒルベルト空間 $\mathcal{H}_k$ が一意に定まる。

    この定理により、 $k$ を決めると上のような再生核ヒルベルト空間 $\mathcal{H}_k$ が1つに決まり、さらにその元は正定値カーネルの線形結合によって表現できることがわかる。

    さらに、リプレゼンター定理によって、有限個の正定値カーネルの線形結合が最適解となることが知られている(下の定理での表現をみても、この文を少し厳密な書き方をしたくらいでしかないが...)。

    リプレゼンター定理 正定値カーネル $k:\mathcal{X}\times\mathcal{X}\to\mathbb{R}$ とそれによって定まる再生核ヒルベルト空間 $\mathcal{H} _ k$ を考える。このとき、データセット $\mathcal{D}=\{(x _ 1,y _ 1),\ldots,(x _ n,y _ n)\}\subset\mathcal{X}\times\mathbb{R}$ と狭義単調増加関数 $g:[0,\infty)\to\mathbb{R}$ と任意の誤差関数 $L$ に対して、経験リスク最小化を達成する $f\in \mathcal{H} _ k$を解とする最適化問題を考える: $$ \hat{f}=\arg\min_{\mathcal{H} _ k} L\left(\lbrace x _ i, y _ i, f (x _ i)\rbrace _ {i=1} ^ n\right) + g(\lVert f\rVert _ { \mathcal{H} _ k }) $$ この最適化問題の解 $\hat{f}$ は $\mathcal{H} _ k$ は、ある $\alpha _ 1,\ldots, \alpha _ n$ によって $$ \hat{f} = \sum _ {i=1} ^ n \alpha _ i k (\,\cdot\,, x _ i) $$ のような有限個の $k$ の線形結合によって表現できる。

    ところで、ここまでカーネルというのを使っていたが、基底関数を使うのが普通の線形回帰とかそういうやつではないか?という疑問が湧くかもしれない。カーネル法は、正定値カーネルをとると、それが無限次元の基底関数からできているものと考えられるという事実を利用したものである。つまり、正定値カーネルは何らかの基底関数によって表現できるということである。これを正当化しているのがMercerの定理である。

    Mercerの定理 コンパクト距離空間 $\mathcal{X}$ とし、 $\nu$ を$\mathcal{X}$ 上にsupportをもつボレル測度とする。二乗可積分カーネル $k:\mathcal{X}\times\mathcal{X}\to\mathbb{R}$ をとる。このとき、有界線形作用素 $ T _ k $ を次のように決める: $$ T _ k: L _ 2(\nu)\to L _ 2 (\nu); T _ k f = \int k (\,\cdot\,,x)f(x)d\nu(x) $$ この $T _ k$ が正値自己共役作用素なら $(\phi _ i,\lambda _ i) _ {i\in I}\subset L _ 2(\nu)\times(0,\infty)$ が正規直交基底とそれに対応する固有値となり( $T _ k\phi _ i=\lambda _ i\phi _ i$)、$T _ k f=\sum _ {i\in I}\lambda _ i\langle \phi _ i,f\rangle_{L _ 2(\nu)}\phi _ i$ と展開できる。
    このとき、次の展開が $\mathcal{X}$ の任意のコンパクト集合において絶対一様収束する: $$ k(x,x')=\sum _ {i\in I}\lambda _ i\phi _ i(x)\phi _ i(x'),\quad x,x'\in\mathcal{X} $$

    このことを認めれば、 $\mathcal{H} _ k$ の元である $f$ は $$ f=\sum _ {i\in I}\alpha _ i\sqrt\lambda _ i\phi _ i $$ のように、明示的に基底関数 $\phi _ i$ によって表現されることがわかる(Mercer Representation)。

    したがって、カーネルリッジ回帰は $\mathcal{H} _ k$ 上で、この基底関数 $\phi _ i$ の線形結合で表される関数によって回帰を行うものだということがわかる。

    ガウス過程回帰とカーネルリッジ回帰の等価性

    ガウス過程回帰とカーネルリッジ回帰の間には次のような関係がある。

    ガウス過程回帰の平均関数とカーネルリッジ回帰の解の関係 ガウス過程回帰において $σ ^ 2 = n\lambda$ とすれば $\overline{\mu} = \hat{f}$ が成り立つ
    ガウス過程回帰の分散関数とカーネルリッジ回帰の解の誤差の関係 ガウス過程回帰での事後分散は、カーネルリッジ回帰では最悪ケース誤差である: $$ \sqrt{\overline{k}(x,x)+σ ^ 2}=\sup _ {g\in\mathcal{H} _ {k+σ^ 2\delta}:\lVert g\rVert _ {\mathcal{H} _ {k+σ ^ 2 \delta}}\leq 1}\left(g(x)-\sum _ {i=1}^n(k _ {XX}+σ ^ 2I _ n) ^ {-1}k _ {X}(x)g(x _ i)\right) $$

    左辺はガウス過程回帰での事後分散(標準偏差)である。

    右辺は各要素に分解してみることにする。$g\in\mathcal{H} _ {k+σ^ 2\delta}:\lVert g\rVert _ {\mathcal{H} _ {k+σ ^ 2\delta}}\leq 1$ を固定したときに $\sum _ {i=1} ^ n(k _ {XX}+σ ^ 2I_n) ^ {-1}k _ {X}(x)g(x_i)$ は訓練データ $(x _ i,g(x _ i)) _ {i=1}^n$ のもとでの事後平均であり、 $g(x)$ は真値である。これに対してsupをとっているので、最悪ケースの誤差になっている。ところで、$\mathcal{H} _ {k+σ^ 2 \delta}=\mathcal{H} _ {k}+\mathcal{H} _ {σ ^ 2\delta}$ と分解できることが知られており、 $g=f+h\in \mathcal{H} _ {k}+\mathcal{H} _ {σ ^ 2\delta}$ と分解すると $h(x _ i)$ は独立ノイズと解釈できる。

    このようにみると、MAP推定とリッジ回帰の関係性のようなものが見えてくることがわかる。

    参考文献

    arxiv.org

    個人discord鯖にbotを導入して生活を豊かにする

    昨年の9月頃に個人discord鯖を立て、たまにメモするためとかで使ってはいたがなんだかイマイチ。しかし10月頃に自作のbotを導入してから飛躍的に利便性が向上して気に入っている。いま自分が個人discord鯖をどんな感じで運用しているかを(特にbotを中心に)紹介しようと思う。

    概観

    現状では以下のチャンネルが存在している。

    • welcome:ユーザーが入ってきた時に通知されるあのチャンネル。多分消せないよね?だからとりあえずそのままになっている。
    • 明日やる:明日やるタスク系を書くチャンネルだが、twitterでやってるので実質未使用。自分のtwitterのを拾ってきて転送できたらかなり面白い気はするが、イーロンにAPIを㊙️されたので多分できないだろうな...
    • 欲しい物リスト:amazonとかで気になったもののリンクをとりあえずなんでもぶち込んでいるチャンネル。
    • 旅行:気になるスポットとかがあったら載せたりする用。基本google mapに直接ピンを刺してるというのもあり、あんまり使っていない。
    • links:雑多に気になったリンクを貼る用。
    • paper:気になった論文を貼る用。
    • gpt-playground:ChatGPTを常駐させているチャンネル。後で詳しく紹介。
    • memo:なんでもありのメモ用。
    • program-notification:計算機で回してるプログラムの開始と終了の通知をする用。後で詳しく紹介。
    • vtubers:vtuberの配信予定・開始・終了などの通知をする用。後で詳しく紹介。
    • arXivグループ:arXivの新着をジャンル別で毎日流す。とりあえずcs.LG, stat.ML, cond-mat.dis-nnを登録している。後で詳しく紹介。

    個人discord鯖の様子

    以下ではbotやwebhook apiをどう使って導入しているかを紹介しようと思う。

    bot

    discord鯖にbotを導入したことで飛躍的に利便性が上がったように感じる。自分は転がっていたraspberry pi自宅サーバー化して、botのクライアントを動かしている。

    ちなみに、tailscaleとかいうのを入れると、自宅サーバーでありがちな面倒なセキュリティの設定とか全くなしに普通にSSHの設定ができてクソ便利。これで別のネットワークからでもどこからでもノートPCからvscode使って自宅サーバーに接続してバグを直すなりなんなりし放題。vscodeの拡張もある。

    tailscale.com

    ChatGPTとvtuberの通知とarXivの通知は以下のプログラムで動かしている。たまにバグがある。

    github.com

    一応ログが取られるようにコードが書かれている。tomlに設定が書いてある。

    GPT bot

    今やChatGPTなしではやっていけないので、discordにbotとして1つのチャンネルに常駐させることにした。わざわざopenaiのwebページを開く必要がなく、履歴も全て残る。また、コマンドでGPTのモデルをスイッチできるようにしている。1つの話題が終わったらGPTが読み込む会話の履歴を消せるようにもしている。会話履歴に上限があるが、トークン数を計算してその辺はいい感じにしている。おまけで使用料金もトークン数から計算させている。適当にその時見ていたvtuberの名前をもじって名付けた。何となくキャラ付けのプロンプトでタメ口にしてってことにしているが、関西人っぽいような謎の口調になっている…。

    使用例

    GPT-4Vに数式を投げるとlatex形式で返してくれるのいいっすね

    面倒な数式をlatex形式に変換してもらう。ただしこの例の場合、若干間違っている。とはいえイチから打つよりは圧倒的に楽。

    YouTube bot

    配信してるかどうか追いたいチャンネルをコマンドでデータベースに登録。15分に1回RSSフィードを見に行って新しく放送や動画が出現していないか確認する(この確認頻度はcron式で設定変更できるように作ってはいる)。ただし、放送時間の情報はRSSには載ってないのでここだけYouTubeAPIを叩きに行く。GASでなんかよくわからん設定をしないといけないのが面倒かもしれない。APIを叩きすぎるとお金かかるので節約のためにコードが素直ではない構成で複雑になっている。自分で書いてて読みづらい。

    APIからの情報に基づいて、配信前は灰色、配信中は赤色、配信後や動画の場合は青色になるようにして、また配信時間とかも更新するようにしている。当然その投稿から配信ページに飛ぶことができる。

    偶にアーカイブがなかったり動画が消されたりするがそれにも対応している。

    動画が消えた場合の例とコマンドの一覧

    arXiv bot

    arXivRSSフィードを1日1回見に行って、そこの情報を流すことにしている。ジャンル毎がいいと思って、ジャンルをコマンドから登録するとそのジャンルを流す専用のチャンネルが作られるシステム。これの巡回頻度も無駄な機能としてコマンド呼び出すとcron式で設定できるようになっている。甘えているのでabstractを日本語訳したものを流すようにしている。翻訳もお金をかけたくないのでGASでgoogle翻訳APIみたいなのを使っている。ちゃんと読みたかったら原文を読むので翻訳にわざわざDeepLとか使わなくても大体わかれば問題ないかなと思っている。

    おまけで投稿に適当なリアクションをつけるとdiscordの別のチャンネルとかnotionのデータベースに転送する機能もつけた。が、動いたり動かなかったりするので何かバグがあると思う。

    arXivチャンネルの例

    コマンド一覧

    コードがうまく動けばリアクションで別のチャンネルに転送される

    webhook

    botはちょっとリッチなプログラムを動かすのに使っているが、投げっぱなしでいいようなものではwebhookを使っている。

    arXivbotは元はwebhookで動かしていたが、チャンネルごとに別々のwebhook apiを使ったりスタンプに反応させるたりするのは大変だったのでbotになっている。)

    (Zapier入れてやってみたこともあるが、カスタマイズ性とか考えると微妙だし全部作るのが早いな...という感じになった)

    program notificator

    LLMのembeddingや大量のページのDLや研究など、走らせるコードによっては非常に時間がかかる場合があるので、その通知をこのチャンネルに流すようにしている。

    これはプログラムを走らせてるマシンにスクリプトを仕込んでおく必要がある。以下のリンクを参考にしている。参考リンクではslackに流すコードになっているが、discordのwebhookのやつに置き換えて利用した。使い方は大体同じ。

    qiita.com

    使用例

    さいごに

    みんなも個人discord鯖を立てて活用しよう!

    年末年始2023→2024

    あけましておめでとうございます。今年もよろしくお願いします。10年くらい毎年作ってた年賀状は今年は作る暇がなく...という感じになってしまって楽しみにしてた皆様に申し訳ないです(わりとネタ切れでもある)。来年は作ろうかなと思ってはいます。

    今回の年末年始は、年末は北陸経由で東京に向かい、帰りは東海道経由で京都に戻る。そして年始には再び東へ進路を取って名古屋へ向かうという二段構えを取りました。ひたすらに日記です。

    京都から北陸経由で東京、東京から東海道経由で京都へ戻る切符

    この切符を使って旅行しても実は東海道新幹線で往復するのとそこまで料金は変わらないので、ある意味手軽に旅行気分が味わえるような気もする。

    12/29(金)

    気合いで5時半に起床。コーヒーメーカーで淹れたコーヒーを飲みつつパンを食べつつ、大学に行くリュックに着替えを適当に入れて家を出る。最近は2泊3日くらいなら大学に行くリュックで良いことがわかってデカいリュックの出番がなくなっている。

    バスに乗り京都駅前に7:02下車。今日のタワー(京都タワー)に挨拶。

    ここからサンダーバード3号に乗る。7:29発だったのでけっこう時間があり暇に。駅のホームのうどん屋とか入ろうと思ったんだけど並んでて厳しそうだったので大人しくホームで待つ。

    金沢行きのサンダーバードに乗るのは人生ではこれで最後なのかなあと思ったりする。北陸新幹線伸びちゃうからね。年末だということもありサンダーバードの指定席は満席。

    たまにはぼーっと車窓を眺める。段々山肌も白くなっていき、近江塩津あたりまで来ると雪が地面に残り始める。

    せっかくだし金沢の友人に連絡してみるかと連絡してみるも、みんな実家に帰省中だった。まあ普通そうだなという気持ちになった。

    9:38、年末の帰省客に紛れて金沢駅着。

    金沢駅 空が暗い

    なんだかんだお腹が減ったので、とりあえず近江町市場へ。バスに乗ろうかとも思ったがめっちゃ並んでたし歩いていくことにした。

    市場は大繁盛で、みんな元気やなあという感じだった。市場内を意味もなくぐるぐるしたのち、適当に海鮮丼を食す。

    おまかせ丼

    本質は一緒に提供されたあら汁だった。うまい。

    ここ最近睡眠不足だったのもありなんか疲れちゃったので、観光とかはせずにそのまま駅へ戻る。

    金沢フォーラスに入ってみる。なんとなく旭川駅前のイオンモールを思い出す。6階にポケモンセンターあるんや〜とか思いつつスタバに吸い込まれる。スタバの都道府県スタンプを集めているが、金沢県埋めてなかったんだ意外だなーという気持ちになっていた。しばし作業。論文を読む。

    いい時間になったので退店。北陸新幹線のホームに上がり、新幹線に乗車。かがやき532号東京行き。13:49発の予定が接続されるサンダーバードが遅れたせいで新幹線も10分程度遅れて発車。

    金沢駅 新幹線ホーム

    やはり日本海沿岸は景色が良い。特に富山から糸魚川のあたり。入善の風力発電所とかも印象に残った。

    ここを越えると山の中のトンネルバリバリ区間に入る。

    気づいたら長野に到着。長野から東京までの区間で新幹線に乗ったことはないのでここからが未開の路となる。

    上田を過ぎ、軽井沢を緩めのスピードで通過。北にカーブして再びトンネルに入る。碓氷峠を迂回しながら越える。安中榛名で一瞬外に出るが、基本トンネルであるように思う。トンネル群を越えると高崎に到着。ここで上越新幹線と合流する。

    関東平野を走り、大宮に到着。新幹線の窓から外を覗くと、下にデカい在来線ホームが見える。ここでかなり首都圏に来たなあと感じる。

    埼京線と並走し、これまでに比べるとゆっくり東京に近づいていく。荒川を越えて東京都に侵入。地下に潜り、上野駅に到着。

    しばらく止まったが、最後、東京駅に向かって出発。10分程度遅れ、16:30頃に東京駅に到着。人の波にのみこまれて駅から出るのにけっこう時間がかかった。

    丸の内口で昨年まで研究室にいた先輩と合流。東京駅の適当なお店でパスタ等を食す。研究室の最近の様子の話をしたり、社会人にはなるもんじゃないね、という話をしたりする。奢っていただいた。ごちそうさまでした(ありがとうございます)。

    デカ肉

    日比谷まで散歩する。道光りすぎだろ。

    ライトアップ

    東京ミッドタウン日比谷まで来た。先輩はこの建物の上の方で働いているらしい。観光客向き(?)エリアのせいでマダムとかが行くようなお高めの飯屋が多くて普段行けるような店が少なく困っているらしい。前澤友作ソユーズの展示がされていた。

    ソユーズの展示

    まだ少し時間が早かったので前回東京に来た時に買いそびれた本を神保町に買いに行きたいです、って言って付きあっていただいた。神保町はどうやら地下鉄で家までの途中で通るらしい。日比谷駅で改札に向かう途中で通勤風景と変わらんな、とか言っててそれはそうかという気持ちになった。神保町に到着し、本屋に入って探してみたが、残念ながらお目当ての本はなかった。

    ここで先輩とはお別れする。またお願いします〜

    宿に向かう。今回は門前仲町の東横に宿泊した。前日までホテルを取ってなかったので選択肢がだいぶ限られていたが、アクセスも悪くないし予約前日に都内で7000円ならまあ許せるような気がする(2泊なので14000円)。

    金沢駅で買っていた金沢プリンを食べつつ就寝。

    12/30(土)

    おはようございます。

    ちょっとやらないといけない作業があったので午前中はホテルで作業をしていた。昼寝をしていたら13時。東京在住の幼馴染と会う約束をしていたのでとりあえず外に出る。時間も時間だったのでとりあえず松屋で昼食をとる。

    渋谷へ向かう。地下街でちょっと迷うがなんとか合流する。

    スターバックスリザーブロースタリー東京が気になってるという話をしたら連れて行ってくれた。建物前まで来るとめっちゃ人いるし整理券予約してくださいみたいなの拡声器で案内してるしヤベーとなった。年末でも100組待ち。エグいなと思っていたが思ったより進みは早いようで、裏のドンキホーテ適当に明日のコミケの買い出し(?)みたいなのをしつつ時間潰して1時間くらい?でなんとか入店できた。

    1階は普通にコーヒーとパン屋、2階はティー、3階はコーヒーとカクテル(各階層デザート的なものと多少のパンとかは一緒に売ってるっぽい)、4階は座席という感じの構成の建物。

    雑に撮影した店内

    ここからまた並んでレジで注文して受け取り待ちもあるので追加で30分くらいかかった気はする。

    自分はアイリッシュコーヒーとクロスタータ・フラーゴラ(いちごタルトって言え!)を注文。うめうめ。

    アイリッシュコーヒーといちごタルト 奥に見えるのはチャイティーラテとバナナケーキ(だっけ?)

    かなりいい時間になったので東京駅方面に戻る。東京駅キャラクターストリートを歩く。ホロライブ限定ショップが出ていたのでグッズを見るなどする。何故か分からないが2023年の8月末くらいからホロライブにハマっている。とりあえず音乃瀬奏のクリアファイルを購入。Hakos Baelzを推しているがグッズはなかった。普通に通販で注文しようと思う。

    ミッフィーストアでハンカチを購入。ファンシー系はかなり好きでたまに買ったりする。

    夕食。とりあえず目についたので洋食の店に入ってオムライスを注文。東京駅構内の飯屋ってなんか尖ってる店多くて無難な定食屋みたいなのがあんまりないのがちょっとうーんと思うところ(そんなこと言ったらどこのデカい駅、例えば京都駅とかもそうか?)。

    地下鉄に乗ってホテルに戻る。幼馴染とは途中でお別れ。

    就寝。

    12/31(日)

    おはようございます。6時半起床。普通に起きれてよかった。

    東横の無料朝食をいただき、荷物をまとめてチェックアウト。ビックサイトに向かう。コミケのブースの売り子をやる。とりあえずコミケに行くことは決めていたが、適当に行ってもつまらないなあと思っていたところ、気になっていたXのフォロワーさんが売り子募集をしていたので連絡してみた、という流れがあった。ジャンルはざっくり情報技術・機械学習系のサークルで、主催者さんが1人で本書いたりグッズ作ったりされている。

    サークル主催者さんが集合予定時間から少し遅れていらしたが、サークル入場時間には余裕があったのでそのあたりは問題なく、ビックサイト内へ。主催者さん+自分含めて売り子3人の布陣。

    設営。ダンボールを開けたり見本誌をサークル窓口に届けたり各種組み立て、電子決済とかも導入していたのでそれらレクチャーを受ける。物理本と電子本をセットにしているところとか、見本誌展示用のたてるやつにノートPCスタンドを使っているところとか、売り子マニュアルとかフローチャートみたいなのとか、随所に長年の経験のノウハウがあったような気がする。

    10時半になる。会場には拍手が響き渡る。

    ブースの場所がデカい通路に面してるところだったので微妙に休憩してる間がない感じで人が来る。その合間に売り子の方々とか主催者さんとか皆さんはどういう関係なんですか?みたいな初対面の会話をする。主催者さんの知り合いの方が挨拶に来られる。その中でデカパイの精神を教授される。主催者さんとお客さんの会話によく聞くモデルの単語がいっぱいあるなーと思いつつ、自分ちゃんと論文読んでないな〜という気持ちになったりする(多少読んでいるが、カバーできていないというか、普段使っていないのもあって定着していないという意味。そもそも普段から応用している人と、応用のことを考えずに理論研究やってる自分(近接領域とはいえそもそも分野がちょっと違うというのもあるが)とでは階層が違うが、知っているに越したことはない)。主催者さんとリアル名刺を交換したが、どういうお仕事されているかは大体想像通りだった。

    13時までのシフトを済ませ、ブースを後にする。ここまでの間で既刊が完売する。新刊は残った。客層とかの読みがどうやら想定外だったらしい。

    財布を見たら万札しかない最悪の状況だったのでとりあえず会場内のファミマでおにぎりを買って両替。このおにぎりを昼飯にする。

    東7に向かう。幼馴染との昨日の会話で、ディズニーのグッズがもらえるだか何かで、飲みもしないのにコーヒードリップパックをたくさん買ったとのことで、余って困ってたらしかったので、ここで貰った。戦利品を大量に買った中で重荷(コーヒーパック)がなくなってよかったとのこと。良いお年を〜また来年会おうね〜

    ちなみに東7はコスプレ同人誌エリアだったようで、あまり自分から入らない世界を見たなあという気持ちになった。

    東1-3,4-6エリアに戻る。適当に評論・情報/鉄道・旅行・メカミリあたりを散策。Xで見かける人の本を買ったりする。

    西方面、企業エリアへ。特にグッズは買わなかったが、文化放送とかシーサイドコミュニケーションブースで何か買っておけばよかった感もある。

    外に出る。なんだかんだちんたら回っていたので、外に出たのは15時半過ぎとかだった気がする。国際展示場駅前の東京BRTの連節バスに乗ってみたかったが、毎回連節バスなわけでもなければ、そもそも列がヤバい感じだったので乗車をやめた。結局そこからゆっくり歩いて、一駅遠くの有明テニスの森から乗車。新橋へ。途中で今日手伝っていたサークル主催者さんから浜松町で打ち上げやりますとの連絡を受ける。

    新橋で下車。そこそこ時間があったので浜松町駅まで歩く。浜松町の駅前のビッグエコーで火事があったようで、消防がかなり集まっていた。ビルも焦げてたし。

    なおも時間がありそうだったので、東京タワーを見に行くか、ということで増上寺へ。参拝納めも兼ねる。

    増上寺と東京タワー

    打ち上げ会場へ。なんとレバノン料理をご馳走になった(ありがとうございます)。チョイスが不思議だなあと思うところだが、どうやらサークル主催者さんと売り子のお一人が共通の友人とよくエスニック料理店の開拓をしているらしい。新大久保(だっけ?忘れた)にある韓国料理がめちゃくちゃウマいオカマバーの話が面白かった。

    店に入ったら自分たちしかいなくて、みんな新橋とかでやるから浜松町ではコミケの打ち上げあんまやらないんすかね?みたいな話をしていた気がする。途中で大量の料理を買っていく外国人の方がいたから、年末地元の料理でパーティーしたい外国人の層にウケたりしてるのかなとか思ったりした。

    皆さん旅行とかにも多少(orとても?)造詣がある方々だったので、今日京都まで新幹線で帰るんだよね?みたいな会話の流れで、前の売り子の方はサンライズで帰ったよ〜というお話しを聞いて、やっぱりそういう人が集まるんすね〜みたいな会話もあった。

    料理としてはひよこ豆ペーストがうまかったのをよく記憶している。

    浜松町駅に戻る。どうでもいいが、駅までの会話の中で銀閣寺まで徒歩5分のとこに住んでるんですよ〜という話をしたら一生に一度そういうこと言ってみたい〜みたいなことを言われて嬉しかった(これまで多くの人はへえ〜で終わっていた気がするが、このへんの領域に興味があるからこそ出る反応な気がしたので)。

    駅の改札に残高不足で弾かれる。関西との違いを実感。

    山手線で東京駅へ。東京駅構内でお土産を探すも、年末だからか店が閉まっていて何も買えず。仕方ないので何も買うことなく新幹線に乗車。当然のように終電(の1本前)の新幹線を取っていた。普段ならどんな時間でも大丈夫なように自由席を取るが、今年は全席指定なので、先に遅めの新幹線をとっておいた。

    東京駅を21:12に発つ。どうせまた3月頃に来るでしょう。

    流石に疲労が溜まっていたので、新横浜を出たあたりから記憶が飛ぶ。気づいたら名古屋だった。

    Xを見ていると、Adoが東本願寺紅白歌合戦ので歌っているみたいなポストが流れてきた。ちょうどこれから京都駅に着くしタイミングが良い。見に行こうと思えば見に行けるな!

    23:22京都駅着。バスはないので当然七条駅まで歩く。東本願寺には寄り忘れる。

    七条駅から出町柳駅へ向かう。京阪が終夜運転をやっているのでいつもとダイヤが違うなあという気持ちになったり。

    年明けは神宮丸太町駅で迎えた。京阪電車の車掌さんからあけましておめでとうのアナウンスが流れる。

    0:02出町柳駅着。

    せっかくなので下鴨神社へ。

    ちゃんとした名前が分からないが、初詣に行くとお焚き上げをしている。本殿に参拝したかったが、あまりに人が多く並んでいるので断念。どうせまたすぐ行くでしょうということで...

    下鴨神社

    今出川通を東へ進む。百万遍知恩寺に入ってみた。除夜の鐘をまだ撞いているようだったので、撞かせていただいた。動画まで撮っていただいた。サービス旺盛やな。

    百万遍知恩寺 除夜の鐘

    1時頃?に帰宅。流石に疲れたな〜と思いつつyoutubeをつける。年越しそばを食す。適当にXで中本と緑のたぬきどっちがいいか?みたいなアンケートを取っていたのに家にあったのはどん兵衛だった。なんだこれ。

    どん兵衛を食す。風呂に入る。就寝。

    1/1(月)

    おはようございます(16時)。布団で横になっていたら令和6年能登半島地震が発生。外で揺れで子供達が騒いでいるのが聞こえた。

    地震速報とかを見る。えらいこっちゃ〜となる。vtuberグループの生放送関係も全部止まっちゃって寂しい。ただ、ENはJPとは管轄が違うのか動いてて助かる。

    この日は特に何もなく作業をしたり論文を読んだりした。あと故障したイヤホンを製造会社に送るための梱包とか。

    このままだとただの平日になってしまう、と思い、なんとなくピザを注文。

    ここまで溜まっていた年末分の日記を書いて就寝。

    1/2(火)

    起きたら11時半。実家に帰る。本当はもっと早く起きて在来線で帰る予定だったが...時間も遅くなってしまったので新幹線課金もやむなし。指定席化のせいで特急券に3000円以上取られるのは痛い。

    適当に準備して外出。大学の研究室に立ち寄って使えるイヤホンを回収。バスに乗って京都駅へ。志津屋カツサンドを購入。京都駅付近で他のお店でおいしいカツサンド売ってる店あったら知りたいな。

    EX予約でe特急券を予約していたので発券しようと思ったが、パスワードを覚えておらず、ここでパスワードリセットをかける羽目になる。ただ、勝手にスマホ側で強力なパスワードを選択のやつをやるとエラーが吐かれて登録できず、謎に時間を食う。

    なんとか発券。京ばあむが食べたいなあと思ったので、実家と親戚と自分用に京ばあむを購入。新幹線に飛び乗り名古屋へ。

    名古屋で下車。在来線に乗り換えて大曽根で下車。乗車券を千種までで発券していたので乗り越し清算で150円追加で払うことになった。京都から大曽根までで最初から発券しておけば運賃は京都から千種までと変わらないので、単純に損したことになる。ちなみにこの料金は京都から名古屋までの運賃と同じである。大曽根瀬戸線に乗り換え、祖父母宅へ。

    ここで羽田空港で旅客機が燃えるニュースが飛び込んでくる。なんやねんこの年始。

    こたつに入りながら、このブログを書いている。

    Double Descent in Random Feature Regression

    Introduction

    二重降下現象(Double Descent)とは、統計学機械学習において、モデルのパラメータ数を増やしていくにつれて一度は複雑性誤差が増加するが、その後再び誤差が減少していくという現象です。古典的な統計モデルでは、複雑性誤差が一度増加する手前でバイアスとバリアンスのトレードオフをとるようにモデルを調整することが一般的でしたが、現在の深層学習に代表されるような過剰パラメータモデルでは、パラメータを増やせば増やすほど誤差を減らすことができる場合があるということで、ある種現在の大規模なモデルが良いということの証左になっているともいえるでしょう(Neural Scaling Lawとかの方が説得力は強いと思いますが)。

    今回はこのDouble Descentを実験で確かめてみます。下の論文をもとに実装してみました。

    arxiv.org

    実験設定

    データ

    • 入力 $d$ 次元、出力 $1$次元のデータが $n$ 個与えられるとします: ${(\boldsymbol{x} _ i,y _ i)} _ {i=1} ^ n\subset\mathbb{R}^d\times \mathbb{R}$

    • 制約条件: $\boldsymbol{x} _ i\overset{\mathrm{i.i.d.}}{\sim} \mathrm{Unif}(\mathbb{S} ^ {d-1}(\sqrt{d}))$ かつ $f _ d \in L ^ 2(\mathbb{S} ^ {d-1}(\sqrt{d}))$ を使って以下の形で書けているとします: $$y _ i=f _ d(\boldsymbol{x} _ i)+\varepsilon _ i, \quad \varepsilon _ i \overset{\mathrm{i.i.d.}}{\sim} \mathcal { N }(0, τ ^ 2 ) $$

      • ここで $\mathrm{Unif}(\mathbb{S} ^ {d-1}(r))$ は半径 $r$ の $d$ 次元球面上での一様分布を表す: $\boldsymbol{x}\sim \mathrm{Unif}(\mathbb{S} ^ {d-1}(r))$ は $\lVert\boldsymbol{x}\rVert _ 2=r$ になっています。

      • 特に今回は $\boldsymbol{w}\sim\mathrm{Unif}(\mathbb{S} ^ {n-1}(1))$ をとって固定して $f_d(\boldsymbol{x}) = \boldsymbol{w} ^ \top \boldsymbol{x}$ で定め、単純な線形関係にノイズが乗ったものとします:

    $$ y _ i = \boldsymbol{w} ^ \top \boldsymbol{x} _ {i} +\varepsilon _ i,\quad \varepsilon _ i \overset{\mathrm{i.i.d.}}{\sim} \mathcal { N }(0, τ ^ 2 ) $$

    モデル

    Random Feature Regressionを行います。まずは $i=1,\ldots, N$ に対して以下の関数を考えます。

    $$ f(\boldsymbol{x};\boldsymbol{a},\boldsymbol{\theta} _ 1,\ldots,\boldsymbol{\theta} _ N)=\sum _ {i=1} ^ Na _ iσ\left(\frac{\boldsymbol{\theta} _ i ^ \top \boldsymbol{x}}{\sqrt{d}}\right),\quad σ(x)=\mathrm{ReLU}(x)=\max\lbrace 0,x \rbrace $$

    ここで $\boldsymbol{\theta} _ i\overset{\mathrm{i.i.d.}}{\sim}\mathrm{Unif}(\mathbb{S} ^ {d-1}(\sqrt{d}))$ をとって固定することにし、$\boldsymbol{a}=(a _ 1,\ldots, a _ N) ^ \top\in\mathbb{R} ^ N$ はRidge回帰によって決めます:

    $$ \hat{\boldsymbol{a}}(\lambda)=\arg\min _ {\boldsymbol{a}\in\mathbb{R} ^ N}\left \lbrace \frac{1}{n}\sum _ {j=1} ^ n\left(y _ j-f(\boldsymbol{x} _ j;\boldsymbol{a},\boldsymbol{\theta} _ 1,\ldots,\boldsymbol{\theta} _ N)\right) ^ 2+\frac{N\lambda}{d}\lVert\boldsymbol{a}\rVert ^ 2 _ 2\right \rbrace $$

    これは、$ \boldsymbol{X} = \left(σ\left(\frac{\boldsymbol{\theta} _ j ^ \top \boldsymbol{x} _ i}{\sqrt{d}}\right)\right)_{ij} \in \mathbb{R} ^{n\times N}$ とおくと

    $$ \hat{\boldsymbol{a}}(\lambda) = \left( \boldsymbol{X} ^ \top \boldsymbol{X} + \frac{N\lambda}{d} \boldsymbol{I} _ {n\times n}\right) ^ + \boldsymbol{X} ^\top \boldsymbol{y} $$

    となります。ここで$^ +$ は擬似逆行列を表しています。数値安定性みたいなのを気にしなければ普通に逆行列でいいと思います。その方が計算早いし。

    このときの $f$ は、2層のニューラルネットワークの特殊な形で、1層目の重みが固定されているおかげで( $d$ 次元の入力データが $N$ 次元のRandom Featureに飛ばされます)2層目を線形回帰(今回はRidge回帰)と同様に求めることができます(cf. カーネル法)。

    誤差の評価

    次のような二乗和誤差を使います:

    $$ R(f _ d,\boldsymbol{x} _ 1,\ldots,\boldsymbol{x} _ n,\boldsymbol{\theta} _ 1,\ldots,\boldsymbol{\theta} _ N,\lambda) = E _ {\boldsymbol{x}}[\left(f _ d(\boldsymbol{x})-f(\boldsymbol{x};\hat{\boldsymbol{a}}(\lambda),\boldsymbol{\theta} _ 1,\ldots,\boldsymbol{\theta} _ N)\right) ^ 2] $$

    経験分布に対しては

    $$ \hat{R}(f _ d,\boldsymbol{x} _ 1,\ldots,\boldsymbol{x} _ n,\boldsymbol{\theta} _ 1,\ldots,\boldsymbol{\theta} _ N,\lambda) = \frac{1}{n}\sum _ {j=1} ^ n\left(f _ d(\boldsymbol{x} _ j)-f(\boldsymbol{x} _ j;\hat{\boldsymbol{a}}(\lambda),\boldsymbol{\theta} _ 1,\ldots,\boldsymbol{\theta} _ N)\right) ^ 2 $$

    で $R$ を推定します。

    漸近挙動

    非常に複雑ですが、 $\lambda\to 0, d\to\infty$ の場合の漸近的な挙動の解析解が知られています。

    現在の設定において

    $$ f _ d(\boldsymbol{x})=\boldsymbol{w} ^ \top\boldsymbol{x} $$

    であり、$\lVert\boldsymbol{w}\rVert _ 2 ^ 2=F _ 1 ^ 2 (=1)$ でした(論文中では $F _ 1 ^ 2$ と表記されている)。また $τ ^ 2$ は、観測データに入り込むノイズの分散、すなわち、観測データが $(\boldsymbol{x},y)$ だったとき

    $$ y = f _ d(\boldsymbol{x}) +\varepsilon,\quad\varepsilon \sim\mathcal{N}(0,τ ^ 2) $$

    だったことを思い出します(数値実験では $τ ^ 2= 1/5$ としています)。

    $G\sim\mathcal{N}(0,1)$ と $σ(x)=\mathrm{ReLU}(x)=\max \lbrace 0,x \rbrace $ として

    $$ \begin{split} \mu _ 0 & = E[σ(G)] = E[\max \lbrace 0,G \rbrace ]=\frac{1}{\sqrt{2\pi}} \cr \mu _ 1 & = E[Gσ(G)] = E[\max \lbrace 0,G ^ 2 \rbrace ]=\frac{1}{2}\cr \mu _ \star ^ 2 &= E[σ(G) ^ 2]-\mu _ 0 ^ 2-\mu _ 1 ^ 2=E[\max \lbrace 0,G ^ 2 \rbrace ]-\mu _ 0 ^ 2-\mu _ 1 ^ 2=\frac{1}{4}-\frac{1}{2\pi} \end{split} $$

    これより

    $$ \zeta=\frac{\mu _ 1}{\mu _ \star}=\frac{1}{\sqrt{\frac{1}{2}-\frac{1}{\pi}}} $$

    を定めます。次に $\psi = \min \lbrace \psi _ 1, \psi _ 2 \rbrace $ として

    $$ \chi = -\frac{\left[ \left( \psi\zeta ^ 2 - \zeta ^ 2 - 1) ^ 2 \right) ^ 2 + 4\zeta ^ 2\psi \right] ^ {1/2} + \left( \psi\zeta ^ 2 - \zeta ^ 2 - 1 \right) }{ 2\zeta ^ 2} $$

    を定めます。これを使って

    $$ \begin{split} \mathscr{E} _ {0,\text{rless}}(\zeta, \psi _ 1, \psi _ 2) &= - \chi ^ 5 \zeta ^ 6 + 3\chi ^ 4 \zeta ^ 4 + (\psi _ 1 \psi _ 2 - \psi _ 2 - \psi _ 1 + 1)\chi ^ 3 \zeta ^ 6 - 2\chi ^ 3 \zeta ^ 4 - 3\chi ^ 3 \zeta ^ 2 \cr &\quad + (\psi _ 1 + \psi _ 2 - 3 \psi _ 1 \psi _ 2 + 1)\chi ^ 2 \zeta ^ 4 + 2\chi ^ 2\zeta ^ 2 + 2\chi ^ 2 + 3 \psi _ 1 \psi _ 2 \chi \zeta ^ 2 - \psi _ 1 \psi _ 2, \notag \cr \mathscr{E} _ {1,\text{rless}}(\zeta, \psi _ 1, \psi _ 2) &= \psi _ 2 \chi ^ 3 \zeta ^ 4 - \psi _ 2 \chi ^ 2 \zeta ^ 2 + \psi _ 1 \psi _ 2 \chi \zeta ^ 2 - \psi _ 1 \psi _ 2, \cr \mathscr{E} _ {2,\text{rless}}(\zeta, \psi _ 1, \psi _ 2) &= \chi ^ 5 \zeta ^ 6 - 3\chi ^ 4 \zeta ^ 4 + (\psi _ 1 - 1)\chi ^ 3 \zeta ^ 6 + 2\chi ^ 3 \zeta ^ 4 + 3\chi ^ 3 \zeta ^ 2 + (-\psi _ 1 -1)\chi ^ 2 \zeta ^ 4 - 2\chi ^ 2 \zeta ^ 2 - \chi ^ 2, \notag \end{split} $$

    から

    $$ \begin{split} \mathscr{B} _ {\text{rless}}(\zeta, \psi _ 1, \psi _ 2) &= \frac{\mathscr{E} _ {1,\text{rless}}}{\mathcal{E} _ {0,\text{rless}}},\cr \mathscr{V} _ {\text{rless}}(\zeta, \psi _ 1, \psi _ 2) &= \frac{\mathscr{E} _ {2,\text{rless}}}{\mathscr{E} _ {0,\text{rless}}} \end{split} $$

    で記号を定めると

    $$ \lim _ {\lambda\to 0}\lim _ {d\to 0}E[R(f _ d,\boldsymbol{x} _ 1,\ldots,\boldsymbol{x} _ n,\boldsymbol{\theta} _ 1,\ldots,\boldsymbol{\theta} _ N,\lambda)]=F _ 1 ^ 2\mathscr{B} _ {\text{rless}}(\zeta, \psi _ 1, \psi _ 2)+τ ^ 2\mathscr{V} _ {\text{rless}}(\zeta, \psi _ 1, \psi _ 2) $$

    となることが導けるそうです。

    実装

    実験結果

    パラメータは $d=100,n=500,N=25,50,\ldots,3000$ として、横軸は $N/n$ で縦軸は $\hat{R}$ としています。青色のテストデータに対する誤差に注目すると、 $N/n=1$ では $\lambda\to 0$ で発散する様子が見受けられ、また二重降下している様子も良く見えます。なお、黒線は上で示した解析解をプロットしています。

    Double Descent in Random Feature Regression

    2023秋の京都紅葉散策 十二所巡礼

    potaxyz.hatenablog.jp

    potaxyz.hatenablog.jp

    去年や昨年に引き続き。今年も忙しくあまり巡れなかったが、合間を縫って新規開拓をした。

    今年は東福寺塔頭や意外と行かなさそうな方丈庭園、そして京都の北西、山の入り口にある鷹峯を主に攻めてみた。

    本編

    東福寺 方丈庭園

    • 訪問:11/28 15時頃
    • 拝観料:500円

    多くの人が通天橋に行ってしまうためあまり見に来ないかもしれない東福寺の方丈。枯山水庭園の作庭家でよく名前を見る重森三玲が庭を手がけている。入ってすぐ南庭が目に飛び込んでくるが、お〜〜〜〜ってなる。 西庭の北西方面を見ると、一緒によく見る紅葉してる谷(と一緒に通天橋とたくさんの人)が見える。 市松模様の北庭のところも一緒に紅葉が見られたりするが、僕が行った時はそこまでだった。

    南庭

    西庭と通天橋方面の紅葉

    東福寺塔頭 正覚庵

    • 訪問:11/29 15時30分頃
    • 拝観料:1000円

    秋の特別公開をしていた。筆の寺として有名らしい。紅葉というよりは旧白洲屋敷を移築してきたとかいう本堂や茶室の構造が興味深かった。 白州さんが建築道楽だったとかいう話で、色々なところに屋久杉が使用されている(今は伐採禁止らしい)。天井が格子天井になっていたり、天井や廊下に屋久杉の一枚の切り出し板が埋め込んであったりする。部屋にガイドの人がいたので興味があれば聞いてみるといいかもしれない。 建築オタクの人は一度行ってみると良いと思う。

    庭の紅葉
    格子天井。右側に(見切れているが)屋久杉の板が埋め込んであるのが見える。

    東福寺塔頭 龍吟庵

    • 訪問:11/29 14時30分頃
    • 拝観料:500円

    こちらも重森三玲が作庭した枯山水。かなりかっこいい。龍の庭がすごい。他にも無の庭、不離の庭というのもある。先鋭的だと思う。

    龍の庭

    東福寺塔頭 即宗院

    • 訪問:11/29 15時頃
    • 拝観料:300円

    秋の特別公開中だったので入ってみた。西郷隆盛にゆかりがあるらしい。京都市名勝になっているきれいな庭園。

    庭園
    庭園

    東福寺塔頭 天得院

    • 訪問:11/29 14時頃
    • 拝観料:600円

    こちらも秋の特別公開。桔梗の寺と呼ばれているらしい。あまり人もいないのでお茶菓子いただくとかしてのんびりできると思う。

    庭園
    華頭窓

    東福寺塔頭 勝林寺(毘沙門堂

    • 訪問:11/29 13時30分頃
    • 拝観料:700円

    ここも秋の特別公開。他の東福寺塔頭に比較すると少し離れた位置にある。そのためか人はまばらだった。手水にお花が生けてあったり庭には和傘や狐のお面が置いてあったりお土産も可愛らしいものが多かったりと、かなり若者をターゲットにしている感を感じた。そこまで境内は広くないがかなり楽しめた。

    庭園

    南禅寺 方丈庭園

    • 訪問:11/27 13時ごろ
    • 拝観料:600円

    近所にあるからとずっと行くことができていなかった方丈庭園。外は激混みだったが、方丈のところは比較的人は少なめ。紅葉が見たければ一番奥の龍吟庭を目指すとよさそうだ。満足度は高かった。

    虎の児渡しの庭
    龍吟庭

    常照寺

    • 訪問:11/22 14時頃
    • 拝観料:500円(自転車の駐輪に100円かかる)

    京都の北西、鷹峯とよばれる地区にある代表的なお寺。紅葉を見ながらお茶菓子がいただけるスペースもある。吉野窓とか聞いたことがあったので見てみるもフーンという感じで終わってしまった。時期がよければその窓から紅葉が見れたりするんですかね? 白馬観音と白馬池とかいうのが少しメインのところから階段降りたところにある。

    吉野門をくぐったところ
    白馬観音像と白馬池

    源光庵

    • 訪問:14時30分頃
    • 拝観料:500円

    常照寺よりも混んでいるように感じた。円形の悟りの窓と角形の迷いの窓や伏見城遺構血天井が有名。書院から見える鶴亀の庭も美しい。駐車場からもかなり紅葉が見えた。

    ポケットモンスター 悟りの窓・迷いの窓
    鶴亀の庭
    駐車場(駐輪場)より

    光悦寺

    • 訪問:15時頃
    • 拝観料:500円

    名前の通り、本阿弥光悦にゆかりがあるらしい。参道の紅葉の感じが好き。光悦垣と呼ばれているもののところでも紅葉がみられた。きれいに鷹峯の山や、京都市内が見渡せるのが良い。

    参道
    光悦垣
    正規分布

    廬山寺

    • 訪問:
    • 拝観料:なし

    京都御所の横にある紫式部邸宅跡で、ここで源氏物語が書かれたみたいな話がある。源氏物語に関連する小さい陶磁器?皿?とか屏風とか実際の絵巻などがたくさん展示してあったのが印象的だった(撮影禁止だったので画像なし)。源氏物語の教養があればかなり楽しめると思うが、僕はそのような教養を持ち合わせていなかった...

    源氏庭

    随心院

    • 訪問:12/2 12時頃
    • 拝観料:500円

    こちらは小野小町にゆかりがあるお寺で、山科にある。深草少将の百夜通いの舞台のモデルとも言われる。建物の拝観入口前には小倉百人一首9番の石碑がある。庭園はいい感じの苔とバックに紅葉が映えていて良かった。 色々な襖絵があり興味深いが、極彩色の襖絵だけ撮影可能だったので撮っておいた。どうやら最近作られたものらしい。これに限らず最近の技術とか(?)を取り入れようとしているお寺のようで良いなと思った。

    小倉百人一首 9番 石碑
    庭園
    極彩色梅匂小町絵図

    まとめ

    かかった予算

    今年拝観でかかった金額は6700円でした。東福寺塔頭随心院には今回はお京阪で行き、鷹峯には自転車で行きました。その分入れても7000円ちょいでしょうか。

    来年以降の宿題

    なかなか宿題を消化できなくて大変だが、京都市内の紅葉スポットで残すは

    • 赤山禅院圓光寺蓮華寺、実相院などの一乗寺・岩倉地区
      • 赤山禅院かどこかは駐輪場がないらしく行きづらいかも?
    • 大徳寺
    • 嵐山のマイナースポット
    • 無鄰菴、嵐山祐斎亭など寺社仏閣以外のスポット
    • 山科の勧修寺
    • 将軍塚青龍殿

    あたりでしょうか。来年以降で回収はできるでしょうか...

    個人的おすすめ

    今年回ったところは良いところが多かったように思えますが、だんだんマイナーどころも増えてきて、その良さを感じる部分に紅葉というよりはその神社やお寺自体がどうかみたいなところに価値の重みが置かれてきている感もあったなあという感想。まあ建物とかの構造があって紅葉が映えるかどうか決まってくる部分もあるからそれはそれでいいか(?)

    • 南禅寺方丈庭園はもっと前から行っておけばよかったなあと思いました。紅葉関係なくもう一度訪れてもいいかもと思いました。

    • 東福寺方丈庭園や塔頭龍吟庵あたりは紅葉というよりは庭がかなり好きかもしれません。重森三玲庭園美術館とか行ってみようかな。あと勝林寺もかなり良かったと思います。東福寺の駅から歩いて行くときに途中で勝林寺方面と東福寺方面と分岐するんですが99%くらい東福寺方面に人が流れていくので(当たり前といえば当たり前だけど)もう少し人気になっててもいいと思う。

    • 鷹峯だと源光庵が個人的には良かったかなと思います。

    京都にあとどれだけ居るかもわからないし、来年もまわれるだけまわるぞ〜

    セキュリティ・キャンプ2023参加記【L5 チューター】

    はじめに

    セキュリティキャンプ2023にL5(TEEの活用と攻撃実践ゼミ)のチューターとして参加してきました。講師の櫻井さんとは職場のチームが同じで、チューターをお願いされたので参加することにしたという所以です。(残念ながらTEEについては概念を知っている程度でほぼ何も知らず、毎度のことながら現地キャッチアップ形式で、めちゃくちゃ試されている)

    TEE(Trusted Execution Environment)とは、信頼可能な実行環境とも訳され、ハードウェアの力を借りて信頼可能な領域内(CPU内やRAM内の保護領域とか)で秘密データを扱うことで、秘密情報を保護したままの計算が行える、という技術です。

    本ゼミで行う内容は、TEEの基本知識と応用的議論の解説、TEEアプリケーションの開発を実践してみること、そして多くの攻撃手法の解説とその攻撃手法の一部を実践的に体験する、というものです。自分でアプリケーションを作り、その脆弱性を攻撃する、ビルド&スクラップなゼミでした。スライドが570枚程度あり、かなり網羅的なゼミだったと思います(スライド作成お疲れ様です)。

    2年前の参加記はこちら:

    potaxyz.hatenablog.jp

    2年前のセキュリティキャンプのグループワークが1年続いた記録はこちら:

    potaxyz.hatenablog.jp

    ミニキャンプのチューター参加記はこちら:

    potaxyz.hatenablog.jp

    タイムライン

    1日目

    京都の自宅で朝6時前に起床。前日に豚骨ラーメンを食べすぎたせいで胃の調子が死ぬほど悪い。途中で薬局に寄って胃薬だけ買いました。なんだかんだ時間がギリギリでしたが新幹線に乗って東京、乗り換えて西国分寺、さらに乗り換えて北府中、ということで約4時間の長時間移動でした。

    会場のクロスウェーブ府中に到着。

    講師チューター控え室で少し雑談したのち、すぐにお昼ご飯の時間になりました。

    チューターの集まりに出席し、よろしくおねがいします〜とかトランシーバーの説明(チューターはトランシーバーを持っており、必要があればそれで連絡をしたり受けたりします)を受けたりしていると、開講式、LT大会、グループワークと続き、すぐに夕食です。

    夕食後にスイーツビュッフェで交流会とのことでしたが、胃の調子が悪かったので、ご飯は食べきれず、スイーツビュッフェでも胃によさそうなフルーツをいくつか食べる程度という感じでした。

    さて、最初の講義時間です。我々のL5の講義では、TEEの中でもintelSGXを利用するのですが、例えばMacBookとかでは対応していないのでazureのインスタンスを利用して開発を行います。sshのアクセス情報がどこにあるのかわからず(普通にモニターに載ってるのを見てなかっただけ)若干手間取りましたが。

    チューターではありますがTEEの開発をしたことはないので、私も受講生と同様にコーディングをしてみることにしました。

    コーディングしてみよう!ということでプログラミングの簡単なレクチャーと開発を少しやると初日は終了です。

    Trustedな領域とUntrustedな領域をまたぐ為に色々込み入ったことをやらないといけない、変な独自の型が存在する、メモリの管理を色々としないといけない、独自のSDKの利用等々、組み込み開発に似ている部分がかなり多く、中々難しい開発になるなあという印象を受けました*1。開発の難しさには、講師の方や、SGXを利用した開発をされている方が他のクラスのチューターにもいらっしゃいましたが、皆文句を言っています(笑)。

    2日目

    おはようございます。今日も胃の調子が悪く、朝からヴィーガンの食事です。

    今日は朝から開発があり、ワイワイと雑談も挟みながら開発をしていきます。受講生の方が詰まったりしていたらその部分を手伝ったり説明してあげたりもします。自分含めみなさんHello Worldにあたるプログラミングは完成し、いよいよ具体的なアプリケーション(パスワード管理アプリ)の開発に入っていきます。

    夜には協賛企業さんからの企業紹介でした。チューターも受講生の方に混じってお話を聞きます。

    ホームルームにはNOCの見学に行きました。ネットワークまわりをやってくれている方々です。建物自体のネットワーク機器置いてある配電盤室的なとこ(名前わからず)の機器をそのまま自前のものに取り替えたりとかしてるのはスゲーという気持ちになったりしました。

    チューターの夕礼を終え、2日目終了です。

    3日目

    おはようございます。胃の調子が治りました(やったー)。今日は朝から社会見学ということで、IPA文京オフィスの見学です。内容はあまり言ってはいけないようなので詳細は割愛しますが、中々面白かったです。渋滞がすごくてバスに乗っている時間がけっこう長く、行きも帰りもずっと寝ていました。というわけでスケジュールが1時間近く押してしまっていました。

    昼ごはんを食べ終わると途中夜ご飯を挟んで、21時まで開発です。初めにazureのインスタンスを立ち上げようとしたら、更新中とかなってて使えなくなるというトラブルがあり、講師の方がお怒りになっていました(笑)。受講生の方が攻撃手法の実践がやりたい!とのことで、途中で攻撃手法についてのレクチャーも入ります(かなり詳しく攻撃手法の解説があったので、お話の時間がけっこう長かったかも)。しばしば他のコースからの見学が来るので、講師の方と僕とで応対をしたりします。

    チューターの夕礼を終え、3日目終了です。

    4日目

    おはようございます。今日は朝から開発ですが、開発できるのは今日が最後です。

    みなさん開発にあたっての目標的なものはなんとか達成できていたので、各自興味があるものを開発していきます。アプリケーションの機能拡充や、攻撃手法をいくつか試してみる等、受講生がやりたいことをやってもらって、また成果発表のスライドも作成してもらっていました。その間自分もアプリケーションの機能を拡充できるように実装していました。これで全日程の開発は終了です。

    最後にLトラック内で成果報告会みたいなものをしました。自分もL2トラックの卒業生なので、そんなこともやったなあと想いを馳せたりしていました。

    夕食が豪華でした。

    夕食後はLT大会でした。面白い発表ばかりで楽しむことができました(広報の方もLT大会出るんだ!と思った)。

    グループワークでちょっかいをかけたりしているとあっという間にホームルームです。ホームルームの時間は他のクラスの見学に行こう!ということでしたが、部屋に誰もいなくなってしまうと困るので講師の方と部屋で待機していました。他のトラックから見学に来られた方と、部屋に残っていた受講生とか講師の方とかと名刺交換したりお話したりしました。

    チューターの夕礼を終えて、名刺交換会をするなどしていると、あっという間に4日目が終了です。

    5日目

    7時45分くらいに起床。朝食を摂り、お部屋をチェックアウト。

    グループワークの発表を聞きます。色々なアイデアが出ていて面白いです。その後は集合写真を撮ります。合間を縫ってLトラックの集まった人で写真を取ったりしていました。

    専門コースとジュニア、ネクストの成果発表が終わると昼食です。

    午後からは開発コースの成果発表です。最後にNOCからどういうことをやっているか説明がありました。殆どが自分の専門とは離れた話(そもそも自分はセキュリティやコンピューターサイエンスをやってる人間ではありません)なので、他のコースの成果発表はやはり面白いです。

    あっという間に閉講式です。5日間おつかれさまでした。

    最後に講師の櫻井さんの車を見せてもらってカッケ〜と思ったりとか、Lトラックのプロデューサーの松岡さんと握手をしたりするなどしていました。

    ちなみに、開発していたコードはこんな感じになりました。とりあえずザーっと落書きじゃないですが、そんな感じで書いていたのであまり綺麗ではないです。利用可能な環境に制約があり手元では動かせないので、リファクタとかコードの改善ができるかは未定です。

    github.com

    さいごに

    チューターとしての参加は初めてで、しかも自分の詳しくない分野のチューターではあったので役が務まるか初めは不安でしたが、参加してみると(まるで受講生のように)自分が知らなかった技術を学ぶことができ、また受講生のサポートもそれなりにできたのではないかな、と思います。受講生が少しずつ内容を理解して、成長していく姿を見ることができたのも良かったです。2年前受講生の立場で参加した時はオンラインでしたが、やはりオフラインの方が会話や雑談が自然に発生して、それも良かった点かなと思います。本当にあっという間の5日間で、とても楽しかったです。講師の櫻井さんには大変お世話になりました。また、他の講師やチューターはじめ、関係者の皆様ありがとうございました。そしてお疲れ様でした!

    *1:筆者はsony製のマイコンspresenseを利用して放射線測定器の開発を行っています。arduino IDEの開発環境も利用できますが、放射線測定に必要な高サンプリングレートでの電圧取得機能が制限されている為、開発環境としてはspresense SDKというものを使って生のC言語のコードを書いています。