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

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

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)。