THINKING MEGANE

ペンタブレットでリモートワークのコミュニケーションを改善する

リモートワークが続く中、口頭での説明を補足するため電子ホワイトボードなどを使ったコミュニケーションの機会が増えています。 一方で、手書きの気軽さに追従できないマウスを使っていると、書くより口頭での説明の方が早いと電子ホワイトボードを使わずにすましてしまうこともありました。

しかしながら手書きの表現力を生かしたコミュニケーションは捨て難く、ペン型の入力装置を探していました。 iPadは入力装置としても優れていますが、他にも活躍する場面が多いこと、連携時にも一手間かかることから、常時接続できる据置型のシンプルな入力装置としてペンタブレット(いわゆる板タブ)を導入しました。 今のところ、快適に利用できているので、簡単にご紹介します。

機材

家にあったワコム Intuos Comicを使っています。

僕の用途であればSサイズ(210x169mm。ただし入力領域はこのうち155x95mm程度)で十分でした。 こちらはUSB(Type-A)でPCと接続します。すでに旧モデルとのことで、これから購入するならBluetoothで接続できる新しいものが良さそうです。

また、接続先のPCはMacBook Pro (15-inch, 2019) です。 macOS Catalinaですが、ワコムのサイトに公開されている最新のドライバをインストールした上で、「セキュリティとプライバシー」で必要なアプリケーションに許可を与えることで利用できるようになりました。

設定

後述しますが、タブレットの座標検出は絶対位置の指定です。 小さいタブレットに大きな画面をマッピングして使うのは向いていないため、画面内の限られた範囲をマッピングして利用しています。

僕の用途では電子ホワイトボードとしてJamboardを利用しており、画面内の決まった位置(左上)で扱うため、この範囲をタブレットの操作範囲としました。 これによってJamboardの表示範囲とタブレットの入力領域がある程度同じになり、違和感なく入力できるようになりました。

ワコムのタブレットの場合、以下のように設定できます。

wacom

タブレットの操作

普段の業務は、キーボードとマウスで済むため、タブレットは初めて利用でした。 そのため、操作に慣れるまで少しだけ戸惑いましたが、以下のサイトを見て、基本を理解しました。

以下だけ理解すればすんなり使えると思います。

  • ペンをタブレットから浮かした状態でポインタを移動
  • ペンをタブレットにつけるとクリックしながらポインタを移動することに相当
  • タブレットの操作領域が画面にマッピングされている

まとめ

Google MeetからJamboardを開いて参加者にリンクを共有できるようになり、便利になりました。 利用までの手間を小さくできるよう、常時接続型のシンプルなタブレットを導入することで、Jamboardを積極的に利用することができ、手書きの気軽さと表現力を活かしたコミュニケーションの改善につながっていると感じます。

今後改善したいところとしては、ペンのボタンへのアクション割り当てなのですが、Jamboardの消しゴムやレーザーポインタ切り替えにショートカットがなく、まだ実現できていない状態です(フィードバック送ろう)。

まだまだリモートワークも続くでしょうから、引き続き、入力機器の構成や工夫など進めていきたいと思います。

構造を意識した抜け漏れがなく主張点が明確な論文執筆

はじめに

研究者は、自身の研究の有用性を主張するため論文を発表する。 しかしながら、研究の有用性を主張するために、抜け漏れがなく主張点が明確な文章を書くのは、慣れないうちは難しい(慣れても難しい)。 本エントリでは、論文の構造を見出だす工程とその構造を書き下す工程を明示的に分離することで、抜け漏れがなく主張点が明確な論文執筆を行う方法を検討する。

論文執筆の課題

前述の通り、研究の有用性を主張するために、抜け漏れがなく主張点が明確な文章を書くのは、慣れないうちは難しい。 これは、主張の整理と文章の生成を頭の中で同時にやろうとしていることが原因であるように思う。

第一に、主張の整理は複雑なタスクである。 研究の有用性の主張は、いくつかの課題や提案、評価といった複数の要素と、要素同士の関係性のあり方、すなわち「構造」を持つ。 要素やその関係性の増加に伴い、構造は複雑になるため、頭の中だけで網羅しつつ整合性を取り続けるのは困難である。

第二に、主張の構造を文章に落とし込むのは複雑なタスクである。 文章は連続した文から構成され、逐次的に記述される。 そのため、要素同士の関係性を含む主張の構造を書き下すためには、文同士の局所的な繋がりに加え、段落や接続詞による大局的な繋がりを表現しなければならない。 頭の中の主張の構造を余さずに正確に文章へと変換するのは困難である。 主張の構造が明らかでない段階では尚更である。

抜け漏れがなく主張点が明確な論文を書く

論文執筆が難しい理由は、主張の構造を見出だすこと、この構造を文章に落とし込むことという複雑なタスクを同時に行うためだと解釈した。 そこで、これらのタスクを明示的に分離する方法を考える。 この時、主張の構造を見出だすタスクの成果物を文章としてしまっては、主張の構造を文章に落とし込むタスクを兼ねてしまう。 主張の構造を見出だすタスクには必要な要素を文単位で表し、これらの関係性を表現できる形式が望ましい。 本エントリでは、このタスクをつなぐ中間表現を論文ストラクチャーと名付ける。 提案する論文ストラクチャーを以下に示す。

structure

提案する論文執筆では、この論文ストラクチャーを埋めていく工程と、論文ストラクチャーをもとに主張を文章に落とし込む工程を繰り返すことで執筆を行う。

主張の構造を見出だす(論文ストラクチャーを埋める)

以下、埋めるべき内容について簡単に説明する。 はじめに②と⑤から主張を明確にし、その主張をストーリー立てて仕上げるよう残りの項目を埋めていくと良い。 なお、③④⑥はリスト形式かつ対応づけを行えるため、ストーリー内の根拠の抜け漏れを防ぐことができる。

② やりたいこと

⑤と合わせて、主張を明確にするために重要な要素。 リサーチクエスチョンとして、何を解決したいのか、達成したいのかを一文で述べる。

システム・ソフトウェア開発の論文では、提案手法によって、どのような理想の世界に近づくのかを示す。

  • 例)実行環境の変化に素早く適応する [*1]
  • 例)文脈に応じて継続的に推薦手法の選択を最適化する [*2]

⑤ やったこと

②と合わせて、主張を明確にするために重要な要素。 リサーチクエスチョンをどのようなアプローチ、着眼点をもって解決、達成したかを一文で述べる。

システム・ソフトウェア開発の論文では、開発したシステムやソフトウェア、アーキテクチャなどの特徴を示す。

  • 例)恒常性を持つシステムアーキテクチャ(を提案・開発)[*1]
  • 例)多腕バンディットを用いたメタ推薦システム(を開発)[*2]

① なぜ、やりたいのか

②への導入となる要素。 その研究の価値や意義を述べる。

システム・ソフトウェア開発の論文では、提案手法によって、どうして、そのような理想の世界に近づけたいのかを示す。 世間一般的に解決すべき課題として位置付けるも良いし、これまで世間が気づけていなかったけれども見方を変えて課題として捉え直した、のようにしても良いと思う。

③ なぜ、できないのか

②に対しての課題であり、⑤のアプローチへの導入となる要素。 理想となる世界に対しての(主に)技術的な課題を述べる。 多くの研究では、従来の研究成果で未解決、もしくは改善が必要とされる領域についてサーベイ結果が該当する。

なお、ここは複数の要素が挙げられるため、論文ストラクチャー上は「A、B、C…」とリスト形式で記述する。

④ どうやって、解決したのか

③の複数の課題に対する個々の解決手段であり、⑤の詳細となる要素。 提案手法である⑤がどのような方法で課題を解決するのかを述べる。

ここは対応づけを行うことでストーリー内での根拠の抜け漏れを防ぐことが目的であるため、③の個々の課題に対する解決手段を「A’、B’、C’…」とリスト形式で記述する。

⑥ 本当に、できたのか

③の課題を④の手法で解決できたことを示す要素。 評価とその結果を述べる。

ここも対応づけによる抜け漏れを防ぐことが目的であるため、③④の個々の課題、手法に対する評価内容を「A”、B”、C”…」とリスト形式で記述する。

構造を文章に落とし込む(論文ストラクチャーから文章を作る)

論文ストラクチャーを埋めたら、各項目を使って論文の文章の雛形を作っていく。

タイトル

②と⑤を組み合わせることは主張を端的に表現したタイトル案を作ることができる。 よく使われるパターンは「⑤を用いた②」「②が可能な⑤」などであろう。

概要

①から⑥を順番に並べることで抜け漏れのない概要案を作ることができる。 典型的な例では以下のようにつながれる。

  • ①の状況になっている
  • そのため②が求められている、必要となる
  • 一方で③A…の課題がある
  • 本研究では⑤を提案する
  • 提案手法では④A’…を用いて課題を解決した
  • 評価では⑤A”…によって有効性を確認した

1. はじめに

概要と同じく①から⑥を順番に並べることで案を作ることができる。 ここでは、パラグラフのトピックセンテンスが論文ストラクチャーの各項目になるように配置し、各パラグラフに説明とリファレンスを追加していくと良い。

2. 関連研究

③の各課題を単位とする節やパラグラフを並べることで案を作ることができる。 ここでは、各課題がなぜ発生するのか、解決できていないのかを説明するために、従来手法の説明を加えるのが一般的である。

3. 提案手法

④の各手法を単位とする節やパラグラフを並べることで案を作ることができる。 ここでは、③との対応づけが明らかになるようにできるだけ順序を維持し、また対応する課題について明記すべきである。 また、⑤を用いて提案手法全体の概要と達成できる事柄について導入部分で触れておくと良い。

4. 評価

⑥の各評価を単位とする節やパラグラフを並べることで案を作ることができる。 ここでも、③や④との対応づけが明らかになるようにできるだけ順序を維持し、また対応する課題、手法について明記すべきである。

5. まとめ

②と⑤からリサーチクエスチョンとこれに対する提案をまとめる。 また、⑥の結果を踏まえ解決した③を明記する。 最後に研究を発展させるための今後の予定を述べる。

おわりに

本エントリでは、抜け漏れがなく主張点が明確な論文執筆のために、論文執筆の複雑なタスクを分離し、主張の構造を見出だすタスクと、この構造を文章に落とし込むタスクという二つのタスクを交互に行う方式を提案した。 また、このために論文ストラクチャーと名付けた主張の構造の整理に適した表現形式を提案した。

提案手法によって、論文の品質を一定に保ちつつ初稿までの執筆時間を短縮する。 加えて、論文ストラクチャーを通した研究成果共有によって共著者との早期の意思疎通が容易になり、手戻りを防ぐ効果が期待できる。

あとは良い研究をするだけである(それもまた難しいのであった)。


参照

  • *1: 松本 亮介, 近藤 宇智朗, 三宅 悠介, 力武 健次, 栗林 健太郎, FastContainer: 実行環境の変化に素早く適応できる恒常性を持つシステムアーキテクチャ, インターネットと運用技術シンポジウム2017論文集,2017,89-97(2017-11-30), Nov 2017
  • *2: 三宅 悠介, 峯 恒憲, Synapse: 文脈に応じて継続的に推薦手法の選択を最適化する推薦システム, 電子情報通信学会論文誌D, Vol.J103-D,No.11,pp.-,Nov. 2020. (to appear)

九州大学大学院システム情報科学府博士後期課程に入学します

先日8/7、九州大学大学院システム情報科学府博士後期課程に無事合格しました。 10/1より入学します。 専攻は情報知能工学[*1]です。

39歳、文系学士から修士を飛ばして理系の博士課程への挑戦となった経緯や入試に向けた準備などまとめます。

略歴

大学では環境政策を学びましたが、工学的なアプローチの解決手法の方に興味を持ち、いろいろあってソフトウェアを扱える仕事につきました。 2012年に転職し、現職のGMOペパボでインターネットサービスのWebアプリケーションの開発・運用維持業務に携わってきました。 2017年より同社の研究職として情報システムの自律適応等の研究に従事しています。

研究員になった理由

サービスの運用開発の傍ら、ログ活用基盤の構築に取り組み、サービスを動的に改善していくための仕組みづくりと機械学習に興味を持ち始めたところ、その前年に設立したペパボ研究所でやってみませんかと@antipop所長に誘われました。

当時、ソフトウェア開発という非常に強力で柔軟な相棒を得て、OSSを楽しく量産する一方で、独学でやってきたこともあり、解決できる課題規模やアルゴリズムなど実装力に関する頭打ちを感じていました。 そんな折、コンピュータサイエンスや研究的なアプローチを学ぶことでここを突破できるのはないかと思えるこの誘いは非常に魅力的でした。

完全に未知の職種であること、天職だと思っていたエンジニアからの職種転換ということなど、悩む部分は正直多かったですが、所長との面談の中で「今までやっていることに論文書くのが加わるだけです」と後押しされ、その日のうちに決めました。(今思えば論文として研究をまとめるそれが一番難しいじゃ〜〜という気持ちでいっぱいですが興味があればやってみましょうと後押ししてくれたんだと思ってます)

実際に、今進めている研究も、インターネットサービスの運用維持の中で発生する課題を、研究というアプローチを用いて解決、サービスへ還元するという、エンジニアリングに研究が加わった方式で進めており、これまでのスキルも十分に活かしながら、研究観点での新規性・有効性・信頼性を追求することができています。

博士後期課程に入学した理由(大学の選定理由)

自身の研究の発展はもちろんのこと、研究を推し進めていく力を高めたいと考え、博士後期課程へ挑戦しました。

僕の3年間の研究への取り組みは全く順調ではなく、研究活動もテーマも解決手段も評価も論文執筆も暗中模索で、そのくせいつの間にか年齢と共に大きくなっていた自意識が、光となるはずの先達からのアドバイスも歪めてしまっていました。 結果として、最初の2年ほどは迷走しており、研究所の皆さんには迷惑をかけてしまいました。

今年の6月に初めてジャーナルの採録通知をもらい、研究者としての一歩を踏み出したものの、研究への取り組み方はまだまだ下手くそだなあと自分自身考えています。 具体的には、課題解決だけでなく、問題自体への向き合う時間を見直していく必要がありそうです。 過去の迷走の中で、かろうじて掴んだことは、「研究とは、ある問題設定に対する解釈を深めることであり、その問題設定に対して向き合った量が結果につながる(のではないか)」というものでした。 何が課題なのか、どういう世界があるべきなのか、これらは瞬時に明確になるものではなく、試行錯誤やアウトプットとフィードバックによって徐々に練られていく問いですが、この工程を避けてしまうと小手先や思いつきの対策に留まる、もしくは不要に複雑なだけの解法の適用に陥ってしまいます。 周りを見ても、良い研究だなあと思うものは、課題そのものを高度に解決するのはもちろんのこと、問題設定自体にきちんと向き合うことで、研究の位置付けを明確にし、提案手法の汎用性を高めているものがたくさんあります。 特に、モノの見方自体を少しでも変えるような問題設定に昇華した研究には尊敬すら覚えます。 博士後期課程では、自分の研究というものを確立する過程を通して、世界をよくするような研究を推し進める力を高められたらと考えています。

10月より指導いただく峯先生とは、幸い、既に共著で論文執筆する機会があり、専門性の観点だけでなく、研究の課題や貢献に対する気づきを多数アドバイスいただき、この面でも学ぶことができると考えています。 また、通学が可能な範囲、学費の面での国公立の大学という諸条件も九州大学は満たしており、受験を決めました。

博士後期課程に向けての準備など

九州大学大学院システム情報科学府では、社会人特別選抜試験が用意されており、こちらを受験することとなりました。 前提として指導教官との受け入れに関する合意が必要ですが、僕の場合、幸い、既に先生と共著で論文執筆する機会があり、その繋がりで指導についてお願いすることができました。

出願について、学士である僕は、修士相当の学力を持つという出願資格を認めてもらうため、事前審査が必要でした。 そのため、以下の出願資格を満たすことを証明する内容と研究実績を事前に提出しています。

(7) 文部科学大臣の指定した者 A) 大学を卒業し,大学,研究所等において,2年以上研究に従事した者で,本学府において,当 該研究の成果等により,修士の学位を有する者と同等以上の学力があると認めた者

事前審査のため、通常の出願スケジュールより前倒しで各種書類なども合わせて準備する必要があります。 僕の場合、2020年10月入学の入試に向けて、5月下旬が事前審査の書類提出でしたので4月下旬ごろから関係書類を集めていたようです。 ここで落ちるようなら、修士から臨もうと考えていましたが、幸いにも出願資格を認めてもらうことができました。 もしかしたらここが一番緊張したかもしれません。

2020年10月入学の入学試験は、口頭試問でした。 これまでの研究実績と博士課程での研究計画に関して発表し、質疑応答という形式です。 限られた時間で3年間の研究実績と研究計画に触れなければならず、羅列ではなくストーリーの中での位置付けと重要な部分の抜粋が必要となり、資料の作成には苦労しました。 それでも、資料作成を通して研究テーマや位置付けの整理が一段階進み、結果として自分の研究とこれからを見直す良い機会になったなあと思います。 せっかくなので公開可能な範囲で資料を公開しておきます。

試験を終えた感想としては、事前審査にしろ口頭試問にしろ、そのために慌てて頑張って準備が間に合うようなものではなく、きちんとこれまで積み重ねてきた実績やその課題設定に向き合ってきた量というのが試されたんだろうなあと思います。 なお、完全に余談ですが、マスクをつけて30分程度の発表と質疑応答は酸欠で倒れそうになったので、今後もこのような状況が続くようであればフェイスマスクのような呼吸が楽な装備をお勧めします。

会社の支援

10月より社会人博士課程に挑むことになりますが、所属する研究所において、業務との両立について理解をいただけています。 特に、博士課程の研究テーマにサービスの改善に適用可能なものを選択したことが理解を得やすかった点だと思います。

これから

研究としては、今取り組んでいる推薦システムの自律適応について発展させていきたいと考えています。 シラバスを見る限り、博士論文に向けて色々指導の時間(指導教官以外の取り組む研究テーマの分野ごとの研究指導や関連研究調査など)があるようで、研究そのものの発展はもちろんのこと目的としている研究力の向上も図れるのではないかなと、今から楽しみです。


ペパ研から研究をはじめてジャーナルでのアクセプトまでいけた日

先週の6/22、初めてジャーナルの採録通知をいただいた。

大学は情報系ではなく、大学院にも行っていないので、研究なるものを始めたのが、ペパボ研究所に入った2017年1月から。3年半もかかってしまった。

元々、サービスの運用開発をしていた経緯もあり、2017年の前半はその延長で研究報告を2本書き切った。 初めての研究報告は、論文の型みたいなのを徹底的に教えてもらえた。 今も執筆時に気をつけるところのほとんどはここで教えてもらったことが根底にあると思う。 2017年の後半から、研究の内容自体も「すごいもの」にしようとした結果、迷走が始まる。 自分のやってきたことを深堀するわけでもなく、先達の研究を調べるわけでもなく、自分の能力を高めるわけでもなく、ただ、目新しいことに挑んでは当然のように跳ね返され、焦りから近道を探し、悪循環に陥る。 研究所内で、(今にして思えばほぼ八つ当たりな)相談したり、WSA研でいろいろな人の研究に対する考え方を聞きながら、自分の中の蓄積や道標をきちんと整備していかなければと考えるようになった。

2018年は、アドバイス制度を利用して初めてジャーナル投稿に挑戦した。 当時としては全力で取り組んだ論文はあらゆる直接的間接的な表現で「よくわからないです」とアドバイスをいただき、心砕け撃沈した。 まだまだ付け焼き刃な研究は、専門性に対する脆い知識や理論構成であり、指摘に対して一気に瓦解する。 やれることは、専門性を高めることだけなのだが、分野のあまりの広さ・難しさに途方に暮れていた。 この時期は、指摘をまだアドバイスと見なすことができず辛い時期であった。

2019年の前半は、転換の兆しが見えたが苦しい時期でもあった。 わからないなりに勉強を続け、サーベイを進めた。 自分なりの方向性を見つけ、評価し、効果がある研究ができた。 それでも相変わらず研究報告を上手く書けない。 文章として形が見えていく中で、新しい前提や課題が明らかになり、議論は活発になる。 当たり前のことであり、むしろ喜ばしいことであるのだが、どこかで形を決めなければならない。 この時期は、これは、もっといけるはずだという期待に応えたい気持ちとそれを時間内に解決できない自分の無力感で悪循環に陥ることが多かったのではないかと思う。 そして、この時期の振り返りで、自分と向き合った結果、「結局は、無能だと判断されたくないだとか、集中することができれば大きな成果を出せるはずだとか、心の奥底に対外的な評価が中心に据えられて、自己評価とのギャップと相まって動けなくなっていたことが原因だと思い至」った。

2019年の後半、これを踏まえ冷静になりつつ、いろいろな人に助力をいただきながら、前に進んだ。 学術系ではないがGo言語の国際カンファレンスのトークセッションに採択された。 ポスターセッションではあるものの学術系では初めて査読ありセッションで採択された。 ジャーナルへももう一度挑戦した。結果はリジェクトであったが、査読者の判定は、条件付き採録と不採録で別れ、メタ査読者からは前半(研究の前提や既存研究に対する位置づけ)は非常に読みやすいとのコメントをいただけた。 後半の提案手法やその評価について、アーキテクチャ含め更新、年内にまた別のジャーナルに提出へこぎつけた。

2020年、3月にその論文が条件付き採録となり、これに応えて晴れて採録通知を受けたのが先週。 「ペパ研から研究をはじめてジャーナルでのアクセプトまでいけた日」は研究所の所長が言ってくれた。 本当にそうだなあとこれまでのことを思い返して、泣けた。 今にして思えば遠回りばかりして、勝手に袋小路に迷い込んで非効率極まりない反面教師の塊だと思うけれどもこの過程と振り返りがなければ、今の研究もできていないだろうし小さな人間のままだったかもしれない。 これからまた難航することがあるかもしれないが、今はこの経験が今度は乗り切れるのではないかと思わせてくれる。 なんにせよ、自分のような人間が、ジャーナルを通せるところまでたどり着くことができたのは、ひとえに見捨てずに見守りアドバイスをくれ、相談に乗ってくれる周りの方々のおかげです。 遠回りばかりしていますが、これから、改めて巨人の肩に乗ることから逃げずに真摯に向き合い一歩づつ精進していこうと思います。


今年は他にも、研究チームとしての側面も取り組んで、研究報告ではあるが、はじめて2本ラストオーサーを務めた。 研究所での論文読みや勉強会などの新しい習慣も定着し、今後が楽しみ。 また、自身の研究も前進させ、ジャーナルのアドバイスもうまく取り込めていると思う。 国際会議なども狙っていきたい。 そして、博士課程に挑戦することにした。 まだ結果はわからないが、これまで模索してきた取り組みを加速できると良いなと思う。

過去の振り返り

Go言語でシミュレーション用のシンプルなフレームワークStageをつくった

時系列に対するコンピュータシミュレーションを開発する機会が増えてきたので、共通する処理の流れをフレームワーク化した。

コンピュータシミュレーション

状況に応じたクリック数の最大化や変化点検出のような、システムの適応的な振る舞いを検証するために、時系列に対するコンピュータシミュレーションを行うことがある。 また、実環境で発生するランダムな誤差を表現する場合、乱数を用いたシミュレーション技法であるモンテカルロ法も利用することになる。

このようなシミュレーションのプログラムでは、変化する時系列を入力に、振る舞いのシミュレーション結果を出力するだけではなく、乱数によって発生する誤差を均すためにシミュレーションを数百〜数千回繰り返す必要がある。

Stage

Stageは、これらの一連の流れの実行とこれに伴う煩雑な処理(シミュレーションの並列化、乱数の管理、進捗の監視、ログ出力)を開発者から隠蔽する。 開発者は、時系列や振る舞い、ログフォーマットをGo言語で記述するだけで良い。

Stageで行っているメイン処理の「疑似コード」は以下の通りシンプルである。

for i := 0; i < iter; i++ {
    sem <- struct{}{}

    go func() {
        scenario := NewScenarioFn(rnd.Int63())
        actor := NewActorFn(rnd.Int63())

        for scenario.Scan() {
            action, _ := actor.Act(scenario.Line())
            w.Write(action.String())
        }
        <-sem
    }()
}

このフレームワークでは、メタファーとして劇場(Stage)を採用した。 劇場は、劇を開催する。 その劇は台本(Scenario)があり、演者(Actor)は台本の1行づつのセリフ(Line)に沿って演技を行い、結果(Action)を出力する、といった形だ。 そして劇は何度も繰り返される。

開発者は、時系列や振る舞いをそれぞれ、ScenarioとActorのinterfaceを実装によって記述する。 また、ログフォーマットもAction interfaceで指定するだけで良い。

type Scenario interface {
	Scan() bool
	Line() Line
}

type Actor interface {
	Act(Line) (Action, error)
}

type Action interface {
	String() string
}

あとは実装したScenarioとActorを生成する関数を指定して必要な回数実行。

dir := "log"                    // Directory for output
concurrency := runtime.NumCPU() // Number of concurrency for scenario
seed := 1                       // Seed for random
iter := 3                       // Number of iteration

s := stage.New(dir, concurrency, seed)
s.Run(iter, NewActorFn, NewScenarioFn, stage.NoOpeCallbackFn)

結果は、指定したログディレクトに出力され、実行日時や利用した乱数シードも確認することができる。

log
└── 20200530184234-1 # Timestamp-Seed
    ├── iter_00-a_7947919477105006377-s_5355116748216652230.log # Iteration log files
    ├── iter_01-a_4846631296614585111-s_2007235010091403794.log #   with seed for actor(a)
    └── iter_02-a_0610076349056253918-s_3540139325796113853.log #   and  seed for scenario(s)

なお、出力後の解析、グラフ出力については、Stageでは取り扱わない。 任意のフォーマットで出力できるのでお好みの言語やツールで操作して欲しい。

各インターフェースの具体的な実装方法についてはREADMEを参照のこと。

複数のシナリオを持つシミュレーション例

例えば、以下の青線のような変化の仕方が異なるシナリオを切り替えて、橙の線のような振る舞いの違いをシミュレーションすることができる。

Abrupt changesGradual changes
example_adwin_abruptexample_adwin_gradual

長時間かかるシミュレーション例

また、シミュレーションに時間がかかる場合は、各シナリオの完了時に呼ばれるCallback関数を指定することで、進捗の監視もできる。 お好みのProgress barライブラリを使えば進捗バーも表示できる。

$ go run _examples/progress/main.go
180 / 200 [---------------------------->___] 90.00% 40 p/s

まとめ

普段よりアルゴリズムの理解を深めるため手に馴染んだGo言語で実装を試みるので、必然的にシミュレーションもGoで書くことが多くなったことからGo言語での実装となった。 完全に自分用途でつくったフレームワークではあるが、各シミュレーションにおいてシナリオとアクターという要素のみを意識すればよくなり実装の効率が格段に上がりコードの見通しもよくなった。 また、Go言語を使うことで並列化が容易に実装できシンプルなフレームワークでありながら十分に安定して高速化を達成できていると思う。 付加的な利点として、ログ構成などが統一されたことで後段の解析やグラフ化のスクリプトも共通化が進んでおり、個人的に満足度が高いものができたと思う。

多腕バンディット問題におけるUCB方策を理解する

多腕バンディット問題における解法の一つであるUCB1方策では以下のスコアを各腕に対して求め、最大のものを選択する。

\[ \overline{x}_j+\sqrt{\frac{2\ln{n}}{n_j}} \tag{1}\label{eq-1} \]

ここで、$\overline{x}_j$は腕$j$に対して観測された平均報酬、$n_j$は腕$j$が選択された回数、$n$は全体の試行回数である。 第2項は選択された回数$n_j$が少ないほど大きくなることから、評価が不確かな腕ほど積極的に探索を行う(Optimism in face of uncertainty)。

本エントリでは、この第2項について上記の振る舞い以上の理解を進める。

確率不等式

\eqref{eq-1}式は確率不等式の一種であるヘフディングの不等式に基づいたものであるため、まず確率不等式を学ぶ。 確率不等式は、確率の分布に依らない確率の近似的な評価に利用される不等式である。 簡単には、稀に発生する事象についての確率の上限を求めることができる。

マルコフの不等式 Markov’s inequality

非負の確率変数$X\geq0$と任意の正数$a > 0$に対して

\[ Pr \left[ X \geq a \right] \leq \frac{E[X]}{a} \tag{2}\label{eq-2} \]

が成り立つ。\eqref{eq-2}をマルコフの不等式と呼ぶ。

この不等式を用いることで、確率変数$X$の実現値が$a$以上になる確率の上限を、確率分布に依らず期待値$E[X]$から求めることができる(ただし$a \leq E[X]$だと実用的な値にならない)。

マルコフの不等式を用いて例えば「期待値が10の確率変数で100以上が出る確率は10%以下」($Pr \left[ X \geq 100 \right] \leq \frac{10}{100} = 0.1$)などと求めることができる。

証明は

\begin{align} E[X] &= \int_0^\infty x f(x) dx \notag \\ &= \int_0^a x f(x) dx + \int_a^\infty x f(x) dx \notag \\ &\geq \int_a^\infty x f(x) dx \notag \\ &\geq \int_a^\infty a f(x) dx = a \int_a^\infty f(x) dx = a Pr [X \geq a] \notag \
\end{align}

となる。なお、2行目から3行目は、右辺第1項が$\geq 0$であるため。3行目から4行目は積分区間で最も小さい$a$を使うため。

チェビシェフの不等式 Chebyshev’s inequality

確率変数$X$が期待値$E[X]=\mu$、分散$\sigma^2$を持つとき、任意の正数$a > 0$に対して

\[ Pr \left[ \mid X - \mu \mid \geq a \sigma \right] \leq \frac{1}{a^2} \tag{3}\label{eq-3} \]

が成り立つ。\eqref{eq-3}をチェビシェフの不等式と呼ぶ。

この不等式を用いることで、確率変数$X$の実現値と期待値$\mu$の差が標準偏差$\sigma$の$a$倍以上になる確率の上限を、確率分布に依らず期待値$\mu$と分散$\sigma^2$から求めることができる。

証明は、マルコフの不等式に対して$X = (X-\mu)^2$と$a=a^2\sigma^2$とおいた時、

\[ Pr[(X-\mu)^2 \geq a^2\sigma^2] \leq \frac{E[(X-\mu)^2]}{a^2\sigma^2} = \frac{\sigma^2}{a^2\sigma^2} = \frac{1}{a^2} \\ Pr[\mid X-\mu \mid \geq a\sigma] \leq \frac{1}{a^2} \]

となる。なお、少し工夫して$a=a^2$とすると

\[ Pr[(X-\mu)^2 \geq a^2] \leq \frac{E[(X-\mu)^2]}{a^2} = \frac{\sigma^2}{a^2} \\ Pr[\mid X-\mu \mid \geq a] \leq \frac{\sigma^2}{a^2} \]

のように、確率変数$X$の実現値と期待値$\mu$の差を標準偏差$\sigma$を使わずに表現できる。この場合例えば「期待値が10で標準偏差が5の確率変数で100以上が出る確率は0.31%未満」($Pr[X-10 \geq 90] \leq \frac{5^2}{90^2} = 0.00308…$)などと求めることができる。

ヘフディングの不等式 Hoeffding’s inequality

独立な$n$個の確率変数$X[a,b]$において平均を$\overline{X}$、期待値を$E\left[\overline{X}\right]$とおいた時、任意の正数$u > 0$に対して

\[ Pr \left[\overline{X}-E\left[\overline{X}\right] \geq u\right] \leq \exp\left(-\frac{2n^2u^2}{\sum_{i=1}^{n}(b_i-a_i)^2}\right) \tag{4}\label{eq-4} \]

が成り立つ。\eqref{eq-4}をヘフディングの不等式と呼ぶ。

この不等式を用いることで、n個の確率変数$X$の平均と期待値の誤差が$u$以上になる(すなわち真の期待値を過大評価している)確率の上限を、確率分布に依らずに求めることができる。

同様に真の期待値を過小評価している確率の上限は、

\[ Pr \left[-\overline{X}+E\left[\overline{X}\right] \geq u\right] \leq \exp\left(-\frac{2n^2u^2}{\sum_{i=1}^{n}(b_i-a_i)^2}\right) \tag{5}\label{eq-5} \]

であり、真の期待値に対して$u$以上の誤差が生じる確率の上限は\eqref{eq-4}と\eqref{eq-5}を合わせた、

\[ Pr \left[\mid \overline{X}-E\left[\overline{X}\right] \mid \geq u\right] = Pr \left[\overline{X}-E\left[\overline{X}\right] \geq u\right] + Pr \left[-\overline{X}+E\left[\overline{X}\right] \geq u\right] \tag{6}\label{eq-6} \]

となる。

また、確率変数$X[a,b]$で$a=0,b=1$の時、\eqref{eq-4}より

\[ Pr \left[\overline{X}-E\left[\overline{X}\right] \geq u\right] \leq \exp\left(-\frac{2n^2u^2}{n}\right) = \exp\left(-2nu^2\right)\tag{7}\label{eq-7} \]

同じく\eqref{eq-5}より

\[ Pr \left[-\overline{X}+E\left[\overline{X}\right] \geq u\right] \leq \exp\left(-\frac{2n^2u^2}{n}\right) = \exp\left(-2nu^2\right)\tag{8}\label{eq-8} \]

である。証明は論文に譲る。

UCB1方策

UCB1方策では、ヘフディングの不等式\eqref{eq-8}を用いて、腕$j$の報酬の期待値の信頼区間の上側の上限である\eqref{eq-1}を求める。 \eqref{eq-1}を再掲する。

\[ \overline{x}_j+\sqrt{\frac{2\ln{n}}{n_j}} \tag{1} \]

腕$j$の報酬の期待値を$x^*_j$とすると\eqref{eq-8}は

\[ Pr \left[x^*_j \geq \overline{x}_j + u\right] \leq \exp\left(-2n_ju^2\right)\tag{9}\label{eq-9} \]

\eqref{eq-9}は真の期待値を過小評価している確率の上限であり、これを試行回数$n$が進むごとに小さくしたいと考える。そこで右辺を$n^{-m}=\frac{1}{n^m}$とすると、

\begin{align} \exp\left(-2n_ju^2\right) &= \frac{1}{n^m} \notag \\ -2n_ju^2 &= \ln{\frac{1}{n^m}} \notag \\ &= \ln{1} - \ln{n^m} \notag \\ &= 0 - m\ln{n} \notag \\ 2n_ju^2 &= m\ln{n} \notag \\ u^2 &= \frac{m\ln{n}}{2n_j} \notag \\ u &= \sqrt{\frac{m\ln{n}}{2n_j}} \notag \end{align}

が得られる。理論限界より$n$回目の試行において$1/n$の確率で各腕が選択する必要があるとされており、これに従えば$m=1$だが、論文では$m=4$としている(すなわち$u = \sqrt{\frac{2\ln{n}}{n_j}}$)。

これを\eqref{eq-9}に代入し

\[ Pr \left[x^*_j \geq \overline{x}_j + \sqrt{\frac{2\ln{n}}{n_j}}\right] \leq \frac{1}{n^4}\tag{10}\label{eq-10} \]

よって$1/n^4$の上限において、\eqref{eq-1}のスコアを用いて報酬の期待値を最も低く見積もっているであろう腕を選択することができる。すなわちOptimism in face of uncertaintyに従う。

参考

なぜ勉強会「だった」のか

主催するFukuoka.goでは2〜3ヶ月に一度の割合で登壇形式の勉強会を開催している。 昨今の状況を受けて前回こそYouTubeを使ってリアルタイム配信を行ったものの、この状況が続くあるいは当たり前になるならば、地域言語コミュニティをどう運営していくべきか考えないといけないだろうなと思う。

このエントリは、これまでの勉強会やカンファレンスではなぜ物理的に集合するのか、を自分の中で整理した上で、オンライン開催のありようを考える材料を見つけようとするものです。

なぜ物理的に集合するのか

これまでの勉強会やカンファレンスではなぜ物理的に集合していたのか。

今年、オンラインでの開催を余儀なくされた様々な勉強会やカンファレンスでは(それなりの運営の苦労はありつつも)比較的スムーズに移行できており、これはそのようなインフラが整っていたということに他ならない。 一方で、これだけのインフラがある中、必要に迫られるまでは物理的に集合していたということは、この行為になんらかの利点があると考えるのが妥当だと思う。

物理的に集合する勉強会やカンファレンスでは、登壇者の発表を聞き、質疑があり、飲食の機会が提供される。 同じ場に集ってリアルタイムに同時多発的に発生した議論によって、場には総体として大きくなった知が形成される。 参加者は、場によって増幅された知を様々な形で受け取る。 あるひとは有意義な情報として、あるひとはモチベーションとして。 想定より多くの量を得ることができる人もいれば、あまり得るものがなかった人もいるかもしれない。 主催者は、なるべくその機会を増やすべく、趣向を凝らす。

勉強会やカンファレンスというのは、興味関心を同じくするものの初対面の人たちを含む集団が限られた時間で効率よく、知の増幅を場に形成するための枠組みであると言える。

  • 発表者が資料を用意して丁寧に説明することで、「同じ事」を、
  • 日程や会場を揃えることで、「同じタイミング」で、
  • 質疑応答の機会や飲食による雰囲気を使って、「同じ立場」で、

参加者は一緒に考え、場を作っていく。

これまでは、物理的な集合を伴う勉強会やカンファレンスを開催することで、自然とこの枠組みに乗って、知の増幅を場に形成する機会を提供できていた。 物理的な集合を伴わないオンライン開催が前提になれば、これらを達成するための仕組みを意識的に演出しなければならない(あるいは目的自体を変える?)

オンライン開催は代替となるのか

せっかくオンラインでやれるのだから、漠然とこれまでの勉強会の代替ではなく、目的を明確にした上で技術的に解決できるといいなと思っている。

知の増幅を場に形成するのであれば、物理的な集合を伴わないオンライン開催であっても、登壇のリアルタイム配信によって参加者が、同じことを同じタイミングで考えることは有効だろう。 実際、難しいのは、「同じ立場」の部分だと思う。

興味関心を同じくするものの初対面の人たちが短時間で気兼ねなく議論できる状態を作りたい。 明示的な質疑応答の機会はもちろん必要だろう。 それでも、議論が深くなるとき、もしくは個別化しそうな時、同じミーティングルーム内で即座に個別かつ双方向に話せるだろうか。 昨年、登壇したGopherConでは、発表後はもちろんのこと、廊下でのすれ違うタイミングで感想や質問をたくさん受けた。そういうことを再現できないだろうか。

問題意識の方向性やレベル感が同じくする人を積極的に見つけて、同じ立場の中でクラスタリングされて、その問題を本当に考えたい人が凝縮して、それぞれの知を増幅して、総体として大きくなった知が形成される。

この辺りの、集団から始まって最終的に、個と個をダイナミックにつなげる部分をなんとか解決していきたいと思う。

Fukuoka.goはどうするのか

どうしよう。

Fukuoka.goは長期的にみて知の増幅を地域に形成できる(といいな)というあたりを狙っているので、主催者が楽しんで継続できることを大切にしています。 色々それらしきことを述べてみたものの、主催者のモチベは単純には「僕の最近のGo取り組みで面白かったものを聞いてください。よければご飯もどうですか」だったりもするので、オンライン飲みの余興で発表、とか、登壇を動画で配信とかでもいいのかもしれない。

Archives