フューチャー技術ブログ

Software Design 後記

はじめに

はじめまして、Strategic AI Groupの上野です。

2019年は幸運なことに、技術評論社のSoftware Designという雑誌に3回も機械学習関連の記事を執筆する機会を頂きました。

Strategic AI GroupのChief AI Officierである貞光とともに以下の3つの記事を書きました。

  • 1月号:自然言語処理・画像処理における線形代数の応用 ~データ処理アルゴリズムへの活用事例~
  • 3月号:微分でつなぐ、機械学習とニューラルネットワーク ~データ分析も画像処理も最小二乗法で!~
  • 9月号:数字認識APIを作って実感 ~充実した機械学習ライブラリがPythonの魅力~

本記事では3回分の記事を振り返りながら、機械学習を学ぶ際のちょっとしたTipsを紹介したいと思います。

難易度順に易しい方から9月号、1月号、3月号の順に振り返っていきます。

9月号:数字認識APIを作って実感 ~充実した機械学習ライブラリがPythonの魅力~

9月号では、機械学習がはじめての方向けに数字認識アプリを作ってみることを通して、機械学習への入門を果たすことを目指しました。

何はともあれ作って実感してみよう、というコンセプトです。

機械学習ではPythonがよく用いられます。Pythonには機械学習に関するライブラリが豊富にあって、それらを組み合わせることで高度な処理も容易に実現できます。

一方で、様々なライブラリがありすぎて、初心者のうちは戸惑ってしまいがちです。行列計算のためのNumPy、 深層学習のためのKeras、WebアプリケーションフレームワークのFlask…。どれも色々な機能をもっているのですが、初心者にとってはまずはそれぞれの役割を大雑把に理解するのがよいと思います。

9月号では以下のような数字認識アプリの作成を通して、それぞれのライブラリの役割を体感することができます。

まず全体像をつかんだ後に、各ライブラリの高度な使い方を学んでいくと躓きにくいと思います。この考え方は、ライブラリの習得に限らず機械学習のアルゴリズムを学ぶ際にも通じるところがあります。いきなり難しい教科書の先頭から完璧に理解していこうとすると挫折してしまいがちですが、まずは全体像を学んだ後に、各手法の詳細を勉強していくとスッキリ理解できることがあります。

以上のように、Pythonの豊富なライブラリを使うと高度な処理を実現できるのですが、機械学習の仕組みをキチンと理解して論文を読みこなすためにはどうしても数学を避けては通れません。

1月号と3月号では、機械学習で使われる数学を理解するために、線形代数と微分を取り上げました。

1月号:自然言語処理・画像処理における線形代数の応用 ~データ処理アルゴリズムへの活用事例~

1月号では機械学習の理解に必要な線形代数をテーマに、自然言語処理と画像処理での応用事例を紹介しました。

線形代数では行列の積がたくさん登場します。行列の積は形に着目すると計算を追いやすくなります。下図の同じ色の部分はサイズが一致しているということを意識しておくことがポイントです。

記事のなかでは、まず自然言語処理での応用事例として潜在意味インデキシング(LSI)と潜在意味解析(LDA)、そしてword2vecを紹介しました。次に、画像処理での応用事例として非負値行列因子分解(NMF)とAutoencoderを紹介しました。
実は、これらの手法は下の表に示すタテの繋がりもあります。タテとヨコ、両方の繋がりを意識すると、様々な手法が有機的に繋がって、おもしろいです。

では、この表の行と列を増やしてみるとどんな手法が考えられるでしょうか?

例えば、次の表が考えられます。まず行を増やすことを考えるとグラフを対象とした手法があります。グラフに対する行列因子化の適用としてPageRank、ニューラルネットワークの適用としてnode2vecがあります。次に、列についてはどうでしょうか。自然言語、画像、グラフに対して、畳み込みニューラルネットワーク(CNN)の適用が考えられます。CNNによる画像分類は有名ですが、自然言語に適用して文書分類を行うことやグラフ上で畳み込みを定義することもできます。

このようにタテとヨコの視点を意識すると新しい気づきがあるかもしれません。

3月号:微分でつなぐ、機械学習とニューラルネットワーク ~データ分析も画像処理も最小二乗法で!~

3月号では、微分をテーマに、ニューラルネットワークの学習方法である誤差逆伝播法(backpropagation)を解説しました。

初めてニューラルネットワークの学習を学ぶ際には、下図のようにニューラルネットワークの結合重みをトンカチで調整していくんだよー、というようにイメージで理解しておくのはわかりやすいと思います。

しかし、初心者を卒業してもう一歩踏み込んだ理解をするためには微分が必要になります。実は、Kerasなどの高水準フレームワークを利用していると、画像分類などの典型的なタスクにおいては、学習の仕組みをほとんど意識することなく学習を実行できるのですが、精度向上のためにチューニングしたり、あるいは最新の論文を理解するためにはニューラルネットワークの学習の仕組みの理解はとても役に立ちます。

例えば、敵対的生成ネットワーク(GAN)の学習は典型的なニューラルネットワークの学習よりも複雑です。

GANは鮮明な顔画像などを生成できることで、最近注目されている手法です。GANの学習ではGeneratorとDiscriminatorという2つのニューラルネットワークを、互いにだましあうように学習させていきます。下図にGANの学習手順と疑似コードを示しています。損失関数の計算やパラメータ更新のやり方が、典型的な画像分類の学習と比べて複雑になっています。

しかし、一つ一つの要素は基本的なものでありニューラルネットワークの学習の仕組みをキチンと理解していれば、自分で実装できるようになります。

このように、基礎をキチンと学んでおくと、最新の手法の理解にも繋がります。簡単の意味の基礎ではなく多くの手法の土台となる基礎をしっかりと学んでおくとよいと思います。

まとめ

Software Design 1/3/9月号を振り返りながら機械学習を学ぶ際のちょっとしたTipsを紹介してきました。
まとめると以下の3点です。

  • 全体像から詳細へ
  • タテとヨコの視点
  • 基礎徹底

以上を具体的に実践してみたい方は、ぜひSoftware Designを読んでみてください。