THINKING MEGANE

理性の人

思えばこの一年半は自分の感情に振り回された期間だった. エンジニアとして新しい道が見えながらも,そこに近づけない不甲斐なさと焦り. 自己肯定感が著しく下がったために価値基準がだんだんと外部へ移り,余計に道を見失う. 局所的には努力しているけれども,不安解消や短期的な承認に囚われて殻にこもりがちになる. 愚痴や相談で一時的に心は軽くなれどもいつのまにか焦りが高まる.

いい加減,自分との向き合い方について考えなければならない時期だと思った.


幸いにもここ最近,何人かの自分の尊敬する人とまとまった時間話す機会があり,自分との考え方の違いなどを意識して比較してみた. 元から,皆一様に論理的で理路整然と自他の意見の要点や本質を掴んだ議論ができる能力の面で見習いたいと感じていたのだが, 最も自分と違っていたのは,客観性をもって自分がなすべきことを検討し続け,そこに向けて邁進している点だと思えた.

すなわち,彼らは理性的であった. 理性とは,手元の辞書によると「感情に動かされたりしないで,論理的に考えをまとめたり物事を判断したりする頭の働き」とある.

自分も感情に振り回されないようになれば,先に進めるのかと思いつつも,思考から感情を分離することはとても難しいことではないかと思えた. なぜなら自分は極度の負けず嫌いである.自分にも他人にも負けたくないというのが心根にある.勝っていたり承認されている状態というのは素直に嬉しいし,この動機付けが今まで自分を成長させてきたとさえ思っている. しかしながら,この主観的で感情的な動機は上手くいくうちは良いが,失敗すると簡単に歪んでしまうというのもまた事実である. 誰かに勝つため,負けないため,舐められないため,価値を認めてもらうため.往往にしてなすべきことではないものを目指し始める.さらには引け目があるから,それらを貫き通すことも難しくなる.

ただ,このようなことを悶々と考えるうち,自分の中で感情的である状態と理性的である状態というのを区別し現状を俯瞰できるようになってきた. ここで,理性的な人は,感情を抑え込むのではなく,感情とうまく付き合い,感情に動かされないための方法論をそれぞれ持っているのではないかと考えた. 自分の場合,承認欲求は強く自己と結びついてしまっていてこれを無視することはできない.であれば二つの状態があることを認識し,これを行き来するための方法論を見つけることで理性的に振る舞えるようになるのではないか.

理性の人でありたい.

  • 理性の人は,感情を抑え込むのではなく感情に動かされないための方法論を持つ.
  • 理性の人は,論理的になすべきことを定める.
  • 理性の人は,なすべきことを解決するため,己を高める.
  • 理性の人は,なすべきことを解決するため,周りと協力する.

何も感情を無くそうというのではない.自分の性質のため視野が狭くなりがちなことを認めて,目的を客観的に定めたのち,楽しい手段を見つけたい.行動方針における優先順位を明確にしただけである. 結果的に相対的な価値観の世界からも脱却し,より大きなことを成せるのではないかと思う. もちろん,理性の人になるためには多くの努力が必要であり,今後も継続して努力していく.技術力も思考力に対してもやるべきことはたくさんある.ただ,局所的であろうが今までの努力も無駄ではない.うまく活かして一気に花開きたい.

First Half of 2018

上期も昨年度から引き続き研究開発に従事した.これまでやってきたいくつかの研究が繋がり始めて”なめらかなマッチング”というおぼろげながら大きな研究テーマが見えてきたように思う. 推薦システムに代表されるような要望と提案のマッチングをなめらかにするためには,マッチング観点からの研究と,それをサービスとして的確かつ即時に提供できるような実装や導入の観点からの両方が必要であり,マッチングを支える仕組み全体に対する研究を進めていきたいと考えるようになった.

また,上期はこのテーマに基づく各研究内容を実装するにあたって技術的な深堀りを進めることができたこと,継続してアウトプットを続けることができたのも良かった. マッチング観点からは消費者行動や情報探索プロセスも考慮しながら検討している.実装面からは,近似近傍探索を高速かつ高精度に提供するためにSannyやSmux,go-avxなどこれまでよりレイヤを掘り下げながら目的を達成するための最適な実装を検討することができるようになった. アウトプットについても,これらの内容を元に継続的にブログや登壇を行った. 技術的な必要性などをきちんと記述することで反響が大きくなるものもあり論理的な思考やそれを用いて人に伝えることの重要性も感じた.

それでも,特に論文のような専門的なアウトプット過程において,力不足は常に感じていた. 論文執筆において,初稿はなんとか書き上げられるようになったものの,共著者や査読からの指摘点を踏まえてより良いものにするための議論が上手くできず,徐々にこれがストレスとなってしまっていった. 技術的な背景による新規性についてはサーベイの積み重ねで少しづつでも回答できるが,研究として新規性や有用性を謳う部分,これらを論述する部分の議論において,そもそも前提となる能力が足りないようにも思えた. 論文執筆を続けていく中でこれらの能力が上がるようコツがつかめてくるのかもしれないが,自分としては一旦この足りない能力についてきちんと向き合った上で,今後の研究開発へ取り組んでいきたいと思っている. そのため下期はこれまでの研究開発成果を導入・課題発見の部分に力を注ぎながら,論文執筆に向けたスキルを高めていきたい.

実績

以下,上期実績を列挙する.

論文

3本,ジャーナルについては事前査読制度への投稿のみで終わったこともあり,上述した対策を進めた上で再度挑戦したい.

発表

技術イベントでの発表の他,研究会での発表,大学での登壇など計6回.

OSS

なめらかなマッチングの実装面の観点から高速かつ高精度,かつ拡張性も備えた近似近傍探索の実装とそれらの要素技術の検討を行っていった. Smuxやgo-avxなどこれまで扱ってこなかったレイヤで課題に対処できるようになってきたと思う.

  • Sanny: Scalable Approximate Nearest Neighbors in Golang optimized for embedding vectors.
  • go-avx: AVX(Advanced Vector Extensions) binding for golang.
  • Smux: smux is a socket multiplexer written in Golang. It provides fast communication by efficiently a single connection.
  • SmartSifter: SmartSifter (On-line outlier detection) by Golang.
  • Guardian: Monitor file changes and execute custom commands for each event.
  • Gannoy(NGT ver.): Approximate nearest neighbor search server and dynamic index written in Golang.

コミュニティ活動

福岡のGo言語コミュニティ主催として継続的なイベント開催を進めた. 研究開発とはまた別の技術の付き合い方ができる活動であり,大切な活動となっている. また,分散アプリケーションも興味があるため仮想通貨コミュニティの地方開催もお手伝いさせていただいた.

ブログ

実装紹介を主に7本.もう少し気軽に考えをまとめてアウトプットするようにしたい.

読書

半期で購入した本と読み直した本を重ねてみた.物理本が54冊.電子書籍を含めるともう少しなりそう. ベイズは相変わらず分からない. これだけ学んだのだという自信が半分,本当に自分の知識として議論へ活かせるようにせねばなという反省が半分.

books

まとめ

上期はとにかく濃くて長い半年だった. 論文執筆など自分が上手くできないことに対してストレスと感情の起伏が大きくなってしまって相変わらず未熟だなあと反省しきりであったが,こうして客観的に実績としてまとめてみると進んでいるところももちろんあって,適切に都度自分を認めてあげなくてはなあと思えたのはよかった.

もちろん力不足で悔しい思いをしているのは事実であるので,下期は研究開発への付き合い方も見直しながら,まわりも見る余裕を持って,どんどん影響を与えていけるよう成長できればなあと思う.

Sanny: 大規模ECサイトのための精度と速度を両立した分散可能な近似近傍探索エンジン

このエントリは、第二回 Web System Architecture 研究会 (WSA研)の予稿です。

はじめに

ECサイトの商品種類増大に伴う情報過多問題を解決するため,利用者の要求を満たす商品を自動的に提案する機能がECサイトにとっての関心事となる.商品の提案は任意の観点での商品同士の類似性を根拠とすることから,商品の特性を数値化し,任意の距離空間で近傍に位置する要素を求めることで,機械的に扱えるようにする.この数値化された商品特性を特徴量と呼ぶ. 深層ニューラルネットワークの発展によって,これまで適切な特徴量を導くことが難しかった画像やテキストに対しても,人の感性に近い,特性をよく表現する高精度な特徴量を得られるようになったことからECサイトの商品提案機能に利用され始めている. これらの深層ニューラルネットワークから得られる特徴量は,数百から数千次元の高次元ベクトルとして表現される. また,大規模なECサイトでは提案対象となる商品数も多いため,この特徴量の集合も数十から数百万を超える大規模なものとなる. このような大規模かつ高次元ベクトル集合に対する類似度の比較において,正確ではあるが,データ数と次元数に比例して計算量が増加する線形探索は現実的ではない.そこで,事前に近傍候補となる集団を求めておくことで,少数の近傍候補から計算量を抑えて近傍点を得る空間分割や局所性鋭敏型ハッシュといった手法が用いられる. しかしながら,高次元ベクトル集合においては正確な近傍を求めるための計算量が線形探索と同程度となると考えられており,精度を犠牲にして近似解を用いることで計算量の増加に対処する近似近傍探索が採用されているが,商品を自動的に提案する機能は、提案内容の的確さと充分な応答速度が求められることから,大規模かつ高次元ベクトル集合に対して精度と速度を両立する近似近傍探索の手法が必要となる.

大規模かつ高次元ベクトル集合に対する近似近傍探索では,データ数と次元数に依存して計算量が増加するため,これらを分割して処理することが効果的である. ベクトル集合を行列と見なし,行方向での分割,つまりデータ数によって分割する手法は一般に採用されるが,依然として次元数に依存した計算量の課題は残る. そこで,列方向での分割が必要となる. 直積量子化は,高次元ベクトル集合を任意の次元数の低次元ベクトル集合に等分し,各低次元ベクトル集合に対する近傍探索結果を集約する. しかしながら,集約処理はデータ数に依存するという課題がある.

そこで,本報告では,大規模ECサイトで商品を提案することを想定して,精度と速度を両立した分散可能な近似近傍探索エンジンSannyを提案する. Sannyは,商品特性をよく表現しており高精度に類似度が比較可能な高次元かつ密なベクトルの集合において,検索質問データ(クエリ)に対する高次元ベクトル集合の近傍探索結果の上位集合が,クエリと高次元ベクトル集合を任意の次元数で等分した部分ベクトル単位で近傍探索した結果の上位集合と類似しやすいことに着目して,提案すべき商品の近傍探索を部分ベクトル単位での探索に分解することで分散処理可能にし,その探索結果の和集合である近傍候補から再度近傍探索を行うことにより,全体として高速に近似近傍探索を行える.

提案手法

事前準備

提案手法ではまず,商品特性をよく表現しており高精度に類似度が比較可能な高次元かつ密なベクトルの集合を対象とする. このような集合として,学習済み深層畳み込みニューラルネットワークを特徴抽出器として利用して画像から得られる特徴量集合や,テキストを分散表現へ変換するWord2vecのネットワークから得られる特徴量集合がある. 筆者らはこれらの集合において,検索質問データ(クエリ)に対する高次元ベクトル集合の近傍探索結果の上位集合が,クエリと高次元ベクトル集合を任意の次元数で等分した部分ベクトル単位で近傍探索した結果の上位集合と類似しやすい特性があることを見出した. この,高次元ベクトルで表現される特徴量のうち,部分が類似しているものは全体としても類似する可能性が高いという特性を利用することで,高次元ベクトル集合を列方向に分割した結果の集約のデータ数依存の課題を解決する.

ここでは,対象となるベクトル集合を$Y \subset \mathbb{R}^D$と置き,これを重複しない$D^*=D/m$次元の部分ベクトル$S_j(1 \leq j \leq m)$に分割する.

近傍探索

Yに対する近傍探索は次のように行う. クエリベクトル$q \in \mathbb{R}^D$を$p_j (1 \leq j \leq m)$に分割し,対応する添え字$j$の部分ベクトル集合$s_j$に対して上位$n$件を得る近傍探索を行う.

\begin{align} NN(p_j) = \argmin_{s \in S_j} d(p_j,s) \end{align}

$NN(p_j)$の結果を$n$個の識別子からなる集合$N_j$とし,全ての$N_j$の和集合を$N$としてこれを近傍候補とする.なお,距離関数には現時点でユークリッド距離を想定しているが,すべての部分ベクトルで統一されていれば近傍探索の手法自体は問わない.

最後に近傍候補$N$に対応する元のベクトル集合 $YN \subset \mathbb{R}^D$ に対して正確な類似度を比較するためにクエリベクトル$q$との線形探索を行う.$|YN|$は最大$n*m$であることから線形探索のコストは非常に小さいが,距離関数にユークリッド距離を用いる場合,以下で求まる近似的な線形探索を用いることで一層の高速化が見込める.

\begin{align} argmin_a (a - b)^2 = argmin_a a^2 - 2ab + b^2 = argmin_a a^2 - 2ab \end{align}

システム構成

提案手法では,探索対象となる高次元ベクトル集合を任意の次元数で等分した部分ベクトルに分割する.これらの部分ベクトルに対する近傍探索は互いに独立していることから並列に処理することができるため,データ数や次元数に応じた分散構成を取ることができる. 分散構成では,部分ベクトルの近傍探索結果$N_j$がネットワーク上でやり取りされるが,前述のように最小限のデータ量のみが通信されることからネットワーク通信における影響を抑えることができる.なお,大規模なECサイトにおいては大量のクエリが想定されることから,HTTP/2のバイナリフレームレイヤーのように通信の多重化を行うことで影響を抑える手法も合わせて導入する.

また,分散構成では,データを重複して保持することで,可用性も高めることができる.

評価

速度と精度による性能評価

以下に,2048次元,40,000件程度の高次元ベクトル集合に対して提案手法と従来手法の精度と速度のバランスを比較した予備実験の結果を示す.横軸は再現率であり,各手法の提示した予測近傍集合と正しい近傍集合との重複率である.縦軸は検索にかかった秒数の逆数を取ったもので,上にあるほど高速である. 従来手法として,線形探索(brute_force),近似線形探索(brute_force_blas),近似近傍探索(annoy)と比較した.提案手法は,近傍候補から正確な近傍を求めるために用いた手法ごとに評価を行なっている.

sanny

結果から,近傍候補からの探索に近似線形探索を用いた場合の提案手法が従来の近似近傍探索手法より精度並びに速度でも有効であることを示している.

発表スライド

発表を終えて

大規模なデータセットでの評価,事前分類による推薦との差など研究報告としてはまだ新規性や有用性の面で示しきれていない箇所もあったが,そこも含めて議論ができてよかったと思う.特にGPU環境での評価や,データ数や次元数への依存が少ないと思われるLSHなどの手法への適用など具体的に差を示すべき箇所が浮かんできたのが収穫である.サーベイ並びに評価を進めたい.

WSA研は,事業で研究的なアプローチをどう活かすかを普段から考えて実際に成果を出している人々が集まっている.研究成果とサーベイを携えて次はどう論述するかについて吸収し,次回は誰かに影響を与えられるようになれたら良いなと思う.

Go言語でTCPやソケット通信を多重化,高速化するsmux(ソケットマルチプレクサ)をつくった

サーバ間で分散処理を行う際の相互通信におけるボトルネックを解消するため,smux(Socket multiplexer)を開発している.

サーバ間の相互通信におけるボトルネックとその解決策

一対のサーバ間で多数のリクエストとレスポンスが送受信され,信頼性の高い通信としてTCPを利用する場合,コネクション確立のオーバーヘッドを排除するために接続の再利用が行われる.しかしながら,クライアントは送信に対する受信を待つ必要があるため,レスポンスまでに幾許かの処理時間を要する状況では送信のキューがたまってしまう.そこで複数の接続を利用することでこれを解消する方法が取られるが,追加の接続はリソース使用に関するオーバーヘッドを発生させてしまう.なにより各接続におけるレスポンス待ち時間は依然として解決しておらず,接続の利用面から見て非効率である.そこで,単一の接続において,仮想的に並行送受信を行う方法が提案されている.これは,HTTP/2におけるバイナリフレーミングレイヤの役割であり,コネクション内にストリームと呼ばれる仮想的なチャンネルを設けて双方向の通信を並行して行う.下位レイヤの制約であるリクエスト送信後のブロッキングは,リクエストやレスポンスをフレームと呼ばれる単位に分割することで影響を抑えている.

このように多数のリクエストとレスポンスが送受信され,レスポンスまでに幾許かの処理時間を要する状況においては,HTTP/2は非常に魅力的であり,はじめに採用を検討すべき価値がある.一方で,HTTP/2を利用する場合,HTTPプロトコルに依存した一定のオーバーヘッドは発生する.もちろんHTTP/2にはバイナリ化やヘッダ圧縮などの多数の対策が組み込まれているため,自身の適用課題において十分な性能が見込めるならば問題ないが,より最適化したパフォーマンスが必要な状況では,これらのオーバーヘッドの除去も検討の余地がある.

smux(Socket multiplexer)

smux(Socket multiplexer)はこのような状況において,非常にシンプルなバイナリフレーミングレイヤの振る舞いをアプリケーションに提供する.すなわち,単一コネクションの仮想多重化である.アプリケーションは独自の(そしておそらく簡潔な)プロトコルに則ってストリーム経由でデータを送受信する.複数コネクションのハンドリングが不要になり,複数のリクエストを並行して発行することができるため,アプリケーション実装は簡潔に,通信は高速になることが見込める.

smuxはGo言語で実装されており,アプリケーションがGo言語であれば,以下のように利用することができる.

// smux server
server := smux.Server{
	Network: "tcp", // or "unix"
	Address: "localhost:3000", // or "sockfile"
        Handler: smux.HandlerFunc(func(w io.Writer, r io.Reader) {
                io.Copy(ioutil.Discard, r)
		fmt.Fprint(w, "Hello, smux client!")
        }),
}

server.ListenAndServe()
// smux client
client := smux.Client{
	Network: "tcp", // or "unix"
	Address: "localhost:3000", // or "sockfile"
}

body, _ := client.Post([]byte("Hello, smux server!"))
fmt.Printf("%s\n", body) // "Hello, smux client!"

内部的には,streamはReadやWriteのメソッドを持っているため,より最適化したい場合はこれらを自身で利用することもできる. また,あくまでソケットインターフェースを経由したやり取りであり,smuxのプロトコルに従えば他の言語での実装も可能である.

パフォーマンス

以下は,smuxとHTTP/1.1,HTTP/2を対象としたベンチマークである.それぞれ多重度として,コネクション数やストリーム数を増加させながら,一定数のリクエストを捌くまでの時間を計測した.リクエストとレスポンスの内容,サーバサイドでの処理は各手法で統一している.また,サーバーサイドでの処理の代替に数十msのsleepを入れている.

benchmark

今回の条件では多重度を上げた場合に,手法によっては性能が頭打ちになる中で,smuxが特に高い多重度において性能を十分に発揮できた.今回のベンチマークはサーバーとクライアントが同一の環境であり,各手法に適したチューニングや適用時の条件によっても変動はあると考えられるため,利用においては条件に合わせたパフォーマンス計測を行うことが望ましい.ベンチマークのコードはここにおいている.

まとめ

サーバ間通信のボトルネックを解決するため,HTTP/2のバイナリフレーミングレイヤを参考に,プロトコルのボトルネックを排除するシンプルなコネクションの仮想多重化を行うsmuxを開発した.手元でのベンチマークでは,できるだけ多くのリクエストを並列に処理したいような状況で効果がありそうであることが確認できた.まだまだ安定性の面などで不安もあるが,引き続き本番運用に向けて開発を継続していきたい.


2018/05/04追記

コメントにて先行実装として,hashicorp/yamuxxtaci/smuxを教えていただいたので,ベンチマークを再実行した.xtaci/smuxはSimple Stream Multiplexingらしいので,ここではssmuxと呼称する.

benchmark_2

yamuxに対しては同等以上と言えるが,ssmuxが優秀であるという結果になった.両者とも,ストリームにおけるリクエストに対してレスポンスが発生する場合では,リクエスト側の終了を検知するためにクローズ処理が利用できないため,別途自前でデータサイズを送信する必要があるなど使い勝手に関しては多少の難もありつつも,実装や性能については参考になる部分が多い.まだ改善の余地が残っていること,着眼点自体は良さそうであるという点は喜びたい.並列時の性能に効果があると考えられるフロー制御周りを中心に実装参考しながらパフォーマンスなど改めて見直していく.

Go言語でオンライン外れ値検出エンジンSmartSifterを実装した

推薦システムにおける被推薦者の文脈把握に向けて確率的な手法での行動分析を検討している.そこで,データマイニングによる異常検知で紹介されていたオンライン外れ値検出エンジンであるSmartSifterの理解を深めるため実装してみた.

SmartSifter

On-line Unsupervised Outlier Detection Using Finite Mixtures with Discounting Learning Algorithms. This method is proposed by Yamanishi, K., Takeuchi, J., Williams, G. et al. (2004)

refs: http://cs.fit.edu/~pkc/id/related/yamanishi-kdd00.pdf

SmartSifterはデータの発生分布が時間とともに非定常に変化していくことを考慮した外れ値検出の手法である.離散値と連続値のベクトルを入力とし,離散値はヒストグラム型の確率密度関数で,連続値は混合ガウスモデルで表し,これをデータから推定する.実際にはオンライン対応のために忘却型学習アルゴリズムとしてそれぞれ拡張されたSDLEとSDEMと呼ばれるアルゴリズムが利用される.また,パラメトリックなモデルを用いるSDEMアルゴリズムはノンパラメトリックなSPDUアルゴリズムと交換することが可能である.外れ値のスコアリングには対数損失またはヘリンジャースコアを利用することができる.詳細は上記論文を参照されたい.

外れ値検出

Old Faithful Geyser Dataとして公開されている間欠泉に関するデータを用いてオンライン外れ値検出を試みる.

smartsifter

x軸がeruptionsで,y軸がwaiting.各軸は標準化N(0,1)で標準化済みとする.このデータを順番に入力し,各入力でオンライン学習されたSmartSifterの外れ値スコアを全エリアで確認した.スコアが高い(=外れ値の確率が高い)ほど黄色に近付く.

入力が進むごとにデータの分布に大まかに沿うようにスコアリングされていることが確認できる.

離散値を含んだ外れ値検出

SmartSifterは離散値ベクトルを排反な集合に分類したセルごとに混合ガウスモデルを学習する.標準化後の間欠泉のデータからxが正か負,yが正か負かの4象限をセルとしてオンライン外れ値検出を試みる.

smartsifter_2

各セルごとにスコアが異なることが見て取れる.実運用ではsource-IPaddressなど,各セルごとに連続値側の振る舞いが異なることが想定されるようなものが与えられるだろう.

実装

実装は論文に準じているが,$\overline{\mu}_i^{(t)}$と$\overline{\Lambda}_i^{(t)}$については論文中に初期値が与えられていなかったので,それぞれ$\mu_i^{(t)}$と$\Lambda_i^{(t)}$から求めた.また,$\Lambda_i^{(0)}$は単位行列とした.

現状,Golangからは以下のように利用することができる.

r := 0.1 // Discounting parameter.
alpha := 1.5 // Hyper parameter for continuous variables.
beta := 1.0 // Hyper parameter for categorical variables.
cellNum := 0 // Only continuous variables.
mixtureNum := 2 // Number of mixtures for GMM.
dim := 2 // Number of dimentions for GMM.

ss := smartsifter.NewSmartSifter(r, alpha, beta, cellNum, mixtureNum, dim)
logLoss := ss.Input(nil, []float64{0.1, 0.2}, true)
fmt.Println("Score using logLoss: %f\n", logLoss)

まとめ

こういった確率モデルに従うようなアルゴリズムの勉強のため,今回はSmartSifterを実装した.実運用ではハイパーパラメータの調整が必要になってくると思われるが,今回のような単純なデータであれば想定した結果を得られることがわかった.

現状,ヘリンジャースコアやノンパラメトリックなアルゴリズム(SPDU)は実装していない.また,CLIも用意していないので今後必要になれば順次実装していく.

また,今後は独立モデルとしての外れ値検出だけでなく時系列モデルや行動モデルを仮定していく異常検出も試していきたい.

論文生成モデルの検討を通して論文執筆を進めてみる

今期の論文執筆に着手しながら相変わらず上手く書けていなかったのだけれども,自分をある論文生成モデルの実行基盤だと考えると歯車が回り出した気がしたので書いておく.

今回考えた論文生成モデルはこんな感じ.

model

ここで,p^tは入力xに対して出力されるt時点の論文内容である.入力xt-1時点の論文とV(バリュー.研究成果),S(サーベイ)とする.

なお,fはGANのようなDiscriminatorとGeneratorを持つ生成モデルであり,実行基盤の特性上,Generatorは常にDiscriminatorよりも低精度である.

実際は執筆,推敲を意識して役割分担しながら短いサイクルで繰り返すだけではあるが,以下のように執筆行為を捉えることで執筆時の心理的負担を減らすようにしている.

以下,本モデルの詳細と利点について述べる.

従来の執筆時は二つの役割を同時に実行していた

基本的に論文執筆は難しいものだと思う.昨年の振り返りで先行研究の理解と再構成の必要性を痛感し,サーベイなどに努めているが,いざ書き出すとなると上手く書けない.考えはあるし,簡単なメモ書きや口頭なら出力することができるのに,論文として書こうとすると筆が止まる. 筆が止まる時は大抵,自分の中で批判者がいて,内容を書き出す前にダメ出ししている感じである.つまり,執筆という行為において,自分の中に執筆者と批評者の二つの役割がいると考えられる.この辺りはノンストップライティングで言うところの反省的思考の除去という捉え方に通じるものもある.しかしながら,論文執筆においてはその批評的な視点も思考をねりあげるのに必要なステップであり,これを除去してしまってはいけない. 問題はこれらの役割を脳内で分離せず,かつ同時に実行していることであり,これらの役割が別であることを認識した上で,GAN的に別々の担当者が交互に役割を遂行することが,書き出しを阻害せず,かつ論文としての精度向上も図れるのではないかと考える.

出力と判断に対する認知的負荷の差

一般に,人間はある概念を言語化するよりも,すでに表現されたものが概念に合致するかどうかを判断する方が認知的負荷が低くなる.そのため,情報推薦の分野では情報探索プロセスにおいて都度適切な検索クエリを表現してもらうよりも結果から取捨選択してもらうことでフィードバックを得るような手法もある.文章を書き出すよりも,その良さを判断する方が容易なのはこのような特性があるからである. 逆に言えば,読むときのレベルではそうそう書けないのであり,そのように納得してしまえば,思ったより練度の低い文章が出力されるても落ち込まずに許容できるようになる.重要なのはまずGenerateして,次のDiscriminatorに渡すことである.

提案手法を意識した論文執筆の利点

上記のように論文執筆を弱い執筆者と強い推敲者とに役割分担しながら進めることで以下の利点がある.

  1. サーベイや研究成果などの入力が変化しない状態においては,地道に執筆を繰り返すしかない.逆に言えば何か書けば進むという状態が開ける.
  2. GeneratorとDiscriminatorの工程が分離されていることでGenerate時の心理的な負担が減る
  3. Generatorの精度が低いのはそういうものだと割り切れるのでGenerate時の心理的な負担が減る

どれだけ執筆時に心理的な負担を減らすかが自分の中では大事なようだ.

実際には教師データがないのでGANとは言えないのだけれども,役割を明確に分離することで出力精度を向上させていくというアプローチを参考にした.少なくともここ最近は執筆は何かしら進んでいて,内容は幸いにして自分の中のDiscriminatorが頑張ってくれているので少しづつは良くなっていると思う.混沌とした文章がなんだか論文らしきものになっていく様はまさに生成モデルのようであり,よりよくするためにステップを継続することが楽しみにすらなってくる.

自分の中で色々がんじがらめになってしまって動けない人は,このように行為を解釈することでまずは進み出してみてはいかがだろうか.

情報要求を取り巻く技術とプロセスモデル

情報検索にまつわる開発を行っていると、情報検索や情報推薦の技術詳細、つまりシステム側に注目しがちである。しかしながら前回のエントリで触れたように、情報探索のプロセスには、これを駆動する主体である利用者が存在する。

情報要求を取り巻く技術とプロセスモデルの関連を以下のように図に起こしてみた。

association_chart

利用者は何らかの情報要求をクエリなりの具体的な要求の形でシステムに問い合わせを行い、システムはシステムの持つ文書集合から検索や推薦などの技術を用いて最適と思われる結果を応答し、必要に応じクエリ修正と再問い合わせといった一連のインタラクションサイクルを繰り返す。

狭義の情報検索技術は、静的な情報要求から作られた相互に関連を持たないクエリ集合に対しての適合性を評価される。これは上図で言う所のインタフェースより右側のみで完結するため定量的な評価が行いやすかった。一方で、利用者サイドを中心とした情報探索のプロセスモデルに関する先行研究により、情報要求は、探索プロセスのステージや個々人の戦略、検索結果など様々な文脈により変化していくことがわかっている。

これは、文脈により最適と考えられる応答が変わっていくということである。すなわち情報検索技術間での優位性を比較するのではなく、情報要求の背後にある利用者の文脈や状況、課題設定を把握して、適切な情報検索技術を選定するようなアプローチが考えられる。

また、利用者の存在を意識すると、情報要求を形にするまでの認知的な負荷を下げるため、曖昧だったり、人間的な感覚に近い問い合わせに対しても少ない試行回数でたどり着けることが重要となってくる。より先進的には、課題設定自体の明確化を支援する仕組みも必要かもしれない。

これらをまとめると、利用者の取りうる行動が文脈により変化すると仮定した上で、精緻な文脈の把握並びに課題設定の明確化支援を通して、直感的な問い合わせに応答できる仕組みが求められると考えられる。

そのため、まずは自身の課題環境において、

  1. 文脈により応答の評価が変わることを確認
  2. 利用者の文脈のパターン分類と識別手法の確立
  3. 必要に応じて直感的な問い合わせに応答できる検索情報技術の導入
  4. 課題設定の明確化支援の検討

のようになりそうである。

なお、こういった利用者の背景を踏まえた評価は適切性や有用性といった観点での定性的な評価が必要となってくるそうで、別途文献をあたりたい。

参考文献

Archives