最近の所感
この記事はSFC-RG Advent Calendar 2017の19日目です。
統計分野で何かを語りたかったのですが、面白いことが書けそうにないのでポエムと最近読んでる本おいておく
最近
NNとかやってても面白みがなくなってきたので9月から統計を研究してるグループに入った。信ぴょう性も引用もないけど少しだけわかってきたこと書こうと思う。
①ニューラルネットと統計(ポエム)
正直9月までベイズ推論も詳しく知らずに機械学習の論文読んでた。PRML下巻の知識もない状態だった。
それでも最近のNN系の論文は読めていたので統計ってどこに位置して何に必要なんだかよくわかっていなかった。でもちょっとだけわかった。今のところの私の理解を初学者向けに少しだけ書いておきたい。
統計がやりたいことはモデルの推定なんだと思う。モデルになんかしら仮定を与えてデータ点からそれを推定していく。モデルを推定するというのはそもそもパラメータを推定することだった。ベイズってなんだかずっとわかっていなかったけれどよくよく考えたら少なくともMLPシリーズにある書籍のすべてはベイズ推論なんだと思った。
そのなかでも最近少し面白いと思ったのが、ノンパラメトリックの概念である。モデルに仮定を置かずデータ点からモデルを適当に推定するというものである。これはGANに近いような気がする。でもGANの論文にはノンパラのことなんて一切述べられていない。そもそもGANはモデルそのものを求めるわけではない。低次元のベクトルからより高次元な真のモデルへの写像を考えることがGANである。
統計は束縛の強いモデルの仮定のおかげで教師無しで分類できたりするのが面白いだけな気がする。分布がガウス分布の混合であると仮定した人はすごいと思う。人間もそうやってる気がする。ところで最適化ってなんだろうって最近考えていた。統計もNNより強い束縛を置いたうえでパラメータをデータに最適化している。最近STANという道具を使い始めた。モデルのパラメータを普通なら変分ベイズだったりギブスサンプリングだったり結構な数学的操作を必要とするものを全自動で行ってくれる。NUTSとかADVIというアルゴリズムが使われてるらしい。たしかにこれは最適化だった。EMアルゴリズムも最適化の理論に含まれるのだから最適化だ。
まだ何もまとまってない。情報幾何論をしっかりと学習していつかまとめていきたい。
ところで統計の勉強をしてるけどやっぱりDNNはすごい特にCNNはすごい。特徴量抽出は統計屋ができることではなかったと思う。CNNは関数系そのものが強力な仮定であるということがどっかの論文に書いてあった。本当はNNは隠れ層1層で一部の関数クラス、大体欲しい関数がすべて近似できるはずである。しかし関数の形そのものがどのように最適化されていくかというのを表現している気がする。CNNのようなモジュールは無限次元の多様体の一部のドメインを表現しやすくしている、そちらに向かって最適化しやすくしているとイメージしている。たしかにそう考えるとCNNそのものが強力な事前知識というのにも納得がいく。
すべての関数を近似できる関数系というのはNN以外にもあるはずである。それらが無限次元の時、目的に向かってどのように最適化されていくかというのは面白い気がする。収束のしやすさという面は考えたらそこにも出てくるのか?面白い。
モデルをイメージするときGANを考えることが多い。アニメ画像を生成するにしても、人間が描くイラストは一つのモデル多様体上に置くことができるのだろうか。最近人間の創作物のすべては低次元から高次元への写像というより、画像よりももっと高位な概念の次元から画像というかなり低次元な空間への写像な気がしてきた。
ところでアンサンブルという概念はすごい奇妙であると思う。あれは真の分布が存在することを前提としていないのでその意味で根本的な仮定から統計を崩している気がする。考えたらNNというのはあまりノイズという概念を考えておらず、真の分布という概念がない気がする。分布という概念そのものがない気がする。だから元をたどれば最適化の概念が好きな人たちがこっちに来ている気がする。だからこそGANは真の分布の概念が出てくるので面白い。ある意味でNNは汎用度が高すぎる状態からいかにして何かしらの最適化をするかというのに焦点が当てられている。
難しい。まだまだ何も理解していない。
②最近読んでる本
ベイズ統計の理論と方法(渡辺澄夫)
情報幾何学の新展開
統計的学習理論
この3つを今期はしっかりと理解したい。すべてを理解したい。
またなんか面白いことあったら描く
qtjs2015 jubeat発表資料
今更ですが、qtjs2015でltした資料を貼っておきます。
qt quickでjubeat自作した
qt quickで音げー
この記事はQt Advent Calendar 2014 - Qiitaの20日目のエントリーです。
高校生がソフトからハードまで音ゲー自作した - YouTube
10/4(土)及び10/5(日)東京工業大学附属科学技術高等学校にて開催された、文化祭にてマイコン制御部で、qt quickを使用して作った某オトゲーを本日は紹介します。
ハードウェアは@BLUE4z
ソフトウェアは@latte_zero
が担当しました。ゲームの概要は動画をご覧ください。
こちらでは主にqt-quickの細かい技術面、参考url、書籍などをカバーしていきます。
qt quick/qmlを選択した理由
部室にはクロスプラットフォーム信者が多く、単に私もqtが好きだったからです。もともとc++で作成したいたのですが一ヶ月前になり、どう考えても間に合わないのでqmlの勉強も含めて作成しました。
qmlで作成した結果全体の行数は2000行もないと思います。(多分)
オトゲーはアニメーションやエフェクトが非常に多いため、どっちにしろc++なら死んでました。おそらくその10倍は行ったと思います。
上画面について
実機は2つのディスプレイに分かれていると思います。しかし予算、時間の関係上一つのディスプレイに無理やり詰め込んでいます。
メニュー画面について
正直これが一番難関でした。qt quickには標準でリストをループさせるという機能がなかったからです(多分) *1
そこで以下のリンクを参考にし、前後の要素を削除しながら動的に次に来るべき要素を読み取りロードするという流れでうまくやりぬきました。
http://doc.qt.io/qt-5/qml-qtquick-viewtransition.html
したがって、楽曲の位置は固定されてないし、楽曲の数が一つなら、すべて同じ楽曲でうめつくされると思います。
クリアエフェクトについて
文字が徐々に出現していく方法を一から記述するのはとてもめんどかったので、メニュー画面の方法と同じlistviewのtransitionを使いました。その部分のソースコードを抜粋します。
Timer{
id:result_listview_adder
onTriggered: result_textadd()
interval: 100
}
function result_textadd(){
result_listview.model.insert(clear_nowlength,{"txt":result_text.charAt(clear_nowlength), "num":clear_nowlength});
if(clear_nowlength === result_text.length){
result_listview_adder.running=false
}
}
ListView{
x:490
y:20
id:result_listview
width: 200; height: 1000
spacing:-100
model: ListModel {}
delegate:Rectangle{
rotation:90
width:200
height:260
id:titlerec
color:"transparent"
property int spreadth:500
property int sam_ani:100
Glow {
anchors.fill: parent
source: text
radius: 80
samples:sam_ani
color: "white"
spread:spreadth/1000
}
Image{
id: text
visible:false
source:Name.dhire + "movie_marker/img/CLEARED/" + num + ".png"
}
}
add: Transition {
id: addTrans
NumberAnimation { property: "opacity"; from: 0; to: 1.0; duration: 400 ;easing.type: Easing.OutQuad}
NumberAnimation { property: "scale"; from: 2.0; to: 1.0; duration: 400; easing.type: Easing.OutQuad}
NumberAnimation{ property: "x"; to: addTrans.ViewTransition.item.x + 100;duration:400; easing.type: Easing.OutQuad}
NumberAnimation{ property:"spreadth"; from: 1000; to: 0; duration: 400; easing.type: Easing.InOutQuad}
NumberAnimation{ property:"sam_ani"; from: 60; to: 40; duration: 400; easing.type: Easing.InOutQuad}
ScriptAction{script:{clear_nowlength++}}
}
}
こいつに result_listview_adder.running=true
とやってやれば再生されるはずです。(多分)
プログラムは一つ一つ文字が画像になっていますが、おそらく普通のテキストでも可能だと思います。
座標の位置は微調整しました。動画ではありませんが
失敗時のfailedはまた別にもうひとつプログラムを用意しております。
ゲーム画面について
ここはほとんどのゲームと構成が同じです。canvasをtimerを使い描画しまくっています。corei7-2670 hdgraphics4000でもこれほどぬるぬる動作しました。
しいて工夫した点を挙げるならば、後ろの動画やコンボ数などは一切キャンバスを使用していません。canvasは透過させ後ろにおいてひたすらアニメーションさせているだけです。
公開にあたって
楽曲などは著作権の関係上配布することができません。著作権フリーの楽曲の譜面を作成し、使用していつか公開するかもしれません。
参考文献
以下の参考書は入門にあたって非常に参考になりました。
Qt QuickではじめるクロスプラットフォームUIプログラミング
- 作者: 折戸孝行
- 出版社/メーカー: アスキー・メディアワークス
- 発売日: 2013/08/01
- メディア: 大型本
- この商品を含むブログ (3件) を見る
※1記事を公開してからtwitterにて@task_jp さんから listループのためにpathviewというものがあるとご教授いただきました。ありがとうございます。
ListView の最初と最後をつなげて表示する - Qt 5 の未来は明るいブログ