俺のニューラルネットワークは学習能力の低い俺に似てちゃんと学習しないし、気分転換にTensorflowにプルリク投げたらマージされた。

世間ではディープラーニングはアツいようで、ディープラーニングさえできれば基本的人権が確保されるどころか人体の代謝を高め、疲労感が改善し、生活習慣病の予防やダイエットにも役立ち1、キュウリの仕分けもできる2という。

ということで僕も最近はTensorflowを使ってディープラーニングのラーニングをしているのだけど、久しぶりに計算機関連の学習においてつらさを感じている。

確かにサンプルに入ってるmnistとか回すのは当然うまく行くのだけど、自分の抱えている問題に適用しようと思ってデータセットを変えてみたり、他のネットワークを試してみようと思って実装を変えてみたりすると、とたんに上手くいかなくなる。

デバッグしようにも結果が出るまで時間がかかるし、ハイパーパラメータの設定がおかしいのかコーディングにミスがあるのか分からなくてつらい。なのだけど、近くの席のディープラーニングガチ勢に聞いたら、「TensorflowじゃなくてCaffeで書いて同じデータ入れてみましたけど普通に分類できてますよ?あれ、なんか精度めっちゃいいんだけどwww」って言われるし、また別のディープラーニング職人にコード見てもらったら「ここの(パラメータの)数字、これはさすがに大きすぎっすね。」って指摘された。「デバッグつらいですよね、なんで分かるんですか。」と聞いたら「経験による...。」との渋い返事をいただいた。

つらい時間を過ごしている間に、この感覚は何かで味わったそれと似ていることに気づいた。そうだ、Blenderで描かれた3DCGを見て、すげぇ、このソフトを使えば俺にもこんな3DCGが作れるんだ...。と思ってチュートリアルをひたすらやってみたけど、「2Dでも絵が描けないのに3Dモデリングできるわけないじゃん...。」と気づいたときや、それならば2Dだと思い、saiで描かれた絵を見て、俺もsaiを使えばと思って体験版をダウンロードしてみて、読者の想像通りの結果に終わった時のあの「ソフトはすごいけど、自分に使うための基礎能力がなければ使いこなせなかった」時の気分だ。これ職人芸じゃん。

そうこうしながらデバッグしてると、関数に不適切なパラメータ与えてしまったようでValueErrorが飛んだのだけど、エラーメッセージが正しくフォーマットされていない。書式化指定子の%sがそのまま入っているし、そこに入るであろう値がメッセージの後に連結されて表示されている。

Tensorflow内部の該当部分のコードを読むと、例外を出している部分で%,をtypoしているようだった。せっかく見つけたし修正しておくかーと思ってプルリクエストを投げた。botがContributor License Agreementに同意してくれよーと言ってきたので同意したら数日後にテストが走った後にマージされた。

ということで、ディープラーニングもTensorflowも全然理解してないのだけどTensorflowにコミットしてしまった。これまであんまり大きなプロジェクトにパッチ投げたりしたことは無かったので地味に嬉しい。

― 以上、心がほくほくするエピソードでした。1ヶ月前の話です。