THINKING MEGANE

Dynamic Gamma-Poisson modelを試す

以前のADWINのように、変化する環境において適応的に振る舞うための仕組みについて調べる中で以下の論文で紹介されていたDynamic Gamma-Poissonモデルについてベイズ推定の理解を兼ねて試してみたのでメモ。

ベイズ推定

統計モデルとは

「ある確率変数$Y$の実現値$y=\{y_1,y_2,..,y_n\}$から、$Y$が本来従う確率分布(真の分布)を推定するためのもの」

とされている。 ベイズ推定はベイズの定理に基づいて観測したデータと過去の情報からデータの本来従う確率分布を推定する。

ベイズの定理 $p(\theta \mid y) \propto p(y \mid \theta)p(y)$ に対して右辺(尤度x事前確率)が具体的な確率値でかつ分布が数え上げられるような単純な場合は理解は比較的容易。

一方で、データの確率分布がパラメタによって変動するような確率質量関数や確率密度関数に従う場合、そのパラメタ(母数)の分布を推定することで、(分布の種類が分かっていればパラメタの推定が分布の特定になるので)データの従う確率分布を推定できる。 この時、データの分布の種類に応じた事前分布を選択することで事後分布が求めやすくなる(共役事前分布)。

このようなパラメタを推定するようなベイズ推定に関しては以下の資料が理解の助けになる。

以下、ポアソン分布のパラメタ推定を例にベイズ推定の理解を深め、これを拡張したDynamic Gamma-Poissonモデルを説明する。

ポアソン分布

単位時間に平均$\lambda$回起きる事象が単位時間に$k$回発生する分布。

平均が$\lambda$のポアソン分布を表す確率質量関数は\[P(X=k)=\frac{\lambda^{k}}{k!}\cdot e^{-\lambda}\]であり平均$E[X]$は$\lambda$となる。

ポアソン分布のパラメタ$\lambda$を推定する

Parameter Estimation Fitting Probability Distributions Bayesian Approachのp.19の例を元に説明する。

  • $X_1,X_2,..,X_n$ $i.i.d.$ $Poisson(\lambda)$
    • 単位時間に平均$\lambda$回起きる分布に従う確率変数の実現値を$n$回観測
    • $X_i$は0以上の整数値
  • $lik(\lambda) = f(x_1, x_2,..,x_n \mid \lambda) = \prod_{i=1}^n f(x_i \mid \lambda)$
    • 尤度はパラメタ$\lambda$において観測した値が得られる確率(この場合は上述したポアソン分布の確率質量関数$P(X=x_i)$)
    • 複数回観測した場合はその同時確率
  • $\lambda \sim Gamma(\alpha, \nu)$
    • 事前分布、つまり、$\lambda$が「ある値(の範囲)」を取る確率
    • 今回は事前分布にガンマ分布を仮定する(ポアソン分布の共役事前分布)
    • $\pi(\lambda)$
  • $\pi(\lambda \mid x) \propto lik(\lambda) \times \pi(\lambda)$
    • ベイズの定理より事後分布は尤度x事前分布で求められる
    • $P(x\mid\lambda)P(\lambda)$なので、$\lambda$の分布から観測値$x$が得られる確率と言える
  • $Gamma(\alpha^*,\nu^*)$ with $\alpha^*=\alpha+\sum_{1}^n x_i$ and $\nu^*=\nu+n$
    • 上を計算すると事後分布は観測された$x$の値の合計を$\alpha$に、観測回数$n$を$\nu$に加えたものをパラメタとするガンマ分布とみなせる
    • 観測したデータから$\lambda$の分布(確率変数が従う確率分布(分布の種類はわかっているのでそのパラメタ))を推定した

Dynamic Gamma-Poissonモデル

論文3.1によれば、クリック数$c$、閲覧数$v$、CTRを$\theta$としたときに、

  • 平均$v\theta$(=$\lambda$)である$Poisson(\lambda)$に従い観測されたクリック数から
  • $\theta$の事前分布に平均が$\alpha/\gamma$、分散が$\alpha/\gamma^2$である$Gamma(\alpha,\gamma)$を仮定して
  • $\theta$の事後分布を$Gamma(\alpha+c,\gamma+v)$として得られるとしている

ただし、実際はこの推定は$\lambda$の推定であるため、CTRとして考えるために以下のように考える。

  • $\lambda$を1閲覧($v$)の間の平均回数と考える(つまり$\lambda=1*\theta$)
  • 1閲覧に該当する期間を閲覧数分、観測した
  • これによって推定された$\lambda$は$\theta$と等しくなる

ここで、$Gamma$のパラメタはこれまでのクリック総数と閲覧総数であることから、$\lambda$の値が変化する場合に過去のデータに引きづられてしまい、速やかな追従を行うことができない。 論文では、Dynamic Gamma-Poissonモデルとして過去の観測結果に対する割引の概念を導入することでこれを解決する。 実現はシンプルで、割引率$(0< \delta \leq1)$を導入し、事後分布を$Gamma(\delta\alpha_{t-1}+c_t,\delta\gamma_{t-1}+v_t)$のように求める。 これによって累積された過去の総数を減らし、直近のデータに重み付けが行われる。 論文中では0.95から1の間ぐらいが良い結果を得たとしている。

以下、実際に同じ条件での$\lambda$の推定を通常のGamma-PoissonモデルとDynamic Gamma-Poissonモデルで行ったものを比較する。 評価では、CTRが0.4のアイテムに対して1ステップごとに7回の閲覧が行われた際のクリック数を観測データとした。 また、20ステップ目にCTRが半分の0.2になっている。

dgp

評価期間内では通常の推定の期待値0.3程度までの追従に止まったが、Dynamicな手法ではより早く実際のCTRである0.2に近づけたことが分かる。

動作確認用のコード

動作確認用のコードは以下にある.

このような感じで利用できる.

python dgp.py --lambda_ 0.4 --view 7 --delta 0.9

勉強会をオンライン配信するための必要最小限な環境構築

昨今の状況だけでなく、多様な働き方やコミュニティ(とそこで得られる情報)に接する機会を増やすためにも今後、オンライン勉強会は広がっていくと思います。 Fukuoka.goでも今回、初めて勉強会のオンライン配信を実施しました。 同様のモチベーションを持つイベントの主催者に向けて、勉強会をオンライン配信するためにやった最小限の環境構築についてまとめておきます。

想定する環境

オンライン勉強会には、Google Hangouts Meetなどのビデオ会議のWebサービスとYouTubeライブ配信を用います。 勉強会には、配信を行う運営者、発表を行う登壇者、発表を聞く参加者がいるとします。

登壇者はビデオ会議の画面共有によって各々のPCから発表を行います。 運営者はビデオ会議の画面と音声をYouTubeでライブ配信します。 参加者はYouTubeのライブ配信を視聴、必要に応じてコメントします。

architecture

ビデオ会議とライブ配信のWebサービスを利用することで、Macに二つオープンソースソフトウェアをインストールするだけで、最低限の配信環境環境が整ってしまいます。ありがたい時代になりました。インターネット万歳。

手順のサマリ

1. YouTubeアカウントを作成(要Googleアカウント)
2. YouTubeライブ配信を作成(初回は24時間程度待つ必要あり)
3. 配信に必要なソフトウェアをダウンロードしてインストール
  - [OBS Studio](https://obsproject.com/download)
  - [BlackHole](https://github.com/ExistentialAudio/BlackHole)
4. YouTubeエンコード配信を選択し、ストリーミングキーを発行
5. OBSにストリーミングキーを設定
6. OBSで音声ミキサーとしてBlackHoleを追加(マイク2)
  - 必要に応じてマイク(1)はミュート
7. OBSでソースにウィンドキャプチャでMeetを実行するブラウザを追加
  - ウィンドウキャプチャに必要なウィンドウが出ない場合はmacOSXのセキュリティとプライバシーでOBSが画面収録を許可されているか確認
8. macOSXの音声出力をBlackHoleに変更
9. OBSで配信開始をクリック
  - しばらく待つとYouTube側の配信ボタンが押せるようになる
10. YouTubeの配信開始をクリック
11. 配信する
  - 画面がチラつく場合はOBS Studioがウィンドウキャプチャしている画面の前面に配置されていないか確認
12. YouTubeの配信終了をクリック
13. OBSの配信終了をクリック

手順の詳細

以下、上記手順についての詳しい説明です。

なお、配信のための環境構築には配信の専用機を用意するのが一番楽でしょう。 以下、配信の専用機としてMacBook Pro (15-inch, 2019) macOS Catalina(10.15.3)を用いています。

また、配信に利用するPCは有線によるネットワーク接続をおすすめします。

YouTubeアカウントを作成

持っていなければ作成しましょう。Googleのアカウントが必要です。

YouTubeチャンネルを作成

ライブ配信をするチャンネルを作成しましょう。

YouTubeライブ配信を作成

ライブ配信を開始 ボタンからライブ配信を登録します。 初めてライブ配信を登録する場合は、24時間待つ必要があるため、余裕を持って登録しましょう。

start

エンコーダ配信 タブから、タイトル、公開範囲、カテゴリを指定します。 作成後、ライブ配信のための ストリームキー が取得できるため控えておきます。

配信に必要なソフトウェアをダウンロードしてインストール

ライブ配信をサポートしてくれる OBS Studio と仮想オーディオデバイスを作成するための BlackHole をインストールします。

*BlackHoleはmacOSから出力される音声(今回の場合ではビデオ会議の音声)をYouTubeで配信するために利用します。配信機がWindowsであればデスクトップ音声をキャプチャできるそうなのですがmacOSではできないため、BlackHoleで仮想オーディオデバイスを作成して回避します。

以下、OBS Studioは 24.0.6 (64 bit)、BlackHoleは v0.2.6を利用した場合の手順となります。

OBS Studioでストリームキーの設定

  1. 設定 -> 配信
  2. サービスにYouTube/YouTube Gamingを選択
  3. サーバーにPrimary YouTube ingest serverを選択
  4. ストリームキーに先ほど控えておいた値を入力

OBS Studioで音声の設定

  1. 設定 -> 音声
  2. マイク音声 2にBlackHole 16chを選択

必要に応じてマイク音声(1)は無効、もしくは配信時にミュートしておくと余計な音声が入らずに便利。

OBS Studioで配信ソースの設定(待ち受け画面)

配信の準備中やビデオ会議の画面を表示したくない時の待ち受け画像のシーンを準備しておくと便利。

  1. シーンを選択し、画像ソースを追加
  2. 新規作成からOKで画像プロパティが表示される
  3. 画像ファイルを選択してOK

OBS Studioで配信ソースの設定(ビデオ会議画面)

タブブラウザの場合、ビデオ会議のウィンドウは分けておくと便利。

  1. 待ち受け画面とシーンを分けるのでシーンを追加
  2. 新しいシーンを選択し、ウィンドウキャプチャソースを追加
  3. 新規作成からOKでウィンドウキャプチャプロパティが表示される
  4. ビデオ会議のウィンドウを選択

ウィンドウに起動中のアプリが表示されない場合は、macOSの設定->セキュリティとプライバシーから画面収録に対してOBSの許可がチェックついているか確認のこと。

OBS Studioの設定確認

ここまででOBS Studioの下部は以下のような設定になっているはずです。

obs

シーンは静止画用、シーン2がビデオ会議の画像用です。 僕の環境ではシーン2に、ビデオ会議の画面とTwitterの画面を二つ並べて表示するようにしたので、ウィンドウキャプチャのソースが2つあります。

また、音声ミキサーはマイク2をミュートにすれば、ビデオ会議の音声が配信に乗らなくなります。

macOSの音声出力をBlackHoleに変更

ビデオ会議の音声をBlackHole経由でOBS Studioに渡せるようにします。 macOSの設定->サウンドから出力タブでBlackHoleを選択します。

  • *macOSの音声出力をBlackHoleに変更するとmacOSからは音声が聞こえなくなります。音声も聞きたい場合は、macOSのユーティリティ->オーディオ装置から複数出力装置を作成し、MacBookのスピーカーとBlackHoleに同時に出力できるデバイスを作成してください。そしてmacOSの音声出力をBlackHoleではなく、複数出力装置を選びます(OBS StudioはBlackHoleの入力側を利用するのでそのままで良いです)。 Ref: https://github.com/ExistentialAudio/BlackHole/wiki/Multi-Output-Device 手元では、複数出力装置について外部オーディオ装置との相性が悪かったため利用していません(配信の専用機なのでここから音が聞こえる必要はなく現在のところBlackHoleを直接利用で困ってない) もし、外部オーディオ装置も含めて高度な設定が必要な場合は、LadioCastなどのソフトウェアミキサーの導入を検討してください(そして良いやり方があれば教えてください)

OBS Studioから配信開始

OBS Studio側で配信開始ボタンをクリック。 しばらくするとYouTube側の管理画面に配信のプレビューが表示され、YouTube側のライブ配信開始ボタンがアクティブになる。

YouTubeから配信開始

YouTube側でライブ配信を開始ボタンをクリック。 30秒程度で参加者にライブ配信が見えるようになる。

配信中

YouTuberとして頑張る。適宜シーンの切り替えやマイクのミュートなど操作が必要です。

  • ウィンドウキャプチャの画面がチラつく場合は、OBS Studioがキャプチャするウィンドウの前面に表示されていないかを確認しましょう。 僕の環境では、OBS Studioをこれらより背面に持っていくことでチラツキが解消しました。

YouTubeで配信終了

YouTube側でライブ配信を終了する。

OBS Studioで配信終了

OBS Studio側で配信終了ボタンをクリック。

配信後

ライブ配信の動画は自動でアーカイブとして公開されます。 アーカイブに残さない場合は、YouTubeのライブ配信の管理画面から削除が必要です。 この辺りは事前に発表者に了承をとっておく必要があると思います。

動画の編集もYouTubeの管理画面から行えるため、必要に応じて無言の時間などを取り除くことが可能です。

editor

初のオンライン配信を終えての感想など

これまでFukuoka.goでは、他の地域のコミュニティと拠点間をリモート接続する取り組みは既におこなっており、これをライブ配信に乗せるだけだろうと思っていましたが、それなりに準備や実行で大変だった点や反省点もありました。

よかった点

  • 高速な配信環境を準備できた(配信のネットワーク環境は結構重要。家のネットワーク(特に上り)が遅いと配信できないので注意)
  • 事前に発表者にアーカイブ残すことについてきちんと承諾をもらった
  • 事前にOBS Studioの設定を終わらせて、当日は起動するだけでよかった
  • 登壇者はイベント30分前にビデオ会議に集合して画面共有やミュートのルールなどの手順をおさらいした
  • 事前にオンライン配信のノウハウを仕入れることができた
  • 発表の始まりと終わりはある程度、司会者も音声オンで入っておき盛り上がりを演出できた
  • 静止画のシーンを用意することでビデオ会議の切り替えなどのもたつきがあっても配信上は見せないようにできた

反省点

  • 配信準備した環境と配信を行った環境が違ったので設定周りで当日焦った(リハーサル大切…)
    • 画面のチラつき(途中で解消してよかった)
    • 画面サイズの違い
  • 発表中の登壇者に対して、連絡をとる手段を用意していなかった
    • 打鍵音が気になる、発表時間過ぎてるなどを伝えようとするとそれも配信に乗ってしまう
  • 発表中の登壇者がコメントの盛り上がりなどを見るのが難しかった
  • Twitterの画面を共有していたが自動更新にならないので手動で更新する手間がかかった

などです。

今回の構成は、登壇形式の勉強会において、参加者が視聴する際の敷居を低くすることを目的に設計しました。 参加者にとっては個別のビデオ会議のWebサービスのアカウントが不要ですし、運営者にとってもビデオ会議のアクセス制限や人数制限を気にする必要がありません。 もちろん、勉強会の方式(双方向のディスカッション)によっては他のやり方が最適な場合もあると思います。 そのような場合についてのノウハウも共有してもらえれば嬉しいです。

『強化学習アルゴリズム入門』第1章〜第2章の学習メモ

書籍『強化学習アルゴリズム入門』について第1章〜第2章を読んでの学習メモをまとめる。

強化学習は一連の行動によって得られる報酬を最大化する行動基準を学習する。 そのために、「一連の行動」を状態の遷移と捉えて、その状態に対する価値(状態価値)を求める。 また、各状態には取りうる複数の行動があると考え、その状態の価値を、これらの行動ごとの価値(行動状態価値)から求める。

強化学習アルゴリズムごとの価値関数

はじめに、第1章〜第2章までで学ぶ各強化学習アルゴリズムの状態価値関数と行動状態価値関数をまとめておく。

状態価値関数 $V(S_t)$行動状態価値関数 $Q(S_t,a_t)$
動的計画法$V(S_t)=\sum_{a} \pi (a \mid S_t) Q(S_t, a_t) \tag{1}\label{1}$$Q(S_t,a_t)=r_{t+1}+\gamma V(S_{t+1}) \tag{2}\label{2}$
モンテカルロ法$V(S_t)=\sum_a Q(S_t,a_t) \frac{N_a}{N} \tag{3}\label{3}$ $V(S_t)=max\{Q(S_t,a_t)\} \tag{4}\label{4}$$Q(S_t,a_t)=\frac{1}{m}\sum_{i=1}^{m} G^i(S_t,a_t) \tag{5}\label{5}$ $Q(S_t,a_t) \gets Q(S_t,a_t)+\alpha[G(S_t,a_t)-Q(S_t,a_t)] \tag{6}\label{6}$ where $G(S_t,a_t)=r_{t+1}+\gamma G(S_{t+1},a_{t+1}) \tag{7}\label{7}$
TD(0)法同上$Q(S_t,a_t) \gets Q(S_t,a_t)+\alpha[\{r_{t+1}+\gamma(Q(S_{t+1},a_{t+1}))\}-Q(S_t,a_t)] \tag{8}\label{8}$

以下、各強化学習アルゴリズムについて捕捉する。

動的計画法

確率型ベルマン方程式\eqref{1}に従い行動状態価値を更新する手法。 ここで$\pi (a \mid S_t)$は行動確率であり、方策$\pi$に従い状態$S$において行動$a$を選択する確率を示す。 また、$Q(S_t, a_t)$は行動状態価値関数であり\eqref{2}によって求める。

行動状態価値関数\eqref{2}は状態$S$において行動$a$によって遷移する状態$S$で得られる報酬$r$とその状態の価値$V$の和によって求められる。 ここで$\gamma$は価値の割引率である。

書籍ではこの価値の求め方を「将来に対する平均($X_{t+1}$ から$X_N$ までの平均$\bar{X}$)の逐次的な計算」との類似性によって説明している。 \[ \bar{X_t}=\bar{X}_{t+1}+\frac{1}{N-t}(X_{t+1}-\bar{X}_{t+1})
=(\frac{1}{N-t})X_{t+1}+(\frac{N-t-1}{N-t})\bar{X}_{t+1} \]

動的計画法における学習プロセスは以下のようになる。

方策反復法

1. 状態価値が収束するまで以下のステップを繰り返す
2. 各状態において方策(行動ごとの行動状態価値Qによるepsilon-greedyなど)に従い行動確率を求める
3. 各状態において行動ごとの行動状態価値を遷移後の状態の報酬と状態価値から求める
4. 2と3よりその状態の状態価値を更新する
5. 全ての状態で状態価値の更新が終わったら次の学習イテレーションへ

価値反復法

$\epsilon$-Greedyの探索率$\epsilon=0$の場合は方策に依存しない価値反復法となる。

1. 状態価値が収束するまで以下のステップを繰り返す
2. 各状態において行動ごとの行動状態価値を遷移後の状態の報酬と状態価値から求める
3. 2のうち最大の値で状態の状態価値を更新する
4. 全ての状態で状態価値の更新が終わったら次の学習イテレーションへ

モンテカルロ法

動的計画法は環境情報が既知の場合に使えるが未知の場合、環境も含めて手探りで行動基準を学習しなければならない。 そのような場合はモンテカルロ法を利用する。

モンテカルロ法の価値の学習には総報酬$G$\eqref{7}を用いる。 総報酬は一連の行動が終わり得た報酬$r$から遡って状態(と行動)に対して価値を算出する。 書籍ではこの価値の求め方も「将来に対する平均」で表現している(tの値をt+1から求める)。

なお、行動状態価値は\eqref{5}により試行数$m$での平均とする(学習ステップにおいて\eqref{3}\eqref{4}\eqref{6}は使わない)。

モンテカルロ法における学習プロセスは以下のようになる。

1. 任意の試行回数だけ以下のステップを繰り返す
2. 最初の状態から報酬rを得るまで以下のステップを繰り返す
3. 現在の状態において方策(行動ごとの行動状態価値Qによるepsilon-greedyなど)に従い行動aを決定する
4. 次の状態へ遷移
5. 報酬を得たら行動を遡り各状態(と行動)の総報酬Gを求め、試行回数での平均によって行動状態価値Qを更新する

TD(0)法

モンテカルロ法は総報酬$G$を求めるために必ず一連の行動を終える必要がある。 そこで、逐次的に行動状態価値を求めることでモンテカルロの探索行為を効率的に行おうとするTD(0)法がある。

TD(0)法では、行動状態価値$Q$を\eqref{8}によって求める。 これは、モンテカルロ法の行動状態価値関数\eqref{5}を逐次計算表現にした\eqref{6}の$G(S_t,a_t)$を動的計画法の行動状態価値関数\eqref{2}で置き換えたものと考えることができる。 つまり、総報酬$G$を$t+1$の報酬と状態価値で近似するものである。

TD(0)法における学習プロセスは以下のようになる。

SARSA (方策反復法)

1. 任意の試行回数だけ以下のステップを繰り返す
2. 最初の状態から報酬rを得るまで以下のステップを繰り返す
3. (S) 現在の状態において方策(行動ごとの行動状態価値Qによるepsilon-greedyなど)に従い行動aを決定、Q(S_t,a_t)を得る
4. (A) 行動aに従い状態を遷移
5. (R) 遷移後の状態で報酬rを得る(得られない時もある)
6. (S) 遷移後の状態において方策に従い行動aを決定、Q(S_t+1,a_t+1)を得る
7. (A) 行動aに従い状態を遷移
8. 5の報酬rと3と6の行動状態価値QでQ(S_t,a_t)を更新

Q学習 (価値反復法)

$Q(S_{t+1},a_{t+1})$を$max\{Q(S_{t+1},a_{t+1})\}$で求めることで方策に非依存とする。

1. 任意の試行回数だけ以下のステップを繰り返す
2. 最初の状態から報酬rを得るまで以下のステップを繰り返す
3. 現在の状態においてランダムに行動aを決定、Q(S_t,a_t)を得る
4. 行動aに従い状態を遷移
5. 遷移後の状態で報酬rを得る(得られない時もある)
6. 遷移後の状態においてランダムに行動aを決定、Q(S_t+1,a_t+1)は全行動状態価値のうち最大の値とする
7. 行動aに従い状態を遷移
8. 5の報酬rと3と6の行動状態価値QでQ(S_t,a_t)を更新

学習書籍

テッド・チャン『息吹』と「なめらかなシステム」

昨年末にあんちぽさんからお勧めされていた、テッド・チャン『息吹』をようやっと読み終えた。

本書を通して所属する研究所のビジョンである「なめらかなシステム」の世界観について理解が深まったように感じたのでメモしておく。

本書は表題の「息吹」を含むSFの短編集である。全部で9編の作品から成る。 多くの作品は、現在の地球の水準より進んだ技術とそれを扱う知性体が登場する。 登場人物は世界を左右するような運命や世界をまたにかける使命など帯びていないどこにでもいるような人々であることが多い。 (『イブの時間』などが雰囲気としては近いかもしれない) 彼ら彼女らはただ、彼らにとっては当然となった新しい技術に起因する変化に彼ら彼女らなりに適応していく。 この技術と変化の設定がリアリティを持っているがゆえに、読者はそう遠くない未来に地球の技術水準が到達した後に発生するであろう変化に対して自分ならばどうするかと没入感を持って作品にのめり込む。

さて研究所のビジョンとしての「なめらかなシステム」であるが、情報システムとこれを取り巻く要素が互いに影響を及ぼし合う総体としてのシステム観である。 これに対し、以前に「なめらかなシステムの見据えるもの。個人的考察」のエントリで、なめらかであることの必然性を問いの発端としてその未来像を検討した。 その際は、「個性」というキーワードで、システムと接する要素が多様かつ継続的に変化することを前提としてこれにシステム側が適応することがこの必然性につながると考えた。 いわば、システムを利用する要素(特に人間)が主でシステムが従のような捉え方であった。 ここで、「なめらかなシステム」自体は、要素間に主従の考えは導入していないにも関わらず、個人の感性としてバイアス的にこのような考えが導入されてしまったと思う。 そのためか、互いに影響を及ぼし合うと言いつつも、システムの利用側としては、そのシステムとそのタスクに限定された影響(例えば、情報要求の前進、あるいは具体化など)程度に収まると考えていた。

一方で、今回の読書を通して、一段階規模を広げたシステム観に思い至れた。 もし、個別のシステムを超えて、全体としての技術水準やパラダイムのような圧倒的な変化があれば、主従が変化し、そのような技術に追従するために人生観や哲学でさえも(好むと好まざるに関わらず)そこに適応しなければならない。 「なめらかなシステム」においては、ある意味、これまでであれば受け手側が制御不能なレベルでの変化をも適応していきたい。

今回、単一のシステムから技術、パラダイムの変化にまで拡大してシステム観を適用して考える契機になったと思う。 僕にとって発想を広げるのはSFを読む醍醐味であり、今回の作品は大いにこれが達成されて満足している。 興味を持った方は是非読んで欲しい。 短編集なので1時間程度の空きがあれば少しづつ読み進めることができると思う。 代表作の「息吹」だけでも読んで欲しいし、「ソフトウェア・オブジェクトのライフサイクル」「偽りのない事実、偽りのない気持ち」「オムファロス」「不安は自由のめまい」もお勧めしたい。

2019

今年は研究とGo言語三昧だった。 特にGo言語については、福岡でGoConを開催し、GopherCon2019で初の海外カンファレンスに登壇した。 大規模カンファレンスの主催も海外の大きなカンファレンスでの登壇も初めての経験で準備もプレッシャーも大変だったが、多くの人と笑いながら協力しながらなんとか達成することができたと思う。 これらの経験は自分の行動の幅を世界基準に広げるにあたって大きな自信につながった。 加えて、コミュニティ活動として主催するFukuoka.goを他の地方コミュニティと同時開催したり、Go言語教室を招いたり、OSS Gateのメンター、Fukuoka.LTの運営をやったりと精力的に福岡のコミュニティを全国とつなげ、盛り上げることができた。 来年もGo言語を武器にどんどん活動していきたい。

研究については、当初目標だったジャーナルには残念ながら不採録となったものの、改めて研究を発展させ年内に再度投稿することができた。 今年執筆した論文とそのフィードバックから、研究の背景(動機、位置付け、従来課題の整理)は一定のレベルで書けるようになったのではないかと感じる。 一方で、提案手法とその評価に関する指摘の割合が多くなってきており、改めて提案手法の貢献を明確にできるよう考え抜いていかなければならない。 これまでの研究を通して「常に変化しうる多数の環境に対する自律適応的なシステムとその仕組み」が背景にあるのではないかと考えており、来年はこの観点でのサーベイと体系化を進めていきたい。

2019年をかけて、多くのことを達成することができた。 特に精神的な面では強くなれたのでないかと思う。 上期の前半は、研究で実績が出ないことに対する焦りや力不足でまたも袋小路に入ってしまったが、アドバイスや助力いただけたことで立て直すことができた。 それでも、何かをやることに対する漠然とした恐怖や、過度な専念などいくつかの弱体化がかかっていたように思う。 結局は、無能だと判断されたくないだとか、集中することができれば大きな成果を出せるはずだとか、心の奥底に対外的な評価が中心に据えられて、自己評価とのギャップと相まって動けなくなっていたことが原因だと思い至り、過去の理性の人のエントリを見返しつつ、自分を大切に、なすべきことをやっていけるよう少しづつ冷静になれた。 周りからの評価を恐れてやるべきことを見失ったり曲げてしまうのはとても悲しいことだし、 生きている以上、やることは常に発生するのだから、これらを後回しにすることは長期的には専念にはならないし、 色々なことに向き合う必要があるのだから、人や結果に過度にひきづられることを言い訳にせずに個々の事象をある程度独立させて淡々とこなして行くのが良いのだろう。

来年は、数学、英語、サーベイを継続的にこなしつつジャーナルを通して博士課程に挑戦する。 また、トップダウンの視点をもって行動の意義を共有することで影響力を高めていこうと思う。 2020年もよろしくお願いします。

実績

以下、実績を列挙する。

論文

国内査読無し論文が2本と国内査読付きポスター発表が1本。執筆としては査読付き論文が2本。うち1本が不採録で、投稿中が1本。

  1. 三宅 悠介, 栗林 健太郎, Kaburaya AutoScaler: 多環境での運用性を考慮した自律適応型オートスケーリング制御系, インターネットと運用技術シンポジウム論文集, 2019, pp.114-115, Nov 2019. [論文] [発表資料]
  2. 三宅 悠介, 阿部 博, 栗林 健太郎, なめらかなセキュリティを目指して, 研究報告インターネットと運用技術(IOT), Vol.2019-IOT-47, pp.1-7, Sep 2019. [論文] [発表資料]
  3. 三宅 悠介, 松本 亮介, 利用者の文脈に応じて継続的に推薦手法の選択を最適化する推薦システム, 研究報告インターネットと運用技術(IOT), Vol.2019-IOT-45, pp.1-7, May 2019. [論文] [発表資料]

国外発表

初の海外カンファレンス登壇。めでたい!

国内発表

技術イベント、研究会での発表で計6回。

  1. 三宅 悠介, コマンドラインオプションをパースするコードをコマンドラインオプションから生成するツールをつくった, Fukuoka.go#14+Umeda.go, 2019年10月.
  2. 三宅 悠介, Kaburaya AutoScaler: 多環境での運用性を考慮した自律適応型オートスケーリング制御系, 第五回 Webシステムアーキテクチャ研究会, 2019年9月.
  3. 三宅 悠介, 「エンジニアコミュニティの運営について」パネルディスカッション, Engineer Friendly Space, 2019年7月.
  4. 三宅 悠介, AI(機械学習)ワーキンググループ 成果報告, ペパコンナイト, 2019年5月. [動画]
  5. 三宅 悠介, Ebira: アクセス負荷に応じて継続的にスケーリング基準を最適化する汎用オートスケーリング機構, 第四回 Webシステムアーキテクチャ研究会, 2019年4月.
  6. 三宅 悠介, Go language serverを理解する, Go 1.12 Release Party in Fukuoka, 2019年2月. [動画]
  7. 三宅 悠介, dragon-importsで爆速goimports生活 - プロジェクト Go modules, Fukuoka.go#13+Okayama.go, 2019年2月.

OSS

Kaburayaを中心に自律適応的な仕組みに向けての知見を深めていった。また、研究系のシミュレーションが増えてきた。

コミュニティ活動

Goを中心に精力的に活動できた。特に全国規模のカンファレンスを福岡で主催したり、地方のGoコミュニティ同士を繋いだり福岡以外へも活動の幅が広がっている。 また、OSS GateやFukuoka.LTへの参加を通して福岡全体の盛り上げにも協力できたかなと思う。

出版物等への寄稿

前作に引き続きガッツリと査読に関わらせていただいた。

  • 書籍査読: スマートニュース株式会社 立石 賢吾, やさしく学ぶ ディープラーニングがわかる数学のきほん ~アヤノ&ミオと学ぶ ディープラーニングの理論と数学、実装~, マイナビ出版, 2019年07月31日. ISBN:978-4-8399-6837-3

ブログ

13本。一時期は日記を書いていたが、考えをまとめる練習にはつながらなかったかもしれない。 実績に加えてどうしてそのような活動に至ったのかについてもトップダウンの視点で書いていきたい。

論文執筆の道しるべ

論文執筆にあたり自分向けの指針のようなものがまとまってきたのでメモしておく。 以下の内容の一枚もののサマリがあると良いのではないか。

  1. 背景: なぜその課題に取り組むか
  2. リサーチクエスチョン: 何を解決したいのか
  3. 従来手法の整理: これまではその課題をどう解決していたのか、これまでのやり方に残った課題は何か
  4. 提案手法: 残った課題をどう解決したか
  5. 評価: 残った課題は定量的にどの程度解決したか

ここで

  • 2.のリサーチクエスチョンと3.従来手法の課題を混同しない。
  • 3.従来手法の課題、4.提案手法、5.評価はもれなく対応する。つまり、課題が3つであれば提案手法もそれらに対する解決アプローチを提示し、それぞれに評価が行われている。もしくは課題のうち、いくつを解決するものかを明示する。
  • これらは一枚まとめにすると良い。シーケンシャルな文章とこのまとめを交互に見直すことで道筋を外れずに具体と抽象を行き来できる(といいな)

上手な査読者のレビューは提案内容を除けば上記の観点での過不足を指摘しているように思える。 指摘事項に対する個別対処では、論文執筆力の向上はのぞめないのでこのような枠組みも意識して一定の水準での論文を執筆できるようにもなっていきたい。

また、議論から多くを得るためには

  • 分野のやや異なる人とは1.背景の説明を長めに取ることで自分の思い込みや暗黙の前提が浮き彫りにされ読み易い論文になる
  • 分野の同じ人とは同じ課題意識を持つとみなし、従来手法の整理と提案手法のアプローチを中心に議論する
  • 差読者目線を持つ人とは、リサーチクエスチョンを一言で伝わるか、それが解決したかをできるだけ手短に説明する

のような感じに使い分けると良いのではないかなと考えている。

コマンドラインオプションをパースするコードをコマンドラインオプションから生成するツールをつくった

コマンドラインオプションの形式は決まったけれども、パース処理を実装するために各言語やライブラリのドキュメントを読むことを繰り返していたので、この手間を省くためのツールをつくりました。

flagenは、先に決めたコマンドラインオプションから、これを解析するための各言語用のコードを出力するツールです。 オプション名から変数名や変数の型、デフォルト値が決定されるため、汎用的なボイラーテンプレートと比較して編集の手間が少なくなります。 また、テンプレートによって任意の出力を行えるため、エディタや自前のボイラーテンプレート出力ツールとの連携が容易です。 使いやすくするため、プリセットのテンプレートとしてGo、Ruby、Python、Shellのものを提供しています。

使い方

使い方は、テンプレートと実際に使う時のコマンドラインオプションを渡すだけです。

$ flagen YOUR_TEMPLATE YOUR_COMMAND_LINE_OPTIONS...

例えば、

$ flagen go --dist erlang -e k/l --lambda 1.5 -k 1 -v

と指定すると、Go用のコマンドラインオプションの解析処理を出力します。

var (
	dist	string
	e	string
	lambda	float64
	k	int
	v	bool
)

func init() {
	flag.StringVar(&dist, "dist", "erlang", "usage of dist")
	flag.StringVar(&e, "e", "k/l", "usage of e")
	flag.Float64Var(&lambda, "lambda", 1.5, "usage of lambda")
	flag.IntVar(&k, "k", 1, "usage of k")
	flag.BoolVar(&v, "v", false, "usage of v")
}

指定されたコマンドラインオプションから変数名、オプション名、型、デフォルト値が設定されることで編集の手間が極力ない状態になっています。

Python、Ruby、Shellの例はGodocのExamplesを参考にしてください。

テンプレート

テンプレートはGoのtext/templateを利用して解析されます。 テンプレート内では、.Flags(解析したオプションの情報)と.Args(残りのコマンドライン引数)が利用可能です。 .FlagsNameValueをもち、Valueは更にTypeGetをもちます。

以下は、解析したオプションの情報を列挙するシンプルなテンプレート(my.tmpl)です。

{{ range $flag := .Flags -}}
  {{ $flag.Name }}={{ $flag.Value.Get}}({{ $flag.Value.Type }})
{{ end }}
$ flagen my.tmpl --dist erlang -e k/l --lambda 1.5 -k 1 -v

このテンプレートから以下の出力を得ることができます

dist=erlang(string)
e=k/l(string)
lambda=1.5(float)
k=1(int)
v=false(bool)

また、テンプレート内では文字列のケース変換のための関数を利用することができます。 主に変数を言語の命名規約に合わせるのに使えます。 使える関数は、こちら で確認ください。

連携

Vim

flagenの結果は標準出力を使っているため、エディタとの連携も容易です。 例えば、Vimでは以下により、カーソル位置に結果を挿入することができます。

:r!flagen YOUR_TEMPLATE YOUR_COMMAND_LINE_OPTIONS...

ボイラーテンプレート出力ツール

flagenはライブラリとして利用することができるため、自前のボイラーテンプレート出力ツールがGo製であれば以下のように呼び出すことができます。

	tmpl, err := flagen.NewTemplate(args[0])
	if err != nil {
		return err
	}
	return tmpl.Execute(outStream, args[1:])

また、独自の関数が必要な場合は flagen.TemplateFuncMapに設定することでテンプレート内で利用することができます。

ワークアラウンド

曖昧なフラグ

flagenはオプションに値が指定されていないときにboolだと見なすため、以下のようにboolフラグで終わって引数がある場合に判断がつきません。

$ flagen TEMPLATE --bool-flag arg1

想定どおりにするためには値としてtrue or falseを受け取ることを明示する必要があります。

$ flagen TEMPLATE --bool-flag=false arg1

まとめ

様々な実装が提供されているコマンドラインオプションの解析処理を利用形式から動的に生成するジェネレーターとしてflagenをつくりました。実際にいくつかの言語のテンプレートを用意してエディタと連携させることでCLI開発の効率が改善しています。

今後はflagen自体のオプションとしてprefixなどを提供すれば構造体の変数に設定する用途などのテンプレートとの相性もよくなりそうだと考えています。 便利なテンプレート追加のプルリクエストやイシュー、ボイラーテンプレートのツールへ組み込んだ報告などお待ちしています。

Fukuoka.go

このツールはFukuoka.go#14+Umeda.goで発表しました。 発表資料はこちらです。

Archives