数理的手法を使いやすくするためのソフトウェア開発

科学技術計算とデータサイエンスについて

機械学習エンジニアになるために学ぶべき5つのスキル(海外記事紹介)

機械学習エンジニアにはどのようなスキルが求められるのでしょうか?

あれこれと調べてみたのですが、どうもわかりづらいです。 というのは、ブームが盛り上がるうちに スキル要件の範囲が広くなり、また、レベルが高くなって、 「そのような人材はユニコーン(現実には存在しない生き物)」 ということが言われるほどになっているからです。 そして、このように求められるスキルが増えるのに呼応して、 学ぶべきとされる事柄と読むべきとされる書籍のリストも非常に長くなりつつあります。 これでは、何から学ぶかを決めるのも一苦労です。

そこで、 スキル要件をもっとコンパクトに書き表している記事^1

5 Skills You Need to Become a Machine Learning Engineer | Udacity

を、機械学習を学ぶときの参考にするべく、以下で紹介します。 この記事の著者、Chakrabortyさんは コンピュータービジョンの研究で学位を取得して、 Udacity^2(米国のオンライン学習サイト)で、 人工知能機械学習のオンラインコースを作っているという専門家です。 そして、 機械学習エンジニアに求められるスキルを整理して、具体的なリストとしてまとめています。

機械学習に関わるプロジェクトとは?

この記事ではスキル要件について説明するために、次のような機械学習プログジェクトを想定しています。

Let’s say you’re working for a grocery chain, and the company wants to start issuing targeted coupons based on things like the past purchase history of customers, with a goal of generating coupons that shoppers will actually use. ... The Machine Learning approach would be to write an automated coupon generation system.

生鮮食料品チェーン店の販売支援プロジェクト

  • 目標)顧客の過去の購入履歴に基づいて、(レジで)クーポンを発行できるようにする。
  • 手段)機械学習アプリを開発して、購入履歴の分析とクーポンの発行を自動的に行なわせる。

But what does it take to write that system, and have it work? You have to understand the whole ecosystem—inventory, catalog, pricing, purchase orders, bill generation, Point of Sale software, CRM software, etc.

Ultimately, the process is less about understanding Machine Learning algorithms—or when and how to apply them—and more about understanding the systemic interrelationships, and writing working software that will successfully integrate and interface. ...

  • 必要な実務スキル)
    • チェーン店のビジネスに対する理解・洞察
      • 商品の在庫、カタログ、値付け、発注、レシート発行、POSシステム(レジ)での会計、顧客情報の管理など
    • 実用的なソフトウェアを開発

必要なスキル構成は担当パートによって異なる

上記のようなプロジェクトでは、メンバーは

というように、異なったタイプの仕事をこなすことになります。 そこで、担当する仕事ごとに、プロジェクトメンバに求められる基盤スキルの構成は、 次の表のように違ってきます。

データ解析 機械学習アルゴリズム 機械学習アプリ 情報システム
統計学 -
モデリング
機械学習アルゴリズム利用
計算機科学
ソフトウェア工学 -

表1 : 仕事のタイプに対して求められるスキルの構成。スキルの相対的な重みを、◎:上級,◯:中級, △:初級,-:入門者レベルのように示しています。(原文での表^3を日本語訳)

3種類の機械学習エンジニア

ちなみに、Chakrabortyさんが書いた表^3では、機械学習エンジニアとして3つのタイプ、core ML enginer、applied ML enginnerと、software engineer - MLが示されています。 しかし、それらのエンジニアの担当については詳しく書かれていなかったので、 私は、core ML enginer が機械学習アルゴリズムの研究開発を担当し、 applied ML enginner がアプリの試作を担当し、 software engineer - MLが情報システム全体へアプリを統合する担当である、 と解釈しています。

データ分析者と機械学習エンジニアの分業

すると、これら3種類の機械学習エンジニアとデータ分析者が 一緒のプロジェクトで仕事をするときには、 担当する仕事がデータの解析から情報システムへの統合へと変わっていくにつれて、 重点的に求められるスキルもまた統計学からソフトウェア工学へとシフトしていきます。

例えば、データ解析を担当するメンバは、 仕事として、顧客情報を統計的に分析してデータモデリングを行いますから、 スキルとしては、統計学モデリングの専門家であることを求められます。 そして、このメンバの仕事ではプログラミングはそれほど重要ではありませんから、 スキルとしてソフトウェア工学はそれほど求められてはいないわけです。 (ただ、データ収集のためのSQL文を書けるくらいのプログラミングスキルは必要でしょうから、要求レベルはゼロではないのでしょうが。) これに対して、機会学習アプリのプロトタイピングを担当するメンバは、 仕事として、機械学習のソフトウェア部品を使ってアプリの試作を繰り返すので、 スキルとしては、機械学習アルゴリズムの使用と計算機科学についての専門家であることを 求められます。 そして、このメンバの仕事では統計的分析はそれほどの重みはありませんので、 スキルとしては、データ分析者のように統計学の専門家であることを求められないのです。

このように、プロジェクトメンバが自分の専門に特化して、 それぞの強みと弱みを補いあうことで ^7 、 プロジェクトの生産性を上げることができるのだと思います。

基盤スキルの内訳

表1に掲げられた5つの基盤スキルの内訳を、Chakrabortyさんは以下のように説明しています。 (ただし、他のスキル要件についての記事 ^4,^5 を参考にして、私が追加したり書きなおした箇所があります。)

  1. 統計学
  2. データモデリングと評価
    • パターン、構造の発見(相関、クラスター、固有ベクトル(主成分解析)、...)
    • 予測(分類、回帰、異常検知などによる)
    • 精度、誤差の解析(log-loss for classification, 最小二乗法の誤差(sum-of-squared-errors for regression), ...)
    • 検証(標本データの分割(トレーニングデータ、テストデータ)、逐次(? = sequential cross-validation)/ ランダム化交差検証(? = randomized cross-validation)、...)
    • 誤差伝搬? (ニューラルネットワークでの逆伝搬計算)
  3. 機械学習アルゴリズム&ライブラリの利用
  4. 計算機科学
    • データ構造、アルゴリズム(検索、ソート、最適化問題(目的関数、制約条件の違いによるクラス分け(連続、離散))、動的計画法、...)
    • 計算量、計算複雑性(P vs NP, NP完全問題, big O-記法, ...)
    • ハードウェア アーキテクチャー(メモリ階層、キャッシュ、バンド幅、並列処理、マルチプロセス、マルチスレッド、ベクトル演算、...)
  5. ソフトウェア工学

まとめ

機械学習・データサイエンスの仕事に就くためのスキル要件について、ふたつの対照的な見解があるようです。

ひとつは、こうした分野で働くためには、あらゆるスキルを身につけて、プロジェクトで必要となるすべてのタイプの仕事をひとりでこなせるようなるべき、という見解です。 もうひとつは、上で紹介した記事のように、仕事のタイプに応じて、異なったスキルに専門化することが求められ、プロジェクトにおいては、メンバが互いに強みと弱みを補い合って分業する、という見解 ^1 ,^6 ,^7 です。

ただ、どちらが現実に近いのかは、まだ機械学習の仕事をしていないので分かりません。 しかし、私が機械学習について学ぼうとするとき、 何を優先して何を後回しにするかという指針になるのは、 後者の見解(Chakrabortyさんの記事)のほうです。


参考

^1:5 Skills You Need to Become a Machine Learning Engineer | Udacity

^2:Udacity - Free Online Classes & Nanodegrees(いわゆる、MOOCs(massive open online courses)のサイト。)

^3:Relative importance of core skills for different Machine Learning job roles

^4:From PhD to Data Scientist: 5 Tips for Making the Transition

^5:「未経験者はどうすればデータサイエンティストになれるか」

^6:データ分析のためのチームビルディング--情シスとマーケの重要スキルセット

^7:Tips for Beginner Machine Learning/Data Scientists Feeling Overwhelmed

Coursera機械学習コースは、仕事を得るための準備としてどれほどのものか?

Courseraの機械学習コースを完走した後、あるいは、始める前に、表題のようなことを知りたくなる人は少なくないと思います。 私もです。 そこで、質問サイトQuara^1を見てみると、その疑問に対して機械学習の仕事をしている人々が答えていたので、まとめてみました。

Andrew Ng教授の答え^2

Ng先生はそのコースの担当教官です。

Andrew Ng: What are the best ways to start a career in Machine Learning?

The Stanford machine learning on Coursera was designed to help a broad audience get started in machine learning. ...

Many people have gotten jobs in machine learning just by completing that MOOC. There're other similar online courses ... Participating in Kaggle or other online machine learning competitions has also helped people gain experience. Kaggle has a community with online discussions from which you can learn practical skills. ...

But the most important thing is to keep on learning. Not just for a few months, but for years.

まず、このコースを受講しただけで仕事を得た人がいるというのは、良いニュースです。 ただ、他の人たちからの回答も考え合わせると、これから数年間(!)は学習を続けるようにと励ましているほうに、重点があるようです。 そうですか、がんばります。 なるほど、Kaggleコンペ^3に挑戦するというのは大変そうですが、他の参加者と議論するレベルまで行けば、実践的なスキルが身につきそうです。

他にも、次に何を学ぶかについては様々なアドバイスを見かけたのですが、上記のNg先生のアドバイスとは違っていました。 というより、皆、それぞれ違っています。 考えてみれば、それは当然です。 何を目指すか、どのような「機械学習の仕事」を得たいのかで、何を学ぶべきかは違ってくるのですから。

なかなか悩ましいです。

現実的な答えは「Coursera機械学習コースだけでは不十分」^4

Is it enough to complete a machine learning course by Andrew Ng from Coursera to get my first job/internship? If not, what more can be done for the same?

Well, in recent weeks two people I interviewed for the machine learning position at our company mentioned they've completed Andrew Ng's Coursera course. In the end, I didn't hire either of them. It was for other reasons (mainly they weren't so good in thinking about algorithms).

現実は厳しい。この答えの日付は Jul 29, 2014 とあるので、現在はもっと厳しいわけです。

See this is a perspective question. Andrew NG's course is a very good starting point for you to get your understanding but I would suggest you not to stop there. You can also check Abu Mostafa's course on Machine Learning and look for Andrew NG's actual class videos available in YouTube..

Coming back to the job availability, don't think of this as a pathbreaker for your job/internship like I always say... Think of it from a learning perspective only....

なるほど、Ng先生の基本コースで学んだことをもとにして、これからどのように機械学習を学ぶかの見通しを立てなさい、と。

次に何を学ぶか

そういうわけで、機械学習の仕事を得るには、Coursera機械学習コースの後も様々なことを学ぶ必要がありそうです。 ただ、どんな仕事を目指すかによって、学ぶべきことは違うので、自分が何をしたいのかを考える必要もあります。


参考リンク

^1:Quara

^2:Andrew Ng: What are the best ways to start a career in Machine Learning?

^3:Your Home for Data Science (https://www.kaggle.com/)

^4:Is it enough to complete a machine learning course by Andrew Ng from Coursera to get my first job/internship? If not, what more can be done for the same?

計算科学からデータ集約型科学へのシフトで、数理的手法が使いやすくなっている

数理的手法とは、様々な現象を数学的モデルでシミュレートできることを仮定して、現象を理解したり利用するためのアプローチです^1

具体的に言うと、理論科学において自然現象を微分方程式でモデル化したり、計算科学においてモデル方程式を数値的に解いてシミュレーションを行ったり、データ集約型科学において、モデルのパラメーターを機械学習で決定したりするのは、すべて数理的手法です。

数理的手法の効用

これに対して、数理的手法で数学的にモデル化することよりも、現象を観測あるいは実験することによって、理解しようとするのが、実験科学です。 しかし、観測や実験には、それまでの観測や実験によって経験した現象や、それに似通った現象であれば、理解し利用できるが、それまでの経験からかけ離れた現象については、理解や利用が難しくなるという限界があります。 そこで、この限界を超えるために、現象を数学的にモデル化することで、未経験の現象をも理解し利用できるようになります。 これが、数理的手法の効用です。

科学でのパラダイムシフト

また、このように現象を理解するための枠組みをパラダイムと呼ぶことがあります。 最も伝統的な第1のパラダイムが実験科学で、第2が理論科学、第3が計算科学、そして、最も新しい第4のパラダイムがデータ集約型科学です^2

こうしたパラダイムシフトのたびに、数理的手法はより使いやすくなり、より広い範囲で使われるようになってきました。 理論科学には、数学的モデルが解析的に解ける現象でないと調べづらいという使いづらさや、利用範囲の狭さがありました。 しかし、この限界は、計算科学により、数学的モデルを数値的に解いてシミュレートすることで、乗り越えられました。 また、計算科学には、モデルを複雑な現実に近づけると、数値シミュレーションを行うために、ハード購入とソフト開発のコストが膨れ上がるという使いづらさがあります。

しかし、この問題は、データ集約型科学により、ビッグデータで統計的にモデルパラメーターを改善して、モデルを現実に近づけるというやり方で、回避できるのかもしれません。

まとめ

数理的手法の道具立てが進歩して、より使いやすくなるとともに、科学ではパラダイムシフトが起こっています。 まず、数学的モデルという道具により、実験から理論科学へのパラダイムシフトが、次に、計算機シミュレーションという道具により、計算科学へのシフトが、そして、ビッグデータと統計によって、データ集約型科学へシフトしつつあります。

私は計算科学分野で働いているので、計算科学が最新のパラダイムではなくなってしまったということに対しては複雑な気分です。 しかし、データ集約型科学へのシフトによって、数理的手法が使いやすくなっていくことは、喜ばしいと思っています。 そして、それがデータサイエンスと機械学習を学び始めた理由です。


参考リンク

^1:「数理的アプローチとは何か」

^2:“The Fourth Paradigm: Data-Intensive Scientific Discovery – Book Released”, eSciece@Microsoft

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

Coursera のオンラインコース"Machine Learning^1" を完走できたので、記念に修了証を取得しました。

スタンフォード大学の Andrew Ng教授によるスライドと講義が、非常に分かりやすかったです。 世間では、機械学習を学ぶには高度な数学を理解する必要があるなどと言われることがありますが^2、Ng先生は、最小限の数学(行列・ベクトル演算と偏微分くらい)だけを使って機械学習アルゴリズムを説明してくれます。

所要時間は約70時間

ただし、このコースのボリュームは相当なもので、講義は11週間あり、毎週、試験をパスして、宿題を提出せねばなりません。 そのための所要時間は、レビューサイト^3 によれば、毎週 5〜7時間です。 この時間のなかには、宿題として、Octave(MATLAB互換のフリーウェア)で簡単なアルゴリズムを実装する時間も含まれます。 宿題の量は、日本の大学に比べると多めですが、米国の大学生はこのくらいは普通に勉強するものなのかもしれません。

機械学習アプリを作りたい

宿題のコーディングはそれなりに面白いのですが、機械学習アプリというほどのプログラムではなかったところが物足りないです。 こうなると、私もいずれは機械学習アプリ開発に参加したくなってきます。

しかし、このコースを修了しただけの私が力不足であることは否めません。 まず、実際の応用では、決定木、ランダムフォレスト、ナイーブベイズなどが使われているのを良く見かけるのですが、それらのアルゴリズムをまだ理解できていません。 また、ディープラーニングのアプリに登場する畳み込み型や再帰型のニューラブネットワークと、講義で扱われてい線型結合の多層型ネットワークの違いがよく分かりません。

そういうわけで、次に何に取り組むかを検討しています。


講義内容のまとめ

  • 基本

    • 機械学習とは
      • 予測 : 特徴ベクトル(入力) --> モデル --> 予測値(出力)
      • 学習 : モデルパラメーターをデータを使って最適化
    • 学習アルゴリズム
      • 教師あり学習 : {(特徴ベクトル1、実測値1)、 (特徴ベクトル2、実測値2)、 ... }のデータを使って最適化
      • 教師なし学習 : {特徴ベクトル1、特徴ベクトル2、 ... }のデータを使って最適化
        • K-平均法、PCA(principal component analysis 主成分解析)、異常検知(注:cross-validation のためにはラベル付きのデータを使うことがある。)
  • 実践に向けて

    • モデル作成のためのアドバイ
      • アルゴリズムやモデルが劣っていても、データ量を増やせば予測精度では優ることがある。
        • しかし、データ量を増やしても、過剰学習では精度は上がらない。
        • そこで、学習曲線、正規化、誤差解析、ceiling analysis などの技法を使って、データ量を増やすかモデルを改善するかを判断すべし。
          • データ量が少ない時には、それを倍増させるコストも小さい。
      • モデル関数形や特徴量を賢く選ぶほうが、力づくのパラメーター増加よりも効果的に予測精度を改善できる。
    • 応用事例の紹介
      • 推薦システム、OCR
      • 大規模計算、並列化

参考リンク

^1:Machine Learning - Stanford University | Coursera

^2:「文系エンジニアに「機械学習」は難しすぎる! ディープラーニングは難しい数式がいっぱい」東洋経済 2016年08月21日。

^3:CLASS CENTRAL

ブログで自分をマーケティングするために

「SOFT SKILLS ソフトウェア開発者の人生マニュアル^1」という本に啓発されて、ブログを書くことにしました。 特に次の2点、

  1. ソフトウェア開発者として長期的に、自分は何をしたいか?
  2. その途上で問題になりうることをどう解決するか?

を考えながら、ブログ記事を書いていきたいと思います。

この本のようにソフトウェア開発者にブログを書くようにアドバイスすることは、今では目新しいことではないのかもしれません^2。 しかし、そのアドバイスを理由付けるレトリックは以下のように、少し刺激的でした。

「SOFT SKILLS ソフトウェア開発者の人生マニュアル^1」の該当部分の要約

0. 自分を売り込め!

多くのソフトウェア開発者は良いキャリアを築くことにそれほど熱心ではありません。 つまりは、会社に自分のキャリアを委ねてしまっています。 しかし、会社には会社の都合がありますから、社員のキャリアを悪化させるような人事異動、リストラ、整理解雇をすることもあります。 ですから、そうなる前に、より良いキャリアのために、どのような仕事をする必要があるかを考え、その仕事を手に入れるため自分を売り込む必要があるのです。

換言すれば、自分のキャリアを会社に委ねるのではなく、自分自身でコントロールするために、会社を顧客としてソフトウェア開発というビジネスを行うというくらいの意識を持つのです。 そして、そのビジネスを成功させるためには、自分をマーケティングする必要があります。

1. 潜在的な顧客の注意を引きつけろ!

通常、マーケティングで人々の注意を引くためには、ブランディングが行なわれます。 それは、売り込むものが何のためのもので、何をするものなのかというメッセージを絞り込み、首尾一貫した形で、何度も繰り返すことです。 例えば、ジョン・ソンメズ (この本の著者)は、ブランド名によって、自分は「シンプルプログララマー」であり、ブランドメッセージによって、自分がすることは「複雑なコンセプトを分解し、単純にして、誰もが理解できるようにする」であると、明確にしています。 これがブログによるブランディングです。 なので、ソフトウェア開発者としての自分をブランディングするために、自分が何者で何をしたいのかを明確にしましょう。

2. 潜在的な顧客に価値を提供せよ!

マーケティングにおける価値とは、潜在的な顧客に役立つような情報(あるいはサービス)を無償で提供することです。 例えば、良いAndroidアプリ開発の仕事を得たいのであれば、そういった分野の開発において生じるであろう問題に対して、解決策あるいはヒントとなるようなブログ記事を書いてみましょう。 つまり、ある専門分野で良い仕事を得たいのであれば、その分野で問題となっていることをどのように解決するかを考えて、それをブログ記事にするのが良いのです。

売り込みだけを目的にするのはやり過ぎでは

以上が、「SOFT SKILLS ソフトウェア開発者の人生マニュアル^1」がソフトウェア開発者にブログを書くことを薦めるレトリックです。

ただ、自分の売り込みだけをブログの目的とするのはやり過ぎのように思えます。 その目的では、ブログ読者として想定するのが、近い将来に仕事の依頼主になるかもしれない人々だけになってしまいます。 しかし、その想定範囲は狭すぎます。 それに、売り込みの他にも、良いソフトウェア開発の仕事を得るために必要なことはあります。 それはそのような仕事で必要となる技術を学び、専門を深めることです。 ですから、想定読者層をその専門分野でソフトウェア開発をしている人々へと広げて、ブログにはその分野での問題解決についてだけでなく、その専門分野を学ぶ途中経過についても書く方が、良い仕事を得るという最終目的にかなっていると思います。

そういうわけで、私と同じ分野、あるいは、関連分野でソフトウェア開発をしている方々へ向けて、何かお役に立てるようなブログ記事を書ければと思っています。

これから宜しくお願いします。


参考リンク

^1:「SOFT SKILLS ソフトウェア開発者の人生マニュアル」ジョン・ソンメズ (著), 長尾 高弘 (翻訳), まつもとゆきひろ (監修)、日経BP社 (2016/5/21)。

^2: 「【寄稿】 エンジニアはブログを書いた方が良い、その理由をキャリアの視点から考える」週刊はてなブログ(2013-08-22)。