全てプログラミングで解決しなければならないという思い込みを捨てる

2時間しか眠れなかったが、なんとか起きて出勤。朝はアルゴリズム演習の授業。先日台風で休講になった日の補講なのだが、3限以降は休講にならなかったので、1-2限だけの補講のはずなのに、1限の授業が休講だったので、実質自分の授業のためだけに学校に来ている人がほとんどだったらしい……(出席しなくてよいし、課題を出すだけでもよいと伝えていたところ、1/3の学生が出席。)

今年度の講義はこれで全部終了。来年は今年度やる予定でウォーミングアップに3回かかってしまったためにできなかったデータ構造と、ソートアルゴリズムをカバーしたいところである。

お昼は学内のお仕事に関係する説明会。どういう分担か事前に知らされていなかったのだが、1時間半あった説明のうち、自分に関するところは1分くらいで、残りは全部自分に関係ないところだった。説明会のあと、コース内の先生方に自分がやる予定の仕事がどういうものか教えていただいたので、概要は分かったのだが、睡眠時間が短かったこともあり、説明会の最中は眠さ max だった(汗)

夕方は研究室で研究の相談。一緒に Scala の使い方を勉強する。やりたいことができるならどの言語で書いてもいいし、Scala でできそうにないなら他の言語で書けばいいと思うのだが、どのタイミングで諦めるかが難しい。しかし言語処理的なレイヤーで止まって時間がかかるのは仕方ないが、プログラミング言語的なレイヤーで時間を空費するのはもったいないので、できそうにないならさっさと断念したほうがいい(それでやらないといけない、ということはない場合は、特に)と思うのだけどなぁ。

あと、手でやれば5分でできる内容を、プログラミングでやろうとして1カ月かかったりするのも、本気で泣きたい。大学(院)でやるべきは研究であってプログラミングではないので、プログラミングでやる必要がないところを無駄にやろうとして異常に時間がかかるのは、本末転倒である。言語処理でよくあるケースは、たとえばコマンドラインから MeCab/Cabocha/Stanford Parser etc を使ってファイルに書き込んだものを読み込めばよいだけなのに、Python/Ruby/Perl インタフェースを使ってそれぞれの言語から呼ぼうとしてうまく行かない、というような事例(特にオブジェクト指向がよく分かっていない人にありがち)であるが、なぜか「こうしなければならない」と考えるようなのである。

機械学習はじめよう(最終回)の「機械学習を使わずのすすめ」でも書かれているように、

え? ルールを書いてしまったら,なんだか負けた気がする?

目的は「機械学習を使う」ことだったのでしょうか。

いいえ,違いますよね。本当の目的は「いいものを作る」だったはず。それなら,ルールを書いても全然負けたわけではありません。

機械学習もあくまで手段の一つ」という点が念頭にあれば,場合によっては「(試してみたけど)やっぱり機械学習を使わない」という判断もあり得ます。

ルールを書くということはメンテナンスコストが上がるということです。それによって本当に作りたいものから離れていないか,そういうことこそを気にするようにしましょう。

(中略)

せっかく機械学習を勉強したのだから使いたい気持ちはとてもよくわかりますが,それでも「機械学習を使わない」という選択肢を常に残しておいてほしいというつもりで最後にこのような節を持ってきてみました。

機械学習は間違いなく強力な道具です。だからこそイメージに引きずられずに正しく使えるようになってほしいと思います。

ということであり、目的と手段を混同してしまうとよろしくない。プログラムを書くのはあくまで研究する手段の一つに過ぎないわけで、プログラミングの勉強を各自やるのは大いにけっこうなことだと思うが、「機械学習でやらなければならない」「プログラムを書かなければならない(この言語で書かなければならない)」という思い込みは捨てたほうがよい。もしどうしても機械学習でやりたい、あるいは手でなくプログラムを書きたい、というならそれはそれでかまわないと思うのだが、まず人手でやってみた上で、研究的としてはそこをクリアして先に進めた上で、勉強として趣味でやってもらいたいと思うのである。

SVM でよく知られる Vapnik の原理として「ある問題を解くとき、その問題よりも難しい問題を途中段階で解いてはならない」というものがあるのだが、途中段階で難しいものがあるなら、それを回避する方法を考えた方がよいし、途中段階で本来の問題よりも(いまの自分にとって)難しい問題が出てきて回避できないなら、最終的なタスクの変更を検討した方がよいと思う。特に最初のうちは、ハードなタスクを1つこなすより、簡単なタスクをいくつもこなす方が実力がつくし、そのうち自分の実力がついて、乗り越えられるようになったらおもむろに取り組めばいいので……。

とはいえ、自分自身修士のころは正規表現を使ったプログラミングや SVM による機械学習で味を占めて、なんでもかんでも(汎用的な)プログラムを書こうとしたり、とにかく機械学習で解こうとしたりすることがあったので、人のことは言えないのであるが……。(乾先生や松本先生もときどき「そんなの機械学習しても意味ないよ」とおっしゃっていたの、そのときは分からなかったが、いまは自分が同じことを思う立場になった)

CTOとはなんなのか、あるいはエンジニアの生存戦略 でも

一定以上のエンジニアリングの経験やスキルを持っていると、多くの技術的課題を(実際にやっていなくても)抽象的に理解できるようになりますし、その理解が大筋で正しいことも非常に多いです (すくなくともチューリング完全という意味ではそうだよね、ということではあったりします)。ただ、これが続くと実際に自分がやっていたときのいろんな苦労を忘れていって、必要以上にものごとが簡単に思えたり、自分ならすぐできる、とか思ってしまったりします。

というくだりに同感で、つとめて自分がやっていたときの苦労を思い出さないとなぁ、と思うのであった。