下町柚子黄昏記 by @yuzutas0

したまち発・ゆずたそ作・試行錯誤の瓦礫の記録

Courseraの機械学習コースを修了しました

概要

Courseraというオンライン学習サイトで公開されているMachineLearningコースを修了しました。

f:id:yuzutas0:20160319161104p:plain

もくじ

  • どんな講座か
  • 講座のアジェンダ
  • なぜ受講したか
  • 受講した感想
  • あると望ましい事前知識
  • はまりどころ
  • 最後に

どんな講座か

  • 機械学習の主要なアルゴリズムを直感的に理解して、実際にプログラミングできるように教えてくれます。また、実装前にどのアルゴリズムを使うべきかの判断、テストとチューニングの方法、大量データの並列処理といった付帯トピックも言及されます。
  • 講師はStanford UniversityのAndrew Ng(呉恩達)氏で、Googleの人工ニューロン研究プロジェクト発起人や百度首席科学者として知られています。実際にこんな風にやっていますよ!という話を交えるので、画一的で教科書的な解説よりも聴きやすいと感じました。
  • ボリュームは結構重いです。「講義および4択試験(2時間)」+「実践課題(3時間)」×「11週間」となります。

講座のアジェンダ

実際の内容は以下となっています。

なぜ受講したか

機械学習の仕組みを正しく理解する必要性を感じたからです。

学生時代に分析手法の1つとして機械学習アルゴリズムを使ったこともありましたが、直接の専門分野ではなかったので、改めて学びたいと考えました。

企画観点

  • 某所にて、機械学習の各手法の特性を無視した施策を打って、ROIを大きく下げた事例を見聞きしました。
  • バズワードに流されて誤った企画判断をしないように、仕組みと特性を把握する必要性を感じました。

開発観点

  • レコメンド機能を開発する機会があり、機械学習ツールやライブラリを使うことで、簡単に機能を導入できました。
  • しかし、さらなる機能改善・性能向上に当たり、本質を理解せずにお手軽ツールを使うことにすぐさま限界を感じました。
  • ほとんどのソフトウェアは作って終わりではないので、パラメータやロジックを継続改善できるように(そもそも継続改善することが妥当なのか判断できるように)仕組みを理解する必要性を感じました。

受講した感想

ビジュアルや動きで直感的に理解しやすい

  • 書籍だと図と文章説明と数式とサンプルコードを1つ1つ見比べながら脳内補完しなければいけないので、初学者には辛いものがあります。動画だと、その過程を講師が順を追ってビジュアルや動きで再現してくれます。
  • オフラインの講義でも直感的な理解を促してくれる優良講師はいるかもしれません。ただ、動画だとスケジュールを気にしなくて良かったり、一時停止ボタンを押すことで、安心して一歩立ち止まって考えることができます。

そのまま実務には使えないかも

内容面

  • Random Forestなど、よく使われるのに講義で解説されないアルゴリズムがあるので、網羅性の高い書籍で概要把握に当たるのが良さそうです。私は書店で何冊か読み比べて『データサイエンティスト養成読本 - 機械学習 入門編』を買いました。
  • せっかく素敵な内容なのですが、いかんせん動画なので見返すには辛いものがあります。途中途中でノートを取るか、チートシートをまとめれば良かったなぁと反省しています。

実装面

  • Octaveで試してうまくいったらPythonなどの言語を使うべし」と解説されるものの、最初から最後までPython一択だと思います。特に分析過程を記録できるIPython Notebookの存在は大きいかなと。
  • 実際にPythonのライブラリ群(Numpy, Scipy, scikit-learn)や、IaaS/PaaSが提供する機械学習サービスを活用するには、各チュートリアルに進むことになるかと思います。もしくはPythonでこの講座の課題を実装するのもいいかもしれません。

分量が多いのでかなり大変

  • 心が折れない方法 / 折れてもすぐに復帰できる方法を自分なりに確立する必要があります。
  • 複数人で勉強会形式で進めると挫折しにくい、という案がCROSS 2016 のセッションで挙がっていました。
  • 辛い分だけ、最終動画の講師の言葉に感動します。

あると望ましい事前知識

前提として以下のスキルがあるとスムーズに進むと思います。

線形代数 / 微分積分

yuzutas0.hatenablog.com

学術的な英文の読解

  • 各レッスンの演習課題は15ページほどの英文PDFで与えられます。読めないと課題に着手できません。
  • 普段から英文でドキュメントを読み書きしているソフトウェアエンジニアなら問題ないかと思います。
  • 自信がない場合は、大学受験英語TOEFL対策を試すのも良さそうです。「TOEFL学習法まとめ」が参考になるかと。

ソフトウェアエンジニアリング / コンピュータサイエンス

  • ソースコードの読み書きができないとOctaveでの演習課題に着手できません。
  • また、分野の特性上、メモリ管理などの比較的低レイヤーな話題も出ます。初歩的なCSの知識は必須かと思われます。
  • 講師の発言を聞く感じだと、そもそも受講対象としてソフトウェアエンジニアを想定しているようです。

yuzutas0.hatenablog.com

はまりどころ

実際にやってみてはまったところや困ったところのメモを公開します。 なお、利用環境は以下の通りです。

  • 利用OS:MacOSX
  • パッケージ管理:Homebrew(およびcask)
  • エディタ:SublimeText
  • ブラウザ:Firefox

Web試験の画面が表示されない

  • Firefoxだと問題・回答の画面が表示されず真っ白になることがあります。
  • Google Chromeでは問題なく進められたので、なるべくブラウザはChromeを使いましょう。

Objective-C の Syntax Highlight になる

MATLAB / Octaveのファイルは拡張子.m なので、デフォルトだとObjective-Cとして認識されてしまいます。

Sublime Text 3 で 拡張子と Syntax Highlight を紐づける方法は以下の通りです。

  1. 関連付けしたいファイルを開く
  2. View=>Syntax=>Open all with current extension as…=>[適用したい Syntax Highlight]を選択

これで .m ファイルが MATLABOctave)のソースコードとしてハイライトされます。

ex1.m の実行時エラー

gnuplot> set terminal aqua enhanced title "Figure 1"  font "*,6" dashlength 1
                      ^
         line 0: unknown or ambiguous terminal type; type just 'set terminal' for a list
  • gnuplotが利用している描画用のターミナル(Aqua/X11)が存在しないために実行時エラーが発生しています。
  • 暫定対応はいくつか考えられますが、Courseraで用意されているDLリンクではなく、HomebrewからきちんとOctaveをインストールしましょう。依存関係が明確になります。
# uninstall
$ brew uninstall gnuplot

# update
$ brew update

# install
$ brew cask install aquaterm
$ brew cask install xquartz
$ brew tap homebrew/science
$ brew install gnuplot --with-aquaterm --with-x11
$ gnuplot # => "terminal set to aqua"
$ brew install octave

# test
$ octave
$ octave:1> w = 10 + sqrt(10)*(randn(1,10000));
$ octave:2> hist(w)

submit.m の実行時エラー

!! Submission failed: unexpected error: urlread: HTTP response code said error
  • HomebrewにてOctaveの最新版(4系)を正規インストールした場合に発生します。
  • 課題スクリプトが想定しているバージョンは 3系 なので、submitコマンドの処理が失敗してエラーとなります。
  • 公式のQ&Aに修正箇所と内容が掲示されているので、その通りに修正します。
    • 対象ファイルは lib/loadjson.mlib/jsonlab/makeValidFieldName.m です。

修正前

str=[str str0(pos0(i)+1:pos(i)-1) sprintf('_0x%X_',str0(pos(i)))];

...(中略)...

str=sprintf('x0x%X_%s',char(str(1)),str(2:end));

修正後

str=[str str0(pos0(i)+1:pos(i)-1) sprintf('_0x%X_',toascii(str0(pos(i))))];

...(中略)...

str=sprintf('x0x%X_%s',toascii(str(1)),str(2:end));

参考 https://learner.coursera.help/hc/en-us/community/posts/204693179-linear-regression-submit-error

Week5 動画の翻訳

講師が話している内容と、翻訳が表示されるタイミングが大幅に乖離しています。 弊害と対応策を整理したのが以下の表です。

弊害 対応策
翻訳「数式のここを見てください」 / 画面「数式はすでに消えている」 巻き戻して内容と画面を照合する
日本語翻訳がまだ途中なのに動画が終わってしまう 諦める or 英語できちんと聞く
読むのに30秒はかかる翻訳が2-3秒で切り替わってしまう 一時停止してじっくり読む

ex6.m の実行時エラー

set: unknown hggroup property Color
  • グラフの可視化を行う際に色の指定に関するエラーが出ました。
  • visualizeBoundary.m を以下のように書き換えます。

修正前

contour(X1, X2, vals, [0 0], 'Color', 'b');

修正後

contour(X1, X2, vals, [0 0], 'linecolor', 'blue');

参考 http://blog.livedoor.jp/kmiwa_project/archives/1034089224.html

演習の内容面でつまづいたとき

以下のようなつまづきケースがあるかと思います。

  • 理解度:課題の要求は分かるが、回答に到達できない
  • 語学力:そもそも課題が何を求めているか要領を得ない
  • 精神力:単純に分量の問題で心が折れる

対処法(理解度のケース)

  • 思考の整理:紙やホワイトボードに書き出す
  • 知識の補充:動画を見返す、公式Wikiを参照する
  • 人に聞く:相談部屋を参照する

対処法(語学力/精神力のケース)

何を聞いたらいいか分からない、うまく質問を整理できない、などなど課題を理解できていない場合。あるいは聞く気概さえ喪失している場合。

あまり褒められた方法ではありませんが、Github上に演習課題を解いた人たちのソースコードが公開されているので、それらを参考にするという手があります。 実際にソースコードを読めば「あぁ、そういうことね」とすんなり理解できることは多いかと思われます。

ただ、これは規約違反のようなので、修了証明を取得するような場合には控えるべきでしょう。 本当に悩んで悩み抜いてきちんと理解できた人だけが修了者として認定されるほうが、サイトの趣旨に照らし合わせると健全と言えます。

とはいえ、あくまでも個人の余暇学習において効率的に学ぶという意味では、上記のような方法も有効です。かなりの分量があり、なかなか体力的にも精神的にも時間的にも苦しい中で、ちょっとズルをしてでも最後までやり抜くのが大事かと。せっかく関心を持ったのに、挫折して気力を削がれてしまうのが1番もったいないです。

最後に

何度も言いますが、ボリュームが大きいので辛かったです。その分だけ達成感と満足感も大きいです。 この講座を足掛かりにして、より高度な内容に踏み出して&実践に活かしていきたいと思います。 何はともあれ、「2015 December 28 – 2016 March 21」で同時期に受講した皆様、お疲れさまでした。