派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

【イベントレポート】プログラミング未経験でもOK!Pythonで体験するAI(ディープラーニング)と独学でプログラミングをマスターする方法

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するイベントを、定期的に開催しています。

2018年7月27日のイベントでは「プログラミング未経験でもOK!Pythonで体験するAI(ディープラーニング)と独学でプログラミングをマスターする方法」と題して、書籍『わかるPython[決定版]』や『100問でわかるPython』などの著者、松浦健一郎さんをお迎えして、AIプログラミングとPythonの独学方法について教えていただきました。

f:id:itstaffing:20180920101939j:plain

■今回のイベントのポイント

・今、どのプログラミング言語を学ぶべきか?
・ディープラーニングを体験しよう
・Pythonはここがキモ~この機能を使え!
・独学でプログラミングスキルを身に付けるには


【講 師】松浦 健一郎さん
▲【講 師】松浦 健一郎さん
東京大学工学系研究科電子工学専攻修士課程修了。大学では並列コンパイラを学ぶ。学生時代からプログラミング記事の執筆やソフトウェア開発に携わる。NEC中央研究所において並列コンピューティングの研究に従事した後、フリーランスに。研究所や大学や企業からの依頼で、ソフトウェア開発や研究支援の業務を行い、書籍を執筆する傍ら、企業や学校でプログラミングを教える。司 ゆき氏と共著で、28冊の書籍を執筆。ハンドパペットを使ったプログラミング教育動画の配信なども行っている。近著に『わかるPython[決定版]』(ソフトバンククリエイティブ)、『おもしろまじめなAIスピーカーアプリをつくろう』(秀和システム)などがある。

今、どのプログラミング言語を学ぶべきか?

これまでに多数のプログラミング言語を学び、使いこなしてきた松浦さんは、言語の学び方にもいくつかオススメの方法があるそうです。それは次のようなもの。

・いくつでも学ぶ
・そのとき必要な言語を学ぶ
・目的のものが作れる言語を学ぶ
・短期間で学ぶ

そして、仕事をしながら学ぶ(仕事に育ててもらう)というのがポイント。Pythonを学ぶなら、Pythonの仕事をするのがベストということになります。

いくつもの言語を学ぶのは大変と思うかもしれませんが、共通の概念を学んでおけば、大丈夫。各言語で共通の概念とは次のような項目です。

・データ構造
・アルゴリズム
・計算機アーキテクチャ

松浦さんがPythonをオススメする理由の一つとして紹介してくれたのが、「活きのいい言語を選ぶ」というものでした。

たとえば、大ヒットした映画の続編となるパート2が面白くないという評価を受けることが多いのは、オリジナルの作者が制作から離れていることがあるから。プログラミング言語も同様で、その言語の作者が今でもバージョンアップに関わっているものが、オリジナルの設計思想が失われていない「活きのいい」言語だそうです。Python開発者のグイド・ヴァンロッサムは62歳とメジャーな言語の開発者としては若いので、今後もPythonに関わり続けてくれることを期待したいです。

※本イベントが開催された2018年7月、グイド・ヴァンロッサム氏はPythonの機能拡張に関する議論の調停役からの引退を発表したが、当面の間はPythonの開発に携わるとのこと。

一方で、コンピュータアーキテクチャを理解するのに役立つ機械語も、オススメの言語とのこと。

ディープラーニングを体験しよう

Pythonといえば機械学習。そこで実際にディープラーニング(深層学習)を体験してみることに。

f:id:itstaffing:20180920101943j:plain
▲実際にノード間をつないだり、自分で計算したりしてディープラーニングの中身を体験

ディープラーニングを知るために、まずはニューラルネットワークの基礎を学びます。

f:id:itstaffing:20180920101946j:plain
▲基本的なニューラルネットワークのモデル

結合されたノードとノードの間を、信号が伝わっていきます。結合には「重い結合」と「軽い結合」があり、重い結合は次のノードに信号を強く伝え、軽い結合は弱く伝えます。入力層に入力された信号は、中間層に伝わり、続いて出力層に伝わります。出力層に伝わった信号が、ニューラルネットワークが出した「答え」に相当するのだそうです。

ある層のノードと次の層のノードをすべて結合させたものを「全結合のニューラルネットワーク」と呼び、中間層が2層以上のものを「ディープニューラルネットワーク」と呼びます。

f:id:itstaffing:20180920101948j:plain
▲中間層が2層以上のものがディープニューラルネットワーク

ニューラルネットワークの結合の強さを調整する作業を「学習」と呼び、ディープニューラルネットワークの結合の強さを調整することを「ディープラーニング」と呼ぶそうです。最近、いろいろな場所で「ディープラーニング」という言葉は耳にしますが、その意味は今回のイベントで初めて知った、という方もいらっしゃったのではないでしょうか。

結合の強さを決めるのが「重み」と「バイアス」です。下図の例では、入力Aに重みAXをかけ、入力BにBXをかけ、バイアスXを足したものが出力Xに、同様にAにAYをかけ、BにBYをかけ、バイアスYを足したものが出力Yになります。

f:id:itstaffing:20180920101951j:plain
▲この重みとバイアスで結合の強さを調整する

Pythonのディープラーニングのサンプルとしてよく紹介されるのが手書き文字認識。MNISTと呼ばれる手書き数字のデータを使います。

f:id:itstaffing:20180920101953j:plain
▲MNISTは色々な字体で書かれた0から9までの数字画像データ

このデータはグレースケールの画像で、輝度0~255の256段階の階調で表されています。本来、MNISTのデータはピクセル数も多いのですが、松浦さんは、参加者が手計算でもできるように、4×4ピクセルのデータを例に、処理をわかりやすく紹介してくれました。

まず、入力データに重みを適用する「畳み込み」という処理を行います。これは「畳み込みニューラルネットワーク(CNN)」で行う処理の一部です。

f:id:itstaffing:20180920101956j:plain
▲畳み込みは画像処理に使われる処理で、数学の内積や積和演算に相当する

4×4の入力データに対して3×3の重みを適用するには、3×3の重みをずらしながら演算します。しかし、これでは結果が2×2のデータになってしまい、入力データの4×4に比べると情報量が減少してしまいます。

f:id:itstaffing:20180920101958j:plain
▲4×4のデータに3×3の重みを適用すると結果は2×2になってしまう

そこで、入力データの周囲を0で埋める「パディング」という処理を行います。これにより、元のサイズの出力が得られます。

f:id:itstaffing:20180920102001j:plain
▲元データの周囲を0で埋めることで、元データのサイズの出力が得られる

畳み込みの後に「プーリング」という演算を行います。典型的なプーリングの手法は、マックスプーリングといって、2×2の4つのマトリックスの中から、それぞれの最大値を取り出します。

f:id:itstaffing:20180920102003j:plain
▲左上の2×2に着目すると8、14、19、12なので最大値は19。右下では20、15、15、10なので最大値は20になる

さらに、過学習を防ぐための「ドロップアウト」という処理を経て、最終的な出力を行います。こうした処理を何段階も組み合わせて、次のようなMNISTを認識するためのCNNを構築するそうです。

f:id:itstaffing:20180920102006j:plain
▲MNISTを認識するためのCNNでは、このように何段階もの処理を行っている

Pythonはここがキモ~この機能を使え!

ここからは、松浦さんオススメのPythonのキモとなる機能について。まずはデータ型からです。Pythonでは次のようなデータ型が使えます。

・タプル:値の集まり
(値,値,……)

・リスト:値を追加・変更・削除可能
[値,値,……]

・集合:重複しない値の集まり、高速検索
{値,値,……}

・辞書:重複しないキーと値の組の集まり、高速検索
{キー:値,キー:値,……}

これらのデータ型の特性を把握し、適切に使い分けることで、プログラムを簡潔にしたり、プログラムの実行速度を高めたりといった、効果的なプログラミングができるようになるとのことです。

また、プログラムを短く書けることも、Pythonの特長だそうです。

f:id:itstaffing:20180920102008j:plain
▲C言語で書いたのと同じプログラムをPythonではここまで短く書くことができる

特に「内包表記」は、for文よりもプログラムを短く簡潔に書くのに役立つそうです。

f:id:itstaffing:20180920102011j:plain
▲Pythonのfor文でループさせる処理も、内包表記を使えばさらに短く書ける

独学でプログラミングスキルを身に付けるには

最後に、独学でプログラミングスキルを身に付けるためのアドバイスもいただきました。

開発を成功させるには、開発を小さなステップに分けるのがコツだそうです。たとえば、最終目標までの道筋を設計し、目標1→目標2→目標3……→最終目標というように、細かな目標を立て、一つ一つクリアしていく。実際にプログラミングするときも、目標ごとにプログラムの動作を確認しながら進めます。

目標1を作成→目標1の動作を確認する→修正する→完成
目標2を作成→目標2の動作を確認する→修正する→完成

最終目標までの道筋を設計した上で、この作業を繰り返していくと良いとのことでした。

f:id:itstaffing:20180920102013j:plain
▲ディープラーニングの中身や、Pythonについての新たな魅力を知る濃い内容でした

今回のイベントでは、ディープラーニングがどんなことをしているのか、その片鱗に触れられたのがとても印象的でした。AI関連のプログラムを開発する予定はなくとも、色々な処理を短く簡潔に書けるなど、Pythonの新たな魅力を知ることができました。Pythonに関しては、今注目の言語ということもあり、勉強している方も多いと思います。ぜひ、松浦さんの著書『わかるPython[決定版]』も活用してみましょう。