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とかをシェアできるようにしている。
案外好評で、上級生の方も参加してくれているのが嬉しい。

2017/09/25-10/01

色々とばたばたした一週間。
二ヶ月間お世話になったインターンが終了し、結果を報告し、送迎会的なものをしてもらい、東京にいるついでに某フレームワークのイベントのスタッフをさせてもらい、部屋を爆速で片付けて奈良に戻る、というかんじ。

水曜日、インターンの報告発表を行う。
なんというか、ばりばりの理系じゃないしがんがん実験回したわけでもないし、すごい結果が出たわけでもないし心苦しい気持ちが半分くらいあったが、発表くらいはちゃんと楽しいものを作ろうと心がけた。
というか、プレゼンくらいしか能がないのでそこでも微妙だと存在意義がもっと微妙になってしまうし。
結果、営業の方たちにもそこそこ褒めてもらえ、技術者の方にもウケる発表ができたんじゃないかなと思ってる。
こういうところ、本当に僕は技術者よりもコンサルタント業の方が向いてるんじゃないかなとちょっと思ってしまう。
できればそういう業界には行きたくないんだけど、適性はあるんだろうなぁ。とすこし辛い気持ち。

総じてマイペースにやりたいことをやらせてもらえたし、出勤時間に関する制約も緩めでつらい朝を送った日はなかったし、休みや帰宅時間もいろいろと自由にさせていただけたのでとてもいいインターン生活だった。
あっという間の二ヶ月間で、何か自分が強くなったかと言われると難しいところだけど、実際に現場で働くために何が求められて、何があたりまえにできる日強があって、どんな知識を持っている必要があるのか、というのが学べたのは大きいと思う。
ただ、大企業から転職してきた営業さんには、こんな雰囲気なのはベンチャーだからだよ、と釘を刺されるなど、それはそれで難しいよなあと感じる次第。

是非今後とも仲良くしていただければありがたい限り、というまとめ。

二ヶ月も行くと、インターンに関する下手なエモ記事書く気すら起きなくなる。
また強くなったらお会いしたい、という人たちばかりだったのがとても大きい。


土曜日、普段使ってるフレームワークのイベントがあって、学生スタッフとして参加させてもらった。
ぶっちゃけ情報系に関する知識は雑魚なので、すこしでもハードに寄った話題になると発表者の口から未知語の嵐、といったかんじになってしまう。
が、これが理解できるようになるのが今求められる努力なんだろうなと感じたのでとても有意義であった。

こんなかんじで色々忙しくて、実家で荒らしてた自室を掃除する余裕もなく、なんとなく散らかったままで奈良まで来てしまった。
また冬に戻った時に片付けないとなあ。

日曜日、13時の新幹線で品川から京都へ。
そこからさらに数時間かけてやっと学生寮にたどり着く。
たどり着いたらたどり着いたで、ティッシュはないわ石鹸もないわ、出発する時の自分は一体何を考えてたんだろう、と非常に恨む。
長らく部屋をあけるときのノウハウがついたので、次回は手際がよくなると思う。

ていうか、今日の新幹線だとちょっと遅すぎた。
京都に昼につくくらいの時間じゃないと学生寮につく頃には日が暮れて体力がなくなる。これも教訓。

久しぶりに研究室に来たけど、実家のような安心感がすごい。
たここで数ヶ月頑張るかーと、気合い入れたところで今日はここまで。


あ、そういえば先週だったかの記事に書いた左右分離型のキーボード、結局買って現在使用中。
普通のキーボードをつかうときみたいに手首を内側に曲げる必要がないので非常にらくちん。
みんな是非使ってみてほしい。

2017/09/18-09/24

先週洋書を一冊読みきったので、新しいのを買いに新宿の紀伊国屋に行った。
何読もうかなー、やっぱり英文科出身としてはオースティンを読み直してみようかなぁとか、ぼーっと棚の前で本を選んでたら外国人に話しかけられてめちゃくちゃびびる。
そしてリスニング力の無さから非常に拙い会話をしてLOLって感じだった。強くなりたい。

その後突発的にお酒を飲むことになり帰宅。
仲の良い友人たちが実際どんな仕事をしてるのかよく分かってなかったので、その辺聞けて楽しかった。
なんだかんだみんな働く人になってしまって、僕は一体何をやってるんだろうという気分にすこーしだけなる。
そのぶんしっかり進捗出していかないとなあとも思うけど、そろそろ研究のつらみも感じ始めてるし、髪抜けそう。

某友人氏には大変迷惑なものを買わせてしまって非常に反省しているが、人類のためにも続報が待たれるという気分。

仕事ではもっぱら深層学習のチューニング職人として生活しており、面白くない作業を放置し続けてたツケが回ってきたという感じ。
ただ、最近やっと深層学習とはなんたるかが分かってきたので、インターンで東京に来た甲斐はやっぱりあったなと思う。
コーディング能力が上がるとか、そういうのは多分ないとおもう。やっぱり意識しないと獲得できないスキルってあるよね。
得たのは体重のみ。

仕事先で知り合った同期の方とお話ししてる時、ふと思い浮かんだ実験があって「こんど担当教員に相談してみよう」と呟く。
とっさに「やってみますじゃなくてやってから話せっていつも思う」と感想を述べたところ、氏にも心が痛いとコメントをいただいてつらみが増す。

先日ツイッターにも書いたけど、あと200年くらい18歳でいられたらきっと天才になれたと思う。
世知辛い


東京ではお酒を飲んでばっかりで、週末になるとほぼ必ず友人とお酒を飲んでいる。
土曜日の夜も高校の友達に呼ばれてお酒を飲んだ。
べろんべろんに酔っ払って非常に辛い夜を過ごした。

代謝だけは人よりも優れていると自覚していて、おかげで二日酔いもそこまでひどくなかったんだけど、酔っ払いすぎて早朝に目がさめるってのはもう経験したくない。
高校時代に一緒にバンドやってた友人とお酒飲んで、またやりたいよなあって話す。
えもみがふかまる。

かといって、楽器を練習してる余裕もあまりなくどんどん下手になる一方で、これが大人になるってことなのかー、としみじみする。
なんというか、諦めないといけないものがどんどん増えて行く。
18歳の頃は、いろんなことを極められる気がしていたのに、いつのまにか研究っぽいことしかしなくなってる。
好奇心を失うのは罪なので、無理してでも楽器は続けていきたいし、感性が衰えないように曲も頑張って作っていこうな。

pythonでひらがな、カタカナ判定をする

一覧をリストにしてinで比較してもいいんだけど、もうちょっとスマートにやりたい。
ユニコードとかアスキーとかをちゃんと勉強した人にとっては多分当たり前のことなんだと思う。

ひらがなの「も」
カタカナの「モ」

を判別する時、以下のように書くことが可能。

>>> 'あ'<='も'<~'ん'
True
>>> 'ア'<='モ'<='ン'
True

#こちらはもちろんFalse
>>> 'あ'<='モ'<='ん'
True
>>> 'ア'<='も'<='ン'
True

これなら簡単だが、実は「ぁ」などを判別できない

>>> 'あ'<='ぁ'<='ん'
False

ordとchrをつかって、ひらがなの範囲を調べてみる。

#'ぁ'は'あ'の一つ前
>>> ord('ぁ')
12353
>>> ord('あ')
12354

#'ぁ'より前にひらがなはない
>>> chr(ord('ぁ')-1)
'\u3040'
>>> chr(ord('ぁ')-2)
'〿'
>>> chr(ord('ぁ')-3)
'〾'

#'ん'以降を調べる
>>> chr(ord('ん')+1)
'ゔ'
>>> chr(ord('ん')+2)
'ゕ'
>>> chr(ord('ん')+3)
'ゖ'
>>> chr(ord('ん')+4)
'\u3097'
>>> chr(ord('ん')+5)
'\u3098'
>>> chr(ord('ん')+6)
' ゙'
>>> chr(ord('ん')+7)
' ゚'
>>> chr(ord('ん')+8)
'゛'
>>> chr(ord('ん')+9)
'゜'
>>> chr(ord('ん')+10)
'ゝ'
>>> chr(ord('ん')+11)
'ゞ'
>>> chr(ord('ん')+12)
'ゟ'
>>> chr(ord('ん')+13)
'゠'
>>> chr(ord('ん')+14)
'ァ'		#ここからカタカナになる

ひらがなは実用的には「ゖ」が最後、ちゃんと全部取りたいなら「ゟ」まで取れば良さそう。
(「ゟ」は「より」と読むらしい。初めて知った。)



同様にして、カタカナの範囲も調べる。

#カタカナの始まりを調べる
>>> chr(ord('ア'))
'ア'
>>> chr(ord('ア')-1)
'ァ'                         #ここから
>>> chr(ord('ア')-2)
'゠'

#カタカナの終わりを調べる
>>> chr(ord('ン')+1)
'ヴ'
>>> chr(ord('ン')+2)
'ヵ'
>>> chr(ord('ン')+3)
'ヶ'
>>> chr(ord('ン')+4)
'ヷ'
>>> chr(ord('ン')+5)
'ヸ'
>>> chr(ord('ン')+6)
'ヹ'
>>> chr(ord('ン')+6)
'ヹ'
>>> chr(ord('ン')+7)
'ヺ'
>>> chr(ord('ン')+8)
'・'
>>> chr(ord('ン')+9)
'ー'
>>> chr(ord('ン')+10)
'ヽ'
>>> chr(ord('ン')+11)
'ヾ'
>>> chr(ord('ン')+12)
'ヿ'                    #ここまで
>>> chr(ord('ン')+13)
'\u3100'

こちらも、実用レベルなら「ヶ」が最後、伸ばし棒や中黒をカタカナとして判定したい、などなら「ヿ」までをカタカナにすればいい。
(「ヿ」はコトと読む合字)


ちなみに半角のカタカナは以下の通り。

>>> chr(ord('ア')-1)
'ー'
>>> chr(ord('ア')-2)
'ッ'
>>> chr(ord('ア')-3)
'ョ'
>>> chr(ord('ア')-4)
'ュ'

...

>>> chr(ord('ア')-10)
'ァ'
>>> chr(ord('ア')-11)
'ヲ'
>>> chr(ord('ア')-12)
'・'					#半角カタカナのはじめ
>>> chr(ord('ア')-13)
'、'



>>> chr(ord('ン')+1)
'゙'
>>> chr(ord('ン')+2)
'゚'					#半角カタカナの終わり
>>> chr(ord('ン')+3)
'ᅠ'
>>> chr(ord('ン')+4)
'ᄀ'					#ここからはハングル
>>> chr(ord('ン')+5)r
'ᄁ'
>>> chr(ord('ン')+6)
'ᆪ'

「ᄀ」は「ヿ」の半角かと思ったら普通にハングルだった。難しい。


以上を踏まえて、判定するプログラムは以下の通り。

>>> def judge(c):
...    if 'ぁ' <= c <= 'ゟ':
...        print('ひらがな!')
...    elif 'ァ' <= c <= 'ヿ':
...        print('カタカナ!')
...    elif '・' <= c <= '゚':
...        print('カタカナ!')