読者です 読者をやめる 読者になる 読者になる

機械学習の研究日誌(1)

 前回のエントリ(新しい世界に踏み出そうか迷っている - 祝いのカンパナ)を書いたところ、機械学習内外の多くの方からご助言を頂いた。意見を総合すると「機械学習はなかなか難しいけど、やってみたらいいんじゃない?」とのことだったので、せっかくの人生だしちょっとやってみることにした。

研究方針

 研究をやる大前提として、

  • 機械学習をマスターすることを目的にしない
  • 機械学習を勉強していくプロセスを楽しむ

の2つの基本方針を決めた。いかんせん機械学習は難しいという事実は変わりないので、難しくてやっていくうちに出来なくて精神的に苦しくなってしまうのを避けるためだ。こうしておけばどうにも難しくて研究を辞めたくなった時でも簡単に辞められるので逃げ道の確保にも繋がる。

 また、「楽しんでできる範囲で留めておくと人間どこまでも伸びるんですよ」ということを昔先生に言われたことも思い出してこういう方針に決めた。受験勉強とかでもそうだけど、物事にハマるコツは「対象となることの難易度が易しすぎす、難しすぎない」ことだ。そういった感じで難しすぎない教材を選ぶとか、難しい箇所はパスして理解が付いてきたら後から読み返せばいいことにするとか工夫してあげることが大切だ。

 こうすると目標が無いので最終的にどこに行き着くかわからなくなってしまうけれど、それでいいんだと思う。日々の研究生活を楽しむこと自体が僕の人生を豊かにするし、やっていく過程で思わぬ副産物みたいなものが出来てそれが別のことに役立ったりするものだと思う。

学習の高速道路

 将棋棋士羽生善治先生がよくおっしゃってることだけど、今の時代はインターネットやコンピュータの普及によって、物事を学習する高速道路が敷かれている。なのでその高速経路を通って学習していけばマスターすることは早いんだけど、その高速道路の終点で大渋滞が起こっていて、そこから抜け出せるかどうかはまた別の話になってくる、というのが「学習の高速道路理論」と呼ばれている。

 では機械学習における学習の高速道路とは何かと言うと、

qiita.com

でも推奨されているスタンフォード大の先生が教えてくれるCourseraという無料のオンライン講座を受けることが今の定跡となっているらしい。なのでオンライン講座を受けてしまえばいいかと思うんだけど、その前提条件として数学の線形代数の知識とかが必要になってくるらしい。ということでまずは基本を固めることに重点を置いて研究を進めることにした。

最近読んだ本 

 最初から理論的な本を読んでしまうといきなり嫌になってしまうので、まずは数式とかが一切出てこない文庫本をいくつか読んだ。

 

人工知能の核心 (NHK出版新書 511)

人工知能の核心 (NHK出版新書 511)

 

  去年放送されて話題になった、NHKスペシャル 天使か悪魔か 羽生善治 人工知能を探るという番組がベースになっている本。単なる番組の再収録という感じでは全然なくて、羽生先生がほとんどの部分を書き下ろしている。2017年の最新の人工知能のトピックとか、羽生先生が考えている人工知能との付き合い方、人工知能に出来ること・出来ないことなどがまとまっていて面白かった。

 

  ディープラーニングとは今まで人間が経験則で決めていた特徴量を機械が自分で考えて獲得できる技術で、それが人工知能分野においていかに凄いことなのか、ということが数式なしで説明されている本。推論、探索、エキスパートシステムなど人工知能の歴史について書いてあるので、人工知能分野を俯瞰的に見るのにも適している本。ディープラーニングの章が難しかったので何回か読み返すことになると思う。

 

入門 コンピュータ科学 ITを支える技術と理論の基礎知識

入門 コンピュータ科学 ITを支える技術と理論の基礎知識

 

  前にも貼ったけど、機械学習以前にコンピュータ科学を俯瞰的に学習したいので読んでいる教科書。情報系の学生では無い人はこの節だけ読んでいけば概要を学習できますよ、というガイドが付いているのでそれに従って読み飛ばしながら読んでいる。それでも600ページある大書なのでまだ半分ぐらいしか読めてない。データストレージ、データ操作、OS、ネットワーク、アルゴリズム、プログラミング、ソフトウェア工学あたりは読んだ。これからDB、CG、人工知能、計算理論と章が進んでいく。読み飛ばしたところも後から読む予定なので、しばらくは読むことになると思う本。

 

プログラミングのための線形代数

プログラミングのための線形代数

 

  機械学習に必要な数学の知識としてオススメされていたので買った本。買ってみたら350ページもあって面食らっているんだけど1.2節の「行列と写像」のところだけでとりあえずはいいらしい。昨日届いたばかりなのでまだ少ししか読めてないけど、数学者のための数学ではなくてプログラマのための数学本ということで、説明がとてもわかりやすくて読みやすい。よくできたプログラミングの入門本を読んでいる時の感覚によく似ている。学生の頃もこういう教科書だったら数学が嫌いにならなくて済んだのに……。先生との相性ってとても大事だよなあと思った。受験生の頃も、先生が変わった途端にいきなり成績上がったこととかよくあったし……。

感想

 いざやり始めてみると、読みたい本とかがどんどん出てきて、これは時間がいくらあっても足りそうにないな、でも凄く長い間楽しめそうだな、ということを思った。大学って自分の好きな学問に時間をどんどん投資できて、一流の先生に教えてもらえて、凄く恵まれた環境だったんなんだな……ということを思い返した。なんで情報系の学科にしなかったんだろう、と毎日のように思うけど、でも30歳までに辿り着いたから幸運なのかな、とも思う。

 とりあえず、一歩踏み出せたなという感じがする。先週までは一歩踏み出すのにすらビビっていたから、それを考えたら大きな進歩だ。日中は暇さえあれば本を読んでいるので、やっぱり自分がやりたかった分野だというのは間違いない気がする。とにかく熱が冷めないうちにオンライン講座に取り掛かって面白がりたいので、線形代数の本だけは優先的にバーっと読んでしまいたい。楽しくできるペースでゆっくりやっていきたいと思います。

新しい世界に踏み出そうか迷っている

才能とは、一瞬のひらめきやきらめきではなく、情熱や努力を継続できる力だ

と言ったのは将棋棋士羽生善治先生だけど、僕には研究することしか才能がないんじゃないだろうか、と最近思っている。

 思えば子供の頃から勉強ばかりしていて、勉強が楽しくて仕方なかった。数学は大の苦手だったけど、頑張って行きたい理系の大学に入ることはできた。でも、大学に入ると僕より頭の良い人が本当にたくさんいて、僕なんかの頭じゃ研究職につくことは無理なんだなと悟って、研究とは全く関係のない仕事に就いてしまった。

 前職の研修中に何もすることがなく放置された状態が数ヶ月続いたことがあったんだけど、誰に言われずともずっと社内の技術文書を読んで面白がっていた。そのうち忙しくなって技術と何も関係がない雑多な実務に追われるようになって、研究したいという気持ちと身体が離反して、そのうち体調を崩して退職してしまった訳なんだけど。

 退職した次に目指したのは大学院の博士課程に入ることで、仕事をして給料をもらうことなんかよりも研究していられればそれで良いと思っていた。退職してから入試まで半年の間は全て自分のしたいことに時間を費やせた訳だけど、その間もコンピュータ系の技術本を読んでずっと研究していられた。でも体調は思うように回復せず、入試も受けられず大学院に行くことも諦めてしまった。

 その後体調が少し回復してきたので、Webの開発をしている会社に入ることができた。Webの開発現場は技術がとても重視されていて、勉強できる技術が無限にあって、僕にとっては夢のような世界だった。最初のうちはプログラミングが楽しくて仕方がなかったんだけど、情報系の学科出身ではない僕にとって、プログラミングでの開発作業そのものよりも、その基礎にどういう科学があるんだろう原理の方がよっぽど気になりだしたのだった。

 その頃も相変わらず僕の体調は安定しなくて、思うように会社に行くことが出来ず、家でリモートワークすることが多くなってきた。家で仕事するって言ったってどうやって仕事をすれば良いんだろう、と悩んでいた頃にFacebookで流れてきた

ASCII.jp:“理系”と“エンジニア”は違うと思うのですよ (1/3)|スペシャルトーク@プログラミング+

という記事に、以下のようなコメントが付けられていたのを見つけたのだった。

エンジニアは「問題解決がメイン」、理系(つーか学者)は「一般的な原理の追求がメイン」と思ってます。そして人によって両者の割合が違ってくる。

 開発と研究、似てるようで相反する活動だと思っていたんだけど、割合としてとらえれば良いんだ……というところに頭をガツンとやられたような衝撃を受けたことを鮮明に覚えている。このコメントから、会社にいる時は開発活動をやって、家でリモートワークをする時は研究活動をするというアイデアが生まれ、ここ半年はそのアイデアを実践して開発と研究の二足のわらじを履く仕事生活を送っていた。

 最初は開発7割、研究3割ぐらいの配分で試して見ていたんだけど、体調がジェットコースターばりに日々アップダウンがある自分と、締め切りが必ず存在する開発作業とは相性がとても悪いということが判明してきて、思うように作業が進まない日が続いた。それとは逆に、研究作業というのは基本的に締め切りが無くて自分のペースで進められるので、病気との相性も良くて開発作業よりも研究作業の方が適性が高くて、進捗の方がとてもよく出るのだった。

入門 コンピュータ科学 ITを支える技術と理論の基礎知識

入門 コンピュータ科学 ITを支える技術と理論の基礎知識

 

  今はこの600ページぐらいあるコンピュータサイエンスの教科書で研究をしていて、10日ぐらい前に自分で選んで買ってもらったんだけど、こんな原理と技術でコンピュータは成り立ってるんだ……という感動があって面白くて、難しい本だけどもう半分も読んでしまった。……あれ?体調が良くない中で短期間でこれだけ読めたっていうのは結構すごいことなんじゃないだろうか。そう考えると、「やっぱり僕には研究ぐらいしか才能がないんじゃないか?」と、どんどん思えてきたのだった。他の人には出来ないけど、誰に言われずとも自分の心の赴くままにしてしまう事って、自分にはやっぱり研究しかないのだ。そういったものこそが才能じゃないのか。才能のあることだけに注力した方が、人の為にもなるし自分の為にもなって良いんじゃないだろうか。

 そんな感じのことを思ってTwitterとかで「研究したい」とか「研究楽しい」とか頻繁につぶやいてたら、その事を知ってか知らずかわからないけど「ディープラーニングでもやる?」みたいな事を会社で言われたのだった。ディープラーニングとは機械学習の一種で、去年プロの囲碁棋士と対決して話題になったAlphaGoというコンピュータプログラムにも使われている技術のことだ。コンピュータ囲碁だけじゃなくて、車の自動運転とか画像認識とか、いろんな分野で応用されようとしている最近流行の人工知能分野の技術だ。

 僕が機械学習のことを初めて知ったのは将棋の電王戦のときで、「コンピュータ将棋プログラムが強くなって嬉しい」とか「なかなか強くならなくて大変だ」みたいなことを開発者の人たちがTwitterとかニコ生で言ってるのを見ていて、なんだか楽しそうだなあと思ってずっと見ていた。頓挫してしまったけど、博士課程に入ろうとした時も機械学習を絡めた研究計画を練っていたこともあった。

 そんな経緯もあって機械学習をやってみたいと思うワクワクした気持ちがある反面、簡単に足を踏み出せない事情もある。機械学習をやるには高度な数学的素養が必要で、かなり難易度の高い分野なのだ。

 数学が苦手な僕が手を出してしまって、その難しさで自分が潰れてしまわないだろうか。でも、やりたい目的の為だったらやってみればなんとかなってしまうかもしれないしなあ。仮に原理が理解出来たとしても、会社で実用化できるかどうかなんてまた別次元の難しさだろうし、小さい会社だから僕一人でやれって言われても荷が重すぎるなあ。でも機械学習のライブラリも無償提供され始めたし、Web開発の世界に機械学習の波が押し寄せてくる時代が来るのも目に見えてるし、教育とか福祉の分野で機械学習で何か出来たらって思うとすごくワクワクするなあ。人生で何かにチャレンジできるのも30歳ぐらいまでだから、なんかちょうど大きな転機が来たかのような気もするんだよなあ。"Just temporary"って言うし、試しにちょっとだけやってみて、行けそうだったら深入りすれば良いしダメそうだったら引き返せば良いのかなあ。大企業で新規事業を起こすっていうのならともかくとして、小さい会社でたった一人で始める事だから、失敗したところでダメージなんて無いに等しいしなあ。

 そんな事を今週ずっとぐるぐる考えている。答えはまだ出ていない。ああ、どうしようかなあ。

頑張らないようにしている

 「頑張る」というのは不思議な言葉だといつも思う。時候の挨拶のように「頑張ってね」と人に声をかける様子は毎日のように聞くし、実際に言われるとたった一言の会話なのにどこか元気をもらえた気がして嬉しい言葉のように感じることもある。その一方で、自分にとってやりたくないことを人に頼まれて、渋々了承する時に「頑張ります」と苦し紛れに言わざるを得ないような、とても嫌な言葉に感じることもある。

 つまり、世の中には良い「頑張る」と良くない「頑張る」があると思うのだ。自分が好きで自分から進んで取り組めるような物事に対して頑張るというのは、自分自身を元気にしてくれるものだし、無理のない範囲で生活に取り入れて行った方が人生が豊かで楽しいものになって良いと思う。

 でもそうではなく、自分を消耗してしまうような物事に対して「頑張る」という時のその言葉の裏には、「無理をして」とか「自分の意志に反して」という言葉が隠れている。頑張っている瞬間は一夜漬けみたいな感じでなんとかなるかもしれないけれど、長期間の無茶な行動の後には必ず反動がくるように人間は出来ていて、取り返しのつかないしっぺ返しをくらう事もあったりする。無理の代償として怪我や病気をしてしまい、何年間も人生をふいにせざるを得なくなるなんてことは、この世界で往々にして起こっていることなのだ。

 世の中には頑張ってはいけない性格の人間がいる。真面目な人、責任感の強い人、もしくは自分を犠牲にしてまでも仕事に尽くしてしまうような人は、そういった良くない頑張りをしてしまわないように十分注意していかなければならない。僕自身もそういうタイプだった人間の一人で、過去に辛い状況から逃げ出さずに我慢して頑張りすぎてしまった結果、障害を背負ってしまった。その反省から、今は「頑張ることを手放す」ことを実践していて、自分が楽しく感じられる範囲で仕事をしたり生活を送ったりするようになってから、割と人生がうまく行くようになった。

 現代のビジネスの根底には、とにかく仕事を詰め込んだり、無駄な時間を削ったりして、生産性を高めよう、みたいな言説が蔓延しているんだけど、そういった考えは今の僕にはとてもマッチョな思想に感じられて辛いので、影響を受けないようできるだけ距離を取るようにしている。

 次の図は、1日の仕事の中での生産性を考える上でとても参考になるものだ。

f:id:mashimoc:20151003151928j:plain

lifehack - [翻訳]プログラマの生産性の壊し方 - Qiita

 「ギーク」とはコンピューターに精通している人たちの俗称なんだけど、ギークに限らず人間は本来、生理的には上の図の青い線のように調子の波があるものだと思う。人間は機械ではない。全ての時間帯で人間は生産性を100%まで上げられる、というのは単なる幻想でしかなくて、その生き方を目指してしまうと不幸な結末が待っている。

 「プログラマの三大美徳」と呼ばれる有名な言葉があって、人間の7つの罪とされるうちの怠惰、短気、傲慢がプログラマにとっては美徳だとされている。可能な限り頑張らずに物事を達成したり問題を解決できてしまう方が素晴らしいとされる価値観が、プログラマにとってはとても大切なものなのだ。

 それでも無理をして頑張らないとレベルアップできないし世界では通用しない、みたいな意見もあると思うんだけど、その考えが絶対正しいかというと必ずしもそうではないみたいだ。さまざまな分野の一線で活躍している人たちのインタビューを聞いてみると、凄まじい努力の結果高みまで登りつめたという人がいる一方で、ただずっと楽しくてやってるうちにいつの間にか一流と呼ばれるところまで来ていた、という人もいることがわかってきた。

草彅: よく人って夢のためにがんばるっていうじゃないですか。

タモリ: 夢があるようじゃ、人間終わりだね。

草彅: 僕もそれどうなのって思うんですよ。夢って何なの?って。思いません? それを美徳としてる感じがあるじゃないですか。「夢に向かってがんばろうぜ!」みたいな。じゃあ、夢が叶っちゃったらどうするの?って話で。

能町: 今まで夢とかなかったですか?

草彅: だから、夢ってわからないんですよね。小さい時からこの仕事をしているんで、ある意味早く叶ってしまったっていうのもあると思うんですよ。でも夢のためにがんばって目標立てて、毎日それだけのために生きていくって……。

タモリ: そう。夢が達成される前の区間はまったく意味がない、つまんない世界になる。これが向上心のある人の生き方なんだよね。悲劇的な生き方。夢が達成されなかったらどうなるんだ?ってことだよね。U-zhaanさんとかこう(タブラを)やるのは、夢じゃないんだよ。やってるだけの話だよね。好きでやっててこうなってるだけの話で。

U-zhaan: いつかどうなりたいと思ってやってたことはあんまりないですね。

タモリ: うん。好きでこれ面白いなってやってる人がみんなこういう風になってるんだよ。そういう人たちが夢を持ってやってたかっていうと、そうじゃないよね。それがジャズか、ジャズじゃないかの差。

宮沢: 今を濃厚に生きるかってことですか?

タモリ: そう。

 タモリにとって「ジャズな人」とは何か---70歳の『タモリ学』 - てれびのスキマ

 もしあなたが長い間良くない頑張りを強いられていて辛い状況が続いているのなら、それはきっとあなたが悪いんじゃなくて、身を置いている環境やシステムの設計が良くないんじゃないだろうか。そういった状況はずっと持ちこたえることは出来なくて、遅かれ早かれ瓦解してしまうのだろう。そうなってしまう前に、余裕のある仕組みに作り変えてしまうか、もしくはその環境から諦めて身を引くことが大切なのだと思う。