2017/11/06-11/12

今やってる研究内容を発表したら一気に燃え尽きてモチベーションが消えてしまった一週間。
なんというか、コンスタントに作業しないとこういう燃え尽き症候群になるんだろうなと実感した。

大体一日6時間くらいが真面目に作業できる限度で、それを超えた時間に書いたコードとかは基本的にゴミになるなあとも感じた。
頭が回ってないときに回した実験は大体詰めが甘いし、なんなら普通にバグってたりするので良くない。

コアタイムを設定して、そこを中心に前後三時間くらいで作業するのが一番頭がいいやり方だと思う。
とりあえず来週は1時に寝て8時前に起きるくらいの生活リズムで回してみたい。

ある程度いまのやり方に飽きてきたタイミングで、新しいネタを教えてくれたのでやっぱり担当の先生はすごいと思う。
一週間に一回ミーティングしてくれたり、いろいろとお世話になってるのでせめて手を動かすくらいはやりたい。

ただ、完全に燃え尽きてしまった事に変わりはないのでしばらくはサーベイしようと思う。
実験はもう疲れた。


最近実験のプログラムが大きめになってきたので、gitでちゃんと管理するようにした。
初めからやればよかったってくらいもろもろの作業が楽になった。

半年前に比べると、作るプログラムの品質も多少は良くなってる気がするので成長した。
ずっとpython書いてると、ごくまれにjavaを書きたくなるんだけど完全に書き方を忘れたのでちょっと面倒くさい。
某シミュレーション動画もjavaで書いてるので、続編を作るならjavaをまた書かないといけない。(pythonで書いてもいいんだけどさ)

あのシミュレーターは初めてのプログラミングとしてjavaを練習するついでに作ったものなので、いろいろと酷くてあまり整備をしたくないんだよね。
なんじゃそりゃっていう命名とか、なんでそこそうしました?みたいなクラス分けがごろごろ転がってるので見るだけで精神に支障をきたす。
動画にはコードを公開してくれっていうコメントもあったけど、正直言って見せられるものじゃないのでってかんじ。
もし公開するとしても、つぎにイチから作ったタイミングでそれを公開するつもり。


なんか、基本的に心が辛い一週間だったのであまり覚えてない。
気が付いたら一週間たってた。

今日はオープンキャンパスだったらしいんだけど、うちの研究室は教授が出張だかでいないので特に何かがあったわけでもなかった。
なんとなく学部生っぽい人が多いなーくらいの気持ちで学内をぶらぶらしてた。パジャマで。

2017/10/30-11/05

月に一回くらい大きいプログラム作って、月の残りはそれ回して遊んでるって感じのサイクルなんだけど、このスパンをもっと短くしていかないとなあと思ってる。
いまは10月の中頃に頑張って作った実験プログラムのデバッグしたり、パラメータ変えて遊んだりしてる。
だいたい月に一回のプログラム作成で体力が尽き、指導教員にこれやったら?的なアドバイスをいただいても手が全然動かないって事象が発生する。
モチベーション管理とか研究への体力の問題だと思うので、修士課程が終わるまでにはこのへんのマネジメントができるようになりたい。

そういえば指導していただいてる先生は朝からずっとなにか作業をしていて、夕方にミーティングしてもバリバリに頭が働いていて、思考するための体力が全然違うんだろうなと実感した。
今は基礎知識も足りないし、ちょっと考えるだけですぐに頭がバテてしまうのを自覚してるので、この辺をうまいことやっていけるようにならないとなあ。
ストイックにいきたいんだけど、ぼちぼち心が疲れてきて入るので燃え尽きないようにするのが今は優先かなあ。

ただ、実験プログラムを一つ作るために要する時間とか体力は徐々に減らせてきて入る気がする。
おかげで、多少しんどい気持ちでもある程度大きいプログラムを書けるようになった。
一年前の自分だったら、めちゃくちゃモチベーションがあって時間と心に余裕があるときじゃないと作れないような規模のものを、つらいなぁって言いながらお菓子食べながら作れるようになったのは成長だと思う。
いや、当時はjavaで今はpythonってのもかなり違う部分だと思うけどね。

先日、久しぶりにjavaを書いたんだけど、完全に書き方を忘れてた。
なんというか、いちいちNetBeans起動するのが面倒くさいし、vimでちょろっと書いてターミナルでバンって実行できるpythontとかjuliaが、結局実験には向いてるのかなあという感想。

ただ、pythonの遅さを実感することもよくある。numpyが走ってる時と、そうじゃない時で速度差がありすぎるし、辛いなあという感じ。
pythonでサンプリングのアルゴリズム工夫するよりもnp.random.choiceするのが一番早いし、なんだかなあ。
プロコンでも、ガチガチの動的計画法を提出したのに時間内に処理が終わりませんでした!みたいな結果が返ってくるし、C++覚えるかぁー。


このまえ書いたbot作り記事、色々と詰め込みすぎて微妙なクオリティになってしまったので、いくつかに記事を分けて書き直そうと思う。
単純に人に物を教える練習が最近足りてないし、分かりやすい文章を書く練習になると思うのでこれはちゃんと作るつもり。
中学生にもわかるような入門記事を書けるだけの能力をつけたい。


twitterで、「ら抜き言葉」で抜かれてるのが「ら」ではなく「-ar-」だっていうツイートがバズってるみたい。
もともと形態論とか統語論をやってたので、こういうのをきっかけにみんなが言語学、とくに理論言語学的なところに興味を持ってくれたらいいなと感じた。

最近、現実逃避で箱庭ゲームをやってる。
stardew valleyっていう、牧場物語みたいなゲームなんだけど、無限にできる。
モンスターに突然襲われないマイクラってないのかなあ、ってずっと探してたので、とてもいいゲームバランスで楽しい。
日曜日は朝から晩までずっとこれやってた。
心が疲れぎみなので、こんな感じで適宜回復していく。

2017/10/23-10/29

自分の研究のプログラム作って、実験回して、分析して、また回して、みたいなことをずっとやってる一週間だった。
それなりにうまくいってるので、次の全体報告会でこのテーマについて話すんだろうなあと思いながら、いろいろとデータを分析していた。
いつか見ると思ってたんだけど、ついに全体の進捗報告会で教授にめたくそに批判される夢を見た。それなりに心に負荷がかかってるんだと思う。
でもまあ、インターンで東京に行ってからは1日あたりのQOLを高めに維持するように心がけているので、ストレスはあまり感じていない。
よく寝て美味しいものを食べ、よくゲームをする、でなんとかしている。

10月は、奈良生活のクオリティを上げるために色々と散財してしまった。
デスク周りを整えたり、部屋の質を保てるようなものを色々買ったり、多分十万円くらいつぎ込んだと思う。
色々と充実させて見て思ったけど、上半期はすごくストイックな生活を送ってたみたい。
環境が整ってない中でモチベーション維持できてたのは、多分憧れていた大学院と研究室に配属されたっていう自尊心がブーストになってたからだと思う。
今や、その中で戦わないといけなくなってしまったので、自分を自分で支えないといけないし、もうバフは切れたのでお金でブーストするしかない。


インターンのおかげなのかはわからないけど、入学当初はあんなに何もわからなかったのに、今は機械学習のいろんな手法を実装できるようになっている。
人間って本当にすごいなと思う。
ちょっとした実験で、あのアルゴリズム使いたいな、ってときにちゃんとスクラッチでかけたりすると、ひそかに自分を褒めたくなるよね。
こういうカタルシスを感じながら研究生活を送れたらいいんだけど、すぐに頭打ちになるし、すぐにスランプになると思う。今だけしか感じられない楽しみ方。

研究室の慣例で、月例夕食会をM1が仕切ることになっている。
僕はそれを取りまとめる係の一人なので、食材の調達とか、調理環境を整えたりとかしてる。
研究室は国際色豊かなので、宗教上の理由で食べられないものとかもあって、調理に神経使う。
それはそれで楽しいし、息抜きになるからいいんだけどね。ぶっちゃけ面倒臭い。

責任感を感じてしまうタイプなので、宴会とかの幹事をすると、当日会場の雰囲気が悪くならないかがすごく気になってしまう。
今回も、夕食会で一人ぼっちになってる人いないかな、とか、ちゃんと遠慮せずにお酒飲めてるかな、とか、いろいろと気にしながらウロウロしてた。
まあ、最初の二時間くらいが過ぎたらもうどうでもよくて、お酒がばがばのんでぼーっとするだけなんだけど。

つくづくこういう、企画運営の表舞台に立つのは向いてないよなあと思う。
昔ネットでいくつかの企画運営に首を突っ込んでたことがあるけど、やっぱり密かにクレジットされるくらいの場所でせこせこ仕事してる方が性に合ってる。
いろんな人にお世話になりっぱなしなので、ここでは特に詳しく書かないけどね。


最近土日が一瞬で終わる。
丸一日なにも研究しないという日を作らないと、次の一週間のモチベーションが辛いかもしれないなあと感じる。
セルフスケジューリングが目下課題。

2017/10/16-10/22

奈良に戻って数週間経って、やっとルーチンが固まった。
毎日同じような感じで過ごしてるので特段書くことがなくなるやつ。


最近めちゃくちゃ寒くなって、買い出し行くのもつらい。
原付なんだけど、そろそろちゃんとしたウィンドブレイカー的なものを買わないと体のいろんな部分に問題が出そう。
大きいバイクで60キロくらいぶっ飛ばしてる人とかもっと寒いんだろうなあ。

やっぱり田舎暮らしに車は必須なんだと思う。
もし5年くらいここに住めって言われたら、多少無理してでも車を買うと思う。

それを痛感したのが今週あった選挙。
投票所は学生寮から直線距離だと1kmくらいの場所にあって、地図で見た感じだと行けそうなんだよね。
でも投票所までの最短ルートである大通りは歩行者が通行できる道じゃないので、何かしらの車輪がついた物体じゃないと危なくてしょうがない。

で、晴れてたら原付で行けばいいじゃんって話なんだけど記録的な台風ね。

バスも一本じゃいけないので、一度バスで駅まで出てからまたバス。
しかも日曜日だからバスの運行間隔が一時間に0.5本とかで本当にしんどかった。

帰りはバスと時間がどう考えても合わなかったので、投票所から駅まで徒歩。
20分くらいだから別に晴れてれば大したことないんだけどね。雨だからね。


奈良で投票に行くことは多分もうないけど、もし今後交通手段が限られてる地域で投票に出向く機会があるなら、絶対に期日前投票にしようと思った。
市役所ならどの地域からでも一定の労力でたどり着けるからね。



金曜日、朝寒くて目がさめる。
春に買った布団(薄いタオルケットと薄い上掛けの布団)を両方使ってるのに体がめっちゃ冷えてる。
起き上がるのもつらいくらいで、これが低体温症か!となっていた。
なっていたというか、辛すぎて暖房つけて一時間くらい待たないとろくに動くこともできなかった。

ある程度回復してから、死ぬ思いをしながら厚手の毛布を買いにイオンへ。
こういう体調が微妙な時って判断力が鈍くて、なぜか枕もいっしょに買ってきた。

いや、実家から母が送ってくれた枕があまりにも低すぎて辛いのは事実で、たしかに必要だったんだけど。
なんで今買ったし、というかんじ。めちゃくちゃ重かった。

低体温だと本当に何もできなくなるので、皆さんも季節に適した布団で暖かくして寝るようにしてください。



そういえば、バイクのエンジンオイルをamazonで注文したんだけど、発送先を東京に設定してて無事実家に到着した。
いつかやるミスだと思ってたけど、ついにやったかーという感じ。

まあ、どうせ来年も使うしもう一本買えばいいかってことで再注文。

ぼーっとした一週間。

2017/10/09-10/15

授業うけたり、先行研究の最実装したり、ミーティングして方針転換したりとか、いつも通りの一週間。

夏の間に処理を滞らせていたマイナンバーとか、源泉徴収票の処理だとかを片づけたりしてた。


Euro Track Simulator 2というゲームをSteamで購入した。
とある実況動画に感化されて衝動買いしたんだけど、とてもいい買い物だった。
内容としては、ただトレーラーの運転手になって安全運転するだけなんだけど、クオリティがすごい。
のんびりプレイできる運転シミュレーターをずっと探し求めていて、ついに見つけてしまったという感じ。
永遠にやっていられる。まずいぞこれは。

といっても、下手に自制するとへんに長引くので飽きるまでやりこんでしまおうというスタイル。
100時間くらいはのめりこんでもいいんじゃないかな。


日曜日、学校全体が停電するとのことで、学内にある学生宿舎も無事停電。
ネットワークも前後1日くらい使えないし、寮生はみんな部屋を事実上追い出される形になった。

みんながそろいもそろってバスに乗って避難してる光景は割と見てて楽しかった。
普段はそんなことないのに、近場(と言ってもバスで30分くらい)のカフェに同じ学校の院生が集ってるのは面白い。
なんとなくおいしいものが食べたくなって京都まで出てみたけど、京都駅周辺って特に何もないなあという所感。
あとで同期に聞いてみたら四条河原に行けばよかったのにって言われたので、こんどはそこ行ってみようと思う。

京都駅前のイオンにある本屋をぶらついてたら、人工知能の棚のところにプロフェッショナルシリーズの深層学習が3冊も並んでて、本当に大人気だなあと感じる。
確かにいい参考書なので、深層学習やりたくて式をしっかり追って勉強したいという人にはお勧め。
僕みたいなアルゴリズムの気持ちになって考える系の雑魚にはたまにつらくなるくらい。
最近計算グラフが無いとろくに微分ができないし、もともとない数学力がどんどん落ちていくのを感じる。
一方で、機械学習の数式は割と分かるようになってきたのでそこは成長かも。

停電のあおりを受けて、冷蔵庫の中身も整理しないと行けなくて面倒くさい。
あいにくの雨続きで食料の買い出しも間に合ってないし、しばらくは学食生活。おいしくないから不幸になるんだよなあ、学食。

ネットワークが三日ほど使えないのが本当につらくって、LINEもtwitterも調べ物もできないし、いかに自分が普段ネットに頼り切ってるのかがよくわかった。
来年はこの停電に合わせて旅行とかしようかなあ。というくらい酷い数日間だった。

この頃気候が不安定で風邪をひきそう。
雨続きで洗濯物も乾かないし、仕方なく部屋干ししてたらくっさくなるし。
そろそろ乾燥機を活用しないといけないかなあ。

先週の記事、昼間に更新したせいかめちゃくちゃビューが多くて、50人近くにアクセスされてた。
日平均3アクセスくらいなので、いきなりそんなにみられるとびっくりする。

まあ、こんなただの雑記をまれに読んでくれてる物好きな友人がいるのも知ってるので、つらつら続けていこうと思う。

というか、週記書くと一週間分の記憶の整理がついて頭がリセットされるのでかなり気に入っている。
ぜひみんなにもやってみてもらいたい。

Embedの速度比較

単語埋め込みとかで使う、onehotとlook-up tabelの内積計算を比較する。

埋め込み操作(embedding)の式は以下のとおり。

 \boldsymbol{v} = \boldsymbol{x}\boldsymbol{W}

xは[0,1,0,0,0]って感じのonehotベクトル。欲しいインデックスにビットが立ってて、Wと内積とると欲しいベクトルが引き抜かれる感じ。

これをコードに落とす時、くそまじめにインデックスからonehot作って内積とると重すぎて死ぬので、戒めも兼ねて速度比較を行った。
以下のようなコードを用いる。

Embeddingの操作として、

1. Listを使って目当てのベクトルを引き抜く
2. 内積で引き抜く(式通り)
3. chainerのようなライブラリを使う(中身は知らない)

の三つが考えられるので、それぞれlook-up tableを用意する時間、1万回ベクトルを引き抜く操作を繰り返した時の時間を測る。

ただし、2ではindexをonehotに直す操作、3ではnumpyに包む操作が入って不公平(?)なのでそこは計測しない。
chainerのembedに関しては、中でさらに何かやってるんだろうけど、それは考えないことにする。

import chainer
from chainer import links as L
import numpy as np
import time
import random

iterationSize = 10000
vocSize = 10000
embedSize =100

# 1. リストを用いてembedding
def testListEmbed():
    pStart = time.time()
    # 準備
    embed = [np.random.rand(1, embedSize) for i in range(vocSize)]
    pT = time.time() - pStart
    print('preparation:', pT)
    
    mainStart = time.time()
    # 繰り返し
    for i in range(iterationSize):
        indice = random.randint(0, vocSize-1)
        vec = embed[indice]
    mainT = time.time() - mainStart
    print('time:', mainT)

# 2. numpyで内積
def testNumpyEmbed():
    pStart = time.time()
    # 準備
    embed = np.random.rand(vocSize, embedSize)
    pT = time.time() - pStart
    print('preparation:', pT)

    # 優遇
    onehots = []
    for i in range(iterationSize):
        onehot = np.zeros((1, vocSize))
        onehot[0, random.randint(0, vocSize-1)] = 1
        onehots.append(onehot)
    
    mainStart = time.time()
    # 繰り返し
    for onehot in onehots:
        vec = np.dot(onehot, embed)
    mainT = time.time() - mainStart
    print('time:', mainT)

# 3. chainerで用意されたembeddingを使う
def testChainerEmbed():
    pStart = time.time()
    # 準備
    embed = L.EmbedID(vocSize, embedSize)
    pT = time.time() - pStart
    print('preparation:', pT)

    # 優遇
    indices = [np.array([random.randint(0, vocSize-1)], 'i') for i in range(iterationSize)]

    mainStart = time.time()
    # 繰り返し
    for indice in indices:
        vec = embed(indice)
    mainT = time.time() - mainStart
    print('time:', mainT)

print('List')
testListEmbed()

print('\nNumpy-dot')
testNumpyEmbed()

print('\nChainer')
testChainerEmbed()

3回実行した結果

# 1回目
List
preparation: 0.03716588020324707
time: 0.032792091369628906

Numpy-dot
preparation: 0.01922297477722168
time: 6.139436960220337

Chainer
preparation: 0.05529212951660156
time: 1.03914213180542

# 2回目
List
preparation: 0.12082695960998535
time: 0.0773320198059082

Numpy-dot
preparation: 0.03717994689941406
time: 8.129857063293457

Chainer
preparation: 0.05550503730773926
time: 1.3018569946289062

# 3回目
List
preparation: 0.0423738956451416
time: 0.03646492958068848

Numpy-dot
preparation: 0.021611928939819336
time: 7.694821834564209

Chainer
preparation: 0.05309700965881348
time: 1.3062717914581299


まあそんなもんか、という感想。
chainerはVariableで一気にbackwardできる利便性のぶん、処理速度が犠牲になってる感じ。
深いニューラルならchainerの恩恵を甘受するべきだと思う。

浅いニューラルをスクラッチで書くなら、Listを使って引き抜いた方が速い。
更新する時どうなるかまでは測ってない。
もしかしたら学習のイテレーション全体で見たらchainerが圧勝するのかもしれない。

でもまあ、更新する時もインデックス指定して微分値足すだけなのでリストが爆速なんだと思う。


もしもっと効率的な書き方知ってる方いたら教えてください。

2017/10/02-10/08

二ヶ月ぶりに奈良に戻って来てまたらぼぐらしが始まった。
すでに東京でインターンしてたのが夢のようで、本当に二ヶ月って短いなあと感じる。

先週の日記で書いたけど、石鹸とかティッシュとかのストックが切れてたのでいろいろと買い出しする一週間だった。
で、冷蔵庫の中身もしっかり補充して生活水準まで持って行ったんだけど、来週全学停電があるのでまた冷蔵庫すっからかんにしないと行けないのね。。。
いろいろと辛いけど頑張って生きていこうと思う。

インターン先で学んだんだけど、自分のワーキングスペースは快適にするに越したことはない。ということで、ラボの自席に新しいキーボードとノートパソコンを斜めに置いておくやつ買ってかなり快適な環境にした。
何が作業しやすいのか、とかの情報を得られたのでやっぱり現場で戦うエンジニアと触れ合えたのは大きいと思う。


うちの大学院は修士課程修了に必要な単位数が結構多いので、秋学期もしっかり授業を取らないといけない。
とはいえ数学はつらみがふかみなのでいい感じにすり抜けていかないといけない。
めんどっちー。

月曜日
買い出し。
二ヶ月ぶりに原付に乗ったんだけど、まあまあってかんじ。
案の定エンジンが全然かからねーぜ!って感じだったので30分くらい学生寮の駐輪場で空ぶかししてた。うるさかっただろうなあ。申し訳ない。
そろそろエンジンオイルを変えないといけないので、エンジンオイル買ったり厚手のゴム手袋買ったりしないと。
10月中にはやらないと坂道でエンストしたりしそうで怖い。

指導していただいてる先生に進捗を報告。
何から何まで頼ってしまっているのが申し訳ないので、そろそろ自分で頭使って考えられるようになりたい。
とはいえ、考えるという点については全くもってかなわないので、博士前期課程のあいだは素直に手をガリガリ動かすっていうサイクルになりそうだけど。

水曜日
研究室の定例会で進捗報告をした。
ここでも色々とアドバイスをいただけた。やっぱり専門の数十人の前で自分の考えを発表するってのは刺激になるし、素晴らしい環境にいるんだなと実感する。

土曜日
二ヶ月ぶりに野球。
春学期のあいだは投げ方をすっかりわすれてて肩が痛かったんだけど、東京にいる間にフォームを見直してかなり楽に投げられるようになった。
成長を感じられるし、たしかに一歩ずつ進んでるなあって実感を得られるので研究生活に野球は必要だと思う。

一週間ぶりに発泡酒を買ってきて貴族な夜を過ごす。
多分二週間以内に公開すると思うんだけど、とあるコードを今書いているのでそれを完成させるためにゴリゴリ作業。


日曜日
筋肉痛で使い物にならない。
ざっと買い出ししてチャーハン作ったり、布団干したり、部屋を掃除したりして過ごす。
生活のクオリティ上げるのも意識してやらないと簡単に鬱になる環境なので心がける。
個人的な鬱症状の指標は、よるシャワーを浴びずに寝てしまう。なので、こうなったら次の日は徹底して休むようにしている。

それでもやっぱり、東京での電車通勤が一番鬱になりそうだったので、なんだかんだ言って精神衛生には良い環境なのかもしれない。


そういえば買い出しに行った時に、奈良の人の運転の荒さにひやっとした。
右折信号出てるので曲がろうとしたら、対抗車線の右折車線から車がひょっと出て来て、なぜか左折してきた。
いわゆる右折レーンフェイントの、直進せず左折するバージョンだったわけだけど、本当にこんなことする人間がいるのか、と自分の世界の小ささを実感する。



最近研究室のslackにmusicというチャネルを作って、作業用BGMとかをシェアできるようにしている。
案外好評で、上級生の方も参加してくれているのが嬉しい。