背景
個人趣味で開発してた自分用家計簿サービスが一段落し、次にやる事を考えてみた。やっぱり、今流行りの機械学習で何かしてみたい。とはいえ、基本知識すらない。色々ネット情報をあさっていると、courseraのMachineLearningコースがどうも評判が良い。基本無料で修了証が欲しい場合にお金を払えば良いらしいという事と、ミーハーな所で、受かったら修了証がカッコよくて欲しいと感じ、まずは無料で受講開始。
色々感じた事があり、ポエムという領域にチャレンジしてみたくもなった。
結果
進めるのは大変だったけど、どんどん先に進んで知りたい要求も強く沸き上がり、結果的に規定日数よりも早く終わった。自分は通勤途中ではスマホでビデオ教材を見て、家ではプログラム課題を終わらすというフローで3~4週間で修了。標準では最長で11週間(だと思う)。多分平均より早いと思う。
ちなみに修了証のお金に関しては、進めていくうちにこの講座が評判通りの良いものであると確信し、その時に支払った。
機械学習に関しての感想
なんか世の中では機械学習とかディープラーニングとか、まるで万能のような扱いを受けてる(自分感覚)。だけど、現実にはモデルとかパラメーターとか色々検討して決めなければいけないものがあり、簡単ではない。という事を実感。ちなみにこの講座の中ではどうやってそのようなパラメーター群を決めるべきかとかのセオリーも述べられてる。
何にせよ、機械学習にも色々なタイプがあり、解決しようとしている問題に対して適切なアプローチをしなければよいパフォーマンス(正確さ)が得られないという事を痛感。そして、長い時間がかかる課題もあり、アプローチを失敗すると多大な時間ロスが発生してしまう事も。時間ロスはコンピューターリソースロス、すなわちダイレクトなお金ロスにもつながる。
kaggle というサイトも最近知った。その中のあるサービスでは、機械学習の課題(報奨金付きのもあり)を競い合ってる事からも、機械学習は誰もが簡単にどんな対象にでも活用できる、という類のものでない事が解る。
データサイエンティストのジャンルとして、その様な機械学習のモデル分析とか色々を専門に扱うものもある様子。簡単ではない事を示すものの一つだと思う。
冒頭で述べた通り、何かやってみたいな、という気分で始めたもの。終わってからの感じたのは、取り組んでみるのはやっぱり楽しそう。前述の通り機械学習は万能なものではないと思っているが、もちろん取り扱う題材による。検索してみると初心者向けの題材とか色々見つかる。
これから少しずつ色々試して知見を深めたい。まず狙うは壮大なクソアプリ。クソアプリ狙いとは言え、簡単な事から経験を積まないとダメと思われる。そんな経験を積みながらクソアプリのネタを考察していきたい。
前提知識
今回、この講座を受けていて、以下の知識があったから比較的スムースに進められたと感じる。Qiitaを始めとする各種記事では基本知識が無くてもなんとかなるというのが結構あったけど、自分は以下の基本知識が無かったら多分途中で諦めた。※それらの記事も本当だと思う。ただ、自分は無理だったろうという事。
高校数学
機械学習では行列演算が使われる。微分積分の理解あるとなお良い感じ。統計学の基礎も役に立つと思われ。自分はここらへんの高校数学知識を忘れていなかったのでそこらへんで詰まる事は無かった。
ちなみに以下記事の著者の様な強者も世の中にはいる。
文系エンジニアが機械学習に入門するために小学校の算数から高校数学までを一気に復習してみました。
プログラム
フローチャート的なアルゴリズムは要らないにしろ、何らかのプログラム言語を扱った事があると、このコースで使う Octave or MATLAB に関してもすんなり入れると思う。ただとらわれすぎると、行列演算(ベクトル演算)で処理すべき所をforループ使ってしまったりしそう。
実際にアプリを作る時には多分Pythonとか使うことになると思う。Octaveを外部から呼べたりするのかな?wikiによるとMATLABの方は各種プログラム言語とのインターフェースを持ってるらしい。ライブラリ?
※講座の中で、OctaveとかMATLABとか出てきて、両方使う必要あるかと思って両方チュートリアルやってみたけど、どちらか片方という事らしい。
英語
受講レポートなどを見てみると、Google翻訳活用でなんとかなると書かれてた。間違いではないと思う。コピペのGoogle先生頼りで対応可能と思う。ビデオも日本語字幕あったし。ただ、プログラム課題のドキュメントの理解なども英語読解力があるとスムースになる。テストにおいても、英語が読めないとどんな事を問題で言っているのか理解できず間違った答えを出してしまう事もありそう。ここ数年、別件で英語勉強しておいてよかったと痛感。
自分は使わなかったけど、コミュニティでやり取りする際も英語がある程度できると時間ロスが無いと思う。
※自分はネイティブレベルには話せないけど、普通のコミュニケーションは出来る、というレベル。
知識レイヤ(積み重ね)に関して
今回は機械学習の基本知識を仕入れたけど、ふと前述の知識もそれを得るための前提知識が色々あり、今得ている知識というのが過去の知識が何層にもなっているその上にあると感じた。
数学部分
行列演算や微分積分の事を勉強するのにもちろん方程式やn次関数の知識は必要。そしてそれを勉強する為には四則演算などの小学生算数知識は必要。
英語部分
英語に関しては色々な経験や勉強が複雑に絡んでいて綺麗なレイヤにはなってないけど、小学校のアルファベットの勉強から始まって、学校の勉強とそれ以外の色々な自己学習や経験が少しずつ積み重なっての結果だと感じる。
プログラム部分
Octaveに対しての別言語でのプログラム知識は、必須でなく、あってから良かったという感じ。レイヤという意味では基本的なコンピューターの知識がその下にあるかな?
先人の知恵レイヤ(積み重ね)に関して
前節は自分自身のみの知識積み重ねだけど、先人たちの事も含めると相当なレイヤになってると思う。
数学部分
今回の講座の中でも「この部分は数学的に証明されてるけども」的な話がいくつかあった。自分にはその証明がどうなっているのか理解する事は出来ないけど、ピタゴラスの定理などから始まり(その前にもあるか?)、数々の数学者がその定理などを元にさらなる数学の公式その他を証明し、さらにそれらを使って別の数式を・・・何てことが相当繰り返されてるはず。二次方程式の解の公式とか、証明してから使ってる人あまりいないと思うけど、機械学習でも同じように先人たちが研究して作り上げた公式を活用させてもらうという事になっていると思う。感謝です。
プログラム(コンピューター)部分
関数部分に関しても数学と同じような事があるはず。課題の中で使っていた各種高度関数は、その中でまた別のライブラリを活用したり先人のロジックを改善したり、相当なレイヤが構築されている事が想定される。wikiによるとMATLABではLINPACKやEISPACKという行列、ベクトル演算ライブラリを使っているらしい。これはスパコンの性能検証に使われてるらしい。
MATLABでは他言語とのインターフェースあるみたいだし、実際のアプリで使用する事になったらそれも一つのレイヤになると思う。前述ライブラリもOSレイヤの数値計算関数は使ってると思う。
終わりに
そして、数学部分とコンピューター部分の進化がもたらしたのが機械学習と思う。コンピューターの進化が機械学習ロジックの検証と実践を可能にしたり、機械学習の効率的なロジックが使われだしたらそれを効率化するようなコンピュータの進化があったりすると思う。
はたまた今後は機械学習を元にした何かの学問やテクノロジが発生したりするのかもしれない(もしかしたらその類のものが既にあるかもしれない)。
自分はとりあえずクソアプリ狙いで機械学習を体感すべく各種初心者向け題材をこなしていく予定。
そこそこ長文になってしまった。ここまで読んでくれた人、ありがとうございました。